mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-20 22:26:24 -04:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d11ef0411a |
+4
-28
@@ -13,10 +13,7 @@
|
||||
- Added `visibility/hidden`, `visibility/hat` and `visibility/face` tags to control where and how certain items are rendered.
|
||||
- Added Pokémon markings, toggleable within the summary.
|
||||
- Added `/boxcount` command to change PC boxes amount
|
||||
- Added cosmetics for Gurdurr, Conkeldurr, Squirtle Line, Sneasler, Sandile line, Treecko line, Braixen, Delphox, and Dragonite.
|
||||
- Added cosmetics for Gurdurr, Conkeldurr, Squirtle Line, Sneasler, Sandle line, Treecko line, Braixen, Delphox, and Dragonite.
|
||||
- Added `/transformmodelpart (position|rotation|scale) <modelPart> <transform: x y z>` command that can add transformations to a pokemon's model part.
|
||||
- The player executing the command must be facing the target pokemon entity. Transformations are not persistent and will revert when resources are reloaded.
|
||||
|
||||
### Pokémon Added
|
||||
|
||||
@@ -69,13 +66,9 @@
|
||||
|
||||
### Animation updates for the following Pokémon
|
||||
- Garchomp
|
||||
- Tropius
|
||||
- Torpius
|
||||
- Nosepass
|
||||
- Probopass
|
||||
- Sneasler
|
||||
- Braixen
|
||||
- Delphox
|
||||
|
||||
### Model updates for the following Pokémon
|
||||
- Gyarados
|
||||
@@ -89,37 +82,23 @@
|
||||
- Leafeon
|
||||
- Glaceon
|
||||
- Sylveon
|
||||
- Treecko
|
||||
- Grovyle
|
||||
- Sceptile
|
||||
- Honchkrow
|
||||
- Garchomp
|
||||
- Pidgeot
|
||||
- Nosepass
|
||||
- Probopass
|
||||
- Magnezone
|
||||
- Metagross
|
||||
- Added Syrupy Apples.
|
||||
- Added `/transformmodelpart (position|rotation|scale) <modelPart> <transform: x y z>` command that can add transformations to a pokemon's model part.
|
||||
- The player executing the command must be facing the target pokemon entity. Transformations are not persistent and will revert when resources are reloaded.
|
||||
|
||||
### Changes
|
||||
- Renamed `chargeGainedPerTick` config to `secondsToChargeHealingMachine`.
|
||||
- Made Blocks of Gold count as Big Nuggets when held by a Pokémon (for Fling functionality)
|
||||
- Players can now eat Sweet and Tart Apples, Whipped Dreams, and the Alcremie Sweets.
|
||||
- Updated Sweet and Tart Apple sprites
|
||||
- Updated the following recipes: Air Balloon, Assault Vest, Binding Band, Black Belt, Blunder Policy, Choice Band, Choice Scarf, Cleanse Tag, Covert Cloak, Destiny Knot, Eject Button, Expert Belt, Focus Band, Focus Sash, Magnet, Metronome, Muscle Band, Power Anklet, Power Band, Power Belt, Power Bracer, Power Lens, Power Weight, Protective Pads, Protein, Punching Glove, Reaper Cloth, Rocky Helmet, Room Service, Sachet, Safety Goggles, Silk Scarf, Spell Tag, Utility Umbrella, Weakness Policy, Zinc
|
||||
- Added alternate ingredient options to the following recipes: Cell Battery, Charcoal Stick, Dragon Fang, Miracle Seed, Mystic Water, Never Melt Ice, Twisted Spoon, Damp Rock, Heat Rock, Icy Rock, Smooth Rock
|
||||
- Grouped together some recipes within the Recipe Book. Groups include: the seven basic Poké Balls, the seven basic Ancient Poké Balls, Gilded Chests, Pokedexes, and the Weather Rocks.
|
||||
- Updated some item tags to better integrate behaviours between Cobblemon, Vanilla Minecraft, and other mods
|
||||
- Removed Cooked Meat, Raw Meat, Protein Ingredients, and Zinc Ingredients, the first two are now using `c` namespace tags, the latter have better integrated use of tags within their recipes which removes need for custom tags.
|
||||
- Added our seeds tag into `#c:seeds`, which is now made use of for the Miracle Seed recipe.
|
||||
- Tweaked the Natural Materials Vanilla file to fit with the changes to tags
|
||||
- Substantially optimised spawning checks mainly by front-loading biome filtering.
|
||||
- When using the `cobblemon` or `generation_9` capture calculators a critical capture with a single shake will always play for successful captures when you've already registered the Pokémon as caught in your Pokédex.
|
||||
- Improved the performance of saving Pokédex and player data.
|
||||
- Pokémon hitbox now scales with entity attribute `generic.scale`.
|
||||
- Removed Shulker aspect and replaced it with cosmetic_item-shulker_shell.
|
||||
- Shulker shell Forretress is now a cosmetic rather than a special evo and thus all shulker Forretress will revert back to normal until a shulker shell is put in their cosmetic slot.
|
||||
- Updated `doPokemonSpawning` gamerule to support per-dimension configurations.
|
||||
|
||||
### Fixes
|
||||
- Fixed Particles sometimes facing the wrong direction (looking at you, Swords Dance)
|
||||
@@ -148,6 +127,7 @@
|
||||
- Fixed Pokémon marked as silent still playing shiny sounds and effects.
|
||||
- Fixed an issue with newer versions of Fabric API where underground Pokémon were spawning in The End.
|
||||
- Fixed spawning not working well when you're at high points surrounded by lower altitude spawning areas, such as flying.
|
||||
- Fixed swapping held items with wild Pokémon under certain circumstances causing duplicate items
|
||||
|
||||
### Developer
|
||||
- A finished battle now has winners and losers set inside of `PokemonBattle` instead of them always being empty.
|
||||
@@ -176,11 +156,8 @@
|
||||
- Added `interpolate` boolean property to animated textures to allow gradual colour changes between frames.
|
||||
- Fixed species additions not being capable of changing implemented status.
|
||||
- Added support for action effects that are triggered by `|-activate|` Showdown instructions. `activate_{effect_id}` is the syntax.
|
||||
- Added MoLang functions for rendering items `render_item(item_id, locator_name)` and `clear_items()`.
|
||||
- Added Molang functions for rendering items `render_item(item_id, locator_name)` and `clear_items()`.
|
||||
- Fixed location spawn filter components causing crashes
|
||||
- Added `pokemon` as an available MoLang function for the `battleActor` functions.
|
||||
- Added `spawn_pokemon` as an available MoLang function for the `worldHolder` functions.
|
||||
- Added `attempt_wild_battle` as an available MoLang function.
|
||||
- Added `pokemon` as an available Molang function for the `battleActor` functions.
|
||||
- Fixed `heldItem` property inside spawn files not working and causing crashes
|
||||
- Fixed `spawn_bedrock_particles` MoLang causing crashes when used in a server environment
|
||||
@@ -289,7 +266,6 @@
|
||||
- Geodude
|
||||
- Graveler
|
||||
- Golem
|
||||
- Magnezone
|
||||
|
||||
### Cry updates for the following Pokémon
|
||||
- Sceptile
|
||||
|
||||
@@ -13,7 +13,6 @@ import com.cobblemon.mod.common.OrientationControllable;
|
||||
import com.cobblemon.mod.common.api.orientation.OrientationController;
|
||||
import com.cobblemon.mod.common.api.riding.Rideable;
|
||||
import com.cobblemon.mod.common.api.riding.Seat;
|
||||
import com.cobblemon.mod.common.client.MountedPokemonAnimationRenderController;
|
||||
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate;
|
||||
import com.cobblemon.mod.common.client.render.MatrixWrapper;
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState;
|
||||
@@ -61,8 +60,6 @@ public abstract class CameraMixin {
|
||||
|
||||
@Shadow
|
||||
private BlockGetter level;
|
||||
|
||||
@Shadow private float partialTickTime;
|
||||
@Unique private float returnTimer = 0;
|
||||
@Unique private float rollAngleStart = 0;
|
||||
@Unique Minecraft minecraft = Minecraft.getInstance();
|
||||
@@ -70,7 +67,7 @@ public abstract class CameraMixin {
|
||||
@Unique boolean disableRollableCameraDebug = false;
|
||||
|
||||
@Inject(method = "setRotation", at = @At("HEAD"), cancellable = true)
|
||||
public void cobblemon$setRotation(float f, float g, CallbackInfo ci) {
|
||||
public void open_camera$setRotation(float f, float g, CallbackInfo ci) {
|
||||
if (!(this.entity instanceof OrientationControllable controllable) || disableRollableCameraDebug) return;
|
||||
var controller = controllable.getOrientationController();
|
||||
if (!controller.isActive() && controller.getOrientation() != null) {
|
||||
@@ -88,7 +85,7 @@ public abstract class CameraMixin {
|
||||
return;
|
||||
}
|
||||
controller.getOrientation().rotateZ((float) Math.toRadians(-rollAngleStart*(1-returnTimer)));
|
||||
cobblemon$applyRotation();
|
||||
applyRotation();
|
||||
this.returnTimer += .05F;
|
||||
ci.cancel();
|
||||
} else {
|
||||
@@ -98,7 +95,7 @@ public abstract class CameraMixin {
|
||||
return;
|
||||
}
|
||||
if (controller.getOrientation() == null) return;
|
||||
cobblemon$applyRotation();
|
||||
applyRotation();
|
||||
|
||||
this.returnTimer = 0;
|
||||
this.rollAngleStart = controller.getRoll();
|
||||
@@ -107,10 +104,9 @@ public abstract class CameraMixin {
|
||||
|
||||
//If you want to move this to a delagate you need an AW for position
|
||||
@WrapOperation(method = "setup", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;setPosition(DDD)V"))
|
||||
public void cobblemon$positionCamera(Camera instance, double x, double y, double z, Operation<Void> original, @Local(ordinal = 1, argsOnly = true) boolean thirdPersonReverse) {
|
||||
public void positionCamera(Camera instance, double x, double y, double z, Operation<Void> original, @Local(ordinal = 1, argsOnly = true) boolean thirdPersonReverse) {
|
||||
Entity entity = instance.getEntity();
|
||||
Entity vehicle = entity.getVehicle();
|
||||
MountedPokemonAnimationRenderController.INSTANCE.reset();
|
||||
|
||||
if(vehicle instanceof Rideable){
|
||||
//RidingCameraDelagate.INSTANCE.positionCamera(instance, x, y, z, original);
|
||||
@@ -119,20 +115,20 @@ public abstract class CameraMixin {
|
||||
return;
|
||||
}
|
||||
|
||||
PokemonClientDelegate delegate = (PokemonClientDelegate) pokemon.getDelegate();
|
||||
int seatIndex = pokemon.getPassengers().indexOf(entity);
|
||||
Seat seat = pokemon.getSeats().get(seatIndex);
|
||||
|
||||
Vec3 entityPos = new Vec3(
|
||||
Mth.lerp(instance.getPartialTickTime(), pokemon.xOld, pokemon.getX()),
|
||||
Mth.lerp(instance.getPartialTickTime(), pokemon.yOld, pokemon.getY()),
|
||||
Mth.lerp(instance.getPartialTickTime(), pokemon.zOld, pokemon.getZ())
|
||||
);
|
||||
MountedPokemonAnimationRenderController.INSTANCE.setup(pokemon, partialTickTime);
|
||||
int seatIndex = pokemon.getPassengers().indexOf(entity);
|
||||
Seat seat = pokemon.getSeats().get(seatIndex);
|
||||
|
||||
OrientationControllable rollable = (OrientationControllable) entity;
|
||||
OrientationController controller = rollable.getOrientationController();
|
||||
|
||||
if (!instance.isDetached() || Cobblemon.config.getThirdPartyViewBobbing()) {
|
||||
PokemonClientDelegate delegate = (PokemonClientDelegate) pokemon.getDelegate();
|
||||
MatrixWrapper locator = delegate.getLocatorStates().get(seat.getLocator());
|
||||
|
||||
if (locator == null) {
|
||||
@@ -143,12 +139,10 @@ public abstract class CameraMixin {
|
||||
Vec3 locatorOffset = new Vec3(locator.getMatrix().getTranslation(new Vector3f()));
|
||||
|
||||
float currEyeHeight = Mth.lerp(instance.getPartialTickTime(), eyeHeightOld, eyeHeight);
|
||||
var rotatedEyeHeight = new Vector3f(0f, currEyeHeight - (entity.getBbHeight() / 2), 0f);
|
||||
if (controller.isActive()) {
|
||||
rotatedEyeHeight = controller.getRenderOrientation(partialTickTime).transform(rotatedEyeHeight);
|
||||
}
|
||||
Matrix3f orientation = controller.isActive() && controller.getOrientation() != null ? controller.getOrientation() : new Matrix3f();
|
||||
Vec3 rotatedEyeHeight = new Vec3(orientation.transform(new Vector3f(0f, currEyeHeight - (entity.getBbHeight() / 2), 0f)));
|
||||
|
||||
Vec3 position = locatorOffset.add(entityPos).add(new Vec3(rotatedEyeHeight));
|
||||
Vec3 position = locatorOffset.add(entityPos).add(rotatedEyeHeight);
|
||||
setPosition(position);
|
||||
} else {
|
||||
Vector3f pos = entityPos.add(new Vec3(0, pokemon.getBbHeight() / 2, 0)).toVector3f();
|
||||
@@ -185,7 +179,7 @@ public abstract class CameraMixin {
|
||||
}
|
||||
|
||||
@Unique
|
||||
private void cobblemon$applyRotation(){
|
||||
private void applyRotation(){
|
||||
if (!(this.entity instanceof OrientationControllable controllable) || controllable.getOrientationController().getOrientation() == null) return;
|
||||
var controller = controllable.getOrientationController();
|
||||
var newRotation = controller.getOrientation().normal(new Matrix3f()).getNormalizedRotation(new Quaternionf());
|
||||
|
||||
@@ -59,21 +59,8 @@ public class HumanoidModelMixin {
|
||||
}
|
||||
|
||||
Entity vehicle = entity.getVehicle();
|
||||
if (vehicle instanceof PokemonEntity pokemonEntity && entity instanceof AbstractClientPlayer) {
|
||||
var shouldRotatePlayerHead = pokemonEntity.ifRidingAvailableSupply(false, (behaviour, settings, state) -> {
|
||||
return behaviour.shouldRotatePlayerHead(settings, state, pokemonEntity);
|
||||
});
|
||||
|
||||
if (!shouldRotatePlayerHead) {
|
||||
netHeadYaw = 0f;
|
||||
headPitch = 0f;
|
||||
if (this.head != null) {
|
||||
this.head.yRot = 0f;
|
||||
this.head.xRot = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
MountedPlayerRenderer.INSTANCE.animate(pokemonEntity, (AbstractClientPlayer) entity, relevantPartsByName, netHeadYaw, headPitch, ageInTicks, limbSwing, limbSwingAmount);
|
||||
if (vehicle instanceof PokemonEntity && entity instanceof AbstractClientPlayer) {
|
||||
MountedPlayerRenderer.INSTANCE.animate((PokemonEntity) vehicle, (AbstractClientPlayer) entity, relevantPartsByName, netHeadYaw, headPitch, ageInTicks, limbSwing, limbSwingAmount);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,6 @@ import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||
import com.cobblemon.mod.common.pokedex.scanner.PokedexUsageContext;
|
||||
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import com.mojang.blaze3d.Blaze3D;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.MouseHandler;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
@@ -30,10 +29,9 @@ import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||
|
||||
@Mixin(MouseHandler.class)
|
||||
public abstract class MouseHandlerMixin {
|
||||
public class MouseHandlerMixin {
|
||||
@Shadow private double accumulatedScrollY;
|
||||
@Shadow @Final private Minecraft minecraft;
|
||||
|
||||
@@ -51,14 +49,6 @@ public abstract class MouseHandlerMixin {
|
||||
|
||||
@Shadow private double accumulatedDY;
|
||||
|
||||
@Shadow private double lastHandleMovementTime;
|
||||
|
||||
@Shadow public abstract boolean isMouseGrabbed();
|
||||
|
||||
@Shadow protected abstract void turnPlayer(double movementTime);
|
||||
|
||||
@Unique private double cobblemon$timeDelta;
|
||||
|
||||
@Inject(
|
||||
method = "onScroll",
|
||||
at = @At(
|
||||
@@ -171,21 +161,16 @@ public abstract class MouseHandlerMixin {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Inject(method = "handleAccumulatedMovement", at = @At("HEAD"))
|
||||
private void cobblemon$maintainMovementWhenInScreens2(CallbackInfo ci) {
|
||||
double time = Blaze3D.getTime();
|
||||
cobblemon$timeDelta = time - this.lastHandleMovementTime;
|
||||
}
|
||||
|
||||
@Inject(method = "handleAccumulatedMovement", at = @At("TAIL"))
|
||||
private void cobblemon$maintainMovementWhenInScreens(CallbackInfo ci) {
|
||||
@Inject(method = "handleAccumulatedMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;isMouseGrabbed()Z", ordinal = 0))
|
||||
private void cobblemon$maintainMovementWhenInScreens(CallbackInfo ci, @Local(ordinal = 1) double e) {
|
||||
if (minecraft.player == null) return;
|
||||
if (!(minecraft.player instanceof OrientationControllable controllable)) return;
|
||||
if (!controllable.getOrientationController().isActive()) return;
|
||||
if (minecraft.isPaused()) return;
|
||||
if (isMouseGrabbed()) return;
|
||||
|
||||
this.turnPlayer(cobblemon$timeDelta);
|
||||
var pitch = pitchSmoother.getNewDeltaValue(0, e);
|
||||
var roll = rollSmoother.getNewDeltaValue(0, e);
|
||||
controllable.getOrientationController().rotate(0.0F, (float)pitch, (float)roll);
|
||||
}
|
||||
|
||||
@Unique
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.mixin.client;
|
||||
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||
import net.minecraft.client.model.PlayerModel;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(PlayerModel.class)
|
||||
public class PlayerModelMixin {
|
||||
@Inject(method = "setupAnim(Lnet/minecraft/world/entity/LivingEntity;FFFFF)V", at = @At(value = "HEAD"))
|
||||
private void cobblemon$setHeadRotation(LivingEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, CallbackInfo ci) {
|
||||
if (!(entity instanceof Player)) return;
|
||||
Entity vehicle = entity.getVehicle();
|
||||
|
||||
if (!(vehicle instanceof PokemonEntity pokemonEntity)) return;
|
||||
|
||||
var shouldRotatePlayerHead = pokemonEntity.ifRidingAvailableSupply(false, (behaviour, settings, state) -> {
|
||||
return behaviour.shouldRotatePlayerHead(settings, state, pokemonEntity);
|
||||
});
|
||||
if (shouldRotatePlayerHead) return;
|
||||
|
||||
netHeadYaw = 0f;
|
||||
headPitch = 0f;
|
||||
}
|
||||
}
|
||||
@@ -293,21 +293,20 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
@JvmField val REAPER_CLOTH = noSettingsItem("reaper_cloth")
|
||||
@JvmField val PRISM_SCALE = noSettingsItem("prism_scale")
|
||||
@JvmField val SACHET = noSettingsItem("sachet")
|
||||
@JvmField val WHIPPED_DREAM = create("whipped_dream", foodItem(8, 0.3f))
|
||||
@JvmField val STRAWBERRY_SWEET = create("strawberry_sweet", foodItem(6, 0.125f))
|
||||
@JvmField val LOVE_SWEET = create("love_sweet", foodItem(6, 0.125f))
|
||||
@JvmField val BERRY_SWEET = create("berry_sweet", foodItem(6, 0.125f))
|
||||
@JvmField val CLOVER_SWEET = create("clover_sweet", foodItem(6, 0.125f))
|
||||
@JvmField val FLOWER_SWEET = create("flower_sweet", foodItem(6, 0.125f))
|
||||
@JvmField val STAR_SWEET = create("star_sweet", foodItem(6, 0.125f))
|
||||
@JvmField val RIBBON_SWEET = create("ribbon_sweet", foodItem(6, 0.125f))
|
||||
@JvmField val WHIPPED_DREAM = noSettingsItem("whipped_dream")
|
||||
@JvmField val STRAWBERRY_SWEET = noSettingsItem("strawberry_sweet")
|
||||
@JvmField val LOVE_SWEET = noSettingsItem("love_sweet")
|
||||
@JvmField val BERRY_SWEET = noSettingsItem("berry_sweet")
|
||||
@JvmField val CLOVER_SWEET = noSettingsItem("clover_sweet")
|
||||
@JvmField val FLOWER_SWEET = noSettingsItem("flower_sweet")
|
||||
@JvmField val STAR_SWEET = noSettingsItem("star_sweet")
|
||||
@JvmField val RIBBON_SWEET = noSettingsItem("ribbon_sweet")
|
||||
@JvmField val CHIPPED_POT = noSettingsItem("chipped_pot")
|
||||
@JvmField val CRACKED_POT = noSettingsItem("cracked_pot")
|
||||
@JvmField val MASTERPIECE_TEACUP = noSettingsItem("masterpiece_teacup")
|
||||
@JvmField val UNREMARKABLE_TEACUP = noSettingsItem("unremarkable_teacup")
|
||||
@JvmField val SWEET_APPLE = create("sweet_apple", foodItem(4, 0.3f))
|
||||
@JvmField val TART_APPLE = create("tart_apple", foodItem(4, 0.3f))
|
||||
@JvmField val SYRUPY_APPLE = create("syrupy_apple", foodItem(4, 0.3f))
|
||||
@JvmField val SWEET_APPLE = noSettingsItem("sweet_apple")
|
||||
@JvmField val TART_APPLE = noSettingsItem("tart_apple")
|
||||
@JvmField val GALARICA_CUFF = noSettingsItem("galarica_cuff")
|
||||
@JvmField val GALARICA_WREATH = noSettingsItem("galarica_wreath")
|
||||
@JvmField val BLACK_AUGURITE = noSettingsItem("black_augurite")
|
||||
@@ -1359,7 +1358,4 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
return createdItem
|
||||
}
|
||||
|
||||
private fun foodItem(nutrition: Int, saturationModifier: Float): Item {
|
||||
return Item(Item.Properties().food(FoodProperties.Builder().nutrition(nutrition).saturationModifier(saturationModifier).build()))
|
||||
}
|
||||
}
|
||||
@@ -20,4 +20,4 @@ interface EntitySideDelegate<T : Entity> {
|
||||
fun tick(entity: T) {}
|
||||
fun onSyncedDataUpdated(data: EntityDataAccessor<*>) {}
|
||||
fun addToStruct(struct: QueryStruct) {}
|
||||
}
|
||||
}
|
||||
@@ -22,5 +22,4 @@ interface PokemonSideDelegate : EntitySideDelegate<PokemonEntity> {
|
||||
fun handleStatus(status: Byte) {}
|
||||
fun spawnShinyParticle(player: Player) {}
|
||||
fun positionRider(passenger: Entity, positionUpdater: MoveFunction)
|
||||
fun updateAge(age: Int) {}
|
||||
}
|
||||
}
|
||||
@@ -24,16 +24,12 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||
import com.cobblemon.mod.common.api.dialogue.PlayerDialogueFaceProvider
|
||||
import com.cobblemon.mod.common.api.dialogue.ReferenceDialogueFaceProvider
|
||||
import com.cobblemon.mod.common.api.mark.Marks
|
||||
import com.cobblemon.mod.common.api.moves.MoveTemplate
|
||||
import com.cobblemon.mod.common.api.moves.Moves
|
||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
|
||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
|
||||
import com.cobblemon.mod.common.api.moves.animations.NPCProvider
|
||||
import com.cobblemon.mod.common.api.pokedex.*
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||
import com.cobblemon.mod.common.api.pokemon.moves.Learnset
|
||||
import com.cobblemon.mod.common.api.pokemon.moves.LearnsetQuery
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
|
||||
import com.cobblemon.mod.common.api.spawning.context.SpawningContext
|
||||
@@ -42,7 +38,6 @@ import com.cobblemon.mod.common.api.storage.party.PartyStore
|
||||
import com.cobblemon.mod.common.api.storage.party.PlayerPartyStore
|
||||
import com.cobblemon.mod.common.api.storage.pc.PCPosition
|
||||
import com.cobblemon.mod.common.api.storage.pc.PCStore
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
||||
import com.cobblemon.mod.common.api.text.text
|
||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||
import com.cobblemon.mod.common.battles.actor.PlayerBattleActor
|
||||
@@ -298,27 +293,6 @@ object MoLangFunctions {
|
||||
packet.sendToPlayersAround(x, y, z, 64.0, world.dimension())
|
||||
}
|
||||
}
|
||||
map.put("spawn_pokemon") { params ->
|
||||
val x = params.getInt(0)
|
||||
val y = params.getInt(1)
|
||||
val z = params.getInt(2)
|
||||
val props = params.getString(3).toProperties()
|
||||
|
||||
val pos = BlockPos(x, y, z)
|
||||
|
||||
if (!Level.isInSpawnableBounds(pos)) {
|
||||
return@put DoubleValue.ZERO
|
||||
}
|
||||
|
||||
val pokemon = props.createEntity(world)
|
||||
pokemon.moveTo(pos, pokemon.yRot, pokemon.xRot)
|
||||
|
||||
if (world.addFreshEntity(pokemon)) {
|
||||
return@put pokemon.struct
|
||||
} else {
|
||||
return@put DoubleValue.ZERO
|
||||
}
|
||||
}
|
||||
map.put("get_entities_around") { params ->
|
||||
val x = params.getDouble(0)
|
||||
val y = params.getDouble(1)
|
||||
@@ -786,26 +760,6 @@ object MoLangFunctions {
|
||||
}
|
||||
struct
|
||||
}
|
||||
map.put("learnset") { pokemon.form.moves.asMoLangValue() }
|
||||
map.put("can_learn") { params ->
|
||||
val moveId = params.getString(0)
|
||||
val move = Moves.getByName(moveId) ?: return@put DoubleValue.ZERO
|
||||
val learnType = params.getStringOrNull(1) ?: return@put DoubleValue(
|
||||
LearnsetQuery.ANY.canLearn(move, pokemon.form.moves)
|
||||
)
|
||||
|
||||
val query = when (learnType) {
|
||||
"tm" -> LearnsetQuery.TM_MOVE
|
||||
"egg" -> LearnsetQuery.EGG_MOVE
|
||||
"tutor" -> LearnsetQuery.TUTOR_MOVES
|
||||
"level" -> LearnsetQuery.ANY_LEVEL
|
||||
"form_change" -> LearnsetQuery.FORM_CHANGE
|
||||
"evolution" -> LearnsetQuery.EVOLUTION
|
||||
else -> LearnsetQuery.ANY
|
||||
}
|
||||
|
||||
DoubleValue(query.canLearn(move, pokemon.form.moves))
|
||||
}
|
||||
map.put("is_wild") { DoubleValue(pokemon.entity?.let { it.ownerUUID == null } == true) }
|
||||
map.put("is_shiny") { DoubleValue(pokemon.shiny) }
|
||||
map.put("species") { pokemon.species.struct }
|
||||
@@ -856,14 +810,9 @@ object MoLangFunctions {
|
||||
map.put("is_moving") { DoubleValue((pokemonEntity.moveControl as? PokemonMoveControl)?.hasWanted() == true) }
|
||||
map.put("is_flying") { DoubleValue(pokemonEntity.getBehaviourFlag(PokemonBehaviourFlag.FLYING)) }
|
||||
map.put("is_gliding") { DoubleValue(pokemonEntity.useRidingAltPose()) }
|
||||
map.put("is_ridden") { DoubleValue(pokemonEntity.hasControllingPassenger()) }
|
||||
map.put("has_aspect") { DoubleValue(it.getString(0) in pokemonEntity.aspects) }
|
||||
map.put("is_pokemon") { DoubleValue.ONE }
|
||||
map.put("is_holding_item") { DoubleValue(!pokemonEntity.entityData.get(PokemonEntity.SHOWN_HELD_ITEM).let {
|
||||
it.isEmpty || it.`is`(CobblemonItemTags.WEARABLE_HAT_ITEMS) || it.`is`(CobblemonItemTags.WEARABLE_FACE_ITEMS)
|
||||
}) }
|
||||
map.put("is_wearing_hat") { DoubleValue(pokemonEntity.entityData.get(PokemonEntity.SHOWN_HELD_ITEM).`is`(CobblemonItemTags.WEARABLE_HAT_ITEMS)) }
|
||||
map.put("is_wearing_face") { DoubleValue(pokemonEntity.entityData.get(PokemonEntity.SHOWN_HELD_ITEM).`is`(CobblemonItemTags.WEARABLE_FACE_ITEMS)) }
|
||||
map.put("is_holding_item") { DoubleValue(!pokemonEntity.entityData.get(PokemonEntity.SHOWN_HELD_ITEM).isEmpty) }
|
||||
map
|
||||
}
|
||||
)
|
||||
@@ -1138,43 +1087,11 @@ object MoLangFunctions {
|
||||
map.put("hitbox_height") { DoubleValue(species.hitbox.height) }
|
||||
map.put("hitbox_fixed") { DoubleValue(species.hitbox.fixed) }
|
||||
map.put("catch_rate") { DoubleValue(species.catchRate) }
|
||||
map.put("learnset") { species.moves.asMoLangValue() }
|
||||
|
||||
map
|
||||
}
|
||||
)
|
||||
|
||||
val learnsetFunctions: MutableList<(Learnset) -> HashMap<String, java.util.function.Function<MoParams, Any>>> = mutableListOf(
|
||||
{ learnset ->
|
||||
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||
|
||||
map.put("tutor_moves") { learnset.tutorMoves.map { it.struct }.asArrayValue() }
|
||||
map.put("egg_moves") { learnset.eggMoves.map { it.struct }.asArrayValue() }
|
||||
map.put("tm_moves") { learnset.tmMoves.map { it.struct }.asArrayValue() }
|
||||
map.put("evolution_moves") { learnset.evolutionMoves.map { it.struct }.asArrayValue() }
|
||||
map.put("form_change_moves") { learnset.formChangeMoves.map { it.struct }.asArrayValue() }
|
||||
|
||||
map.put("get_level_up_moves_to") { params ->
|
||||
val level = params.getIntOrNull(0) ?: 0
|
||||
learnset.getLevelUpMovesUpTo(level).map { it.struct }.asArrayValue()
|
||||
}
|
||||
|
||||
map.put("level_up_moves") {
|
||||
val struct = QueryStruct(hashMapOf())
|
||||
for (level in learnset.levelUpMoves.keys) {
|
||||
struct.addFunction("$level") {
|
||||
learnset.levelUpMoves[level]?.map { it.struct }?.asArrayValue() ?: ArrayStruct()
|
||||
}
|
||||
}
|
||||
struct
|
||||
}
|
||||
|
||||
map
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
|
||||
val pokemonPropertiesFunctions: MutableList<(PokemonProperties) -> HashMap<String, java.util.function.Function<MoParams, Any>>> = mutableListOf(
|
||||
{ props ->
|
||||
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||
@@ -1339,18 +1256,6 @@ object MoLangFunctions {
|
||||
return value
|
||||
}
|
||||
|
||||
fun Learnset.asMoLangValue(): ObjectValue<Learnset> {
|
||||
val value = ObjectValue(
|
||||
obj = this,
|
||||
stringify = { it.toString() }
|
||||
)
|
||||
|
||||
value.addFunctions(learnsetFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||
|
||||
return value
|
||||
|
||||
}
|
||||
|
||||
fun PokemonEntity.asMoLangValue(): ObjectValue<PokemonEntity> {
|
||||
val value = ObjectValue(
|
||||
obj = this,
|
||||
|
||||
@@ -19,4 +19,4 @@ interface Decodable {
|
||||
*/
|
||||
fun decode(buffer: RegistryFriendlyByteBuf)
|
||||
|
||||
}
|
||||
}
|
||||
@@ -25,4 +25,4 @@ interface Encodable {
|
||||
*/
|
||||
fun encode(buffer: RegistryFriendlyByteBuf)
|
||||
|
||||
}
|
||||
}
|
||||
-18
@@ -107,22 +107,4 @@ open class OrientationController(val entity: LivingEntity) {
|
||||
val roll: Float
|
||||
get() = Mth.wrapDegrees(-upVector.angleSigned(UP, forwardVector).toDegrees())
|
||||
|
||||
fun applyGlobalYaw(deltaYawDegrees: Float) = updateOrientation { original ->
|
||||
val euler = Vector3f()
|
||||
original.getEulerAnglesXYZ(euler)
|
||||
val pitch0 = euler.x
|
||||
val roll0 = euler.z
|
||||
|
||||
val unroll = Matrix3f().rotateZ(-roll0)
|
||||
val unpitch = Matrix3f().rotateX(-pitch0)
|
||||
val flattened = Matrix3f(original).mul(unroll).mul(unpitch)
|
||||
|
||||
//Flip to reflect current acceptance of what direction is pos for yaw
|
||||
val globalYaw = Matrix3f().rotationY(-1.0f * deltaYawDegrees.toRadians())
|
||||
val rePitch = Matrix3f().rotateX(pitch0)
|
||||
val reRoll = Matrix3f().rotateZ(roll0)
|
||||
|
||||
return@updateOrientation Matrix3f(globalYaw).mul(flattened).mul(rePitch).mul(reRoll)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -41,6 +41,9 @@ class RidingProperties(
|
||||
}
|
||||
}
|
||||
|
||||
val canRide: Boolean
|
||||
get() = seats.isNotEmpty() && behaviour != null
|
||||
|
||||
fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeMap(
|
||||
stats,
|
||||
@@ -50,6 +53,7 @@ class RidingProperties(
|
||||
buffer.writeCollection(seats) { _, seat -> seat.encode(buffer) }
|
||||
buffer.writeCollection(conditions) { _, condition -> buffer.writeString(condition.getString()) }
|
||||
buffer.writeNullable(behaviour) { _, behaviour ->
|
||||
buffer.writeResourceLocation(behaviour.key)
|
||||
behaviour.encode(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,5 @@ package com.cobblemon.mod.common.api.riding
|
||||
enum class RidingStyle {
|
||||
LAND,
|
||||
LIQUID,
|
||||
AIR,
|
||||
COMPOSITE
|
||||
}
|
||||
AIR
|
||||
}
|
||||
+1
-3
@@ -8,7 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
@@ -28,7 +27,6 @@ import net.minecraft.world.phys.Vec3
|
||||
*/
|
||||
interface RidingBehaviour<Settings : RidingBehaviourSettings, State : RidingBehaviourState> {
|
||||
val key: ResourceLocation
|
||||
val style: RidingStyle
|
||||
|
||||
fun isActive(settings: Settings, state: State, vehicle: PokemonEntity): Boolean
|
||||
|
||||
@@ -87,6 +85,6 @@ interface RidingBehaviour<Settings : RidingBehaviourSettings, State : RidingBeha
|
||||
|
||||
fun shouldRotatePlayerHead(settings: Settings, state: State, vehicle: PokemonEntity): Boolean
|
||||
|
||||
fun createDefaultState(settings: Settings): State
|
||||
fun createDefaultState(): State
|
||||
|
||||
}
|
||||
|
||||
-1
@@ -11,7 +11,6 @@ package com.cobblemon.mod.common.api.riding.behaviour
|
||||
import com.cobblemon.mod.common.api.net.Decodable
|
||||
import com.cobblemon.mod.common.api.net.Encodable
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
/**
|
||||
* Represents static settings of a riding behaviour.
|
||||
|
||||
+17
-32
@@ -8,10 +8,15 @@
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour
|
||||
|
||||
import com.cobblemon.mod.common.api.net.Decodable
|
||||
import com.cobblemon.mod.common.api.net.Encodable
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.ifClient
|
||||
import com.cobblemon.mod.common.util.ifServer
|
||||
import net.minecraft.client.player.RemotePlayer
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
/**
|
||||
* Represents the state of a Pokemon when being ridden.
|
||||
@@ -22,38 +27,18 @@ import net.minecraft.world.phys.Vec3
|
||||
*
|
||||
* @author landonjw
|
||||
*/
|
||||
open class RidingBehaviourState {
|
||||
open val rideVelocity: SidedRidingState<Vec3> = ridingState(Vec3.ZERO, Side.BOTH)
|
||||
open val stamina: SidedRidingState<Float> = ridingState(1.0F, Side.BOTH)
|
||||
|
||||
open fun reset() {
|
||||
rideVelocity.set(Vec3.ZERO, true)
|
||||
stamina.set(1.0F, true)
|
||||
}
|
||||
|
||||
open fun copy(): RidingBehaviourState {
|
||||
val copy = RidingBehaviourState()
|
||||
copy.rideVelocity.set(rideVelocity.get(), true)
|
||||
copy.stamina.set(stamina.get(), true)
|
||||
return copy
|
||||
}
|
||||
|
||||
open fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous.rideVelocity.get() != rideVelocity.get()) return true
|
||||
if (previous.stamina.get() != stamina.get()) return true
|
||||
return false
|
||||
}
|
||||
|
||||
open fun encode(buffer: FriendlyByteBuf) {
|
||||
buffer.writeVec3(rideVelocity.get())
|
||||
buffer.writeFloat(stamina.get())
|
||||
}
|
||||
|
||||
open fun decode(buffer: FriendlyByteBuf) {
|
||||
rideVelocity.set(buffer.readVec3(), true)
|
||||
stamina.set(buffer.readFloat(), true)
|
||||
}
|
||||
interface RidingBehaviourState : Encodable, Decodable {
|
||||
fun reset()
|
||||
fun copy(): RidingBehaviourState
|
||||
fun shouldSync(previous: RidingBehaviourState): Boolean
|
||||
}
|
||||
|
||||
object NoState : RidingBehaviourState {
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) = Unit
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) = Unit
|
||||
override fun copy() = NoState
|
||||
override fun reset() = Unit
|
||||
override fun shouldSync(previous: RidingBehaviourState) = false
|
||||
}
|
||||
|
||||
fun <T> ridingState(value: T, side: Side) = SidedRidingState(value, side)
|
||||
|
||||
+7
-7
@@ -9,32 +9,32 @@
|
||||
package com.cobblemon.mod.common.api.riding.behaviour
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.*
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeBehaviour
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
|
||||
object RidingBehaviours {
|
||||
val behaviours = mutableMapOf<ResourceLocation, RidingBehaviour<RidingBehaviourSettings, RidingBehaviourState>>()
|
||||
val behaviours = mutableMapOf<ResourceLocation, RidingBehaviour<*, *>>()
|
||||
|
||||
init {
|
||||
register(BirdAirBehaviour.KEY, BirdAirBehaviour())
|
||||
register(DolphinBehaviour.KEY, DolphinBehaviour())
|
||||
register(FallToGlideCompositeBehaviour.KEY, FallToGlideCompositeBehaviour())
|
||||
register(GenericLandBehaviour.KEY, GenericLandBehaviour())
|
||||
register(GenericSwimBehaviour.KEY, GenericSwimBehaviour())
|
||||
register(GliderAirBehaviour.KEY, GliderAirBehaviour())
|
||||
register(HelicopterBehaviour.KEY, HelicopterBehaviour())
|
||||
register(JetAirBehaviour.KEY, JetAirBehaviour())
|
||||
register(JumpToFlightCompositeBehaviour.KEY, JumpToFlightCompositeBehaviour())
|
||||
register(RunToJetCompositeBehaviour.KEY, RunToJetCompositeBehaviour())
|
||||
register(SwimDashBehaviour.KEY, SwimDashBehaviour())
|
||||
register(VehicleLandBehaviour.KEY, VehicleLandBehaviour())
|
||||
register(HoverBehaviour.KEY, HoverBehaviour())
|
||||
register(CompositeBehaviour.KEY, CompositeBehaviour())
|
||||
}
|
||||
|
||||
fun register(key: ResourceLocation, behaviour: RidingBehaviour<out RidingBehaviourSettings, out RidingBehaviourState>) {
|
||||
fun register(key: ResourceLocation, behaviour: RidingBehaviour<*, *>) {
|
||||
if (behaviours.contains(key)) error("Behaviour already registered to key $key")
|
||||
behaviours[key] = RidingController(behaviour) as RidingBehaviour<RidingBehaviourSettings, RidingBehaviourState>
|
||||
behaviours[key] = RidingController(behaviour)
|
||||
}
|
||||
|
||||
fun get(key: ResourceLocation): RidingBehaviour<RidingBehaviourSettings, RidingBehaviourState> {
|
||||
fun get(key: ResourceLocation): RidingBehaviour<*, *> {
|
||||
if (!behaviours.contains(key)) error("Behaviour not registered to key $key")
|
||||
return behaviours[key]!!
|
||||
}
|
||||
|
||||
+3
-10
@@ -8,7 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.SmoothDouble
|
||||
@@ -25,7 +24,6 @@ import net.minecraft.world.phys.Vec3
|
||||
class RidingController<Settings : RidingBehaviourSettings, State : RidingBehaviourState>(val behaviour: RidingBehaviour<Settings, State>) : RidingBehaviour<Settings, State> {
|
||||
|
||||
override val key = behaviour.key
|
||||
override val style = behaviour.style
|
||||
|
||||
override fun isActive(settings: Settings, state: State, vehicle: PokemonEntity) =
|
||||
behaviour.isActive(settings, state, vehicle)
|
||||
@@ -41,13 +39,8 @@ class RidingController<Settings : RidingBehaviourSettings, State : RidingBehavio
|
||||
return behaviour.speed(settings, state, vehicle, driver)
|
||||
}
|
||||
|
||||
override fun clampPassengerRotation(settings: Settings, state: State, vehicle: PokemonEntity, driver: LivingEntity) {
|
||||
if (!isActive(settings, state, vehicle)) return
|
||||
return behaviour.clampPassengerRotation(settings, state, vehicle, driver)
|
||||
}
|
||||
|
||||
override fun rotation(settings: Settings, state: State, vehicle: PokemonEntity, driver: LivingEntity): Vec2 {
|
||||
if (!isActive(settings, state, vehicle)) return driver.rotationVector
|
||||
if (!isActive(settings, state, vehicle)) return vehicle.rotationVector
|
||||
return behaviour.rotation(settings, state, vehicle, driver)
|
||||
}
|
||||
|
||||
@@ -171,8 +164,8 @@ class RidingController<Settings : RidingBehaviourSettings, State : RidingBehavio
|
||||
return behaviour.setRideBar(settings, state, vehicle, driver)
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: Settings): State {
|
||||
return behaviour.createDefaultState(settings)
|
||||
override fun createDefaultState(): State {
|
||||
return behaviour.createDefaultState()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+64
-106
@@ -12,14 +12,12 @@ import com.bedrockk.molang.Expression
|
||||
import com.bedrockk.molang.runtime.MoLangMath.lerp
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseProvider
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.SmoothDouble
|
||||
@@ -27,9 +25,6 @@ import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import org.joml.Matrix3f
|
||||
import org.joml.Quaternionf
|
||||
import org.joml.Vector3f
|
||||
import kotlin.math.*
|
||||
|
||||
class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
@@ -38,10 +33,9 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
}
|
||||
|
||||
override val key: ResourceLocation = KEY
|
||||
override val style = RidingStyle.AIR
|
||||
|
||||
val poseProvider = PoseProvider<BirdAirSettings, BirdAirState>(PoseType.HOVER)
|
||||
.with(PoseOption(PoseType.FLY) { _, state, _ -> state.rideVelocity.get().z > 0.2 })
|
||||
.with(PoseOption(PoseType.FLY) { _, state, _ -> state.rideVel.get().z > 0.2 })
|
||||
|
||||
override fun isActive(settings: BirdAirSettings, state: BirdAirState, vehicle: PokemonEntity): Boolean {
|
||||
return true
|
||||
@@ -57,7 +51,7 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return state.rideVelocity.get().length().toFloat()
|
||||
return state.rideVel.get().length().toFloat()
|
||||
}
|
||||
|
||||
override fun rotation(
|
||||
@@ -89,11 +83,11 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
if (controller != null) {
|
||||
//Need to deadzone this when straight up or down
|
||||
|
||||
upForce += -1.0 * sin(Math.toRadians(controller.pitch.toDouble())) * state.rideVelocity.get().z
|
||||
forwardForce += cos(Math.toRadians(controller.pitch.toDouble())) * state.rideVelocity.get().z
|
||||
upForce += -1.0 * sin(Math.toRadians(controller.pitch.toDouble())) * state.rideVel.get().z
|
||||
forwardForce += cos(Math.toRadians(controller.pitch.toDouble())) * state.rideVel.get().z
|
||||
|
||||
upForce += cos(Math.toRadians(controller.pitch.toDouble())) * state.rideVelocity.get().y
|
||||
forwardForce += sin(Math.toRadians(controller.pitch.toDouble())) * state.rideVelocity.get().y
|
||||
upForce += cos(Math.toRadians(controller.pitch.toDouble())) * state.rideVel.get().y
|
||||
forwardForce += sin(Math.toRadians(controller.pitch.toDouble())) * state.rideVel.get().y
|
||||
}
|
||||
|
||||
|
||||
@@ -110,7 +104,7 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
upForce = if (vehicle.y >= altitudeLimit && upForce > 0) 0.0 else upForce
|
||||
}
|
||||
|
||||
val velocity = Vec3(state.rideVelocity.get().x , upForce, forwardForce)
|
||||
val velocity = Vec3(state.rideVel.get().x , upForce, forwardForce)
|
||||
return velocity
|
||||
}
|
||||
|
||||
@@ -126,12 +120,12 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
|
||||
var glideSpeedChange = 0.0
|
||||
|
||||
val currSpeed = state.rideVelocity.get().length()
|
||||
val currSpeed = state.rideVel.get().length()
|
||||
|
||||
//Flag for determining if player is actively inputting
|
||||
var activeInput = false
|
||||
|
||||
var newVelocity = Vec3(state.rideVelocity.get().x, state.rideVelocity.get().y, state.rideVelocity.get().z)
|
||||
var newVelocity = Vec3(state.rideVel.get().x, state.rideVel.get().y, state.rideVel.get().z)
|
||||
|
||||
//speed up and slow down based on input
|
||||
if (driver.zza != 0.0f && state.stamina.get() > 0.0) {
|
||||
@@ -182,26 +176,26 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
}
|
||||
|
||||
//Lateral movement based on driver input.
|
||||
// val latTopSpeed = topSpeed / 2.0
|
||||
// if (driver.xxa != 0.0f && state.stamina.get() > 0.0) {
|
||||
// newVelocity = Vec3(
|
||||
// (newVelocity.x + (accel * driver.xxa)).coerceIn(-latTopSpeed, latTopSpeed),
|
||||
// newVelocity.y,
|
||||
// newVelocity.z)
|
||||
// activeInput = true
|
||||
// }
|
||||
// else {
|
||||
// newVelocity = Vec3(
|
||||
// lerp(newVelocity.x, 0.0, latTopSpeed / 20.0),
|
||||
// newVelocity.y,
|
||||
// newVelocity.z)
|
||||
// }
|
||||
val latTopSpeed = topSpeed / 2.0
|
||||
if (driver.xxa != 0.0f && state.stamina.get() > 0.0) {
|
||||
newVelocity = Vec3(
|
||||
(newVelocity.x + (accel * driver.xxa)).coerceIn(-latTopSpeed, latTopSpeed),
|
||||
newVelocity.y,
|
||||
newVelocity.z)
|
||||
activeInput = true
|
||||
}
|
||||
else {
|
||||
newVelocity = Vec3(
|
||||
lerp(newVelocity.x, 0.0, latTopSpeed / 20.0),
|
||||
newVelocity.y,
|
||||
newVelocity.z)
|
||||
}
|
||||
|
||||
//Vertical movement based on driver input.
|
||||
val vertTopSpeed = topSpeed / 2.0
|
||||
val vertInput = when {
|
||||
driver.jumping && state.rideVelocity.get().length() < 0.3 -> 1.0
|
||||
driver.isShiftKeyDown && state.rideVelocity.get().length() < 0.3 -> -1.0
|
||||
driver.jumping -> 1.0
|
||||
driver.isShiftKeyDown -> -1.0
|
||||
else -> 0.0
|
||||
}
|
||||
|
||||
@@ -228,26 +222,25 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: Reintroduce stamina drain once stats start to be polished and tweaked
|
||||
// //Only perform stamina logic if the ride does not have infinite stamina
|
||||
// if (!vehicle.runtime.resolveBoolean(settings.infiniteStamina)) {
|
||||
// if (activeInput) {
|
||||
// state.stamina.set(state.stamina.get() - (0.05 / staminaStat).toFloat())
|
||||
// }
|
||||
//
|
||||
// //Lose a base amount of stamina just for being airborne
|
||||
// state.stamina.set(state.stamina.get() - (0.01 / staminaStat).toFloat())
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// state.stamina.set(1.0f)
|
||||
// }
|
||||
//Only perform stamina logic if the ride does not have infinite stamina
|
||||
if (!vehicle.runtime.resolveBoolean(settings.infiniteStamina)) {
|
||||
if (activeInput) {
|
||||
state.stamina.set(state.stamina.get() - (0.05 / staminaStat).toFloat())
|
||||
}
|
||||
|
||||
//Lose a base amount of stamina just for being airborne
|
||||
state.stamina.set(state.stamina.get() - (0.01 / staminaStat).toFloat())
|
||||
}
|
||||
else
|
||||
{
|
||||
state.stamina.set(1.0f)
|
||||
}
|
||||
|
||||
//air resistance
|
||||
if( abs(newVelocity.z) > 0) {
|
||||
newVelocity = newVelocity.subtract(0.0, 0.0, min(0.0015 * newVelocity.z.sign, newVelocity.z))
|
||||
newVelocity = newVelocity.subtract(0.0, 0.0, min(0.003 * newVelocity.z.sign, newVelocity.z))
|
||||
}
|
||||
state.rideVelocity.set(newVelocity)
|
||||
state.rideVel.set(newVelocity)
|
||||
}
|
||||
|
||||
override fun angRollVel(
|
||||
@@ -260,17 +253,10 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
if (driver !is OrientationControllable) return Vec3.ZERO
|
||||
val controller = (driver as OrientationControllable).orientationController
|
||||
|
||||
//limit rolling based on handling and current speed.
|
||||
//modulated by speed so that when flapping idle in air you are ont wobbling around to look around
|
||||
//TODO: Tie handling into yaw rate
|
||||
//TODO: Tie into handling
|
||||
val handling = vehicle.runtime.resolveDouble(settings.handlingExpr)
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.speedExpr)
|
||||
//This rotation limit will be used to know if the ride has exceeded it and its needs correcting.
|
||||
val rotMin = 15.0
|
||||
val rotLimit = max(handling * sqrt(normalizeVal(state.rideVelocity.get().length(), 0.0, topSpeed)), rotMin)
|
||||
|
||||
|
||||
val rotationChangeRate = 100.0
|
||||
val rotationChangeRate = 10.0
|
||||
|
||||
var yawForce = rotationChangeRate * sin(Math.toRadians(controller.roll.toDouble()))
|
||||
//for a bit of correction on the rolls limit it to a quarter the amount
|
||||
@@ -280,28 +266,7 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
yawForce *= abs(cos(Math.toRadians(controller.pitch.toDouble())))
|
||||
pitchForce *= abs(cos(Math.toRadians(controller.pitch.toDouble()))) * 1.5
|
||||
|
||||
var yawDeltaDeg = deltaTime * rotationChangeRate * sin(Math.toRadians(controller.roll.toDouble())) //sin(Math.toRadians(controller.roll.toDouble())) * abs(cos(Math.toRadians(controller.pitch.toDouble())))
|
||||
val trueYawDelt = yawDeltaDeg * abs(cos(Math.toRadians(controller.pitch.toDouble())))
|
||||
//val pitchedYawDelt = yawDeltaDeg - trueYawDelt
|
||||
|
||||
controller.applyGlobalYaw(trueYawDelt.toFloat())
|
||||
|
||||
val correctionRate = 5.0
|
||||
//Calculate correcting roll force.
|
||||
if(abs(controller.roll) > rotLimit) {
|
||||
state.currRollCorrectionForce.set(
|
||||
state.currRollCorrectionForce.get() + ((abs(controller.roll) - rotLimit) / 180 - rotLimit) * controller.roll.sign * correctionRate * deltaTime * 0.01
|
||||
)
|
||||
} else {
|
||||
state.currRollCorrectionForce.set(
|
||||
//reduce rollCorrection gradually and make sure to
|
||||
//state.currRollCorrectionForce.get() - max(correctionRate * deltaTime * 0.04, abs(state.currRollCorrectionForce.get())) * state.currRollCorrectionForce.get().sign
|
||||
lerp(state.currRollCorrectionForce.get(), 0.0, deltaTime * 0.98)
|
||||
)
|
||||
}
|
||||
|
||||
//yaw, pitch, roll
|
||||
return Vec3(0.0, 0.0, state.currRollCorrectionForce.get())
|
||||
return Vec3(yawForce, pitchForce, 0.0)
|
||||
}
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
@@ -335,14 +300,13 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
//modulated by speed so that when flapping idle in air you are ont wobbling around to look around
|
||||
val rotMin = 15.0
|
||||
var rollForce = xInput
|
||||
val rotLimit = max(handling * sqrt(normalizeVal(state.rideVelocity.get().length(), 0.0, topSpeed)), rotMin)
|
||||
val rotLimit = max(handling * normalizeVal(state.rideVel.get().length(), 0.0, topSpeed).pow(3), rotMin)
|
||||
|
||||
//Limit roll by non linearly decreasing inputs towards
|
||||
// a rotation limit based on the current distance from
|
||||
// that rotation limit
|
||||
if (abs(controller.roll + rollForce) < rotLimit) {
|
||||
if (sign(rollForce) == sign(controller.roll).toDouble()) {
|
||||
//Grab how far the current roll is away from the roll limit
|
||||
val d = abs(abs(controller.roll) - rotLimit)
|
||||
rollForce *= (d.pow(2)) / (rotLimit.pow(2))
|
||||
}
|
||||
@@ -351,18 +315,10 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
}
|
||||
|
||||
//Give the ability to yaw with x mouse input when at low speeds.
|
||||
val yawForce = xInput * ( 1.0 - sqrt(normalizeVal(state.rideVelocity.get().length(), 0.0, topSpeed)))
|
||||
|
||||
//Yaw locally a bit when up or down so that its more intuitive to make it out of a dive or a straight vertical
|
||||
//climb
|
||||
val yawForcePitched = xInput * sin(Math.toRadians(abs(controller.pitch.toDouble()))) * 0.25
|
||||
|
||||
|
||||
//Apply yaw globally as we don't want roll or pitch changes due to local yaw when looking up or down.
|
||||
controller.applyGlobalYaw(yawForce.toFloat())
|
||||
val yawForce = xInput * ( 1.0 - normalizeVal(state.rideVel.get().length(), 0.0, topSpeed).pow(3))
|
||||
|
||||
//yaw, pitch, roll
|
||||
return Vec3(yawForcePitched, yInput, rollForce)
|
||||
return Vec3(yawForce, yInput, rollForce)
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -422,7 +378,7 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
val glideTopSpeed = vehicle.runtime.resolveDouble(settings.glidespeedExpr)
|
||||
|
||||
//Must I ensure that topspeed is greater than minimum?
|
||||
val normalizedGlideSpeed = normalizeVal(state.rideVelocity.get().length(), topSpeed, glideTopSpeed)
|
||||
val normalizedGlideSpeed = normalizeVal(state.rideVel.get().length(), topSpeed, glideTopSpeed)
|
||||
|
||||
//Only ever want the fov change to be a max of 0.2 and for it to have non linear scaling.
|
||||
return 1.0f + normalizedGlideSpeed.pow(2).toFloat() * 0.2f
|
||||
@@ -477,7 +433,7 @@ class BirdAirBehaviour : RidingBehaviour<BirdAirSettings, BirdAirState> {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: BirdAirSettings) = BirdAirState()
|
||||
override fun createDefaultState() = BirdAirState()
|
||||
|
||||
}
|
||||
|
||||
@@ -501,7 +457,6 @@ class BirdAirSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(infiniteAltitude)
|
||||
buffer.writeExpression(infiniteStamina)
|
||||
buffer.writeExpression(glidespeedExpr)
|
||||
@@ -524,44 +479,47 @@ class BirdAirSettings : RidingBehaviourSettings {
|
||||
}
|
||||
}
|
||||
|
||||
class BirdAirState : RidingBehaviourState() {
|
||||
class BirdAirState : RidingBehaviourState {
|
||||
var rideVel = ridingState(Vec3.ZERO, Side.CLIENT)
|
||||
var stamina = ridingState(1.0f, Side.CLIENT)
|
||||
var gliding = ridingState(false, Side.CLIENT)
|
||||
var lastGlide = ridingState(-100L, Side.CLIENT)
|
||||
var currRollCorrectionForce = ridingState(0.0, Side.CLIENT)
|
||||
|
||||
override fun encode(buffer: FriendlyByteBuf) {
|
||||
super.encode(buffer)
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeVec3(rideVel.get())
|
||||
buffer.writeFloat(stamina.get())
|
||||
buffer.writeBoolean(gliding.get())
|
||||
}
|
||||
|
||||
override fun decode(buffer: FriendlyByteBuf) {
|
||||
super.decode(buffer)
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
rideVel.set(buffer.readVec3(), forced = true)
|
||||
stamina.set(buffer.readFloat(), forced = true)
|
||||
gliding.set(buffer.readBoolean(), forced = true)
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
super.reset()
|
||||
rideVel.set(Vec3.ZERO, forced = true)
|
||||
stamina.set(1.0f, forced = true)
|
||||
gliding.set(false, forced = true)
|
||||
lastGlide.set(-100L, forced = true)
|
||||
currRollCorrectionForce.set(0.0, forced = true)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "BirdAirState(rideVelocity=${rideVelocity.get()}, stamina=${stamina.get()}, gliding=${gliding.get()})"
|
||||
return "BirdAirState(rideVel=${rideVel.get()}, stamina=${stamina.get()}, gliding=${gliding.get()})"
|
||||
}
|
||||
|
||||
override fun copy() = BirdAirState().also {
|
||||
it.rideVelocity.set(this.rideVelocity.get(), forced = true)
|
||||
it.rideVel.set(this.rideVel.get(), forced = true)
|
||||
it.stamina.set(this.stamina.get(), forced = true)
|
||||
it.gliding.set(this.gliding.get(), forced = true)
|
||||
it.lastGlide.set(this.lastGlide.get(), forced = true)
|
||||
it.currRollCorrectionForce.set(this.currRollCorrectionForce.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous !is BirdAirState) return false
|
||||
if (previous.gliding.get() != gliding.get()) return true
|
||||
return super.shouldSync(previous)
|
||||
if (previous.rideVel != rideVel) return true
|
||||
if (previous.stamina != stamina) return true
|
||||
if (previous.gliding != gliding) return true
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -11,7 +11,6 @@ package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseProvider
|
||||
@@ -19,6 +18,7 @@ import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.SmoothDouble
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
@@ -35,7 +35,6 @@ class DolphinBehaviour : RidingBehaviour<DolphinSettings, DolphinState> {
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.LIQUID
|
||||
|
||||
val poseProvider = PoseProvider<DolphinSettings, DolphinState>(PoseType.FLOAT)
|
||||
.with(PoseOption(PoseType.SWIM) { _, _, entity -> entity.entityData.get(PokemonEntity.MOVING) })
|
||||
@@ -257,7 +256,7 @@ class DolphinBehaviour : RidingBehaviour<DolphinSettings, DolphinState> {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: DolphinSettings) = DolphinState()
|
||||
override fun createDefaultState() = DolphinState()
|
||||
|
||||
}
|
||||
|
||||
@@ -283,7 +282,6 @@ class DolphinSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(canJump)
|
||||
buffer.writeExpression(jumpVector[0])
|
||||
buffer.writeExpression(jumpVector[1])
|
||||
@@ -308,11 +306,13 @@ class DolphinSettings : RidingBehaviourSettings {
|
||||
}
|
||||
}
|
||||
|
||||
class DolphinState : RidingBehaviourState() {
|
||||
class DolphinState : RidingBehaviourState {
|
||||
var lastVelocity = ridingState(Vec3.ZERO, Side.BOTH)
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) = Unit
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) = Unit
|
||||
|
||||
override fun reset() {
|
||||
super.reset()
|
||||
lastVelocity.set(Vec3.ZERO, forced = true)
|
||||
}
|
||||
|
||||
@@ -321,8 +321,8 @@ class DolphinState : RidingBehaviourState() {
|
||||
}
|
||||
|
||||
override fun copy() = DolphinState().also {
|
||||
it.stamina.set(stamina.get(), forced = true)
|
||||
it.rideVelocity.set(rideVelocity.get(), forced = true)
|
||||
it.lastVelocity.set(lastVelocity.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState) = false
|
||||
}
|
||||
|
||||
+434
@@ -0,0 +1,434 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonBehaviourFlag
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.SmoothDouble
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class FallToGlideCompositeBehaviour : RidingBehaviour<FallToGlideCompositeSettings, FallToGlideCompositeState> {
|
||||
companion object {
|
||||
val KEY = cobblemonResource("composite/fall_to_glide")
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
|
||||
val landBehaviour: GenericLandBehaviour = GenericLandBehaviour()
|
||||
val glideBehaviour: GliderAirBehaviour = GliderAirBehaviour()
|
||||
|
||||
override fun tick(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
) {
|
||||
val shouldBeFlying = checkShouldBeFlying(settings, vehicle, state.activeController.get() == GliderAirBehaviour.KEY)
|
||||
if (state.activeController.get() == GliderAirBehaviour.KEY && !shouldBeFlying) { // && entity.onGround() && state.timeTransitioned + 20 < entity.level().gameTime) {
|
||||
state.activeController.set(GenericLandBehaviour.KEY)
|
||||
vehicle.setBehaviourFlag(PokemonBehaviourFlag.FLYING, false)
|
||||
} else if (state.activeController.get() == GenericLandBehaviour.KEY && shouldBeFlying) {
|
||||
state.activeController.set(GliderAirBehaviour.KEY)
|
||||
vehicle.setBehaviourFlag(PokemonBehaviourFlag.FLYING, true)
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkShouldBeFlying(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
vehicle: PokemonEntity,
|
||||
isFlyingAlready: Boolean
|
||||
): Boolean {
|
||||
val runtime = vehicle.runtime
|
||||
val minFallingSpeed = runtime.resolveFloat(settings.minimumFallSpeed)
|
||||
val minForwardSpeed = runtime.resolveFloat(settings.minimumForwardSpeed)
|
||||
val grounded = vehicle.onGround()
|
||||
return if (isFlyingAlready) {
|
||||
!grounded
|
||||
} else {
|
||||
vehicle.deltaMovement.y <= -minFallingSpeed && vehicle.deltaMovement.horizontalDistance() >= minForwardSpeed
|
||||
}
|
||||
}
|
||||
|
||||
override fun isActive(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun pose(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): PoseType {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.pose(settings.land, state.landState, vehicle)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.pose(settings.glide, NoState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun speed(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.speed(settings.land, state.landState, vehicle, driver)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.speed(settings.glide, NoState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rotation(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rotation(settings.land, state.landState, vehicle, driver)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.rotation(settings.glide, NoState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun velocity(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.velocity(settings.land, state.landState, vehicle, driver, input)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.velocity(settings.glide, NoState, vehicle, driver, input)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun angRollVel(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.angRollVel(
|
||||
settings.land,
|
||||
state.landState,
|
||||
vehicle,
|
||||
driver,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.angRollVel(settings.glide, NoState, vehicle, driver, deltaTime)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
mouseY: Double,
|
||||
mouseX: Double,
|
||||
mouseYSmoother: SmoothDouble,
|
||||
mouseXSmoother: SmoothDouble,
|
||||
sensitivity: Double,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rotationOnMouseXY(
|
||||
settings.land,
|
||||
state.landState,
|
||||
vehicle,
|
||||
driver,
|
||||
mouseY,
|
||||
mouseX,
|
||||
mouseYSmoother,
|
||||
mouseXSmoother,
|
||||
sensitivity,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.rotationOnMouseXY(
|
||||
settings.glide,
|
||||
NoState,
|
||||
vehicle,
|
||||
driver,
|
||||
mouseY,
|
||||
mouseX,
|
||||
mouseYSmoother,
|
||||
mouseXSmoother,
|
||||
sensitivity,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun canJump(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.canJump(settings.land, state.landState, vehicle, driver)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.canJump(settings.glide, NoState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun setRideBar(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.setRideBar(settings.land, state.landState, vehicle, driver)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.setRideBar(settings.glide, NoState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun jumpForce(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.jumpForce(
|
||||
settings.land,
|
||||
state.landState,
|
||||
vehicle,
|
||||
driver,
|
||||
jumpStrength
|
||||
)
|
||||
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.jumpForce(settings.glide, NoState, vehicle, driver, jumpStrength)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun gravity(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
regularGravity: Double
|
||||
): Double {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.gravity(settings.land, state.landState, vehicle, regularGravity)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.gravity(settings.glide, NoState, vehicle, regularGravity)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rideFovMultiplier(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rideFovMultiplier(settings.land, state.landState, vehicle, driver)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.rideFovMultiplier(settings.glide, NoState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun useAngVelSmoothing(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.useAngVelSmoothing(settings.land, state.landState, vehicle)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.useAngVelSmoothing(settings.glide, NoState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun useRidingAltPose(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.useRidingAltPose(settings.land, state.landState, vehicle, driver)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.useRidingAltPose(settings.glide, NoState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun inertia(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Double {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.inertia(settings.land, state.landState, vehicle)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.inertia(settings.glide, NoState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRoll(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRoll(settings.land, state.landState, vehicle)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.shouldRoll(settings.glide, NoState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun turnOffOnGround(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.turnOffOnGround(settings.land, state.landState, vehicle)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.turnOffOnGround(settings.glide, NoState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun dismountOnShift(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.dismountOnShift(settings.land, state.landState, vehicle)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.dismountOnShift(settings.glide, NoState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRotatePokemonHead(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRotatePokemonHead(settings.land, state.landState, vehicle)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.shouldRotatePokemonHead(settings.glide, NoState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRotatePlayerHead(
|
||||
settings: FallToGlideCompositeSettings,
|
||||
state: FallToGlideCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRotatePlayerHead(settings.land, state.landState, vehicle)
|
||||
GliderAirBehaviour.KEY -> glideBehaviour.shouldRotatePlayerHead(settings.glide, NoState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun createDefaultState() = FallToGlideCompositeState()
|
||||
|
||||
|
||||
}
|
||||
|
||||
class FallToGlideCompositeSettings : RidingBehaviourSettings {
|
||||
override val key = FallToGlideCompositeBehaviour.KEY
|
||||
|
||||
var glide: GliderAirSettings = GliderAirSettings()
|
||||
private set
|
||||
|
||||
var land: GenericLandSettings = GenericLandSettings()
|
||||
private set
|
||||
|
||||
var minimumForwardSpeed: Expression = "0.0".asExpression()
|
||||
private set
|
||||
|
||||
var minimumFallSpeed: Expression = "0.5".asExpression()
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
glide.encode(buffer)
|
||||
land.encode(buffer)
|
||||
buffer.writeExpression(minimumForwardSpeed)
|
||||
buffer.writeExpression(minimumFallSpeed)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
glide.decode(buffer)
|
||||
land.decode(buffer)
|
||||
minimumForwardSpeed = buffer.readExpression()
|
||||
minimumFallSpeed = buffer.readExpression()
|
||||
}
|
||||
}
|
||||
|
||||
class FallToGlideCompositeState : RidingBehaviourState {
|
||||
var activeController = ridingState(GenericLandBehaviour.KEY, Side.CLIENT)
|
||||
var landState: GenericLandState = GenericLandState()
|
||||
var timeTransitioned = ridingState(-100L, Side.BOTH)
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(activeController.get())
|
||||
landState.encode(buffer)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
activeController.set(buffer.readResourceLocation(), forced = true)
|
||||
landState.decode(buffer)
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
activeController.set(GenericLandBehaviour.KEY, forced = true)
|
||||
landState.reset()
|
||||
timeTransitioned.set(-100L, forced = true)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "FallToGlideCompositeState(activeController=$activeController, landState=$landState, timeTransitioned=$timeTransitioned)"
|
||||
}
|
||||
|
||||
override fun copy() = FallToGlideCompositeState().also {
|
||||
it.activeController.set(activeController.get(), forced = true)
|
||||
it.landState = landState.copy()
|
||||
it.timeTransitioned.set(timeTransitioned.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous !is FallToGlideCompositeState) return false
|
||||
if (activeController != previous.activeController) return true
|
||||
if (landState.shouldSync(previous.landState)) return true
|
||||
return false
|
||||
}
|
||||
}
|
||||
+110
-159
@@ -9,8 +9,7 @@
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.bedrockk.molang.runtime.MoLangMath.lerp
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseProvider
|
||||
@@ -18,14 +17,15 @@ import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.util.SmoothDouble
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import kotlin.math.*
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.pow
|
||||
|
||||
class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandState> {
|
||||
companion object {
|
||||
@@ -33,11 +33,10 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.LAND
|
||||
|
||||
val poseProvider = PoseProvider<GenericLandSettings, GenericLandState>(PoseType.STAND)
|
||||
.with(PoseOption(PoseType.WALK) { _, state, _ ->
|
||||
return@PoseOption abs(state.rideVelocity.get().z) > 0.2
|
||||
return@PoseOption state.rideVel.get().z > 0.1
|
||||
})
|
||||
|
||||
override fun isActive(
|
||||
@@ -73,102 +72,18 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return state.rideVelocity.get().length().toFloat()
|
||||
return state.rideVel.get().length().toFloat()
|
||||
}
|
||||
|
||||
override fun updatePassengerRotation(
|
||||
settings: GenericLandSettings,
|
||||
state: GenericLandState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
) {
|
||||
|
||||
//Take the inverse so that it cancels out how
|
||||
//much the entity rotates.
|
||||
val turnAmount = calcRotAmount(settings, state, vehicle, driver)
|
||||
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.speedExpr)
|
||||
val maxYawDiff = 90.0f
|
||||
|
||||
//Normalize the current rotation diff
|
||||
val rotMod = Mth.wrapDegrees(driver.yRot - vehicle.yRot) / maxYawDiff
|
||||
|
||||
val rotAmount = 10.0f
|
||||
|
||||
//Take the inverse so that you turn more at higher speeds
|
||||
val normSpeed = 1.0f - 0.5f*normalizeVal(state.rideVelocity.get().length(), 0.0, topSpeed).toFloat()
|
||||
|
||||
//driver.yRot += (entity.riding.deltaRotation.y - turnAmount)
|
||||
//driver.setYHeadRot(driver.yHeadRot + (entity.riding.deltaRotation.y) - turnAmount)
|
||||
}
|
||||
|
||||
override fun clampPassengerRotation(
|
||||
settings: GenericLandSettings,
|
||||
state: GenericLandState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
) {
|
||||
val f = Mth.wrapDegrees(driver.yRot - vehicle.yRot)
|
||||
val lookYawLimit = 90.0f
|
||||
val g = Mth.clamp(f, -lookYawLimit, lookYawLimit)
|
||||
driver.yRotO += g - f
|
||||
driver.yRot = driver.yRot + g - f
|
||||
driver.setYHeadRot(driver.yRot)
|
||||
}
|
||||
|
||||
|
||||
override fun rotation(
|
||||
settings: GenericLandSettings,
|
||||
state: GenericLandState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
val turnAmount = calcRotAmount(settings, state, vehicle, driver)
|
||||
|
||||
return Vec2(vehicle.xRot, vehicle.yRot + turnAmount )
|
||||
|
||||
return Vec2(driver.xRot * 0.5f, driver.yRot)
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculates the rotation amount given the difference between
|
||||
* the current player y rot and entity y rot. This gives the
|
||||
* affect of influencing a rides rotation through the mouse
|
||||
* without it being instant.
|
||||
*/
|
||||
fun calcRotAmount(
|
||||
settings: GenericLandSettings,
|
||||
state: GenericLandState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Float {
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.speedExpr)
|
||||
//In degrees per second
|
||||
val handling = vehicle.runtime.resolveDouble(settings.handlingExpr)
|
||||
val maxYawDiff = 90.0f
|
||||
|
||||
//Normalize the current rotation diff
|
||||
val rotDiff = Mth.wrapDegrees(driver.yRot - vehicle.yRot)
|
||||
val rotDiffNorm = rotDiff / maxYawDiff
|
||||
|
||||
//Take the square root so that the ride levels out quicker when at lower differences between entity
|
||||
//y and driver y
|
||||
//This influences the speed of the turn based on how far in one direction you're looking
|
||||
val rotDiffMod = (sqrt(abs(rotDiffNorm)) * rotDiffNorm.sign)
|
||||
|
||||
//Take the inverse so that you turn less at higher speeds
|
||||
val normSpeed = 1.0f // = 1.0f - 0.5f*normalizeVal(state.rideVelocityocity.length(), 0.0, topSpeed).toFloat()
|
||||
|
||||
// TODO: This needs to be tweaked with in game results and testing
|
||||
val turnRate = (handling.toFloat() / 20.0f) * 2
|
||||
|
||||
//Ensure you only ever rotate as much difference as there is between the angles.
|
||||
val turnSpeed = turnRate * rotDiffMod * normSpeed
|
||||
val rotAmount = turnSpeed.coerceIn(-abs(rotDiff), abs(rotDiff))
|
||||
|
||||
return rotAmount
|
||||
}
|
||||
|
||||
|
||||
override fun velocity(
|
||||
settings: GenericLandSettings,
|
||||
state: GenericLandState,
|
||||
@@ -176,16 +91,24 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
): Vec3 {
|
||||
//Limit horizontal velocity that may have accumulated through alternate behaviour
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.speedExpr)
|
||||
val currVel = state.rideVelocity.get()
|
||||
// state.rideVelocity.set(Vec3(
|
||||
// max(currVel.x, topSpeed),
|
||||
// currVel.y,
|
||||
// max(currVel.z, topSpeed)
|
||||
// ))
|
||||
val runtime = vehicle.runtime
|
||||
val driveFactor = runtime.resolveFloat(settings.driveFactor)
|
||||
val strafeFactor = runtime.resolveFloat(settings.strafeFactor)
|
||||
val f = driver.xxa * strafeFactor
|
||||
var g = driver.zza * driveFactor
|
||||
if (g <= 0.0f) {
|
||||
g *= runtime.resolveFloat(settings.reverseDriveFactor)
|
||||
}
|
||||
val gravity = -1.0
|
||||
|
||||
state.rideVelocity.set(calculateRideSpaceVel(settings, state, vehicle, driver))
|
||||
val newVelocity = calculateRideSpaceVel(settings, state, vehicle, driver)
|
||||
|
||||
//Jump the thang!
|
||||
if (driver.jumping && vehicle.onGround()) {
|
||||
state.rideVel.set(Vec3(newVelocity.x, 2.0, newVelocity.z))
|
||||
} else {
|
||||
state.rideVel.set(newVelocity)
|
||||
}
|
||||
|
||||
//This is cheap.
|
||||
//Also make it stop quicker the slower it is.
|
||||
@@ -195,7 +118,7 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
|
||||
//entity.deltaMovement = entity.deltaMovement.lerp(velocity, 1.0)
|
||||
//state.currVel = state.currVel.add( f.toDouble() / 20.0, gravity / 20.0 , g.toDouble() / 20.0)
|
||||
return state.rideVelocity.get()
|
||||
return state.rideVel.get()
|
||||
}
|
||||
|
||||
private fun calculateRideSpaceVel(
|
||||
@@ -204,59 +127,35 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Vec3 {
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.speedExpr)
|
||||
val accel = vehicle.runtime.resolveDouble(settings.accelerationExpr)
|
||||
val speed = state.rideVelocity.get().length()
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.topSpeedExpr)
|
||||
val accel = vehicle.runtime.resolveDouble(settings.accelExpr)
|
||||
val speed = state.rideVel.get().length()
|
||||
|
||||
//Flag for determining if player is actively inputting
|
||||
var activeInput = false
|
||||
|
||||
var newVelocity = Vec3(state.rideVelocity.get().x, state.rideVelocity.get().y, state.rideVelocity.get().z)
|
||||
val minSpeed = 0.0
|
||||
|
||||
var newVelocity = Vec3(state.rideVel.get().x, state.rideVel.get().y, state.rideVel.get().z)
|
||||
|
||||
//speed up and slow down based on input
|
||||
if (driver.zza != 0.0f && state.stamina.get() > 0.0) {
|
||||
//make sure it can't exceed top speed
|
||||
val forwardInput = when {
|
||||
driver.zza > 0 && newVelocity.z > topSpeed -> 0.0
|
||||
driver.zza < 0 && newVelocity.z < (-topSpeed / 3.0) -> 0.0
|
||||
else -> driver.zza.sign
|
||||
}
|
||||
if (driver.zza > 0.0 && speed <= topSpeed && state.stamina.get() > 0.0f) {
|
||||
//modify acceleration to be slower when at closer speeds to top speed
|
||||
val accelMod = max((normalizeSpeed(speed, minSpeed, topSpeed) - 1).pow(2), 0.1)
|
||||
newVelocity = Vec3(newVelocity.x, newVelocity.y, min(newVelocity.z + (accel * accelMod), topSpeed))
|
||||
} else if (driver.zza >= 0.0 && state.stamina.get() == 0.0f || speed > topSpeed) {
|
||||
newVelocity = Vec3(newVelocity.x, newVelocity.y, max(newVelocity.z - ((accel) / 4), minSpeed))
|
||||
} else if (driver.zza < 0.0 && speed > minSpeed) {
|
||||
//modify deccel to be slower when at closer speeds to minimum speed
|
||||
val deccelMod = max(-(normalizeSpeed(speed, minSpeed, topSpeed)) + 1, 0.0)
|
||||
|
||||
newVelocity = Vec3(
|
||||
newVelocity.x,
|
||||
newVelocity.y,
|
||||
(newVelocity.z + (accel * forwardInput.toDouble())))
|
||||
|
||||
activeInput = true
|
||||
//Decelerate currently always a constant half of max acceleration.
|
||||
newVelocity =
|
||||
Vec3(newVelocity.x, newVelocity.y, max(newVelocity.z - ((accel * deccelMod) / 2), minSpeed))
|
||||
}
|
||||
|
||||
//Gravity logic
|
||||
if (vehicle.onGround()) {
|
||||
newVelocity = Vec3(newVelocity.x, 0.0, newVelocity.z)
|
||||
} else {
|
||||
val gravity = (9.8 / ( 20.0)) * 0.2
|
||||
val terminalVel = 2.0
|
||||
|
||||
val fallingForce = gravity - ( newVelocity.z.sign *gravity *(abs(newVelocity.z) / 2.0))
|
||||
newVelocity = Vec3(newVelocity.x, max(newVelocity.y - fallingForce, -terminalVel), newVelocity.z)
|
||||
newVelocity = Vec3(newVelocity.x, max(newVelocity.y - 0.2, -1.0), newVelocity.z)
|
||||
}
|
||||
|
||||
//ground Friction
|
||||
if( abs(newVelocity.z) > 0 && vehicle.onGround() && !activeInput) {
|
||||
newVelocity = newVelocity.subtract(0.0, 0.0, min(0.03 * newVelocity.z.sign, newVelocity.z))
|
||||
}
|
||||
|
||||
//Jump the thang!
|
||||
if (driver.jumping && vehicle.onGround()) {
|
||||
val jumpVel = 1.0
|
||||
newVelocity = newVelocity.add(0.0, 1.0, 0.0)
|
||||
|
||||
//Ensure this doesn't add unwanted forward velocity
|
||||
val mag = if(newVelocity.length() < topSpeed) newVelocity.length() else topSpeed
|
||||
newVelocity = newVelocity.normalize().scale(mag)
|
||||
}
|
||||
|
||||
return newVelocity
|
||||
}
|
||||
|
||||
@@ -264,7 +163,7 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
* Normalizes the current speed between minSpeed and maxSpeed.
|
||||
* The result is clamped between 0.0 and 1.0, where 0.0 represents minSpeed and 1.0 represents maxSpeed.
|
||||
*/
|
||||
private fun normalizeVal(currSpeed: Double, minSpeed: Double, maxSpeed: Double): Double {
|
||||
private fun normalizeSpeed(currSpeed: Double, minSpeed: Double, maxSpeed: Double): Double {
|
||||
require(maxSpeed > minSpeed) { "maxSpeed must be greater than minSpeed" }
|
||||
return ((currSpeed - minSpeed) / (maxSpeed - minSpeed)).coerceIn(0.0, 1.0)
|
||||
}
|
||||
@@ -316,6 +215,8 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
driver: Player
|
||||
): Float {
|
||||
//Retrieve stamina from state and tick up at a rate of 0.1 a second
|
||||
val staminaGain = (1.0 / 20.0) * 0.1
|
||||
state.stamina.set(min(state.stamina.get() + staminaGain, 1.0).toFloat())
|
||||
return (state.stamina.get() / 1.0f)
|
||||
}
|
||||
|
||||
@@ -326,7 +227,10 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
): Vec3 {
|
||||
return Vec3.ZERO
|
||||
val runtime = vehicle.runtime
|
||||
runtime.environment.query.addFunction("jump_strength") { DoubleValue(jumpStrength.toDouble()) }
|
||||
val jumpVector = settings.jumpVector.map { runtime.resolveFloat(it) }
|
||||
return Vec3(jumpVector[0].toDouble(), jumpVector[1].toDouble(), jumpVector[2].toDouble())
|
||||
}
|
||||
|
||||
override fun gravity(
|
||||
@@ -412,21 +316,30 @@ class GenericLandBehaviour : RidingBehaviour<GenericLandSettings, GenericLandSta
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: GenericLandSettings) = GenericLandState()
|
||||
override fun createDefaultState() = GenericLandState()
|
||||
}
|
||||
|
||||
class GenericLandSettings : RidingBehaviourSettings {
|
||||
override val key = GenericLandBehaviour.KEY
|
||||
|
||||
var canJump = "true".asExpression()
|
||||
var driveFactor = "1.0".asExpression()
|
||||
private set
|
||||
|
||||
var speedExpr: Expression = "q.get_ride_stats('SPEED', 'LAND', 1.0, 0.3)".asExpression()
|
||||
var strafeFactor = "0.2".asExpression()
|
||||
private set
|
||||
|
||||
var reverseDriveFactor = "0.25".asExpression()
|
||||
private set
|
||||
|
||||
var topSpeedExpr: Expression = "q.get_ride_stats('SPEED', 'LAND', 1.0, 0.3)".asExpression()
|
||||
private set
|
||||
|
||||
// Max accel is a whole 1.0 in 1 second. The conversion in the function below is to convert seconds to ticks
|
||||
var accelerationExpr: Expression =
|
||||
"q.get_ride_stats('ACCELERATION', 'LAND', (1.0 / (20.0 * 1.5)), (1.0 / (20.0 * 5.0)))".asExpression()
|
||||
var accelExpr: Expression =
|
||||
"q.get_ride_stats('ACCELERATION', 'LAND', (1.0 / (20.0 * 0.5)), (1.0 / (20.0 * 5.0)))".asExpression()
|
||||
private set
|
||||
|
||||
var jumpVector = listOf("0".asExpression(), "0.3".asExpression(), "0".asExpression())
|
||||
private set
|
||||
|
||||
// Between 30 seconds and 10 seconds at the lowest when at full speed.
|
||||
@@ -441,17 +354,30 @@ class GenericLandSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(speedExpr)
|
||||
buffer.writeExpression(accelerationExpr)
|
||||
buffer.writeExpression(driveFactor)
|
||||
buffer.writeExpression(strafeFactor)
|
||||
buffer.writeExpression(reverseDriveFactor)
|
||||
buffer.writeExpression(topSpeedExpr)
|
||||
buffer.writeExpression(accelExpr)
|
||||
buffer.writeExpression(jumpVector[0])
|
||||
buffer.writeExpression(jumpVector[1])
|
||||
buffer.writeExpression(jumpVector[2])
|
||||
buffer.writeExpression(staminaExpr)
|
||||
buffer.writeExpression(jumpExpr)
|
||||
buffer.writeExpression(handlingExpr)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
speedExpr = buffer.readExpression()
|
||||
accelerationExpr = buffer.readExpression()
|
||||
driveFactor = buffer.readExpression()
|
||||
strafeFactor = buffer.readExpression()
|
||||
reverseDriveFactor = buffer.readExpression()
|
||||
topSpeedExpr = buffer.readExpression()
|
||||
accelExpr = buffer.readExpression()
|
||||
jumpVector = listOf(
|
||||
buffer.readExpression(),
|
||||
buffer.readExpression(),
|
||||
buffer.readExpression()
|
||||
)
|
||||
staminaExpr = buffer.readExpression()
|
||||
jumpExpr = buffer.readExpression()
|
||||
handlingExpr = buffer.readExpression()
|
||||
@@ -459,16 +385,41 @@ class GenericLandSettings : RidingBehaviourSettings {
|
||||
|
||||
}
|
||||
|
||||
class GenericLandState : RidingBehaviourState() {
|
||||
class GenericLandState : RidingBehaviourState {
|
||||
var rideVel = ridingState(Vec3.ZERO, Side.CLIENT)
|
||||
var stamina = ridingState(1.0f, Side.CLIENT)
|
||||
var currSpeed = ridingState(0.0, Side.BOTH)
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeVec3(rideVel.get())
|
||||
buffer.writeFloat(stamina.get())
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
rideVel.set(buffer.readVec3(), forced = true)
|
||||
stamina.set(buffer.readFloat(), forced = true)
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
rideVel.set(Vec3.ZERO, forced = true)
|
||||
stamina.set(1.0f, forced = true)
|
||||
currSpeed.set(0.0, forced = true)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "GenericLandState(rideVel=${rideVel.get()}, stamina=${stamina.get()}, currSpeed=${currSpeed.get()})"
|
||||
}
|
||||
|
||||
override fun copy() = GenericLandState().also {
|
||||
it.rideVelocity.set(this.rideVelocity.get(), forced = true)
|
||||
it.rideVel.set(this.rideVel.get(), forced = true)
|
||||
it.stamina.set(this.stamina.get(), forced = true)
|
||||
it.currSpeed.set(this.currSpeed.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous !is GenericLandState) return false
|
||||
return super.shouldSync(previous)
|
||||
if (rideVel != previous.rideVel) return true
|
||||
if (stamina != previous.stamina) return true
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
+24
-27
@@ -11,8 +11,7 @@ package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.NoState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
@@ -29,18 +28,17 @@ import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
|
||||
class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviourState> {
|
||||
class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, NoState> {
|
||||
companion object {
|
||||
val KEY = cobblemonResource("swim/generic")
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.LIQUID
|
||||
|
||||
val poseProvider = PoseProvider<GenericSwimSettings, RidingBehaviourState>(PoseType.FLOAT)
|
||||
val poseProvider = PoseProvider<GenericSwimSettings, NoState>(PoseType.FLOAT)
|
||||
.with(PoseOption(PoseType.SWIM) { _, _, entity -> entity.isSwimming && entity.entityData.get(PokemonEntity.MOVING) })
|
||||
|
||||
override fun isActive(settings: GenericSwimSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun isActive(settings: GenericSwimSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return Shapes.create(vehicle.boundingBox).blockPositionsAsListRounded().any {
|
||||
if (vehicle.isInWater || vehicle.isUnderWater) {
|
||||
return@any true
|
||||
@@ -50,17 +48,17 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
}
|
||||
}
|
||||
|
||||
override fun pose(settings: GenericSwimSettings, state: RidingBehaviourState, vehicle: PokemonEntity): PoseType {
|
||||
override fun pose(settings: GenericSwimSettings, state: NoState, vehicle: PokemonEntity): PoseType {
|
||||
return poseProvider.select(settings, state, vehicle)
|
||||
}
|
||||
|
||||
override fun speed(settings: GenericSwimSettings, state: RidingBehaviourState, vehicle: PokemonEntity, driver: Player): Float {
|
||||
override fun speed(settings: GenericSwimSettings, state: NoState, vehicle: PokemonEntity, driver: Player): Float {
|
||||
return vehicle.runtime.resolveFloat(settings.speed)
|
||||
}
|
||||
|
||||
override fun rotation(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
@@ -69,7 +67,7 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun velocity(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
@@ -90,7 +88,7 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun angRollVel(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
deltaTime: Double
|
||||
@@ -100,7 +98,7 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
mouseY: Double,
|
||||
@@ -120,7 +118,7 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun canJump(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
@@ -129,7 +127,7 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun setRideBar(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
@@ -138,7 +136,7 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun jumpForce(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
@@ -151,7 +149,7 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun gravity(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
regularGravity: Double
|
||||
): Double {
|
||||
@@ -160,45 +158,45 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun rideFovMultiplier(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return 1.0f
|
||||
}
|
||||
|
||||
override fun useAngVelSmoothing(settings: GenericSwimSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun useAngVelSmoothing(settings: GenericSwimSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun useRidingAltPose(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun inertia(settings: GenericSwimSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Double {
|
||||
override fun inertia(settings: GenericSwimSettings, state: NoState, vehicle: PokemonEntity): Double {
|
||||
return 0.5
|
||||
}
|
||||
|
||||
override fun shouldRoll(settings: GenericSwimSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun shouldRoll(settings: GenericSwimSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun turnOffOnGround(settings: GenericSwimSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun turnOffOnGround(settings: GenericSwimSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun dismountOnShift(settings: GenericSwimSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun dismountOnShift(settings: GenericSwimSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun shouldRotatePokemonHead(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
@@ -206,13 +204,13 @@ class GenericSwimBehaviour : RidingBehaviour<GenericSwimSettings, RidingBehaviou
|
||||
|
||||
override fun shouldRotatePlayerHead(
|
||||
settings: GenericSwimSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: GenericSwimSettings) = RidingBehaviourState()
|
||||
override fun createDefaultState() = NoState
|
||||
|
||||
}
|
||||
|
||||
@@ -238,7 +236,6 @@ class GenericSwimSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(canJump)
|
||||
buffer.writeExpression(jumpVector[0])
|
||||
buffer.writeExpression(jumpVector[1])
|
||||
|
||||
+24
-26
@@ -12,7 +12,7 @@ import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.NoState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
@@ -29,32 +29,31 @@ import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, RidingBehaviourState> {
|
||||
class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, NoState> {
|
||||
companion object {
|
||||
val KEY = cobblemonResource("air/glider")
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.AIR
|
||||
|
||||
val poseProvider = PoseProvider<GliderAirSettings, RidingBehaviourState>(PoseType.HOVER)
|
||||
val poseProvider = PoseProvider<GliderAirSettings, NoState>(PoseType.HOVER)
|
||||
.with(PoseOption(PoseType.FLY) { _, _, entity -> entity.entityData.get(PokemonEntity.MOVING) })
|
||||
|
||||
override fun isActive(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun isActive(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun pose(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): PoseType {
|
||||
override fun pose(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): PoseType {
|
||||
return poseProvider.select(settings, state, vehicle)
|
||||
}
|
||||
|
||||
override fun speed(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity, driver: Player): Float {
|
||||
override fun speed(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity, driver: Player): Float {
|
||||
return vehicle.runtime.resolveFloat(settings.speed)
|
||||
}
|
||||
|
||||
override fun rotation(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
@@ -63,7 +62,7 @@ class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, RidingBehaviourSta
|
||||
|
||||
override fun velocity(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
@@ -78,7 +77,7 @@ class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, RidingBehaviourSta
|
||||
|
||||
override fun angRollVel(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
deltaTime: Double
|
||||
@@ -88,7 +87,7 @@ class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, RidingBehaviourSta
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
mouseY: Double,
|
||||
@@ -106,13 +105,13 @@ class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, RidingBehaviourSta
|
||||
return Vec3(0.0, mouseY * invertPitch, mouseX * invertRoll)
|
||||
}
|
||||
|
||||
override fun canJump(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity, driver: Player): Boolean {
|
||||
override fun canJump(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity, driver: Player): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun setRideBar(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
@@ -121,7 +120,7 @@ class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, RidingBehaviourSta
|
||||
|
||||
override fun jumpForce(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
@@ -131,7 +130,7 @@ class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, RidingBehaviourSta
|
||||
|
||||
override fun gravity(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
regularGravity: Double
|
||||
): Double {
|
||||
@@ -140,51 +139,51 @@ class GliderAirBehaviour : RidingBehaviour<GliderAirSettings, RidingBehaviourSta
|
||||
|
||||
override fun rideFovMultiplier(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return 1.0f
|
||||
}
|
||||
|
||||
override fun useAngVelSmoothing(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun useAngVelSmoothing(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun useRidingAltPose(
|
||||
settings: GliderAirSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun inertia(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Double {
|
||||
override fun inertia(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): Double {
|
||||
return 0.5
|
||||
}
|
||||
|
||||
override fun shouldRoll(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun shouldRoll(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun turnOffOnGround(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun turnOffOnGround(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun dismountOnShift(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun dismountOnShift(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun shouldRotatePokemonHead(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun shouldRotatePokemonHead(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun shouldRotatePlayerHead(settings: GliderAirSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun shouldRotatePlayerHead(settings: GliderAirSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: GliderAirSettings) = RidingBehaviourState()
|
||||
override fun createDefaultState() = NoState
|
||||
}
|
||||
|
||||
class GliderAirSettings : RidingBehaviourSettings {
|
||||
@@ -200,7 +199,6 @@ class GliderAirSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(glideSpeed)
|
||||
buffer.writeExpression(speed)
|
||||
buffer.writeExpression(canStrafe)
|
||||
|
||||
+24
-27
@@ -11,8 +11,7 @@ package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.NoState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
@@ -32,19 +31,18 @@ import kotlin.math.abs
|
||||
import kotlin.math.pow
|
||||
import kotlin.math.sin
|
||||
|
||||
class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourState> {
|
||||
class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, NoState> {
|
||||
companion object {
|
||||
val KEY = cobblemonResource("air/helicopter")
|
||||
val ROTATION_LIMIT = 30.0f
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.AIR
|
||||
|
||||
val poseProvider = PoseProvider<HelicopterSettings, RidingBehaviourState>(PoseType.HOVER)
|
||||
val poseProvider = PoseProvider<HelicopterSettings, NoState>(PoseType.HOVER)
|
||||
.with(PoseOption(PoseType.FLY) { _, _, entity -> entity.entityData.get(PokemonEntity.MOVING) })
|
||||
|
||||
override fun isActive(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun isActive(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
//If there are only fluid blocks or air block below the ride
|
||||
//then activate the controller. If it is in water the ride will
|
||||
//dismount accordingly
|
||||
@@ -58,11 +56,11 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
}
|
||||
}
|
||||
|
||||
override fun pose(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity): PoseType {
|
||||
override fun pose(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity): PoseType {
|
||||
return poseProvider.select(settings, state, vehicle)
|
||||
}
|
||||
|
||||
override fun speed(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity, driver: Player): Float {
|
||||
override fun speed(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity, driver: Player): Float {
|
||||
//Increased max speed to exaggerate movement.
|
||||
//This likely just needs to be a static number if it really is just
|
||||
//the scalar for the velocity vector
|
||||
@@ -71,7 +69,7 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun rotation(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
@@ -80,7 +78,7 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun velocity(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
@@ -109,7 +107,7 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun angRollVel(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
deltaTime: Double
|
||||
@@ -164,7 +162,7 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
mouseY: Double,
|
||||
@@ -184,7 +182,7 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun canJump(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
@@ -193,7 +191,7 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun setRideBar(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
@@ -202,7 +200,7 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun jumpForce(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
@@ -212,7 +210,7 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun gravity(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
regularGravity: Double
|
||||
): Double {
|
||||
@@ -221,55 +219,55 @@ class HelicopterBehaviour : RidingBehaviour<HelicopterSettings, RidingBehaviourS
|
||||
|
||||
override fun rideFovMultiplier(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return 1.0f
|
||||
}
|
||||
|
||||
override fun useAngVelSmoothing(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun useAngVelSmoothing(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun useRidingAltPose(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun inertia(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Double {
|
||||
override fun inertia(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity): Double {
|
||||
return 0.1
|
||||
}
|
||||
|
||||
override fun shouldRoll(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun shouldRoll(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun turnOffOnGround(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun turnOffOnGround(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun dismountOnShift(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun dismountOnShift(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun shouldRotatePokemonHead(
|
||||
settings: HelicopterSettings,
|
||||
state: RidingBehaviourState,
|
||||
state: NoState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun shouldRotatePlayerHead(settings: HelicopterSettings, state: RidingBehaviourState, vehicle: PokemonEntity): Boolean {
|
||||
override fun shouldRotatePlayerHead(settings: HelicopterSettings, state: NoState, vehicle: PokemonEntity): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: HelicopterSettings) = RidingBehaviourState()
|
||||
override fun createDefaultState() = NoState
|
||||
}
|
||||
|
||||
|
||||
@@ -289,7 +287,6 @@ class HelicopterSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(gravity)
|
||||
buffer.writeExpression(horizontalAcceleration)
|
||||
buffer.writeExpression(verticalVelocity)
|
||||
|
||||
-479
@@ -1,479 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.bedrockk.molang.runtime.MoLangMath.lerp
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseProvider
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.util.SmoothDouble
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import kotlin.math.*
|
||||
|
||||
class HoverBehaviour : RidingBehaviour<HoverSettings, HoverState> {
|
||||
companion object {
|
||||
val KEY = cobblemonResource("air/hover")
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.AIR
|
||||
|
||||
val poseProvider = PoseProvider<HoverSettings, HoverState>(PoseType.STAND)
|
||||
.with(PoseOption(PoseType.WALK) { _, state, _ ->
|
||||
return@PoseOption abs(state.rideVelocity.get().z) > 0.2
|
||||
})
|
||||
|
||||
override fun isActive(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return Shapes.create(vehicle.boundingBox).blockPositionsAsListRounded().any {
|
||||
//Need to check other fluids
|
||||
if (vehicle.isInWater || vehicle.isUnderWater) {
|
||||
return@any false
|
||||
}
|
||||
//This might not actually work, depending on what the yPos actually is. yPos of the middle of the entity? the feet?
|
||||
if (it.y.toDouble() == (vehicle.position().y)) {
|
||||
val blockState = vehicle.level().getBlockState(it.below())
|
||||
return@any !blockState.isAir && blockState.fluidState.isEmpty
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
override fun pose(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): PoseType {
|
||||
return this.poseProvider.select(settings, state, vehicle)
|
||||
}
|
||||
|
||||
override fun speed(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return state.rideVelocity.get().length().toFloat()
|
||||
}
|
||||
|
||||
override fun updatePassengerRotation(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
) {
|
||||
|
||||
//Take the inverse so that it cancels out how
|
||||
//much the entity rotates.
|
||||
val turnAmount = calcRotAmount(settings, state, vehicle, driver)
|
||||
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.speedExpr)
|
||||
val maxYawDiff = 90.0f
|
||||
|
||||
//Normalize the current rotation diff
|
||||
val rotMod = Mth.wrapDegrees(driver.yRot - vehicle.yRot) / maxYawDiff
|
||||
|
||||
val rotAmount = 10.0f
|
||||
|
||||
//Take the inverse so that you turn more at higher speeds
|
||||
val normSpeed = 1.0f - 0.5f*normalizeVal(state.rideVelocity.get().length(), 0.0, topSpeed).toFloat()
|
||||
|
||||
//driver.yRot += (entity.riding.deltaRotation.y - turnAmount)
|
||||
//driver.setYHeadRot(driver.yHeadRot + (entity.riding.deltaRotation.y) - turnAmount)
|
||||
}
|
||||
|
||||
override fun clampPassengerRotation(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
) {
|
||||
val f = Mth.wrapDegrees(driver.yRot - vehicle.yRot)
|
||||
val lookYawLimit = 90.0f
|
||||
val g = Mth.clamp(f, -lookYawLimit, lookYawLimit)
|
||||
driver.yRotO += g - f
|
||||
driver.yRot = driver.yRot + g - f
|
||||
driver.setYHeadRot(driver.yRot)
|
||||
}
|
||||
|
||||
|
||||
override fun rotation(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
val turnAmount = calcRotAmount(settings, state, vehicle, driver)
|
||||
|
||||
return Vec2(driver.xRot, vehicle.yRot + turnAmount )
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculates the rotation amount given the difference between
|
||||
* the current player y rot and entity y rot. This gives the
|
||||
* affect of influencing a rides rotation through the mouse
|
||||
* without it being instant.
|
||||
*/
|
||||
fun calcRotAmount(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Float {
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.speedExpr)
|
||||
//In degrees per second
|
||||
val handling = vehicle.runtime.resolveDouble(settings.handlingExpr)
|
||||
val maxYawDiff = 90.0f
|
||||
|
||||
//Normalize the current rotation diff
|
||||
val rotDiff = Mth.wrapDegrees(driver.yRot - vehicle.yRot)
|
||||
val rotDiffNorm = rotDiff / maxYawDiff
|
||||
|
||||
//Take the square root so that the ride levels out quicker when at lower differences between entity
|
||||
//y and driver y
|
||||
//This influences the speed of the turn based on how far in one direction you're looking
|
||||
val rotDiffMod = (sqrt(abs(rotDiffNorm)) * rotDiffNorm.sign)
|
||||
|
||||
//Take the inverse so that you turn less at higher speeds
|
||||
val normSpeed = 1.0f // = 1.0f - 0.5f*normalizeVal(state.rideVelocityocity.length(), 0.0, topSpeed).toFloat()
|
||||
|
||||
// TODO: This needs to be tweaked with in game results and testing
|
||||
val turnRate = (handling.toFloat() / 20.0f) * 2
|
||||
|
||||
//Ensure you only ever rotate as much difference as there is between the angles.
|
||||
val turnSpeed = turnRate * rotDiffMod * normSpeed
|
||||
val rotAmount = turnSpeed.coerceIn(-abs(rotDiff), abs(rotDiff))
|
||||
|
||||
return rotAmount
|
||||
}
|
||||
|
||||
|
||||
override fun velocity(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
): Vec3 {
|
||||
|
||||
val strafeFactor = 0.2
|
||||
val f = driver.xxa * strafeFactor
|
||||
var g = driver.zza
|
||||
if (g <= 0.0f) {
|
||||
g *= -1.0f
|
||||
}
|
||||
|
||||
return calculateRideSpaceVel(settings, state, vehicle, driver).scale(10.0)
|
||||
}
|
||||
|
||||
private fun calculateRideSpaceVel(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Vec3 {
|
||||
val topSpeed = vehicle.runtime.resolveDouble(settings.speedExpr)
|
||||
val accel = vehicle.runtime.resolveDouble(settings.accelerationExpr)
|
||||
val speed = state.rideVelocity.get().length()
|
||||
|
||||
//Flag for determining if player is actively inputting
|
||||
var activeInput = false
|
||||
|
||||
val minSpeed = 0.0
|
||||
|
||||
var newVelocity = Vec3(state.rideVelocity.get().x, state.rideVelocity.get().y, state.rideVelocity.get().z)
|
||||
|
||||
var jumpVec = Vec3.ZERO
|
||||
|
||||
|
||||
//speed up and slow down based on input
|
||||
if (driver.zza != 0.0f && state.stamina.get() > 0.0) {
|
||||
//make sure it can't exceed top speed
|
||||
val forwardInput = when {
|
||||
driver.zza > 0 && newVelocity.z > topSpeed -> 0.0
|
||||
driver.zza < 0 && newVelocity.z < (-topSpeed / 3.0) -> 0.0
|
||||
else -> driver.zza.sign
|
||||
}
|
||||
|
||||
newVelocity = Vec3(
|
||||
newVelocity.x,
|
||||
newVelocity.y,
|
||||
(newVelocity.z + (accel * forwardInput.toDouble())))
|
||||
|
||||
activeInput = true
|
||||
jumpVec = jumpVec.add(0.0, 0.0, forwardInput.toDouble())
|
||||
}
|
||||
|
||||
//speed up and slow down based on input
|
||||
if (driver.xxa != 0.0f && state.stamina.get() > 0.0) {
|
||||
//make sure it can't exceed top speed
|
||||
val forwardInput = when {
|
||||
driver.xxa > 0 && newVelocity.x > topSpeed -> 0.0
|
||||
driver.xxa < 0 && newVelocity.x < (-topSpeed / 3.0) -> 0.0
|
||||
else -> driver.xxa.sign
|
||||
}
|
||||
|
||||
newVelocity = Vec3(
|
||||
newVelocity.x + (accel * forwardInput.toDouble()),
|
||||
newVelocity.y,
|
||||
(newVelocity.z ))
|
||||
|
||||
activeInput = true
|
||||
}
|
||||
|
||||
//Vertical movement based on driver input.
|
||||
val vertTopSpeed = topSpeed / 2.0
|
||||
val vertInput = when {
|
||||
driver.jumping -> 1.0
|
||||
driver.isShiftKeyDown -> -1.0
|
||||
else -> 0.0
|
||||
}
|
||||
|
||||
if (vertInput != 0.0 && state.stamina.get() > 0.0) {
|
||||
newVelocity = Vec3(
|
||||
newVelocity.x,
|
||||
(newVelocity.y + (accel * vertInput)).coerceIn(-vertTopSpeed, vertTopSpeed),
|
||||
newVelocity.z)
|
||||
activeInput = true
|
||||
}
|
||||
|
||||
|
||||
//air Friction
|
||||
|
||||
|
||||
|
||||
return newVelocity
|
||||
}
|
||||
|
||||
/*
|
||||
* Normalizes the current speed between minSpeed and maxSpeed.
|
||||
* The result is clamped between 0.0 and 1.0, where 0.0 represents minSpeed and 1.0 represents maxSpeed.
|
||||
*/
|
||||
private fun normalizeVal(currSpeed: Double, minSpeed: Double, maxSpeed: Double): Double {
|
||||
require(maxSpeed > minSpeed) { "maxSpeed must be greater than minSpeed" }
|
||||
return ((currSpeed - minSpeed) / (maxSpeed - minSpeed)).coerceIn(0.0, 1.0)
|
||||
}
|
||||
|
||||
override fun angRollVel(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return Vec3.ZERO
|
||||
}
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
mouseY: Double,
|
||||
mouseX: Double,
|
||||
mouseYSmoother: SmoothDouble,
|
||||
mouseXSmoother: SmoothDouble,
|
||||
sensitivity: Double,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
//Smooth out mouse input.
|
||||
val smoothingSpeed = 4
|
||||
val xInput = mouseXSmoother.getNewDeltaValue(mouseX * 0.1, deltaTime * smoothingSpeed);
|
||||
val yInput = mouseYSmoother.getNewDeltaValue(mouseY * 0.1, deltaTime * smoothingSpeed);
|
||||
|
||||
//yaw, pitch, roll
|
||||
return Vec3(0.0, yInput, xInput)
|
||||
}
|
||||
|
||||
override fun canJump(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun setRideBar(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
//Retrieve stamina from state and use it to set the "stamina bar"
|
||||
return (state.stamina.get() / 1.0f)
|
||||
}
|
||||
|
||||
override fun jumpForce(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
): Vec3 {
|
||||
return Vec3.ZERO
|
||||
}
|
||||
|
||||
override fun gravity(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
regularGravity: Double
|
||||
): Double {
|
||||
return 0.0
|
||||
}
|
||||
|
||||
override fun rideFovMultiplier(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return 1.0f
|
||||
}
|
||||
|
||||
override fun useAngVelSmoothing(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun useRidingAltPose(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun inertia(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): Double {
|
||||
return 0.05
|
||||
}
|
||||
|
||||
override fun shouldRoll(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun turnOffOnGround(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun dismountOnShift(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun shouldRotatePokemonHead(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun shouldRotatePlayerHead(
|
||||
settings: HoverSettings,
|
||||
state: HoverState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: HoverSettings) = HoverState()
|
||||
}
|
||||
|
||||
class HoverSettings : RidingBehaviourSettings {
|
||||
override val key = HoverBehaviour.KEY
|
||||
|
||||
var canJump = "true".asExpression()
|
||||
private set
|
||||
|
||||
var speedExpr: Expression = "q.get_ride_stats('SPEED', 'AIR', 1.0, 0.3)".asExpression()
|
||||
private set
|
||||
|
||||
// Max accel is a whole 1.0 in 1 second. The conversion in the function below is to convert seconds to ticks
|
||||
var accelerationExpr: Expression =
|
||||
"q.get_ride_stats('ACCELERATION', 'AIR', (1.0 / (20.0 * 0.5)), (1.0 / (20.0 * 5.0)))".asExpression()
|
||||
private set
|
||||
|
||||
// Between 30 seconds and 10 seconds at the lowest when at full speed.
|
||||
var staminaExpr: Expression = "q.get_ride_stats('STAMINA', 'AIR', 30.0, 10.0)".asExpression()
|
||||
private set
|
||||
|
||||
//Between a one block jump and a ten block jump
|
||||
var jumpExpr: Expression = "q.get_ride_stats('JUMP', 'AIR', 10.0, 1.0)".asExpression()
|
||||
private set
|
||||
|
||||
var handlingExpr: Expression = "q.get_ride_stats('SKILL', 'AIR', 140.0, 20.0)".asExpression()
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(speedExpr)
|
||||
buffer.writeExpression(accelerationExpr)
|
||||
buffer.writeExpression(staminaExpr)
|
||||
buffer.writeExpression(jumpExpr)
|
||||
buffer.writeExpression(handlingExpr)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
speedExpr = buffer.readExpression()
|
||||
accelerationExpr = buffer.readExpression()
|
||||
staminaExpr = buffer.readExpression()
|
||||
jumpExpr = buffer.readExpression()
|
||||
handlingExpr = buffer.readExpression()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class HoverState : RidingBehaviourState() {
|
||||
|
||||
override fun copy() = HoverState().also {
|
||||
it.rideVelocity.set(this.rideVelocity.get(), forced = true)
|
||||
it.stamina.set(this.stamina.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous !is HoverState) return false
|
||||
return super.shouldSync(previous)
|
||||
}
|
||||
}
|
||||
+56
-70
@@ -11,14 +11,12 @@ package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseProvider
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.SmoothDouble
|
||||
@@ -26,7 +24,6 @@ import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import kotlin.math.*
|
||||
|
||||
class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
@@ -35,24 +32,12 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.AIR
|
||||
|
||||
val poseProvider = PoseProvider<JetAirSettings, JetAirState>(PoseType.HOVER)
|
||||
.with(PoseOption(PoseType.FLY) { _, state, _ -> state.rideVelocity.get().z > 0.1 })
|
||||
.with(PoseOption(PoseType.FLY) { _, state, _ -> state.rideVel.get().z > 0.1 })
|
||||
|
||||
override fun isActive(settings: JetAirSettings, state: JetAirState, vehicle: PokemonEntity): Boolean {
|
||||
return Shapes.create(vehicle.boundingBox).blockPositionsAsListRounded().any {
|
||||
//Need to check other fluids
|
||||
if (vehicle.isInWater || vehicle.isUnderWater) {
|
||||
return@any false
|
||||
}
|
||||
//This might not actually work, depending on what the yPos actually is. yPos of the middle of the entity? the feet?
|
||||
if (it.y.toDouble() == (vehicle.position().y)) {
|
||||
val blockState = vehicle.level().getBlockState(it.below())
|
||||
return@any !(!blockState.isAir && blockState.fluidState.isEmpty)
|
||||
}
|
||||
true
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun pose(settings: JetAirSettings, state: JetAirState, vehicle: PokemonEntity): PoseType {
|
||||
@@ -67,26 +52,24 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
//retrieve minSpeed
|
||||
val minSpeed = vehicle.runtime.resolveDouble(settings.minSpeed)
|
||||
|
||||
//TODO: Reintroduce stamina drain once stats start to be polished and tweaked
|
||||
state.stamina.set(1.0f)
|
||||
// //Reduce stamina unless stamina is infinite
|
||||
// if (!vehicle.runtime.resolveBoolean(settings.infiniteStamina)) {
|
||||
// //Calculate stamina loss due to speed
|
||||
// //At max speed it will tick down 0.1 a second so the stamina will last ten seconds
|
||||
// //There has got to be a better way to express this equation. It interpolates between 0.5 and 1.0
|
||||
// var staminaRate = (normalizeSpeed(state.rideVelocity.get().length(), minSpeed, topSpeed))
|
||||
//
|
||||
// //interpolate between 0.25 and 1.0 so that you always have at least a min of 0.25 stam loss
|
||||
// staminaRate = 0.25 + (0.75 * staminaRate.pow(3))
|
||||
//
|
||||
// //Calculate stamina loss in seconds achievable at top speed
|
||||
// val staminaLoss = staminaRate * (1.0 / (20.0 * staminaStat))
|
||||
// state.stamina.set(max(state.stamina.get() - staminaLoss, 0.0).toFloat())
|
||||
// } else {
|
||||
// state.stamina.set(1.0f)
|
||||
// }
|
||||
//Reduce stamina unless stamina is infinite
|
||||
if (!vehicle.runtime.resolveBoolean(settings.infiniteStamina)) {
|
||||
//Calculate stamina loss due to speed
|
||||
//At max speed it will tick down 0.1 a second so the stamina will last ten seconds
|
||||
//There has got to be a better way to express this equation. It interpolates between 0.5 and 1.0
|
||||
var staminaRate = (normalizeSpeed(state.rideVel.get().length(), minSpeed, topSpeed))
|
||||
|
||||
return state.rideVelocity.get().length().toFloat()
|
||||
//interpolate between 0.25 and 1.0 so that you always have at least a min of 0.25 stam loss
|
||||
staminaRate = 0.25 + (0.75 * staminaRate.pow(3))
|
||||
|
||||
//Calculate stamina loss in seconds achievable at top speed
|
||||
val staminaLoss = staminaRate * (1.0 / (20.0 * staminaStat))
|
||||
state.stamina.set(max(state.stamina.get() - staminaLoss, 0.0).toFloat())
|
||||
} else {
|
||||
state.stamina.set(1.0f)
|
||||
}
|
||||
|
||||
return state.rideVel.get().length().toFloat()
|
||||
}
|
||||
|
||||
//TODO: Move these functions to a riding util class.
|
||||
@@ -125,8 +108,8 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
|
||||
//Translate ride space velocity to world space velocity.
|
||||
if (controller != null) {
|
||||
upForce = -1.0 * sin(Math.toRadians(controller.pitch.toDouble())) * state.rideVelocity.get().z
|
||||
forwardForce = cos(Math.toRadians(controller.pitch.toDouble())) * state.rideVelocity.get().z
|
||||
upForce = -1.0 * sin(Math.toRadians(controller.pitch.toDouble())) * state.rideVel.get().z
|
||||
forwardForce = cos(Math.toRadians(controller.pitch.toDouble())) * state.rideVel.get().z
|
||||
}
|
||||
|
||||
//If stamina has run out then initiate forced glide down.
|
||||
@@ -158,7 +141,7 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
val accel = vehicle.runtime.resolveDouble(settings.accelerationExpr)
|
||||
val altitudeLimit = vehicle.runtime.resolveDouble(settings.jumpExpr)
|
||||
val minSpeed = vehicle.runtime.resolveDouble(settings.minSpeed)
|
||||
val speed = state.rideVelocity.get().length()
|
||||
val speed = state.rideVel.get().length()
|
||||
|
||||
//Give no altitude limit if at max jump stat.
|
||||
val pushingHeightLimit = if (vehicle.runtime.resolveBoolean(settings.infiniteStamina)) false
|
||||
@@ -169,15 +152,15 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
if (driver.zza > 0.0 && speed < topSpeed && state.stamina.get() > 0.0f && !pushingHeightLimit) {
|
||||
//modify acceleration to be slower when at closer speeds to top speed
|
||||
val accelMod = max(-(normalizeSpeed(speed, minSpeed, topSpeed)) + 1, 0.0)
|
||||
state.rideVelocity.set(Vec3(state.rideVelocity.get().x, state.rideVelocity.get().y, min(state.rideVelocity.get().z + (accel * accelMod), topSpeed)))
|
||||
state.rideVel.set(Vec3(state.rideVel.get().x, state.rideVel.get().y, min(state.rideVel.get().z + (accel * accelMod), topSpeed)))
|
||||
} else if (driver.zza >= 0.0 && (state.stamina.get() == 0.0f || pushingHeightLimit)) {
|
||||
state.rideVelocity.set(Vec3(state.rideVelocity.get().x, state.rideVelocity.get().y, max(state.rideVelocity.get().z - ((accel) / 4), minSpeed)))
|
||||
state.rideVel.set(Vec3(state.rideVel.get().x, state.rideVel.get().y, max(state.rideVel.get().z - ((accel) / 4), minSpeed)))
|
||||
} else if (driver.zza < 0.0 && speed > minSpeed) {
|
||||
//modify deccel to be slower when at closer speeds to minimum speed
|
||||
val deccelMod = max((normalizeSpeed(speed, minSpeed, topSpeed) - 1).pow(2) * 8, 0.1)
|
||||
val deccelMod = max((normalizeSpeed(speed, minSpeed, topSpeed) - 1).pow(2), 0.1)
|
||||
|
||||
//Decelerate currently always a constant half of max acceleration.
|
||||
state.rideVelocity.set(Vec3(state.rideVelocity.get().x, state.rideVelocity.get().y, max(state.rideVelocity.get().z - ((accel * deccelMod) / 2), minSpeed)))
|
||||
state.rideVel.set(Vec3(state.rideVel.get().x, state.rideVel.get().y, max(state.rideVel.get().z - ((accel * deccelMod) / 2), minSpeed)))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,13 +209,8 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
val invertRoll = if (Cobblemon.config.invertRoll) -1 else 1
|
||||
val invertPitch = if (Cobblemon.config.invertPitch) -1 else 1
|
||||
|
||||
// Smooth out and accumulate roll input
|
||||
val smoothingSpeed = 4.0
|
||||
val mouseXc = (mouseX).coerceIn(-60.0, 60.0)
|
||||
val xInput = mouseXSmoother.getNewDeltaValue(mouseXc * 0.1 * invertRoll, deltaTime * smoothingSpeed);
|
||||
|
||||
// Accumulate the y mouse input for pitch
|
||||
//state.currMouseXForce.set((state.currMouseXForce.get() + (0.0015 * mouseX * invertRoll)).coerceIn(-1.0, 1.0))
|
||||
// Accumulate the mouse input
|
||||
state.currMouseXForce.set((state.currMouseXForce.get() + (0.0015 * mouseX * invertRoll)).coerceIn(-1.0, 1.0))
|
||||
state.currMouseYForce.set((state.currMouseYForce.get() + (0.0015 * mouseY * invertPitch)).coerceIn(-1.0, 1.0))
|
||||
|
||||
//Get handling in degrees per second
|
||||
@@ -254,9 +232,8 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
val pitchRot = handling * state.currMouseYForce.get()
|
||||
|
||||
//Roll is 1.5 times as fast as pitch
|
||||
val rollRot = handling * 1.5 * state.currMouseXForce.get()
|
||||
|
||||
//val rollRot = handling * 1.5 * state.currMouseXForce.get()
|
||||
val rollRot = handling * 1.5 * xInput.coerceIn(-1.0,1.0)
|
||||
//yaw, pitch, roll
|
||||
return Vec3(0.0, pitchRot, rollRot)
|
||||
}
|
||||
@@ -308,7 +285,7 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
val minSpeed = vehicle.runtime.resolveDouble(settings.minSpeed)
|
||||
|
||||
//Must I ensure that topspeed is greater than minimum?
|
||||
val normalizedSpeed = normalizeSpeed(state.rideVelocity.get().length(), minSpeed, topSpeed)
|
||||
val normalizedSpeed = normalizeSpeed(state.rideVel.get().length(), minSpeed, topSpeed)
|
||||
|
||||
//TODO: Determine if this should be based on max possible speed instead of top speed.
|
||||
//Only ever want the fov change to be a max of 0.2 and for it to have non linear scaling.
|
||||
@@ -356,7 +333,7 @@ class JetAirBehaviour : RidingBehaviour<JetAirSettings, JetAirState> {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: JetAirSettings) = JetAirState()
|
||||
override fun createDefaultState() = JetAirState()
|
||||
}
|
||||
|
||||
class JetAirSettings : RidingBehaviourSettings {
|
||||
@@ -365,10 +342,10 @@ class JetAirSettings : RidingBehaviourSettings {
|
||||
var gravity: Expression = "0".asExpression()
|
||||
private set
|
||||
|
||||
var minSpeed: Expression = "0.8".asExpression()
|
||||
var minSpeed: Expression = "1.2".asExpression()
|
||||
private set
|
||||
|
||||
var handlingYawExpr: Expression = "q.get_ride_stats('SKILL', 'AIR', 50.0, 25.0)".asExpression()
|
||||
var handlingYawExpr: Expression = "q.get_ride_stats('SKILL', 'AIR', 25.0, 8.0)".asExpression()
|
||||
private set
|
||||
|
||||
// Make configurable by json
|
||||
@@ -382,7 +359,7 @@ class JetAirSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
var handlingExpr: Expression = "q.get_ride_stats('SKILL', 'AIR', 140.0, 20.0)".asExpression()
|
||||
private set
|
||||
var speedExpr: Expression = "q.get_ride_stats('SPEED', 'AIR', 1.8, 1.0)".asExpression()
|
||||
var speedExpr: Expression = "q.get_ride_stats('SPEED', 'AIR', 2.5, 1.0)".asExpression()
|
||||
private set
|
||||
var accelerationExpr: Expression = "q.get_ride_stats('ACCELERATION', 'AIR', (1.0 / (20.0 * 1.0)), (1.0 / (20.0 * 5.0)))".asExpression()
|
||||
private set
|
||||
@@ -390,7 +367,6 @@ class JetAirSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(gravity)
|
||||
buffer.writeExpression(minSpeed)
|
||||
buffer.writeExpression(handlingYawExpr)
|
||||
@@ -417,40 +393,50 @@ class JetAirSettings : RidingBehaviourSettings {
|
||||
}
|
||||
}
|
||||
|
||||
class JetAirState : RidingBehaviourState() {
|
||||
class JetAirState : RidingBehaviourState {
|
||||
var currSpeed = ridingState(0.0, Side.CLIENT)
|
||||
var currMouseXForce = ridingState(0.0, Side.CLIENT)
|
||||
var currMouseYForce = ridingState(0.0, Side.CLIENT)
|
||||
var stamina = ridingState(1.0f, Side.CLIENT)
|
||||
var rideVel = ridingState(Vec3.ZERO, Side.CLIENT)
|
||||
var currMouseXForce = ridingState(0.0, Side.BOTH)
|
||||
var currMouseYForce = ridingState(0.0, Side.BOTH)
|
||||
|
||||
override fun encode(buffer: FriendlyByteBuf) {
|
||||
super.encode(buffer)
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeDouble(currSpeed.get())
|
||||
buffer.writeFloat(stamina.get())
|
||||
buffer.writeVec3(rideVel.get())
|
||||
}
|
||||
|
||||
override fun decode(buffer: FriendlyByteBuf) {
|
||||
super.decode(buffer)
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
currSpeed.set(buffer.readDouble(), forced = true)
|
||||
stamina.set(buffer.readFloat(), forced = true)
|
||||
rideVel.set(buffer.readVec3(), forced = true)
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
super.reset()
|
||||
currSpeed.set(0.0, forced = true)
|
||||
stamina.set(1.0f, forced = true)
|
||||
rideVel.set(Vec3.ZERO, forced = true)
|
||||
currMouseXForce.set(0.0, forced = true)
|
||||
currMouseYForce.set(0.0, forced = true)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "JetAirState(currSpeed=${currSpeed.get()}, stamina=${stamina.get()}, rideVel=${rideVel.get()}, currMouseXForce=${currMouseXForce.get()}, currMouseYForce=${currMouseYForce.get()})"
|
||||
}
|
||||
|
||||
override fun copy() = JetAirState().also {
|
||||
it.currSpeed.set(currSpeed.get(), forced = true)
|
||||
it.stamina.set(stamina.get(), forced = true)
|
||||
it.rideVelocity.set(rideVelocity.get(), forced = true)
|
||||
// it.currMouseXForce.set(currMouseXForce.get(), forced = true)
|
||||
// it.currMouseYForce.set(currMouseYForce.get(), forced = true)
|
||||
it.rideVel.set(rideVel.get(), forced = true)
|
||||
it.currMouseXForce.set(currMouseXForce.get(), forced = true)
|
||||
it.currMouseYForce.set(currMouseYForce.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous !is JetAirState) return false
|
||||
if (previous.currSpeed != currSpeed) return true
|
||||
return super.shouldSync(previous)
|
||||
if (previous.stamina != stamina) return true
|
||||
if (previous.rideVel != rideVel) return true
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
+469
@@ -0,0 +1,469 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonBehaviourFlag
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.asExpression
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.readExpression
|
||||
import com.cobblemon.mod.common.util.writeExpression
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.SmoothDouble
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class JumpToFlightCompositeBehaviour : RidingBehaviour<JumpToFlightCompositeSettings, JumpToFlightCompositeState> {
|
||||
companion object {
|
||||
val KEY = cobblemonResource("composite/jump_to_flight")
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
|
||||
val landBehaviour: GenericLandBehaviour = GenericLandBehaviour()
|
||||
val birdBehaviour: BirdAirBehaviour = BirdAirBehaviour()
|
||||
|
||||
override fun tick(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
) {
|
||||
val flightState = state.flightState
|
||||
val groundState = state.landState
|
||||
if (shouldTransitionToGround(state, vehicle)) {
|
||||
//Pass the speed to the next state
|
||||
// groundState.currSpeed = flightState.currSpeed
|
||||
groundState.rideVel.set(flightState.rideVel.get())
|
||||
groundState.stamina.set(flightState.stamina.get())
|
||||
|
||||
state.activeController.set(GenericLandBehaviour.KEY)
|
||||
vehicle.setBehaviourFlag(PokemonBehaviourFlag.FLYING, false)
|
||||
state.timeTransitioned.set(vehicle.level().gameTime)
|
||||
} else if (shouldTransitionToAir(state, vehicle, driver)) {
|
||||
//Pass the speed to the next state
|
||||
// flightState.currSpeed = groundState.currSpeed
|
||||
flightState.rideVel.set(groundState.rideVel.get())
|
||||
flightState.stamina.set(groundState.stamina.get())
|
||||
|
||||
state.activeController.set(BirdAirBehaviour.KEY)
|
||||
vehicle.setBehaviourFlag(PokemonBehaviourFlag.FLYING, true)
|
||||
state.timeTransitioned.set(vehicle.level().gameTime)
|
||||
}
|
||||
}
|
||||
|
||||
override fun isActive(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
private fun shouldTransitionToGround(state: JumpToFlightCompositeState, entity: PokemonEntity): Boolean {
|
||||
return state.activeController.get() == BirdAirBehaviour.KEY
|
||||
&& entity.onGround()
|
||||
&& state.timeTransitioned.get() + 20 < entity.level().gameTime
|
||||
}
|
||||
|
||||
private fun shouldTransitionToAir(
|
||||
state: JumpToFlightCompositeState,
|
||||
entity: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return state.activeController.get() == GenericLandBehaviour.KEY
|
||||
&& driver.jumping
|
||||
&& state.timeTransitioned.get() + 20 < entity.level().gameTime
|
||||
}
|
||||
|
||||
override fun pose(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): PoseType {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.pose(settings.land, state.landState, vehicle)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.pose(settings.bird, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun speed(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.speed(settings.land, state.landState, vehicle, driver)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.speed(settings.bird, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rotation(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rotation(settings.land, state.landState, vehicle, driver)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.rotation(settings.bird, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun velocity(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.velocity(settings.land, state.landState, vehicle, driver, input)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.velocity(settings.bird, state.flightState, vehicle, driver, input)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun angRollVel(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.angRollVel(
|
||||
settings.land,
|
||||
state.landState,
|
||||
vehicle,
|
||||
driver,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.angRollVel(
|
||||
settings.bird,
|
||||
state.flightState,
|
||||
vehicle,
|
||||
driver,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
mouseY: Double,
|
||||
mouseX: Double,
|
||||
mouseYSmoother: SmoothDouble,
|
||||
mouseXSmoother: SmoothDouble,
|
||||
sensitivity: Double,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rotationOnMouseXY(
|
||||
settings.land,
|
||||
state.landState,
|
||||
vehicle,
|
||||
driver,
|
||||
mouseY,
|
||||
mouseX,
|
||||
mouseYSmoother,
|
||||
mouseXSmoother,
|
||||
sensitivity,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.rotationOnMouseXY(
|
||||
settings.bird,
|
||||
state.flightState,
|
||||
vehicle,
|
||||
driver,
|
||||
mouseY,
|
||||
mouseX,
|
||||
mouseYSmoother,
|
||||
mouseXSmoother,
|
||||
sensitivity,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun canJump(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.canJump(settings.land, state.landState, vehicle, driver)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.canJump(settings.bird, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun setRideBar(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.setRideBar(settings.land, state.landState, vehicle, driver)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.setRideBar(settings.bird, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun jumpForce(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.jumpForce(
|
||||
settings.land,
|
||||
state.landState,
|
||||
vehicle,
|
||||
driver,
|
||||
jumpStrength
|
||||
)
|
||||
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.jumpForce(
|
||||
settings.bird,
|
||||
state.flightState,
|
||||
vehicle,
|
||||
driver,
|
||||
jumpStrength
|
||||
)
|
||||
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun gravity(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
regularGravity: Double
|
||||
): Double {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.gravity(settings.land, state.landState, vehicle, regularGravity)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.gravity(settings.bird, state.flightState, vehicle, regularGravity)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rideFovMultiplier(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rideFovMultiplier(settings.land, state.landState, vehicle, driver)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.rideFovMultiplier(settings.bird, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun useAngVelSmoothing(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.useAngVelSmoothing(settings.land, state.landState, vehicle)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.useAngVelSmoothing(settings.bird, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun useRidingAltPose(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.useRidingAltPose(settings.land, state.landState, vehicle, driver)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.useRidingAltPose(settings.bird, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun inertia(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Double {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.inertia(settings.land, state.landState, vehicle)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.inertia(settings.bird, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRoll(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRoll(settings.land, state.landState, vehicle)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.shouldRoll(settings.bird, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun turnOffOnGround(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.turnOffOnGround(settings.land, state.landState, vehicle)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.turnOffOnGround(settings.bird, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun dismountOnShift(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.dismountOnShift(settings.land, state.landState, vehicle)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.dismountOnShift(settings.bird, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRotatePokemonHead(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRotatePokemonHead(settings.land, state.landState, vehicle)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.shouldRotatePokemonHead(settings.bird, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRotatePlayerHead(
|
||||
settings: JumpToFlightCompositeSettings,
|
||||
state: JumpToFlightCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRotatePlayerHead(settings.land, state.landState, vehicle)
|
||||
BirdAirBehaviour.KEY -> birdBehaviour.shouldRotatePlayerHead(settings.bird, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun createDefaultState() = JumpToFlightCompositeState()
|
||||
}
|
||||
|
||||
class JumpToFlightCompositeSettings : RidingBehaviourSettings {
|
||||
override val key = JumpToFlightCompositeBehaviour.KEY
|
||||
|
||||
var bird: BirdAirSettings = BirdAirSettings()
|
||||
private set
|
||||
|
||||
var land: GenericLandSettings = GenericLandSettings()
|
||||
private set
|
||||
|
||||
var minimumSpeed: Expression = "0.5".asExpression()
|
||||
private set
|
||||
|
||||
var minimumJump: Expression = "0.5".asExpression()
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
bird.encode(buffer)
|
||||
land.encode(buffer)
|
||||
buffer.writeExpression(minimumSpeed)
|
||||
buffer.writeExpression(minimumJump)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
bird.decode(buffer)
|
||||
land.decode(buffer)
|
||||
minimumSpeed = buffer.readExpression()
|
||||
minimumJump = buffer.readExpression()
|
||||
}
|
||||
}
|
||||
|
||||
class JumpToFlightCompositeState : RidingBehaviourState {
|
||||
var activeController = ridingState(GenericLandBehaviour.KEY, Side.CLIENT)
|
||||
var currSpeed = ridingState(0.0, Side.BOTH)
|
||||
var timeTransitioned = ridingState(-100L, Side.BOTH)
|
||||
var landState = GenericLandState()
|
||||
var flightState = BirdAirState()
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(activeController.get())
|
||||
landState.encode(buffer)
|
||||
flightState.encode(buffer)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
activeController.set(buffer.readResourceLocation(), forced = true)
|
||||
landState.decode(buffer)
|
||||
flightState.decode(buffer)
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
activeController.set(GenericLandBehaviour.KEY, forced = true)
|
||||
timeTransitioned.set(-100L, forced = true)
|
||||
currSpeed.set(0.0, forced = true)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "JumpToFlightCompositeState(activeController=${activeController.get()}, landState=$landState, flightState=$flightState, currSpeed=${currSpeed.get()}, timeTransitioned=${timeTransitioned.get()})"
|
||||
}
|
||||
|
||||
override fun copy() = JumpToFlightCompositeState().also {
|
||||
it.activeController.set(activeController.get(), forced = true)
|
||||
it.landState = landState.copy()
|
||||
it.flightState = flightState.copy()
|
||||
it.currSpeed.set(currSpeed.get(), forced = true)
|
||||
it.timeTransitioned.set(timeTransitioned.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous !is JumpToFlightCompositeState) return false
|
||||
if (activeController != previous.activeController) return true
|
||||
if (landState.shouldSync(previous.landState)) return true
|
||||
if (flightState.shouldSync(previous.flightState)) return true
|
||||
return false
|
||||
}
|
||||
}
|
||||
+450
@@ -0,0 +1,450 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonBehaviourFlag
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.asExpression
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.readExpression
|
||||
import com.cobblemon.mod.common.util.writeExpression
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.SmoothDouble
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class RunToJetCompositeBehaviour : RidingBehaviour<RunToJetCompositeSettings, RunToJetCompositeState> {
|
||||
companion object {
|
||||
val KEY = cobblemonResource("composite/run_to_jet")
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
|
||||
val landBehaviour: GenericLandBehaviour = GenericLandBehaviour()
|
||||
val jetBehaviour: JetAirBehaviour = JetAirBehaviour()
|
||||
|
||||
override fun tick(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
) {
|
||||
val flightState = state.flightState
|
||||
val groundState = state.landState
|
||||
if (shouldTransitionToGround(state, vehicle, driver)) {
|
||||
groundState.currSpeed = flightState.currSpeed
|
||||
groundState.stamina = flightState.stamina
|
||||
groundState.rideVel = flightState.rideVel
|
||||
|
||||
state.activeController.set(GenericLandBehaviour.KEY)
|
||||
vehicle.setBehaviourFlag(PokemonBehaviourFlag.FLYING, false)
|
||||
state.timeTransitioned.set(vehicle.level().gameTime)
|
||||
} else if (shouldTransitionToAir(state, vehicle, driver, input)) {
|
||||
flightState.currSpeed = groundState.currSpeed
|
||||
flightState.stamina = groundState.stamina
|
||||
flightState.rideVel = groundState.rideVel
|
||||
|
||||
state.activeController.set(JetAirBehaviour.KEY)
|
||||
vehicle.setBehaviourFlag(PokemonBehaviourFlag.FLYING, true)
|
||||
state.timeTransitioned.set(vehicle.level().gameTime)
|
||||
}
|
||||
}
|
||||
|
||||
private fun shouldTransitionToGround(
|
||||
state: RunToJetCompositeState,
|
||||
entity: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
if (state.activeController.get() != JetAirBehaviour.KEY) return false
|
||||
if (state.timeTransitioned.get() + 20 >= entity.level().gameTime) return false
|
||||
return driver.isSprinting || entity.onGround()
|
||||
}
|
||||
|
||||
private fun shouldTransitionToAir(
|
||||
state: RunToJetCompositeState,
|
||||
entity: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
): Boolean {
|
||||
if (state.activeController.get() != GenericLandBehaviour.KEY) return false
|
||||
if (state.timeTransitioned.get() + 20 >= entity.level().gameTime) return false
|
||||
return driver.isSprinting && input.z > 0.5
|
||||
}
|
||||
|
||||
override fun isActive(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun pose(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): PoseType {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.pose(settings.land, state.landState, vehicle)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.pose(settings.jet, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun speed(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.speed(settings.land, state.landState, vehicle, driver)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.speed(settings.jet, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rotation(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rotation(settings.land, state.landState, vehicle, driver)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.rotation(settings.jet, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun velocity(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.velocity(settings.land, state.landState, vehicle, driver, input)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.velocity(settings.jet, state.flightState, vehicle, driver, input)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun angRollVel(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.angRollVel(
|
||||
settings.land,
|
||||
state.landState,
|
||||
vehicle,
|
||||
driver,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
JetAirBehaviour.KEY -> jetBehaviour.angRollVel(settings.jet, state.flightState, vehicle, driver, deltaTime)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
mouseY: Double,
|
||||
mouseX: Double,
|
||||
mouseYSmoother: SmoothDouble,
|
||||
mouseXSmoother: SmoothDouble,
|
||||
sensitivity: Double,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rotationOnMouseXY(
|
||||
settings.land,
|
||||
state.landState,
|
||||
vehicle,
|
||||
driver,
|
||||
mouseY,
|
||||
mouseX,
|
||||
mouseYSmoother,
|
||||
mouseXSmoother,
|
||||
sensitivity,
|
||||
deltaTime
|
||||
)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.rotationOnMouseXY(
|
||||
settings.jet,
|
||||
state.flightState,
|
||||
vehicle,
|
||||
driver,
|
||||
mouseY,
|
||||
mouseX,
|
||||
mouseYSmoother,
|
||||
mouseXSmoother,
|
||||
sensitivity,
|
||||
deltaTime
|
||||
)
|
||||
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun canJump(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.canJump(settings.land, state.landState, vehicle, driver)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.canJump(settings.jet, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun setRideBar(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.setRideBar(settings.land, state.landState, vehicle, driver)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.setRideBar(settings.jet, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun jumpForce(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
): Vec3 {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.jumpForce(settings.land, state.landState, vehicle, driver, jumpStrength)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.jumpForce(settings.jet, state.flightState, vehicle, driver, jumpStrength)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun gravity(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
regularGravity: Double
|
||||
): Double {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.gravity(settings.land, state.landState, vehicle, regularGravity)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.gravity(settings.jet, state.flightState, vehicle, regularGravity)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun rideFovMultiplier(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.rideFovMultiplier(settings.land, state.landState, vehicle, driver)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.rideFovMultiplier(settings.jet, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun useAngVelSmoothing(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.useAngVelSmoothing(settings.land, state.landState, vehicle)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.useAngVelSmoothing(settings.jet, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun useRidingAltPose(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.useRidingAltPose(settings.land, state.landState, vehicle, driver)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.useRidingAltPose(settings.jet, state.flightState, vehicle, driver)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun inertia(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Double {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.inertia(settings.land, state.landState, vehicle)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.inertia(settings.jet, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRoll(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRoll(settings.land, state.landState, vehicle)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.shouldRoll(settings.jet, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun turnOffOnGround(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.turnOffOnGround(settings.land, state.landState, vehicle)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.turnOffOnGround(settings.jet, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun dismountOnShift(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.dismountOnShift(settings.land, state.landState, vehicle)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.dismountOnShift(settings.jet, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRotatePokemonHead(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRotatePokemonHead(settings.land, state.landState, vehicle)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.shouldRotatePokemonHead(settings.jet, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRotatePlayerHead(
|
||||
settings: RunToJetCompositeSettings,
|
||||
state: RunToJetCompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return when (state.activeController.get()) {
|
||||
GenericLandBehaviour.KEY -> landBehaviour.shouldRotatePlayerHead(settings.land, state.landState, vehicle)
|
||||
JetAirBehaviour.KEY -> jetBehaviour.shouldRotatePlayerHead(settings.jet, state.flightState, vehicle)
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun createDefaultState() = RunToJetCompositeState()
|
||||
}
|
||||
|
||||
class RunToJetCompositeSettings : RidingBehaviourSettings {
|
||||
override val key = RunToJetCompositeBehaviour.KEY
|
||||
|
||||
var jet: JetAirSettings = JetAirSettings()
|
||||
private set
|
||||
|
||||
var land: GenericLandSettings = GenericLandSettings()
|
||||
private set
|
||||
|
||||
var minimumSpeed: Expression = "0.5".asExpression()
|
||||
private set
|
||||
|
||||
var minimumJump: Expression = "0.5".asExpression()
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
jet.encode(buffer)
|
||||
land.encode(buffer)
|
||||
buffer.writeExpression(minimumSpeed)
|
||||
buffer.writeExpression(minimumJump)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
jet.decode(buffer)
|
||||
land.decode(buffer)
|
||||
minimumSpeed = buffer.readExpression()
|
||||
minimumJump = buffer.readExpression()
|
||||
}
|
||||
}
|
||||
|
||||
class RunToJetCompositeState : RidingBehaviourState {
|
||||
var activeController = ridingState(GenericLandBehaviour.KEY, Side.CLIENT)
|
||||
var landState: GenericLandState = GenericLandState()
|
||||
var flightState: JetAirState = JetAirState()
|
||||
var currSpeed = ridingState(0.0, Side.BOTH)
|
||||
var timeTransitioned = ridingState(-100L, Side.BOTH)
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(activeController.get())
|
||||
landState.encode(buffer)
|
||||
flightState.encode(buffer)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
activeController.set(buffer.readResourceLocation(), forced = true)
|
||||
landState.decode(buffer)
|
||||
flightState.decode(buffer)
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
activeController.set(GenericLandBehaviour.KEY, forced = true)
|
||||
timeTransitioned.set(-100L, forced = true)
|
||||
currSpeed.set(0.0, forced = true)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "RunToJetCompositeState(activeController=${activeController.get()}, landState=$landState, flightState=$flightState, currSpeed=${currSpeed.get()}, timeTransitioned=${timeTransitioned.get()})"
|
||||
}
|
||||
|
||||
override fun copy() = RunToJetCompositeState().also {
|
||||
it.activeController.set(activeController.get(), forced = true)
|
||||
it.landState = landState.copy()
|
||||
it.flightState = flightState.copy()
|
||||
it.currSpeed.set(currSpeed.get(), forced = true)
|
||||
it.timeTransitioned.set(timeTransitioned.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous !is RunToJetCompositeState) return false
|
||||
if (activeController != previous.activeController) return true
|
||||
if (landState.shouldSync(previous.landState)) return true
|
||||
if (flightState.shouldSync(previous.flightState)) return true
|
||||
return false
|
||||
}
|
||||
}
|
||||
+7
-8
@@ -10,7 +10,6 @@ package com.cobblemon.mod.common.api.riding.behaviour.types
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseOption
|
||||
import com.cobblemon.mod.common.api.riding.posing.PoseProvider
|
||||
@@ -34,7 +33,6 @@ class SwimDashBehaviour : RidingBehaviour<SwimDashSettings, SwimDashState> {
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.LIQUID
|
||||
|
||||
val poseProvider = PoseProvider<SwimDashSettings, SwimDashState>(PoseType.FLOAT)
|
||||
.with(PoseOption(PoseType.SWIM) { _, _, entity -> entity.isSwimming && entity.entityData.get(PokemonEntity.MOVING) })
|
||||
@@ -219,7 +217,7 @@ class SwimDashBehaviour : RidingBehaviour<SwimDashSettings, SwimDashState> {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: SwimDashSettings) = SwimDashState()
|
||||
override fun createDefaultState() = SwimDashState()
|
||||
}
|
||||
|
||||
class SwimDashSettings : RidingBehaviourSettings {
|
||||
@@ -229,7 +227,6 @@ class SwimDashSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeFloat(dashSpeed)
|
||||
}
|
||||
|
||||
@@ -238,12 +235,14 @@ class SwimDashSettings : RidingBehaviourSettings {
|
||||
}
|
||||
}
|
||||
|
||||
class SwimDashState : RidingBehaviourState() {
|
||||
class SwimDashState : RidingBehaviourState {
|
||||
var dashing = ridingState(false, Side.BOTH)
|
||||
var ticks = ridingState(0, Side.BOTH)
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) = Unit
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) = Unit
|
||||
|
||||
override fun reset() {
|
||||
super.reset()
|
||||
dashing.set(false, forced = true)
|
||||
ticks.set(0, forced = true)
|
||||
}
|
||||
@@ -253,9 +252,9 @@ class SwimDashState : RidingBehaviourState() {
|
||||
}
|
||||
|
||||
override fun copy() = SwimDashState().also {
|
||||
it.rideVelocity.set(rideVelocity.get(), forced = true)
|
||||
it.stamina.set(stamina.get(), forced = true)
|
||||
it.dashing.set(dashing.get(), forced = true)
|
||||
it.ticks.set(ticks. get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState) = false
|
||||
}
|
||||
|
||||
+7
-7
@@ -53,7 +53,6 @@ class VehicleLandBehaviour : RidingBehaviour<VehicleLandSettings, VehicleLandSta
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.LAND
|
||||
|
||||
val poseProvider = PoseProvider<VehicleLandSettings, VehicleLandState>(PoseType.STAND)
|
||||
.with(PoseOption(PoseType.WALK) { _, _, entity -> entity.entityData.get(PokemonEntity.MOVING) })
|
||||
@@ -266,7 +265,7 @@ class VehicleLandBehaviour : RidingBehaviour<VehicleLandSettings, VehicleLandSta
|
||||
return false
|
||||
}
|
||||
|
||||
override fun createDefaultState(settings: VehicleLandSettings) = VehicleLandState()
|
||||
override fun createDefaultState() = VehicleLandState()
|
||||
}
|
||||
|
||||
class VehicleLandSettings : RidingBehaviourSettings {
|
||||
@@ -297,7 +296,6 @@ class VehicleLandSettings : RidingBehaviourSettings {
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeExpression(canJump)
|
||||
buffer.writeExpression(jumpVector[0])
|
||||
buffer.writeExpression(jumpVector[1])
|
||||
@@ -326,12 +324,14 @@ class VehicleLandSettings : RidingBehaviourSettings {
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleLandState : RidingBehaviourState() {
|
||||
class VehicleLandState : RidingBehaviourState {
|
||||
var currSpeed = ridingState(0.0, Side.BOTH)
|
||||
var deltaRotation = ridingState(Vec2.ZERO, Side.BOTH)
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) = Unit
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) = Unit
|
||||
|
||||
override fun reset() {
|
||||
super.reset()
|
||||
currSpeed.set(0.0, forced = true)
|
||||
deltaRotation.set(Vec2.ZERO, forced = true)
|
||||
}
|
||||
@@ -341,9 +341,9 @@ class VehicleLandState : RidingBehaviourState() {
|
||||
}
|
||||
|
||||
override fun copy() = VehicleLandState().also {
|
||||
it.rideVelocity.set(rideVelocity.get(), forced = true)
|
||||
it.stamina.set(stamina.get(), forced = true)
|
||||
it.currSpeed.set(currSpeed.get(), forced = true)
|
||||
it.deltaRotation.set(deltaRotation.get(), forced = true)
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState) = false
|
||||
}
|
||||
|
||||
-426
@@ -1,426 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types.composite
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.*
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies.CompositeRidingStrategies
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.adapters.RidingBehaviourSettingsAdapter
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.SmoothDouble
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec2
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class CompositeBehaviour : RidingBehaviour<CompositeSettings, CompositeState> {
|
||||
companion object {
|
||||
val KEY = cobblemonResource("composite")
|
||||
}
|
||||
|
||||
override val key = KEY
|
||||
override val style = RidingStyle.COMPOSITE
|
||||
|
||||
override fun createDefaultState(settings: CompositeSettings): CompositeState {
|
||||
val defaultBehaviour = RidingBehaviours.get(settings.defaultBehaviour.key)
|
||||
val defaultState = defaultBehaviour.createDefaultState(settings.defaultBehaviour)
|
||||
val alternateBehaviour = RidingBehaviours.get(settings.alternateBehaviour.key)
|
||||
val alternativeState = alternateBehaviour.createDefaultState(settings.alternateBehaviour)
|
||||
return CompositeState(
|
||||
defaultBehaviour = settings.defaultBehaviour.key,
|
||||
defaultBehaviourState = defaultState,
|
||||
alternateBehaviourState = alternativeState
|
||||
)
|
||||
}
|
||||
|
||||
fun <T> chooseBehaviour(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
action: (behaviour: RidingBehaviour<RidingBehaviourSettings, RidingBehaviourState>, settings: RidingBehaviourSettings, state: RidingBehaviourState) -> T
|
||||
): T {
|
||||
val defaultBehaviour = RidingBehaviours.get(settings.defaultBehaviour.key)
|
||||
val alternativeBehaviour = RidingBehaviours.get(settings.alternateBehaviour.key)
|
||||
return when (state.activeController.get()) {
|
||||
settings.defaultBehaviour.key -> action(
|
||||
defaultBehaviour,
|
||||
settings.defaultBehaviour,
|
||||
state.defaultBehaviourState
|
||||
)
|
||||
settings.alternateBehaviour.key -> action(
|
||||
alternativeBehaviour,
|
||||
settings.alternateBehaviour,
|
||||
state.alternateBehaviourState
|
||||
)
|
||||
|
||||
else -> error("Invalid controller: ${state.activeController.get()}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun tick(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
) {
|
||||
val strategy = CompositeRidingStrategies.get(settings.transitionStrategy)
|
||||
strategy.tick(settings, state, state.defaultBehaviourState, state.alternateBehaviourState, vehicle, driver, input)
|
||||
}
|
||||
|
||||
override fun clampPassengerRotation(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
entity: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
) {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.clampPassengerRotation(behaviourSettings, behaviourState, entity, driver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun updatePassengerRotation(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
entity: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
) {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.updatePassengerRotation(behaviourSettings, behaviourState, entity, driver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRotatePlayerHead(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.shouldRotatePlayerHead(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRotatePokemonHead(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.shouldRotatePokemonHead(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun dismountOnShift(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.dismountOnShift(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun turnOffOnGround(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.turnOffOnGround(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldRoll(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.shouldRoll(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun inertia(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Double {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.inertia(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun useRidingAltPose(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.useRidingAltPose(behaviourSettings, behaviourState, vehicle, driver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun useAngVelSmoothing(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.useAngVelSmoothing(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun rideFovMultiplier(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.rideFovMultiplier(behaviourSettings, behaviourState, vehicle, driver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun gravity(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
regularGravity: Double
|
||||
): Double {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.gravity(behaviourSettings, behaviourState, vehicle, regularGravity)
|
||||
}
|
||||
}
|
||||
|
||||
override fun jumpForce(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
jumpStrength: Int
|
||||
): Vec3 {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.jumpForce(behaviourSettings, behaviourState, vehicle, driver, jumpStrength)
|
||||
}
|
||||
}
|
||||
|
||||
override fun setRideBar(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.setRideBar(behaviourSettings, behaviourState, vehicle, driver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun canJump(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.canJump(behaviourSettings, behaviourState, vehicle, driver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun rotationOnMouseXY(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
mouseY: Double,
|
||||
mouseX: Double,
|
||||
mouseYSmoother: SmoothDouble,
|
||||
mouseXSmoother: SmoothDouble,
|
||||
sensitivity: Double,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.rotationOnMouseXY(
|
||||
behaviourSettings,
|
||||
behaviourState,
|
||||
vehicle,
|
||||
driver,
|
||||
mouseY,
|
||||
mouseX,
|
||||
mouseYSmoother,
|
||||
mouseXSmoother,
|
||||
sensitivity,
|
||||
deltaTime
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun angRollVel(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
deltaTime: Double
|
||||
): Vec3 {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.angRollVel(behaviourSettings, behaviourState, vehicle, driver, deltaTime)
|
||||
}
|
||||
}
|
||||
|
||||
override fun velocity(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
): Vec3 {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.velocity(behaviourSettings, behaviourState, vehicle, driver, input)
|
||||
}
|
||||
}
|
||||
|
||||
override fun rotation(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: LivingEntity
|
||||
): Vec2 {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.rotation(behaviourSettings, behaviourState, vehicle, driver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun speed(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Float {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.speed(behaviourSettings, behaviourState, vehicle, driver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun pose(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): PoseType {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.pose(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun isActive(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
return chooseBehaviour(settings, state) { behaviour, behaviourSettings, behaviourState ->
|
||||
behaviour.isActive(behaviourSettings, behaviourState, vehicle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open class CompositeSettings : RidingBehaviourSettings {
|
||||
lateinit var transitionStrategy: ResourceLocation
|
||||
private set
|
||||
lateinit var defaultBehaviour: RidingBehaviourSettings
|
||||
private set
|
||||
lateinit var alternateBehaviour: RidingBehaviourSettings
|
||||
private set
|
||||
|
||||
override val key: ResourceLocation = CompositeBehaviour.KEY
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(key)
|
||||
buffer.writeResourceLocation(transitionStrategy)
|
||||
defaultBehaviour.encode(buffer)
|
||||
alternateBehaviour.encode(buffer)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
transitionStrategy = buffer.readResourceLocation()
|
||||
val defaultBehaviourKey = buffer.readResourceLocation()
|
||||
defaultBehaviour = RidingBehaviourSettingsAdapter.types[defaultBehaviourKey]?.getConstructor()?.newInstance()
|
||||
?: error("Unknown controller key: $key")
|
||||
defaultBehaviour.decode(buffer)
|
||||
val alternativeBehaviourKey = buffer.readResourceLocation()
|
||||
alternateBehaviour =
|
||||
RidingBehaviourSettingsAdapter.types[alternativeBehaviourKey]?.getConstructor()?.newInstance()
|
||||
?: error("Unknown controller key: $key")
|
||||
alternateBehaviour.decode(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
class CompositeState(
|
||||
private val defaultBehaviour: ResourceLocation,
|
||||
val defaultBehaviourState: RidingBehaviourState,
|
||||
val alternateBehaviourState: RidingBehaviourState
|
||||
) : RidingBehaviourState() {
|
||||
var activeController = ridingState(defaultBehaviour, Side.CLIENT)
|
||||
var lastTransition = ridingState(-100L, Side.BOTH)
|
||||
|
||||
override val rideVelocity: SidedRidingState<Vec3>
|
||||
get() = when (activeController.get()) {
|
||||
defaultBehaviour -> defaultBehaviourState.rideVelocity
|
||||
else -> alternateBehaviourState.rideVelocity
|
||||
}
|
||||
|
||||
override val stamina: SidedRidingState<Float>
|
||||
get() = when (activeController.get()) {
|
||||
defaultBehaviour -> defaultBehaviourState.stamina
|
||||
else -> alternateBehaviourState.stamina
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
super.reset()
|
||||
activeController.set(defaultBehaviour, forced = true)
|
||||
lastTransition.set(-100L, forced = true)
|
||||
defaultBehaviourState.reset()
|
||||
alternateBehaviourState.reset()
|
||||
}
|
||||
|
||||
override fun copy(): CompositeState {
|
||||
val state =
|
||||
CompositeState(defaultBehaviour, defaultBehaviourState.copy(), alternateBehaviourState.copy())
|
||||
state.activeController.set(activeController.get(), forced = true)
|
||||
state.lastTransition.set(lastTransition.get(), forced = true)
|
||||
state.rideVelocity.set(rideVelocity.get(), forced = true)
|
||||
state.stamina.set(stamina.get(), forced = true)
|
||||
return state
|
||||
}
|
||||
|
||||
override fun shouldSync(previous: RidingBehaviourState): Boolean {
|
||||
if (previous !is CompositeState) return false
|
||||
if (previous.activeController.get() != activeController.get()) return true
|
||||
if (defaultBehaviourState.shouldSync(previous.defaultBehaviourState)) return true
|
||||
if (alternateBehaviourState.shouldSync(previous.alternateBehaviourState)) return true
|
||||
return super.shouldSync(previous)
|
||||
}
|
||||
|
||||
override fun encode(buffer: FriendlyByteBuf) {
|
||||
super.encode(buffer)
|
||||
buffer.writeResourceLocation(activeController.get())
|
||||
defaultBehaviourState.encode(buffer)
|
||||
alternateBehaviourState.encode(buffer)
|
||||
}
|
||||
|
||||
override fun decode(buffer: FriendlyByteBuf) {
|
||||
super.decode(buffer)
|
||||
activeController.set(buffer.readResourceLocation(), forced = true)
|
||||
defaultBehaviourState.decode(buffer)
|
||||
alternateBehaviourState.decode(buffer)
|
||||
}
|
||||
|
||||
}
|
||||
-32
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeSettings
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
|
||||
object CompositeRidingStrategies {
|
||||
val strategies = mutableMapOf<ResourceLocation, CompositeRidingStrategy<out CompositeSettings>>()
|
||||
|
||||
init {
|
||||
register(RunStrategy.key, RunStrategy)
|
||||
register(JumpStrategy.key, JumpStrategy)
|
||||
register(FallStrategy.key, FallStrategy)
|
||||
}
|
||||
|
||||
fun register(key: ResourceLocation, strategy: CompositeRidingStrategy<out CompositeSettings>) {
|
||||
if (strategies.contains(key)) error("Strategy already registered to key $key")
|
||||
strategies[key] = strategy
|
||||
}
|
||||
|
||||
fun get(key: ResourceLocation): CompositeRidingStrategy<CompositeSettings> {
|
||||
if (!strategies.contains(key)) error("Strategy not registered to key $key")
|
||||
return strategies[key]!! as CompositeRidingStrategy<CompositeSettings>
|
||||
}
|
||||
}
|
||||
-53
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviours
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeState
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonBehaviourFlag
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
interface CompositeRidingStrategy<T : CompositeSettings> {
|
||||
val key: ResourceLocation
|
||||
|
||||
fun tick(
|
||||
settings: T,
|
||||
state: CompositeState,
|
||||
defaultState: RidingBehaviourState,
|
||||
alternateState: RidingBehaviourState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
)
|
||||
|
||||
fun transition(
|
||||
vehicle: PokemonEntity,
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
fromState: RidingBehaviourState,
|
||||
toState: RidingBehaviourState,
|
||||
toSettings: RidingBehaviourSettings
|
||||
) {
|
||||
toState.stamina.set(fromState.stamina.get())
|
||||
toState.rideVelocity.set(fromState.rideVelocity.get())
|
||||
fromState.reset()
|
||||
state.activeController.set(toSettings.key)
|
||||
state.lastTransition.set(vehicle.level().gameTime)
|
||||
val behaviour = RidingBehaviours.get(toSettings.key)
|
||||
vehicle.setBehaviourFlag(PokemonBehaviourFlag.FLYING, behaviour.style == RidingStyle.AIR)
|
||||
}
|
||||
|
||||
}
|
||||
-99
@@ -1,99 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviours
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeState
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonBehaviourFlag
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
object FallStrategy : CompositeRidingStrategy<FallCompositeSettings> {
|
||||
|
||||
override val key = cobblemonResource("strategy/fall")
|
||||
|
||||
override fun tick(
|
||||
settings: FallCompositeSettings,
|
||||
state: CompositeState,
|
||||
defaultState: RidingBehaviourState,
|
||||
alternateState: RidingBehaviourState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
) {
|
||||
if (shouldTransitionToDefault(state, settings.defaultBehaviour, vehicle)) {
|
||||
transition(vehicle, settings, state, alternateState, defaultState, settings.defaultBehaviour)
|
||||
} else if (shouldTransitionToAlternate(settings, state, settings.alternateBehaviour, vehicle, driver)) {
|
||||
transition(vehicle, settings, state, defaultState, alternateState, settings.alternateBehaviour)
|
||||
}
|
||||
}
|
||||
|
||||
private fun shouldTransitionToDefault(
|
||||
state: CompositeState,
|
||||
defaultSettings: RidingBehaviourSettings,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
if (state.activeController.get() == defaultSettings.key) return false
|
||||
if (state.lastTransition.get() + 20 >= vehicle.level().gameTime) return false
|
||||
if (!vehicle.onGround()) return false
|
||||
val defaultBehaviour = RidingBehaviours.get(defaultSettings.key)
|
||||
return defaultBehaviour.isActive(defaultSettings, state.defaultBehaviourState, vehicle)
|
||||
}
|
||||
|
||||
private fun shouldTransitionToAlternate(
|
||||
settings: FallCompositeSettings,
|
||||
state: CompositeState,
|
||||
alternateSettings: RidingBehaviourSettings,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
if (state.activeController.get() == alternateSettings.key) return false
|
||||
if (!driver.jumping) return false
|
||||
if (state.lastTransition.get() + 20 >= vehicle.level().gameTime) return false
|
||||
|
||||
val runtime = vehicle.runtime
|
||||
val minFallingSpeed = runtime.resolveFloat(settings.minimumFallSpeed)
|
||||
val minForwardSpeed = runtime.resolveFloat(settings.minimumForwardSpeed)
|
||||
if (vehicle.deltaMovement.y < -minFallingSpeed) return false
|
||||
if (vehicle.deltaMovement.horizontalDistance() < minForwardSpeed) return false
|
||||
val alternativeBehaviour = RidingBehaviours.get(alternateSettings.key)
|
||||
return alternativeBehaviour.isActive(alternateSettings, state.alternateBehaviourState, vehicle)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class FallCompositeSettings : CompositeSettings() {
|
||||
override val key = FallStrategy.key
|
||||
|
||||
var minimumForwardSpeed: Expression = "0.0".asExpression()
|
||||
private set
|
||||
|
||||
var minimumFallSpeed: Expression = "0.5".asExpression()
|
||||
private set
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
super.encode(buffer)
|
||||
buffer.writeExpression(minimumForwardSpeed)
|
||||
buffer.writeExpression(minimumFallSpeed)
|
||||
}
|
||||
|
||||
override fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
super.decode(buffer)
|
||||
minimumForwardSpeed = buffer.readExpression()
|
||||
minimumFallSpeed = buffer.readExpression()
|
||||
}
|
||||
}
|
||||
-68
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviours
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeState
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonBehaviourFlag
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
object JumpStrategy : CompositeRidingStrategy<CompositeSettings> {
|
||||
|
||||
override val key = cobblemonResource("strategy/jump")
|
||||
|
||||
override fun tick(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
defaultState: RidingBehaviourState,
|
||||
alternateState: RidingBehaviourState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
) {
|
||||
if (shouldTransitionToDefault(state, settings.defaultBehaviour, vehicle)) {
|
||||
transition(vehicle, settings, state, alternateState, defaultState, settings.defaultBehaviour)
|
||||
} else if (shouldTransitionToAlternative(state, settings.alternateBehaviour, vehicle, driver)) {
|
||||
transition(vehicle, settings, state, defaultState, alternateState, settings.alternateBehaviour)
|
||||
}
|
||||
}
|
||||
|
||||
private fun shouldTransitionToDefault(
|
||||
state: CompositeState,
|
||||
defaultSettings: RidingBehaviourSettings,
|
||||
vehicle: PokemonEntity
|
||||
): Boolean {
|
||||
if (state.activeController.get() == defaultSettings.key) return false
|
||||
if (!vehicle.onGround()) return false
|
||||
if (state.lastTransition.get() + 20 >= vehicle.level().gameTime) return false
|
||||
val defaultBehaviour = RidingBehaviours.get(defaultSettings.key)
|
||||
return defaultBehaviour.isActive(defaultSettings, state.defaultBehaviourState, vehicle)
|
||||
}
|
||||
|
||||
private fun shouldTransitionToAlternative(
|
||||
state: CompositeState,
|
||||
alternativeSettings: RidingBehaviourSettings,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
if (state.activeController.get() == alternativeSettings.key) return false
|
||||
if (!driver.jumping) return false
|
||||
if (state.lastTransition.get() + 20 >= vehicle.level().gameTime) return false
|
||||
val alternativeBehaviour = RidingBehaviours.get(alternativeSettings.key)
|
||||
return alternativeBehaviour.isActive(alternativeSettings, state.alternateBehaviourState, vehicle)
|
||||
}
|
||||
|
||||
}
|
||||
-69
@@ -1,69 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviours
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeState
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
object RunStrategy : CompositeRidingStrategy<CompositeSettings> {
|
||||
|
||||
override val key = cobblemonResource("strategy/run")
|
||||
|
||||
override fun tick(
|
||||
settings: CompositeSettings,
|
||||
state: CompositeState,
|
||||
defaultState: RidingBehaviourState,
|
||||
alternateState: RidingBehaviourState,
|
||||
vehicle: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
) {
|
||||
if (shouldTransitionToDefault(state, settings.defaultBehaviour, vehicle, driver)) {
|
||||
transition(vehicle, settings, state, alternateState, defaultState, settings.defaultBehaviour)
|
||||
}
|
||||
else if (shouldTransitionToAlternate(state, settings.alternateBehaviour, vehicle, driver, input)) {
|
||||
transition(vehicle, settings, state, defaultState, alternateState, settings.alternateBehaviour)
|
||||
}
|
||||
}
|
||||
|
||||
private fun shouldTransitionToDefault(
|
||||
state: CompositeState,
|
||||
defaultSettings: RidingBehaviourSettings,
|
||||
entity: PokemonEntity,
|
||||
driver: Player
|
||||
): Boolean {
|
||||
if (state.activeController.get() == defaultSettings.key) return false
|
||||
if (!entity.onGround()) return false
|
||||
if (state.lastTransition.get() + 20 >= entity.level().gameTime) return false
|
||||
val defaultBehaviour = RidingBehaviours.get(defaultSettings.key)
|
||||
val ret = defaultBehaviour.isActive(defaultSettings, state.defaultBehaviourState, entity)
|
||||
return ret
|
||||
}
|
||||
|
||||
private fun shouldTransitionToAlternate(
|
||||
state: CompositeState,
|
||||
alternativeSettings: RidingBehaviourSettings,
|
||||
entity: PokemonEntity,
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
): Boolean {
|
||||
if (state.activeController.get() == alternativeSettings.key) return false
|
||||
if (state.lastTransition.get() + 20 >= entity.level().gameTime) return false
|
||||
val alternativeBehaviour = RidingBehaviours.get(alternativeSettings.key)
|
||||
return driver.isSprinting && input.z > 0.5 && alternativeBehaviour.isActive(alternativeSettings, state.alternateBehaviourState, entity)
|
||||
}
|
||||
|
||||
}
|
||||
-143
@@ -1,143 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.util
|
||||
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.math.geometry.toRadians
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import org.joml.Matrix3f
|
||||
import org.joml.Quaternionf
|
||||
import org.joml.Vector3f
|
||||
|
||||
/**
|
||||
* Class to handle the updating and containment of ride data used in animation.
|
||||
*
|
||||
* @author Jackowes
|
||||
* @since April 7th, 2025
|
||||
*/
|
||||
|
||||
|
||||
class RidingAnimationData
|
||||
{
|
||||
var prevOrientation: Matrix3f = Matrix3f()
|
||||
var prevRot: Vec3 = Vec3.ZERO
|
||||
var velocitySpring: Vec3Spring = Vec3Spring()
|
||||
var rotSpring: Vec3Spring = Vec3Spring()
|
||||
var rotDeltaSpring: Vec3Spring = Vec3Spring()
|
||||
var localVelocitySpring: Vec3Spring = Vec3Spring()
|
||||
|
||||
fun update(entity: PokemonEntity) {
|
||||
|
||||
var currRot = Vec3.ZERO
|
||||
var angDelta = Vec3.ZERO
|
||||
|
||||
// val stiffness = 90.0
|
||||
// val damping = 18.0
|
||||
val stiffness = 16.0
|
||||
val damping = 8.0
|
||||
|
||||
// Update velocity first
|
||||
val currentVelocity = Vec3(
|
||||
entity.x - entity.xOld,
|
||||
entity.y - entity.yOld,
|
||||
entity.z - entity.zOld
|
||||
)
|
||||
|
||||
val r = entity.ifRidingAvailableSupply(false) { behaviour, settings, state ->
|
||||
behaviour.shouldRoll(settings, state, entity);
|
||||
}
|
||||
if( r ) {
|
||||
//TODO: should this return?
|
||||
val controller = (entity.firstPassenger as? OrientationControllable)?.orientationController ?: return
|
||||
val orientation = controller.orientation ?: Matrix3f()
|
||||
|
||||
val currPitch = controller.pitch
|
||||
val currYaw = controller.yaw
|
||||
val currRoll = controller.roll
|
||||
currRot = Vec3(currPitch.toDouble(), currYaw.toDouble(), currRoll.toDouble())
|
||||
|
||||
val currOrientation = orientation
|
||||
|
||||
/******************************************************
|
||||
* Calculate current 3d euler rotation deltas in the
|
||||
* entities local space
|
||||
*****************************************************/
|
||||
|
||||
// Get current and previous orientation as quaternions
|
||||
val currQuat = Quaternionf().setFromUnnormalized(currOrientation)
|
||||
val prevQuat = Quaternionf().setFromUnnormalized(prevOrientation)
|
||||
|
||||
// Compute deltaQuat = current * inverse(previous)
|
||||
val deltaQuat = Quaternionf(currQuat).mul(Quaternionf(prevQuat).invert())
|
||||
|
||||
// Transform delta into the local space of the current orientation
|
||||
val localDeltaQuat = Quaternionf(currQuat).invert().mul(deltaQuat).mul(currQuat)
|
||||
|
||||
// Convert delta rotation to Euler angles
|
||||
val euler = Vector3f()
|
||||
localDeltaQuat.getEulerAnglesXYZ(euler) // Angles are in radians
|
||||
|
||||
// Convert to degrees
|
||||
val pitchDegrees = Math.toDegrees(euler.x.toDouble()) // Rotation around X axis = pitch
|
||||
val yawDegrees = Math.toDegrees(euler.y.toDouble()) // Rotation around Y axis = yaw
|
||||
val rollDegrees = Math.toDegrees(euler.z.toDouble()) // Rotation around Z axis = roll
|
||||
//Scale rotation delta by 20 to represent degree per second instead of tick
|
||||
angDelta = Vec3(pitchDegrees, yawDegrees, rollDegrees).scale(20.0)
|
||||
|
||||
/******************************************************
|
||||
* Calculate ride local velocity
|
||||
*****************************************************/
|
||||
val velocityWorldF = Vector3f(currentVelocity.x.toFloat(), currentVelocity.y.toFloat(), currentVelocity.z.toFloat())
|
||||
|
||||
val localVelocityF = Matrix3f(orientation).transpose().transform(velocityWorldF)
|
||||
val localVelocity = Vec3(localVelocityF.x.toDouble(), localVelocityF.y.toDouble(), localVelocityF.z.toDouble())
|
||||
|
||||
localVelocitySpring.update(localVelocity, stiffness, damping)
|
||||
|
||||
// Update previous values
|
||||
prevOrientation.set(currOrientation)
|
||||
} else {
|
||||
val currPitch = entity.xRot
|
||||
val currYaw = entity.yRot
|
||||
val currRoll = 0.0f
|
||||
currRot = Vec3(currPitch.toDouble(), currYaw.toDouble(), currRoll.toDouble())
|
||||
|
||||
//Scale rotation delta by 20 to represent degree per second instead of tick
|
||||
angDelta = Vec3(
|
||||
(currRot.x - prevRot.x),
|
||||
Mth.degreesDifference(currRot.y.toFloat(), prevRot.y.toFloat()).toDouble(),
|
||||
Mth.degreesDifference(currRot.z.toFloat(), prevRot.z.toFloat()).toDouble()
|
||||
).scale(20.0)
|
||||
|
||||
/******************************************************
|
||||
* Calculate ride local velocity
|
||||
*****************************************************/
|
||||
val yaw360 = -1.0 * (entity.yRot + 360.0f) % 360.0f
|
||||
val orientationNonRollable = Matrix3f().rotateY(yaw360.toRadians())
|
||||
|
||||
//Convert to Vector3f
|
||||
var velocityWorldF = Vector3f(currentVelocity.x.toFloat(), currentVelocity.y.toFloat(), currentVelocity.z.toFloat())
|
||||
|
||||
val localVelocityF = Matrix3f(orientationNonRollable).transpose().transform(velocityWorldF)
|
||||
val localVelocity = Vec3(localVelocityF.x.toDouble(), localVelocityF.y.toDouble(), localVelocityF.z.toDouble())
|
||||
|
||||
localVelocitySpring.update(localVelocity, stiffness, damping)
|
||||
}
|
||||
|
||||
/******************************************************
|
||||
* Update springs
|
||||
*****************************************************/
|
||||
rotDeltaSpring.update(angDelta, stiffness, damping)
|
||||
velocitySpring.update(currentVelocity, stiffness, damping)
|
||||
rotSpring.update(currRot, stiffness, damping)
|
||||
prevRot = currRot
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.riding.util
|
||||
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import kotlin.math.min
|
||||
|
||||
/**
|
||||
* A spring-based smoother for Vec3 values, designed for applying damped spring motion to riding data.
|
||||
* Stores the previous and current values, along with a history buffer for lookback-based interpolation.
|
||||
*
|
||||
* @author Jackowes
|
||||
* @since March 27th, 2025
|
||||
*/
|
||||
|
||||
|
||||
class Vec3Spring(
|
||||
var value: Vec3 = Vec3.ZERO,
|
||||
var velocity: Vec3 = Vec3.ZERO
|
||||
) {
|
||||
val history = ArrayDeque<Vec3>()
|
||||
//Hold up to a seconds worth of values
|
||||
val lookBackSize = 20
|
||||
|
||||
fun update(target: Vec3, stiffness: Double, damping: Double) {
|
||||
|
||||
//Hooke's Law f = kx where:
|
||||
//f is force
|
||||
//k is the spring constant or stiffness of this spring
|
||||
//x is the distance from rest and in this case the difference between the most recent
|
||||
//rotation delta ( the target ) and the springs current value for delta rot
|
||||
val force = target.subtract(value).scale(stiffness)
|
||||
|
||||
//Now calculate acceleration and apply damping
|
||||
val accel = force.subtract(velocity.scale(damping))
|
||||
|
||||
velocity = velocity.add(accel.scale(1.0/20.0))
|
||||
value = value.add(velocity.scale(1.0/20.0))
|
||||
|
||||
history.addFirst(value)
|
||||
//Adding one since if we want to check max look back point it needs something to interp with.
|
||||
if( history.size > lookBackSize + 1) {
|
||||
history.removeLast()
|
||||
}
|
||||
}
|
||||
|
||||
fun getInterpolated(partialTick: Double, lookBackTick: Int): Vec3 {
|
||||
if (history.size < 2) {
|
||||
return value // or Vec3.ZERO if you prefer
|
||||
}
|
||||
|
||||
val tick = min(lookBackTick, history.size - 2)
|
||||
var ret = Vec3.ZERO
|
||||
for( i in 0..tick) {
|
||||
val older = history.get(i + 1).scale(1.0)
|
||||
val newer = history.get(i).scale(1.0)
|
||||
ret = ret.add(older.add(newer.subtract(older).scale(partialTick)))
|
||||
}
|
||||
|
||||
return ret.scale(1.0/(tick+1))
|
||||
}
|
||||
}
|
||||
+8
-30
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.api.spawning.spawner.PlayerSpawnerFactory
|
||||
import com.cobblemon.mod.common.platform.events.PlatformEvents
|
||||
import com.cobblemon.mod.common.util.server
|
||||
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import java.util.UUID
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
|
||||
@@ -33,45 +32,24 @@ object CobblemonWorldSpawnerManager : SpawnerManager() {
|
||||
init {
|
||||
PlatformEvents.SERVER_PLAYER_LOGIN.subscribe { this.onPlayerLogin(it.player) }
|
||||
PlatformEvents.SERVER_PLAYER_LOGOUT.subscribe { this.onPlayerLogout(it.player) }
|
||||
PlatformEvents.CHANGE_DIMENSION.subscribe { this.onDimensionChange(it.player, it.origin, it.destination) }
|
||||
}
|
||||
|
||||
fun onPlayerLogin(player: ServerPlayer) {
|
||||
// Disables spawning
|
||||
if (!Cobblemon.config.enableSpawning || player.level().gameRules.getBoolean(CobblemonGameRules.DO_POKEMON_SPAWNING) == false) {
|
||||
if (!Cobblemon.config.enableSpawning || server()?.gameRules?.getBoolean(CobblemonGameRules.DO_POKEMON_SPAWNING) == false) {
|
||||
return;
|
||||
}
|
||||
|
||||
registerPlayerSpawner(player)
|
||||
val spawner = PlayerSpawnerFactory.create(this, player)
|
||||
spawnersForPlayers[player.uuid] = spawner
|
||||
registerSpawner(spawner)
|
||||
}
|
||||
|
||||
fun onPlayerLogout(player: ServerPlayer) {
|
||||
unregisterPlayerSpawner(player)
|
||||
}
|
||||
|
||||
fun onDimensionChange(player: ServerPlayer, origin: ServerLevel?, destination: ServerLevel?) {
|
||||
fun getSpawnRule(level: ServerLevel?) = level?.gameRules?.getBoolean(CobblemonGameRules.DO_POKEMON_SPAWNING)
|
||||
|
||||
if (!Cobblemon.config.enableSpawning || getSpawnRule(origin) == getSpawnRule(destination)) {
|
||||
return
|
||||
}
|
||||
|
||||
val spawnerAction = if (destination?.gameRules?.getBoolean(CobblemonGameRules.DO_POKEMON_SPAWNING) == false) {
|
||||
::unregisterPlayerSpawner
|
||||
} else {
|
||||
::registerPlayerSpawner
|
||||
}
|
||||
spawnerAction(player)
|
||||
}
|
||||
|
||||
private fun unregisterPlayerSpawner(player: ServerPlayer) {
|
||||
spawnersForPlayers.remove(player.uuid)?.let { unregisterSpawner(it) }
|
||||
}
|
||||
|
||||
private fun registerPlayerSpawner(player: ServerPlayer) {
|
||||
PlayerSpawnerFactory.create(this, player).also {
|
||||
spawnersForPlayers[player.uuid] = it
|
||||
registerSpawner(it)
|
||||
val spawner = spawnersForPlayers[player.uuid]
|
||||
if (spawner != null) {
|
||||
spawnersForPlayers.remove(player.uuid)
|
||||
unregisterSpawner(spawner)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -71,15 +71,10 @@ open class SpawnerManager {
|
||||
|
||||
open fun onServerTick() {
|
||||
// Disables spawning
|
||||
if (!Cobblemon.config.enableSpawning) {
|
||||
if (!Cobblemon.config.enableSpawning || server()?.gameRules?.getBoolean(DO_POKEMON_SPAWNING) == false) {
|
||||
return
|
||||
}
|
||||
influences.removeIf { it.isExpired() }
|
||||
getSpawnersOfType<TickingSpawner>().forEach {
|
||||
if (it.getCauseEntity()?.level()?.gameRules?.getBoolean(DO_POKEMON_SPAWNING) == false) {
|
||||
return@forEach
|
||||
}
|
||||
it.tick()
|
||||
}
|
||||
getSpawnersOfType<TickingSpawner>().forEach(TickingSpawner::tick)
|
||||
}
|
||||
}
|
||||
-77
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client
|
||||
|
||||
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
/**
|
||||
* This class is responsible for setting up the animation state of a Pokemon entity before it begins to render.
|
||||
*
|
||||
* Sometimes we depend on the animation state of the Pokemon to be set up before we begin rendering it, so this class
|
||||
* allows us to do that. It also caches which Pokemon have been pre-animated to avoid doing it multiple times.
|
||||
*
|
||||
* @author landonjw
|
||||
*/
|
||||
object MountedPokemonAnimationRenderController {
|
||||
private val forcedDeltas = mutableMapOf<Int, Float>()
|
||||
|
||||
fun setup(pokemon: PokemonEntity, partialTickTime: Float) {
|
||||
if (forcedDeltas.contains(pokemon.id)) return
|
||||
|
||||
val delegate = pokemon.delegate as? PokemonClientDelegate ?: return
|
||||
val model = delegate.currentModel ?: return
|
||||
if (!model.isReadyForAnimation()) return
|
||||
|
||||
val entityPos = Vec3(
|
||||
Mth.lerp(partialTickTime.toDouble(), pokemon.xOld, pokemon.x),
|
||||
Mth.lerp(partialTickTime.toDouble(), pokemon.yOld, pokemon.y),
|
||||
Mth.lerp(partialTickTime.toDouble(), pokemon.zOld, pokemon.z)
|
||||
)
|
||||
|
||||
val f = Mth.rotLerp(partialTickTime, pokemon.yBodyRotO, pokemon.yBodyRot)
|
||||
val g = Mth.rotLerp(partialTickTime, pokemon.yHeadRotO, pokemon.yHeadRot)
|
||||
var h = g - f
|
||||
val j = Mth.lerp(partialTickTime, pokemon.xRotO, pokemon.xRot)
|
||||
h = Mth.wrapDegrees(h)
|
||||
|
||||
var l = 0.0f
|
||||
var m = 0.0f
|
||||
if (!pokemon.isPassenger && pokemon.isAlive) {
|
||||
l = pokemon.walkAnimation.speed(partialTickTime)
|
||||
m = pokemon.walkAnimation.position(partialTickTime)
|
||||
if (pokemon.isBaby) {
|
||||
m *= 3.0f
|
||||
}
|
||||
|
||||
if (l > 1.0f) {
|
||||
l = 1.0f
|
||||
}
|
||||
}
|
||||
|
||||
delegate.updatePartialTicks(partialTickTime)
|
||||
delegate.updateLocatorPosition(entityPos)
|
||||
delegate.currentModel?.applyAnimations(pokemon, delegate, l, m, partialTickTime, j, h)
|
||||
|
||||
forcedDeltas[pokemon.id] = partialTickTime
|
||||
}
|
||||
|
||||
fun getPartialTick(pokemon: PokemonEntity) : Float? {
|
||||
return forcedDeltas[pokemon.id]
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the prerendered list. This should be called in the render loop before we begin setting up any pokemon with `setup`.
|
||||
*/
|
||||
fun reset() {
|
||||
forcedDeltas.clear()
|
||||
}
|
||||
}
|
||||
+1
-4
@@ -345,12 +345,9 @@ class PokemonClientDelegate : PosableState(), PokemonSideDelegate {
|
||||
runtime.environment.query = struct
|
||||
}
|
||||
|
||||
override fun updateAge(age: Int) {
|
||||
this.age = age
|
||||
}
|
||||
|
||||
override fun initialize(entity: PokemonEntity) {
|
||||
this.currentEntity = entity
|
||||
this.age = entity.tickCount
|
||||
|
||||
this.runtime.environment.query.addFunctions(mapOf(
|
||||
"in_battle" to java.util.function.Function {
|
||||
|
||||
-3
@@ -48,7 +48,6 @@ import com.mojang.blaze3d.vertex.PoseStack
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer
|
||||
import com.mojang.blaze3d.vertex.VertexFormat
|
||||
import com.mojang.math.Axis
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.client.renderer.MultiBufferSource
|
||||
import net.minecraft.client.renderer.RenderStateShard
|
||||
@@ -827,6 +826,4 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
|
||||
condition = condition,
|
||||
animations = { animations(it) }
|
||||
)
|
||||
|
||||
fun isReadyForAnimation() = ::context.isInitialized
|
||||
}
|
||||
|
||||
+5
-142
@@ -35,10 +35,8 @@ import com.cobblemon.mod.common.client.render.models.blockbench.quirk.ModelQuirk
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.quirk.QuirkData
|
||||
import com.cobblemon.mod.common.entity.PosableEntity
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||
import com.mojang.brigadier.StringReader
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.multiplayer.ClientLevel
|
||||
import net.minecraft.client.resources.sounds.SimpleSoundInstance
|
||||
@@ -132,137 +130,8 @@ abstract class PosableState : Schedulable {
|
||||
/** A list of items to be rendered on a PosableModel during an animation */
|
||||
val animationItems = mutableMapOf<String, ItemStack>()
|
||||
|
||||
/** All of the MoLang functions that can be expose current riding data. */
|
||||
val ridingFunctions = QueryStruct(hashMapOf())
|
||||
.addFunction("pitch") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
val partialTickPitch = pokemon.ridingAnimationData.rotSpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).x
|
||||
val maxPitch = 90.0
|
||||
return@addFunction DoubleValue((partialTickPitch / maxPitch).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("yaw") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
val partialTickYaw = pokemon.ridingAnimationData.rotSpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).y
|
||||
val maxYaw = 180.0
|
||||
return@addFunction DoubleValue((partialTickYaw / maxYaw).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("roll") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
val partialTickRoll = pokemon.ridingAnimationData.rotSpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).z
|
||||
val maxRoll = 180.0
|
||||
return@addFunction DoubleValue((partialTickRoll / maxRoll).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("pitch_change") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
val partialTickPitchDelta = pokemon.ridingAnimationData.rotDeltaSpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).x
|
||||
//TODO: hook back up the retrieval of the current behaviors stat for this and the following functions
|
||||
val maxRotRate = 140.0//pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SKILL)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickPitchDelta / maxRotRate).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("yaw_change") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
val partialTickYawDelta = pokemon.ridingAnimationData.rotDeltaSpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).y
|
||||
//TODO: make this not hardcoded
|
||||
val maxRotRate = 140.0 //pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SKILL)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickYawDelta / maxRotRate).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("roll_change") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
val partialTickRollDelta = pokemon.ridingAnimationData.rotDeltaSpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).z
|
||||
val maxRotRate = 140.0 //pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SKILL)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickRollDelta / maxRotRate).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("speed") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
|
||||
val partialTickSpeed = pokemon.ridingAnimationData.velocitySpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).length()
|
||||
val topSpeed = 1.0//pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SPEED)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
|
||||
return@addFunction DoubleValue((partialTickSpeed / topSpeed).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("velocity_x") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
|
||||
val partialTickXVel = pokemon.ridingAnimationData.velocitySpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).x
|
||||
|
||||
val topSpeed = 1.0//pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SPEED)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickXVel / topSpeed).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("velocity_y") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
|
||||
val partialTickYVel = pokemon.ridingAnimationData.velocitySpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).y
|
||||
|
||||
val topSpeed = 1.0//pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SPEED)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickYVel / topSpeed).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("velocity_z") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
|
||||
val partialTickZVel = pokemon.ridingAnimationData.velocitySpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).z
|
||||
|
||||
val topSpeed = 1.0//pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SPEED)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickZVel / topSpeed).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("velocity_right") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
|
||||
val partialTickZVel = pokemon.ridingAnimationData.localVelocitySpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).x
|
||||
|
||||
val topSpeed = 1.0//pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SPEED)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickZVel / topSpeed).coerceIn(-1.0,1.0) * -1.0)
|
||||
}
|
||||
.addFunction("velocity_upward") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
|
||||
val partialTickZVel = pokemon.ridingAnimationData.localVelocitySpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).y
|
||||
|
||||
val topSpeed = 1.0//pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SPEED)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickZVel / topSpeed).coerceIn(-1.0,1.0))
|
||||
}
|
||||
.addFunction("velocity_forward") { params ->
|
||||
val lookBackTick = params.getInt(0)
|
||||
val pokemon = getEntity() as? PokemonEntity ?: return@addFunction DoubleValue(0.0)
|
||||
|
||||
val partialTickZVel = pokemon.ridingAnimationData.localVelocitySpring.getInterpolated(currentPartialTicks.toDouble(), lookBackTick).z
|
||||
|
||||
val topSpeed = 1.0//pokemon.riding.getController(pokemon)?.getStat(pokemon, RidingStat.SPEED)
|
||||
//?: return@addFunction DoubleValue(0.0)
|
||||
return@addFunction DoubleValue((partialTickZVel / topSpeed).coerceIn(-1.0,1.0))
|
||||
}
|
||||
|
||||
|
||||
/** All of the MoLang functions that can be applied to something with this state. */
|
||||
val functions = QueryStruct(hashMapOf(
|
||||
"riding" to java.util.function.Function { ridingFunctions },
|
||||
"r" to java.util.function.Function { ridingFunctions }
|
||||
))
|
||||
val functions = QueryStruct(hashMapOf())
|
||||
.addFunction("anim_time") {
|
||||
reusableAnimTime.value = animationSeconds.toDouble()
|
||||
reusableAnimTime
|
||||
@@ -288,16 +157,10 @@ abstract class PosableState : Schedulable {
|
||||
.addFunction("render_item") { params ->
|
||||
if (params.get<MoValue>(0) !is StringValue) return@addFunction Unit
|
||||
|
||||
val item: ItemStack
|
||||
try {
|
||||
val client = Minecraft.getInstance().connection ?: return@addFunction Unit
|
||||
val result = ItemParser(client.registryAccess()).parse(StringReader(params.getString(0)))
|
||||
item = ItemStack(result.item)
|
||||
item.applyComponents(result.components)
|
||||
}
|
||||
catch (_: CommandSyntaxException) {
|
||||
return@addFunction Unit
|
||||
}
|
||||
val client = Minecraft.getInstance().connection ?: return@addFunction Unit
|
||||
val result = ItemParser(client.registryAccess()).parse(StringReader(params.getString(0)))
|
||||
val item = ItemStack(result.item)
|
||||
item.applyComponents(result.components)
|
||||
|
||||
val renderLocation = if (params.contains(1)) params.getString(1) else "item"
|
||||
|
||||
|
||||
+6
-17
@@ -8,8 +8,10 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench
|
||||
|
||||
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
|
||||
import com.cobblemon.mod.common.entity.PosableEntity
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture
|
||||
import net.minecraft.client.renderer.RenderType
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer
|
||||
@@ -34,6 +36,7 @@ abstract class PosableEntityModel<T : Entity>(
|
||||
val context: RenderContext = RenderContext().also {
|
||||
it.put(RenderContext.RENDER_STATE, RenderContext.RenderState.WORLD)
|
||||
}
|
||||
|
||||
lateinit var posableModel: PosableModel
|
||||
|
||||
override fun renderToBuffer(
|
||||
@@ -76,25 +79,11 @@ abstract class PosableEntityModel<T : Entity>(
|
||||
) {
|
||||
setupEntityTypeContext(entity)
|
||||
if (entity is PosableEntity) {
|
||||
val ticks = getTicksForAnimation(entity, limbSwing, limbSwingAmount, ageInTicks, headYaw, headPitch)
|
||||
posableModel.applyAnimations(entity, entity.delegate as PosableState, limbSwing, limbSwingAmount, ticks, headYaw, headPitch)
|
||||
val state = entity.delegate as PosableState
|
||||
posableModel.applyAnimations(entity, state, limbSwing, limbSwingAmount, ageInTicks, headYaw, headPitch)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is to support cases where the ageInTicks value that should go to the animator is not the same as the entity's
|
||||
* normal value. This can happen in the case of riding where it has been rendered in a different part of the pipeline
|
||||
* and we want to prevent stuttering / re-render it for a specific moment.
|
||||
*/
|
||||
open fun getTicksForAnimation(
|
||||
entity: T,
|
||||
limbSwing: Float,
|
||||
limbSwingAmount: Float,
|
||||
ageInTicks: Float,
|
||||
headYaw: Float,
|
||||
headPitch: Float
|
||||
): Float = ageInTicks
|
||||
|
||||
open fun setupEntityTypeContext(entity: Entity?) {
|
||||
entity?.let {
|
||||
context.put(RenderContext.ENTITY, entity)
|
||||
@@ -103,4 +92,4 @@ abstract class PosableEntityModel<T : Entity>(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-28
@@ -8,16 +8,12 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon
|
||||
|
||||
import com.cobblemon.mod.common.client.MountedPokemonAnimationRenderController
|
||||
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableEntityModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
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.pokemon.PokemonEntity
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.world.entity.Entity
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class PosablePokemonEntityModel : PosableEntityModel<PokemonEntity>() {
|
||||
override fun setupEntityTypeContext(entity: Entity?) {
|
||||
@@ -30,28 +26,4 @@ class PosablePokemonEntityModel : PosableEntityModel<PokemonEntity>() {
|
||||
.let { texture -> context.put(RenderContext.TEXTURE, texture) }
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: This is a bit of a hack, but it works for now. We should find a better way to do this.
|
||||
override fun getTicksForAnimation(
|
||||
entity: PokemonEntity,
|
||||
limbSwing: Float,
|
||||
limbSwingAmount: Float,
|
||||
ageInTicks: Float,
|
||||
headYaw: Float,
|
||||
headPitch: Float
|
||||
): Float {
|
||||
val delegate = entity.delegate as? PosableState
|
||||
val forcedTick = MountedPokemonAnimationRenderController.getPartialTick(entity)
|
||||
if (entity.passengers.isEmpty() || delegate == null || forcedTick == null) {
|
||||
return ageInTicks
|
||||
}
|
||||
delegate.updatePartialTicks(forcedTick)
|
||||
val entityPos = Vec3(
|
||||
Mth.lerp(forcedTick.toDouble(), entity.xOld, entity.x),
|
||||
Mth.lerp(forcedTick.toDouble(), entity.yOld, entity.y),
|
||||
Mth.lerp(forcedTick.toDouble(), entity.zOld, entity.z)
|
||||
)
|
||||
delegate.updateLocatorPosition(entityPos)
|
||||
return forcedTick
|
||||
}
|
||||
}
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* 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.gen3
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
|
||||
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.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class GrovyleModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("grovyle")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val leftLeg = getPart("left_upper_leg")
|
||||
override val rightLeg = getPart("right_upper_leg")
|
||||
|
||||
override var portraitScale = 2.31F
|
||||
override var portraitTranslation = Vec3(-0.24, 1.29, 0.0)
|
||||
|
||||
override var profileScale = 0.66F
|
||||
override var profileTranslation = Vec3(0.01, 0.87, 0.0)
|
||||
|
||||
//lateinit var sleep: CobblemonPose
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("grovyle", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
//sleep = registerPose(
|
||||
// poseType = PoseType.SLEEP,
|
||||
// animations = arrayOf(bedrock("grovyle", "sleep"))
|
||||
//)
|
||||
|
||||
val blink = quirk { bedrockStateful("grovyle", "blink") }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("grovyle", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("grovyle", "ground_idle"),
|
||||
BipedWalkAnimation(this, periodMultiplier = 0.6F, amplitudeMultiplier = 0.9F)
|
||||
)
|
||||
)
|
||||
}
|
||||
//override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
//) = if (state.isNotPosedIn(sleep)) bedrockStateful("grovyle", "faint") else null
|
||||
}
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* 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.gen3
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class MetagrossModel (root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("metagross")
|
||||
|
||||
override var portraitScale = 1.1F
|
||||
override var portraitTranslation = Vec3(-0.45, 0.5, 0.0)
|
||||
|
||||
override var profileScale = 0.4F
|
||||
override var profileTranslation = Vec3(0.0, 1.0, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var hover: Pose
|
||||
lateinit var fly: Pose
|
||||
lateinit var sleep: Pose
|
||||
lateinit var battleidle: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("metagross", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("metagross", "blink")}
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("metagross", "sleep"))
|
||||
)
|
||||
standing = registerPose(
|
||||
poseName = "stand",
|
||||
poseTypes = PoseType.STATIONARY_POSES - PoseType.HOVER - PoseType.FLOAT + PoseType.UI_POSES,
|
||||
condition = { !it.isBattling },
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("metagross", "ground_idle")
|
||||
)
|
||||
)
|
||||
hover = registerPose(
|
||||
poseName = "hover",
|
||||
poseTypes = setOf(PoseType.HOVER, PoseType.FLOAT),
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("metagross", "air_idle")
|
||||
)
|
||||
)
|
||||
fly = registerPose(
|
||||
poseName = "fly",
|
||||
poseTypes = setOf(PoseType.FLY, PoseType.SWIM),
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("metagross", "air_fly")
|
||||
)
|
||||
)
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES - PoseType.FLY - PoseType.SWIM,
|
||||
transformTicks = 5,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("metagross", "ground_walk")
|
||||
)
|
||||
)
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isBattling },
|
||||
animations = arrayOf(
|
||||
bedrock("metagross", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("metagross", "faint") else null
|
||||
}
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* 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.gen3
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
|
||||
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.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SceptileModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("sceptile")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val leftLeg = getPart("left_upper_leg")
|
||||
override val rightLeg = getPart("right_upper_leg")
|
||||
|
||||
override var portraitScale = 2.34F
|
||||
override var portraitTranslation = Vec3(-0.25, 2.22, 0.0)
|
||||
|
||||
override var profileScale = 0.63F
|
||||
override var profileTranslation = Vec3(0.06, 0.91, 0.0)
|
||||
|
||||
lateinit var sleep: CobblemonPose
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("sceptile", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
// sleep = registerPose(
|
||||
// poseType = PoseType.SLEEP,
|
||||
// animations = arrayOf(bedrock("sceptile", "sleep"))
|
||||
// )
|
||||
val blink = quirk { bedrockStateful("sceptile", "blink") }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("sceptile", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("sceptile", "ground_idle"),
|
||||
BipedWalkAnimation(this, periodMultiplier = 0.6F, amplitudeMultiplier = 0.9F)
|
||||
)
|
||||
)
|
||||
}
|
||||
//override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
//) = if (state.isNotPosedIn(sleep)) bedrockStateful("sceptile", "faint") else null
|
||||
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen3
|
||||
|
||||
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 TreeckoModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("treecko")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 2.25F
|
||||
override var portraitTranslation = Vec3(0.02, 0.12, 0.0)
|
||||
|
||||
override var profileScale = 0.74F
|
||||
override var profileTranslation = Vec3(0.0, 0.6, 0.0)
|
||||
|
||||
lateinit var sleep: CobblemonPose
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("treecko", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
//sleep = registerPose(
|
||||
// poseType = PoseType.SLEEP,
|
||||
// animations = arrayOf(bedrock("treecko", "sleep"))
|
||||
//)
|
||||
|
||||
val blink = quirk { bedrockStateful("treecko", "blink") }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES + PoseType.SLEEP,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("treecko", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("treecko", "ground_walk"),
|
||||
)
|
||||
)
|
||||
}
|
||||
//override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
//) = if (state.isNotPosedIn(sleep)) bedrockStateful("treecko", "faint") else null
|
||||
}
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen7
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
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 MudsdaleModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("mudsdale")
|
||||
override val head = getPart("neck")
|
||||
|
||||
override val foreLeftLeg = getPart("leg_front_left")
|
||||
override val foreRightLeg = getPart("leg_front_right")
|
||||
override val hindLeftLeg = getPart("leg_back_left")
|
||||
override val hindRightLeg = getPart("leg_back_right")
|
||||
|
||||
override var portraitScale = 1.5F
|
||||
override var portraitTranslation = Vec3(-1.0, 1.76, 0.0)
|
||||
|
||||
override var profileScale = 0.5F
|
||||
override var profileTranslation = Vec3(0.0, 1.0, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var sleep: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("mudsdale", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("mudsdale", "blink") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("mudsdale", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(disableY = true),
|
||||
bedrock("mudsdale", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(disableY = true),
|
||||
bedrock("mudsdale", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("mudsdale", "faint") else null
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* 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.gen8
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BimanualSwingAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
|
||||
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.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SneaslerModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("sneasler")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val leftArm = getPart("arm_left")
|
||||
override val rightArm = getPart("arm_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
|
||||
override var portraitScale = 2.03F
|
||||
override var portraitTranslation = Vec3(-0.44, 2.41, 0.0)
|
||||
|
||||
override var profileScale = 0.52F
|
||||
override var profileTranslation = Vec3(0.0, 0.94, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("sneasler", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("sneasler", "blink") }
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("sneasler", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("sneasler", "ground_idle"),
|
||||
BipedWalkAnimation(this, periodMultiplier = 0.6F, amplitudeMultiplier = 0.9F),
|
||||
BimanualSwingAnimation(this, swingPeriodMultiplier = 0.6F, amplitudeMultiplier = 0.9F)
|
||||
//bedrock("sneasler", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+6
@@ -404,6 +404,9 @@ object VaryingModelRepository {
|
||||
inbuilt("klinklang", :: KlinklangModel)
|
||||
inbuilt("morelull", :: MorelullModel)
|
||||
inbuilt("shiinotic", :: ShiinoticModel)
|
||||
inbuilt("treecko", :: TreeckoModel)
|
||||
inbuilt("grovyle", :: GrovyleModel)
|
||||
inbuilt("sceptile", :: SceptileModel)
|
||||
inbuilt("honedge", :: HonedgeModel)
|
||||
inbuilt("spiritomb", :: SpiritombModel)
|
||||
inbuilt("chespin", :: ChespinModel)
|
||||
@@ -481,6 +484,7 @@ object VaryingModelRepository {
|
||||
inbuilt("taillow", ::TaillowModel)
|
||||
inbuilt("swellow", ::SwellowModel)
|
||||
inbuilt("mudbray", ::MudbrayModel)
|
||||
inbuilt("mudsdale", ::MudsdaleModel)
|
||||
inbuilt("comfey", ::ComfeyModel)
|
||||
inbuilt("tandemaus", ::TandemausModel)
|
||||
inbuilt("maushold", ::MausholdModel)
|
||||
@@ -638,6 +642,7 @@ object VaryingModelRepository {
|
||||
inbuilt("gallade", ::GalladeModel)
|
||||
inbuilt("beldum", ::BeldumModel)
|
||||
inbuilt("metang", ::MetangModel)
|
||||
inbuilt("metagross", ::MetagrossModel)
|
||||
inbuilt("ursaluna", ::UrsalunaModel)
|
||||
inbuilt("lechonk", ::LechonkModel)
|
||||
inbuilt("oinkologne_male", ::OinkologneMaleModel)
|
||||
@@ -697,6 +702,7 @@ object VaryingModelRepository {
|
||||
inbuilt("qwilfish_hisuian", ::QwilfishHisuianModel)
|
||||
inbuilt("overqwil", ::OverqwilModel)
|
||||
inbuilt("sneasel_hisuian", ::SneaselHisuianModel)
|
||||
inbuilt("sneasler", ::SneaslerModel)
|
||||
inbuilt("petilil", ::PetililModel)
|
||||
inbuilt("lilligant", ::LilligantModel)
|
||||
inbuilt("petilil_hisui_bias", ::PetililHisuiBiasModel)
|
||||
|
||||
+19
-12
@@ -11,7 +11,6 @@ package com.cobblemon.mod.common.client.render.player
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.riding.Rideable
|
||||
import com.cobblemon.mod.common.client.MountedPokemonAnimationRenderController
|
||||
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.bedrock.animation.BedrockAnimationRepository
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
@@ -21,7 +20,6 @@ import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.client.player.AbstractClientPlayer
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import org.joml.AxisAngle4f
|
||||
import org.joml.Matrix4f
|
||||
import org.joml.Vector3f
|
||||
|
||||
@@ -42,7 +40,12 @@ object MountedPlayerRenderer {
|
||||
|
||||
//Positions player
|
||||
if (locator != null) {
|
||||
MountedPokemonAnimationRenderController.setup(entity, partialTicks)
|
||||
val locatorOffset = locator.matrix.getTranslation(Vector3f())
|
||||
|
||||
val center = Vector3f(0f, entity.bbHeight/2, 0f)
|
||||
val locatorOffsetToCenter = locatorOffset.sub(center, Vector3f())
|
||||
val offset = locatorOffsetToCenter.add(center, Vector3f()).sub(Vector3f(0f, player.bbHeight / 2, 0f))
|
||||
matrix.translate(offset)
|
||||
|
||||
//Undo seat position
|
||||
val playerPos = Vec3(
|
||||
@@ -58,16 +61,20 @@ object MountedPlayerRenderer {
|
||||
)
|
||||
|
||||
matrix.translate(playerPos.subtract(entityPos).toVector3f().negate())
|
||||
matrix.translate(locator.matrix.getTranslation(Vector3f()))
|
||||
|
||||
val offset = Vector3f(0f, player.bbHeight / 2, 0f).mul(-1f)
|
||||
|
||||
matrix.rotate(locator.matrix.getRotation(AxisAngle4f()))
|
||||
matrix.rotate(Axis.YP.rotationDegrees(180 + yBodyRot))
|
||||
matrix.translate(offset)
|
||||
|
||||
matrix.translate(Vector3f(0f, 0.35f, 0f))
|
||||
}
|
||||
|
||||
//Rotates player
|
||||
if (player is OrientationControllable && player.orientationController.active && !disableRollableRenderDebug) {
|
||||
val center = Vector3f(0f, player.bbHeight / 2, 0f)
|
||||
val transformationMatrix = Matrix4f()
|
||||
transformationMatrix.translate(center)
|
||||
transformationMatrix.rotate(player.orientationController.getRenderOrientation(partialTicks))
|
||||
transformationMatrix.translate(center.negate(Vector3f()))
|
||||
//Pre-Undo Yaw
|
||||
transformationMatrix.rotate(Axis.YP.rotationDegrees(yBodyRot+180f))
|
||||
matrix.mul(transformationMatrix)
|
||||
}
|
||||
matrix.translate(0f, 0.25f, 0f)
|
||||
}
|
||||
|
||||
fun animate(
|
||||
|
||||
@@ -49,8 +49,6 @@ import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviours
|
||||
import com.cobblemon.mod.common.api.riding.events.SelectDriverEvent
|
||||
import com.cobblemon.mod.common.api.riding.stats.RidingStat
|
||||
import com.cobblemon.mod.common.api.riding.util.RidingAnimationData
|
||||
import com.cobblemon.mod.common.api.riding.util.Vec3Spring
|
||||
import com.cobblemon.mod.common.api.scheduling.Schedulable
|
||||
import com.cobblemon.mod.common.api.scheduling.SchedulingTracker
|
||||
import com.cobblemon.mod.common.api.scheduling.afterOnServer
|
||||
@@ -253,7 +251,6 @@ open class PokemonEntity(
|
||||
|
||||
var enablePoseTypeRecalculation = true
|
||||
|
||||
val ridingAnimationData: RidingAnimationData = RidingAnimationData()
|
||||
|
||||
var previousRidingState: RidingBehaviourState? = null
|
||||
var ridingState: RidingBehaviourState? = null
|
||||
@@ -286,9 +283,9 @@ open class PokemonEntity(
|
||||
ridingBehaviourSettings = null
|
||||
if (pokemon.riding.behaviour == null) return
|
||||
|
||||
riding = RidingBehaviours.get(pokemon.riding.behaviour!!.key)
|
||||
riding = RidingBehaviours.get(pokemon.riding.behaviour!!.key) as RidingBehaviour<RidingBehaviourSettings, RidingBehaviourState>?
|
||||
ridingState = riding!!.createDefaultState()
|
||||
ridingBehaviourSettings = pokemon.riding.behaviour!!
|
||||
ridingState = riding!!.createDefaultState(ridingBehaviourSettings!!)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -357,11 +354,10 @@ open class PokemonEntity(
|
||||
}
|
||||
|
||||
var flyDistO = 0F
|
||||
|
||||
var isPokemonWalking = false
|
||||
var isPokemonFlying = false
|
||||
|
||||
var tickSpawned = 0
|
||||
|
||||
init {
|
||||
delegate.initialize(this)
|
||||
delegate.changePokemon(pokemon)
|
||||
@@ -486,11 +482,6 @@ open class PokemonEntity(
|
||||
entityData.get(MOVING)
|
||||
|
||||
super.tick()
|
||||
|
||||
if (passengers.isNotEmpty()) {
|
||||
ridingAnimationData.update(this)
|
||||
}
|
||||
|
||||
flyDistO = flyDist
|
||||
|
||||
if (isBattling) {
|
||||
@@ -1020,15 +1011,12 @@ open class PokemonEntity(
|
||||
itemStack
|
||||
)
|
||||
if (player.isShiftKeyDown) {
|
||||
val canRide = ifRidingAvailableSupply(false) { behaviour, settings, state ->
|
||||
this.canRide(player) && seats.isNotEmpty() && behaviour.isActive(settings, state, this)
|
||||
}
|
||||
InteractPokemonUIPacket(
|
||||
this.getUUID(),
|
||||
canSitOnShoulder() && pokemon in player.party(),
|
||||
!(pokemon.heldItemNoCopy().isEmpty && itemStack.isEmpty),
|
||||
(!pokemon.cosmeticItem.isEmpty && itemStack.isEmpty) || cosmeticItemDefinition != null,
|
||||
canRide
|
||||
this.canRide(player) && pokemon.riding.canRide
|
||||
).sendToPlayer(player)
|
||||
} else {
|
||||
// TODO #105
|
||||
@@ -1248,7 +1236,6 @@ open class PokemonEntity(
|
||||
else -> lang("held_item.replace", returned.displayName, this.pokemon.getDisplayName(), giving.displayName)
|
||||
}
|
||||
|
||||
player.giveOrDropItemStack(returned, false)
|
||||
player.sendSystemMessage(text)
|
||||
this.level().playSoundServer(
|
||||
position = this.position(),
|
||||
@@ -1573,8 +1560,6 @@ open class PokemonEntity(
|
||||
inp.z * g.toDouble() + inp.x * f.toDouble()
|
||||
)
|
||||
|
||||
|
||||
|
||||
val diff = v.subtract(this.deltaMovement)
|
||||
|
||||
val inertia = ifRidingAvailableSupply(fallback = 0.5) { behaviour, settings, state ->
|
||||
@@ -1934,7 +1919,7 @@ open class PokemonEntity(
|
||||
// }
|
||||
|
||||
override fun onPassengerTurned(entityToUpdate: Entity) {
|
||||
if (entityToUpdate !is LivingEntity) return
|
||||
if (entityToUpdate !is LivingEntity) return
|
||||
ifRidingAvailable { behaviour, settings, state ->
|
||||
behaviour.clampPassengerRotation(settings, state, this, entityToUpdate)
|
||||
}
|
||||
@@ -1952,22 +1937,6 @@ open class PokemonEntity(
|
||||
}
|
||||
}
|
||||
|
||||
// When riding mimic RemotePlayers logic for rendering players at farther
|
||||
// distances than usual. Otherwise the player may render when the pokemon
|
||||
// entity is not, causing a floating player.
|
||||
override fun shouldRenderAtSqrDistance(distance: Double): Boolean {
|
||||
if (!passengers.isEmpty()) {
|
||||
var d = (boundingBox.getSize() * 10.0)
|
||||
if (d.isNaN()) {
|
||||
d = 1.0
|
||||
}
|
||||
val scale = 64.0 * getViewScale()
|
||||
return distance < d * scale * scale
|
||||
}
|
||||
|
||||
return super.shouldRenderAtSqrDistance(distance)
|
||||
}
|
||||
|
||||
override fun getControllingPassenger(): LivingEntity? {
|
||||
val riders = this.passengers.filterIsInstance<LivingEntity>()
|
||||
if (riders.isEmpty()) {
|
||||
@@ -2131,4 +2100,4 @@ open class PokemonEntity(
|
||||
override fun resolveEntityScan(): LivingEntity {
|
||||
return this
|
||||
}
|
||||
}
|
||||
}
|
||||
-31
@@ -8,14 +8,10 @@
|
||||
|
||||
package com.cobblemon.mod.common.entity.pokemon
|
||||
|
||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.bedrockk.molang.runtime.value.MoValue
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.entity.PokemonSender
|
||||
import com.cobblemon.mod.common.api.entity.PokemonSideDelegate
|
||||
import com.cobblemon.mod.common.api.molang.ObjectValue
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||
import com.cobblemon.mod.common.api.pokemon.status.Statuses
|
||||
@@ -25,7 +21,6 @@ import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.activestate.ActivePokemonState
|
||||
import com.cobblemon.mod.common.pokemon.activestate.SentOutState
|
||||
import com.cobblemon.mod.common.util.asUUID
|
||||
import com.cobblemon.mod.common.util.getIsSubmerged
|
||||
import com.cobblemon.mod.common.util.math.geometry.toRadians
|
||||
import com.cobblemon.mod.common.util.playSoundServer
|
||||
@@ -107,32 +102,6 @@ class PokemonServerDelegate : PokemonSideDelegate {
|
||||
updateTrackedValues()
|
||||
}
|
||||
|
||||
override fun addToStruct(struct: QueryStruct) {
|
||||
super.addToStruct(struct)
|
||||
if (entity.pokemon.isWild()) {
|
||||
struct
|
||||
.addFunction("attempt_wild_battle") { params ->
|
||||
val opponentValue = params.get<MoValue>(0)
|
||||
val opponent = if (opponentValue is ObjectValue<*>) {
|
||||
opponentValue.obj as ServerPlayer
|
||||
} else {
|
||||
val paramString = opponentValue.asString()
|
||||
val playerUUID = paramString.asUUID
|
||||
if (playerUUID != null) {
|
||||
entity.server!!.playerList.getPlayer(playerUUID) ?: return@addFunction DoubleValue.ZERO
|
||||
} else {
|
||||
entity.server!!.playerList.getPlayerByName(paramString) ?: return@addFunction DoubleValue.ZERO
|
||||
}
|
||||
}
|
||||
|
||||
// Need to wait to ensure any entity info gets grabbed properly before battle attempt.
|
||||
return@addFunction entity.after(0.01F) {
|
||||
DoubleValue(entity.forceBattle(opponent))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getBattle() = entity.battleId?.let(BattleRegistry::getBattle)
|
||||
|
||||
fun updateTrackedValues() {
|
||||
|
||||
@@ -353,18 +353,6 @@ object CobblemonItemGroups {
|
||||
entries.accept(CobblemonItems.LEEK_AND_POTATO_STEW)
|
||||
entries.accept(CobblemonItems.BRAISED_VIVICHOKE)
|
||||
entries.accept(CobblemonItems.VIVICHOKE_DIP)
|
||||
entries.accept(CobblemonItems.TART_APPLE)
|
||||
entries.accept(CobblemonItems.SWEET_APPLE)
|
||||
entries.accept(CobblemonItems.SYRUPY_APPLE)
|
||||
entries.accept(CobblemonItems.WHIPPED_DREAM)
|
||||
entries.accept(CobblemonItems.STRAWBERRY_SWEET)
|
||||
entries.accept(CobblemonItems.LOVE_SWEET)
|
||||
entries.accept(CobblemonItems.BERRY_SWEET)
|
||||
entries.accept(CobblemonItems.CLOVER_SWEET)
|
||||
entries.accept(CobblemonItems.FLOWER_SWEET)
|
||||
entries.accept(CobblemonItems.STAR_SWEET)
|
||||
entries.accept(CobblemonItems.RIBBON_SWEET)
|
||||
|
||||
entries.accept(CobblemonItems.BERRY_JUICE)
|
||||
entries.accept(CobblemonItems.REMEDY)
|
||||
entries.accept(CobblemonItems.FINE_REMEDY)
|
||||
@@ -487,7 +475,6 @@ object CobblemonItemGroups {
|
||||
entries.accept(CobblemonItems.WHIPPED_DREAM)
|
||||
entries.accept(CobblemonItems.TART_APPLE)
|
||||
entries.accept(CobblemonItems.SWEET_APPLE)
|
||||
entries.accept(CobblemonItems.SYRUPY_APPLE)
|
||||
entries.accept(CobblemonItems.CRACKED_POT)
|
||||
entries.accept(CobblemonItems.CHIPPED_POT)
|
||||
entries.accept(CobblemonItems.MASTERPIECE_TEACUP)
|
||||
@@ -657,23 +644,9 @@ object CobblemonItemGroups {
|
||||
}
|
||||
|
||||
private fun foodInjections(injector: Injector) {
|
||||
injector.putAfter(CobblemonItems.TART_APPLE, Items.ENCHANTED_GOLDEN_APPLE)
|
||||
injector.putAfter(CobblemonItems.SWEET_APPLE, CobblemonItems.TART_APPLE)
|
||||
injector.putAfter(CobblemonItems.SYRUPY_APPLE, CobblemonItems.SWEET_APPLE)
|
||||
|
||||
injector.putAfter(CobblemonItems.MEDICINAL_LEEK, Items.POISONOUS_POTATO)
|
||||
injector.putAfter(CobblemonItems.ROASTED_LEEK, CobblemonItems.MEDICINAL_LEEK)
|
||||
injector.putAfter(CobblemonItems.BRAISED_VIVICHOKE, CobblemonItems.ROASTED_LEEK)
|
||||
|
||||
injector.putAfter(CobblemonItems.WHIPPED_DREAM, Items.PUMPKIN_PIE)
|
||||
injector.putAfter(CobblemonItems.STRAWBERRY_SWEET, CobblemonItems.WHIPPED_DREAM)
|
||||
injector.putAfter(CobblemonItems.LOVE_SWEET, CobblemonItems.STRAWBERRY_SWEET)
|
||||
injector.putAfter(CobblemonItems.BERRY_SWEET, CobblemonItems.LOVE_SWEET)
|
||||
injector.putAfter(CobblemonItems.CLOVER_SWEET, CobblemonItems.BERRY_SWEET)
|
||||
injector.putAfter(CobblemonItems.FLOWER_SWEET, CobblemonItems.CLOVER_SWEET)
|
||||
injector.putAfter(CobblemonItems.STAR_SWEET, CobblemonItems.FLOWER_SWEET)
|
||||
injector.putAfter(CobblemonItems.RIBBON_SWEET, CobblemonItems.STAR_SWEET)
|
||||
|
||||
injector.putAfter(CobblemonItems.LEEK_AND_POTATO_STEW, Items.RABBIT_STEW)
|
||||
injector.putAfter(CobblemonItems.VIVICHOKE_DIP, CobblemonItems.LEEK_AND_POTATO_STEW)
|
||||
}
|
||||
|
||||
+5
-3
@@ -10,8 +10,10 @@ package com.cobblemon.mod.common.net.messages.client.pokemon.update
|
||||
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.ServerboundUpdateRidingStatePacket
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import com.cobblemon.mod.common.util.server
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
|
||||
@@ -19,7 +21,7 @@ class ClientboundUpdateRidingStatePacket(
|
||||
val entity: Int,
|
||||
val behaviour: ResourceLocation,
|
||||
val state: RidingBehaviourState? = null,
|
||||
val data: FriendlyByteBuf? = null
|
||||
val data: RegistryFriendlyByteBuf? = null
|
||||
) : NetworkPacket<ClientboundUpdateRidingStatePacket> {
|
||||
override val id = ID
|
||||
|
||||
@@ -35,7 +37,7 @@ class ClientboundUpdateRidingStatePacket(
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): ClientboundUpdateRidingStatePacket {
|
||||
val entity = buffer.readInt()
|
||||
val behaviour = buffer.readResourceLocation()
|
||||
val state = FriendlyByteBuf(buffer.readBytes(buffer.readableBytes()))
|
||||
val state = RegistryFriendlyByteBuf(buffer.readBytes(buffer.readableBytes()), Minecraft.getInstance().player!!.registryAccess())
|
||||
return ClientboundUpdateRidingStatePacket(
|
||||
entity = entity,
|
||||
behaviour = behaviour,
|
||||
|
||||
+1
-7
@@ -48,7 +48,6 @@ class SpawnPokemonPacket(
|
||||
var friendship: Int,
|
||||
var freezeFrame: Float,
|
||||
var passengers: IntArray,
|
||||
var tickSpawned: Int,
|
||||
vanillaSpawnPacket: ClientboundAddEntityPacket,
|
||||
) : SpawnExtraDataEntityPacket<SpawnPokemonPacket, PokemonEntity>(vanillaSpawnPacket) {
|
||||
|
||||
@@ -77,7 +76,6 @@ class SpawnPokemonPacket(
|
||||
entity.entityData.get(PokemonEntity.FRIENDSHIP),
|
||||
entity.entityData.get(PokemonEntity.FREEZE_FRAME),
|
||||
entity.passengers.map { it.id }.toIntArray(),
|
||||
entity.tickCount,
|
||||
vanillaSpawnPacket
|
||||
)
|
||||
|
||||
@@ -104,7 +102,6 @@ class SpawnPokemonPacket(
|
||||
buffer.writeInt(this.friendship)
|
||||
buffer.writeFloat(this.freezeFrame)
|
||||
buffer.writeVarIntArray(this.passengers)
|
||||
buffer.writeInt(this.tickSpawned)
|
||||
}
|
||||
|
||||
override fun applyData(entity: PokemonEntity, level: ClientLevel) {
|
||||
@@ -139,8 +136,6 @@ class SpawnPokemonPacket(
|
||||
val passenger = level.getEntity(it) ?: return@forEach
|
||||
passenger.startRiding(entity)
|
||||
}
|
||||
entity.tickSpawned = this.tickSpawned
|
||||
entity.delegate.updateAge(this.tickSpawned)
|
||||
}
|
||||
|
||||
override fun checkType(entity: Entity): Boolean = entity is PokemonEntity
|
||||
@@ -170,10 +165,9 @@ class SpawnPokemonPacket(
|
||||
val friendship = buffer.readInt()
|
||||
val freezeFrame = buffer.readFloat()
|
||||
val passengers = buffer.readVarIntArray()
|
||||
val tickSpawned = buffer.readInt()
|
||||
val vanillaPacket = decodeVanillaPacket(buffer)
|
||||
|
||||
return SpawnPokemonPacket(ownerId, scaleModifier, speciesId, gender, shiny, formName, aspects, battleId, phasingTargetId, beamModeEmitter, platform, nickname, mark, labelLevel, poseType, unbattlable, hideLabel, caughtBall, spawnAngle, friendship, freezeFrame, passengers, tickSpawned, vanillaPacket)
|
||||
return SpawnPokemonPacket(ownerId, scaleModifier, speciesId, gender, shiny, formName, aspects, battleId, phasingTargetId, beamModeEmitter, platform, nickname, mark, labelLevel, poseType, unbattlable, hideLabel, caughtBall, spawnAngle, friendship, freezeFrame, passengers, vanillaPacket)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -8,7 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.platform.events
|
||||
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
|
||||
class ChangeDimensionEvent(val player: ServerPlayer, val origin: ServerLevel?, val destination: ServerLevel?)
|
||||
class ChangeDimensionEvent(val player: ServerPlayer)
|
||||
+9
-1
@@ -20,6 +20,7 @@ import com.cobblemon.mod.common.util.battleLang
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.world.item.Items
|
||||
import java.util.function.Function
|
||||
|
||||
/**
|
||||
@@ -130,7 +131,14 @@ object CobblemonHeldItemManager : BaseCobblemonHeldItemManager() {
|
||||
}
|
||||
// if items aren't consumed, then we don't want to give them to wild pokemon (dupe)
|
||||
if (this.giveItemEffect.contains(effectId) && (pokemon.actor is PlayerBattleActor || consumeHeldItems)) {
|
||||
this.give(pokemon, itemID)
|
||||
// extra check for item swapping abuse
|
||||
// checks if the pokemon whose item is being taken away (wild pokemon) has its held item tampered with in any way
|
||||
// this assumes its always moves causing the swaps
|
||||
// I still think this is a bit brittle and can cause false positives, but for now this should do the trick I hope
|
||||
var fromBattlePokemon = battle.majorBattleActions[pokemon.uuid]?.battlePokemon(2, battle)
|
||||
if(showdownIdOf(fromBattlePokemon?.originalPokemon?.heldItem?.item ?: Items.AIR) == itemID) {
|
||||
this.give(pokemon, itemID)
|
||||
}
|
||||
}
|
||||
// allow players to steal wild held items
|
||||
if (this.takeItemEffect.contains(effectId) && (pokemon.actor !is PlayerBattleActor || consumeHeldItems)) {
|
||||
|
||||
+9
-31
@@ -10,12 +10,6 @@ package com.cobblemon.mod.common.util.adapters
|
||||
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.*
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies.FallCompositeSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies.FallStrategy
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies.JumpStrategy
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.strategies.RunStrategy
|
||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||
import com.google.gson.JsonDeserializationContext
|
||||
import com.google.gson.JsonDeserializer
|
||||
@@ -29,42 +23,26 @@ import java.lang.reflect.Type
|
||||
* @author landonjw
|
||||
*/
|
||||
object RidingBehaviourSettingsAdapter : JsonDeserializer<RidingBehaviourSettings> {
|
||||
val types: MutableMap<ResourceLocation, Class<out RidingBehaviourSettings>> = mutableMapOf(BirdAirBehaviour.KEY to BirdAirSettings::class.java,
|
||||
val types: MutableMap<ResourceLocation, Class<out RidingBehaviourSettings>> = mutableMapOf(
|
||||
BirdAirBehaviour.KEY to BirdAirSettings::class.java,
|
||||
DolphinBehaviour.KEY to DolphinSettings::class.java,
|
||||
FallToGlideCompositeBehaviour.KEY to FallToGlideCompositeSettings::class.java,
|
||||
GenericLandBehaviour.KEY to GenericLandSettings::class.java,
|
||||
GenericSwimBehaviour.KEY to GenericSwimSettings::class.java,
|
||||
GliderAirBehaviour.KEY to GliderAirSettings::class.java,
|
||||
HelicopterBehaviour.KEY to HelicopterSettings::class.java,
|
||||
JetAirBehaviour.KEY to JetAirSettings::class.java,
|
||||
JumpToFlightCompositeBehaviour.KEY to JumpToFlightCompositeSettings::class.java,
|
||||
RunToJetCompositeBehaviour.KEY to RunToJetCompositeSettings::class.java,
|
||||
SwimDashBehaviour.KEY to SwimDashSettings::class.java,
|
||||
VehicleLandBehaviour.KEY to VehicleLandSettings::class.java,
|
||||
HoverBehaviour.KEY to HoverSettings::class.java,
|
||||
CompositeBehaviour.KEY to CompositeSettings::class.java,
|
||||
|
||||
/*
|
||||
Strategy registration. if you do not register a strategy here, it will not be deserialized.
|
||||
Register to CompositeSettings if you do not need to define a subclass.
|
||||
*/
|
||||
FallStrategy.key to FallCompositeSettings::class.java,
|
||||
JumpStrategy.key to CompositeSettings::class.java,
|
||||
RunStrategy.key to CompositeSettings::class.java,
|
||||
VehicleLandBehaviour.KEY to VehicleLandSettings::class.java
|
||||
)
|
||||
|
||||
override fun deserialize(element: JsonElement, type: Type, context: JsonDeserializationContext): RidingBehaviourSettings {
|
||||
val root = element.asJsonObject
|
||||
val key = root.get("key").asString
|
||||
val keyIdentifier = key.asIdentifierDefaultingNamespace()
|
||||
if (keyIdentifier == CompositeBehaviour.KEY) {
|
||||
val strategy = root.get("transitionStrategy").asString
|
||||
val strategyIdentifier = strategy.asIdentifierDefaultingNamespace()
|
||||
val behaviourType = types[strategyIdentifier] ?: throw IllegalArgumentException("Unknown strategy for composite behaviour: $strategy")
|
||||
val settings: RidingBehaviourSettings = context.deserialize(root, behaviourType)
|
||||
return settings
|
||||
}
|
||||
else {
|
||||
val behaviourType = types[keyIdentifier] ?: throw IllegalArgumentException("Unknown behaviour: $key")
|
||||
val settings: RidingBehaviourSettings = context.deserialize(element, behaviourType)
|
||||
return settings
|
||||
}
|
||||
val behaviourType = types[key.asIdentifierDefaultingNamespace()] ?: throw IllegalArgumentException("Unknown controller: $key")
|
||||
val settings: RidingBehaviourSettings = context.deserialize(element, behaviourType)
|
||||
return settings
|
||||
}
|
||||
}
|
||||
|
||||
-28
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.ride_test.sitting": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": [0, -9, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [0, 0, -27.5]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-90, 20, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-90, -20, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+93
-488
@@ -2272,59 +2272,23 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"0.5833": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"2.375": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"3.0": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"5.875": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.4167": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"0.5833": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.0417": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"2.375": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"3.0": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"5.875": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"0.5833": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"2.375": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"3.0": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"5.875": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.4167": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"0.5833": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.0417": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"2.375": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"3.0": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"5.875": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2589,27 +2553,15 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"3.6667": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"1.25": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"3.6667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"3.6667": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"1.25": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"3.6667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
@@ -8811,43 +8763,19 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"2.4583": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.25": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"0.5": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.25": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"2.4583": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"2.4583": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"0.5": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.25": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"2.4583": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11293,59 +11221,23 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"0.4167": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.8333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"1.125": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"2.6667": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.25": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"0.4167": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"0.8333": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"1.125": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.5417": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"2.6667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"0.4167": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.8333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"1.125": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"2.6667": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"0.4167": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"0.8333": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"1.125": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.5417": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"2.6667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"locator_target": {
|
||||
@@ -13637,43 +13529,19 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.3333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"1.2083": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"2.7083": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.3333": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"1.2083": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.5417": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"2.7083": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.3333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"1.2083": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"2.7083": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.3333": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"1.2083": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.5417": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"2.7083": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"locator_mouth": {
|
||||
@@ -13872,20 +13740,14 @@
|
||||
"position": {
|
||||
"0.0": [-0.1, 0.1, 0],
|
||||
"0.125": [-0.1, 0.1, 0],
|
||||
"0.1667": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0.1, 0],
|
||||
"0.125": [0.1, 0.1, 0],
|
||||
"0.1667": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
@@ -14681,7 +14543,7 @@
|
||||
"rotation": [0, -6, -15]
|
||||
},
|
||||
"wing_right_elbow": {
|
||||
"rotation": [0, "-6+", -15],
|
||||
"rotation": [0, "-6", -15],
|
||||
"position": [0.45, 0.1, 0]
|
||||
},
|
||||
"wing_right_membrane": {
|
||||
@@ -16174,7 +16036,7 @@
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": ["22.5 + q.riding.pitch(0)*-90", 0, "math.sin(q.anim_time*90*1-90)*-0.5"],
|
||||
"rotation": [22.5, 0, "math.sin(q.anim_time*90*1-90)*-0.5"],
|
||||
"position": ["math.cos(q.anim_time*90*1-60)*1", "12+math.cos((q.anim_time*90*2-60)+math.sin(q.anim_time*90*2)*20)*3", 0]
|
||||
},
|
||||
"torso": {
|
||||
@@ -17495,14 +17357,6 @@
|
||||
"locator_top": {
|
||||
"position": [0, 13, 0]
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"1.125": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
},
|
||||
"3.1667": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.charizard.air_fly": {
|
||||
@@ -18779,17 +18633,6 @@
|
||||
},
|
||||
"locator_top": {
|
||||
"position": [0, -1, 0]
|
||||
},
|
||||
"locator_seat_1": {
|
||||
"rotation": [-60, 0, 0]
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"1.0833": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
},
|
||||
"3.0833": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -19055,9 +18898,6 @@
|
||||
},
|
||||
"locator_top": {
|
||||
"position": [0, -6, 0]
|
||||
},
|
||||
"locator_seat_1": {
|
||||
"rotation": [-60, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -19257,59 +19097,23 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"0.5833": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"2.5833": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"3.9167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"4.0833": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.4167": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"0.5833": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.4167": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"2.5833": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"3.9167": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"4.0833": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"0.5833": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"2.5833": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"3.9167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"4.0833": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.4167": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"0.5833": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.4167": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"2.5833": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"3.9167": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"4.0833": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22654,10 +22458,7 @@
|
||||
},
|
||||
"0.5": [0.78, -10.13, 0.45],
|
||||
"0.5417": [-0.45, -8.03, 0.45],
|
||||
"0.5833": {
|
||||
"pre": [-0.45, -8.03, 0.45],
|
||||
"post": [-0.45, "-7.79+360", 0.45]
|
||||
},
|
||||
"0.5833": {"pre": [-0.45, -8.03, 0.45], "post": [-0.45, "-7.79+360", 0.45]},
|
||||
"0.625": [-2.7, 355.37, 0.45],
|
||||
"1.0": {
|
||||
"pre": [-9.46, "10.71+360", 0.5],
|
||||
@@ -26328,59 +26129,23 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.625": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"1.8333": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"2.625": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0833": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"0.3333": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"1.625": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"1.8333": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"2.625": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"0.3333": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.625": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"1.8333": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"2.625": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0833": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"0.3333": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"1.625": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"1.8333": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.5": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"2.625": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"locator_root": {
|
||||
@@ -29620,15 +29385,9 @@
|
||||
"brow": {
|
||||
"position": {
|
||||
"0.9583": [0, 0, 0],
|
||||
"1.1667": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, -0.3]
|
||||
},
|
||||
"1.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.3]},
|
||||
"2.2917": [0, 0, -0.3],
|
||||
"2.5417": {
|
||||
"pre": [0, 0, -0.3],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"2.5417": {"pre": [0, 0, -0.3], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
@@ -29963,43 +29722,19 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.3333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"1.2083": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.375": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"2.6667": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.3333": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"1.2083": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.375": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"2.6667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.3333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"1.2083": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.375": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"2.6667": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.3333": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"1.2083": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.375": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"2.6667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"locator_root": {
|
||||
@@ -30018,106 +29753,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.charizard.ride_air_look": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": ["q.riding.pitch_change(0)*-0", "q.riding.yaw_change(0)*-15", "q.riding.roll_change(0)*15"]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["math.clamp(q.riding.pitch_change(0),-0.5,1.0)*-20", 0, "q.riding.yaw_change(0)*7"]
|
||||
},
|
||||
"neck2": {
|
||||
"rotation": ["math.clamp(q.riding.pitch_change(0),-0.5,1.0)*-12", 0, "q.riding.yaw_change(0)*12"]
|
||||
},
|
||||
"neck3": {
|
||||
"rotation": ["q.riding.pitch_change(0)*-7", 0, "q.riding.yaw_change(0)*7"]
|
||||
},
|
||||
"neck4": {
|
||||
"rotation": ["q.riding.pitch_change(0)*-7", 0, "q.riding.yaw_change(0)*7"]
|
||||
},
|
||||
"head_angle": {
|
||||
"rotation": ["q.riding.pitch_change(0)*-7", 0, "q.riding.yaw_change(0)*7"]
|
||||
},
|
||||
"shoulder_right": {
|
||||
"rotation": [0, "-12.5*q.riding.pitch_change(0)", "27.5*q.riding.yaw_change(0)"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, "15*q.riding.yaw_change(0)", 0]
|
||||
},
|
||||
"forearm_right": {
|
||||
"rotation": [0, "15*q.riding.yaw_change(0)", "-12.5*q.riding.pitch_change(0)"]
|
||||
},
|
||||
"shoulder_left": {
|
||||
"rotation": [0, "12.5*q.riding.pitch_change(0)", "27.5*q.riding.yaw_change(0)"]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [0, "15*q.riding.yaw_change(0)", 0]
|
||||
},
|
||||
"forearm_left": {
|
||||
"rotation": [0, "15*q.riding.yaw_change(0)", "12.5*q.riding.pitch_change(0)"]
|
||||
},
|
||||
"wing_right_base": {
|
||||
"rotation": ["-5*q.riding.pitch_change(0)", 0, 0]
|
||||
},
|
||||
"wing_right_bend": {
|
||||
"rotation": ["10*q.riding.yaw_change(0)", "7.5*q.riding.pitch_change(0)", "10*q.riding.yaw_change(0)"]
|
||||
},
|
||||
"wing_right_mid": {
|
||||
"rotation": ["-5*q.riding.pitch_change(0)", 0, 0]
|
||||
},
|
||||
"wing_right_elbow": {
|
||||
"rotation": ["-2.5*q.riding.pitch_change(0)", "5*q.riding.pitch_change(0)", 0]
|
||||
},
|
||||
"wing_left_base": {
|
||||
"rotation": ["-5*q.riding.pitch_change(0)", 0, 0]
|
||||
},
|
||||
"wing_left_bend": {
|
||||
"rotation": ["-10*q.riding.yaw_change(0)", "-7.5*q.riding.pitch_change(0)", "-10*q.riding.yaw_change(0)"]
|
||||
},
|
||||
"wing_left_mid": {
|
||||
"rotation": ["-5*q.riding.pitch_change(0)", 0, 0]
|
||||
},
|
||||
"wing_left_elbow": {
|
||||
"rotation": ["-2.5*q.riding.pitch_change(0)", "-(5*q.riding.pitch_change(0))", 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["q.riding.pitch_change(0)*7", 0, "q.riding.yaw_change(0)*-10"]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["q.riding.pitch_change(0)*7", "q.riding.yaw_change(0)*15", 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["q.riding.pitch_change(0)*7", "q.riding.yaw_change(0)*20", 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": ["q.riding.pitch_change(0)*7", "q.riding.yaw_change(0)*20", 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": ["q.riding.pitch_change(0)*8", "q.riding.yaw_change(0)*20", 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["-12.5*q.riding.pitch_change(0)", "q.riding.yaw_change(0)*20", 0],
|
||||
"position": ["-1.5*q.riding.yaw_change(0)", 0, 0]
|
||||
},
|
||||
"knee_right": {
|
||||
"rotation": ["-12.5*q.riding.pitch_change(0)", 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": ["-12.5*q.riding.pitch_change(0)", 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["-12.5*q.riding.pitch_change(0)", "q.riding.yaw_change(0)*20", 0],
|
||||
"position": ["-1.5*q.riding.yaw_change(0)", 0, 0]
|
||||
},
|
||||
"knee_left": {
|
||||
"rotation": ["-12.5*q.riding.pitch_change(0)", 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": ["-12.5*q.riding.pitch_change(0)", 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.charizard.air_status": {
|
||||
"animation_length": 3,
|
||||
"bones": {
|
||||
@@ -33359,43 +32994,19 @@
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.3333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"1.2083": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.2083": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0.1, 0]
|
||||
},
|
||||
"2.4583": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.3333": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"1.2083": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.2083": {"pre": [0, 0, 0], "post": [-0.1, 0.1, 0]},
|
||||
"2.4583": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.3333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"1.2083": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.2083": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0.1, 0]
|
||||
},
|
||||
"2.4583": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.3333": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"1.2083": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]},
|
||||
"2.2083": {"pre": [0, 0, 0], "post": [0.1, 0.1, 0]},
|
||||
"2.4583": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"locator_root": {
|
||||
@@ -34821,20 +34432,14 @@
|
||||
"position": {
|
||||
"0.0": [-0.1, 0.1, 0],
|
||||
"0.125": [-0.1, 0.1, 0],
|
||||
"0.1667": {
|
||||
"pre": [-0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0.1, 0],
|
||||
"0.125": [0.1, 0.1, 0],
|
||||
"0.1667": {
|
||||
"pre": [0.1, 0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-21
@@ -535,11 +535,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.5": {
|
||||
"effect": "animation.plumage.wing_flap.medium"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.pidgeot.air_fly": {
|
||||
@@ -715,9 +710,6 @@
|
||||
},
|
||||
"wing_open_right4": {
|
||||
"rotation": [0, 0, "7.5+math.sin(q.anim_time*90*0.8-240)*-10+math.sin(q.anim_time*90*12-120)*0.4"]
|
||||
},
|
||||
"locator_seat1": {
|
||||
"position": [0, 1.5, -4]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1574,11 +1566,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"1.375": {
|
||||
"effect": "animation.plumage.wing_flap.medium"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.pidgeot.air_fly_quirk2": {
|
||||
@@ -2734,14 +2721,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"1.4583": {
|
||||
"effect": "animation.plumage.wing_flap.medium"
|
||||
},
|
||||
"3.0833": {
|
||||
"effect": "animation.plumage.wing_flap.medium"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.pidgeot.blink": {
|
||||
|
||||
-8
@@ -182,14 +182,6 @@
|
||||
"rotation": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.eevee.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.eevee.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -225,14 +225,6 @@
|
||||
"rotation": [-59.83045, -1.29256, -14.94548]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.vaporeon.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.vaporeon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -150,14 +150,6 @@
|
||||
"rotation": [37.5, 37.5, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.jolteon.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.jolteon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -266,14 +266,6 @@
|
||||
"rotation": [37.5, 27.5, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.flareon.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.flareon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-12
@@ -467,7 +467,6 @@
|
||||
},
|
||||
"animation.aerodactyl.air_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 1.33333,
|
||||
"bones": {
|
||||
"aerodactyl": {
|
||||
"position": [0, 3, 0]
|
||||
@@ -643,16 +642,10 @@
|
||||
"right_wing_membrane": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*3+90)*3", "0+math.sin(q.anim_time*90*3+90)*1.5"]
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"1.0833": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.aerodactyl.air_fly": {
|
||||
"loop": true,
|
||||
"animation_length": 1.33333,
|
||||
"bones": {
|
||||
"aerodactyl": {
|
||||
"position": [0, 3, 0]
|
||||
@@ -834,11 +827,6 @@
|
||||
"right_horn": {
|
||||
"rotation": ["math.sin(q.anim_time*90*12-160)*2", 0, 0]
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.9583": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.aerodactyl.sleep": {
|
||||
|
||||
-97
@@ -1237,20 +1237,6 @@
|
||||
"rotation": ["-math.sin(q.anim_time*90*2-120)*4", 0, 0],
|
||||
"position": [0, "7.8+math.sin(q.anim_time*90*2)*2", -5.6]
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"1.5": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
},
|
||||
"3.5": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
},
|
||||
"5.5": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
},
|
||||
"7.5": {
|
||||
"effect": "animation.leather.wing_flap.medium"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.dragonite.water_idle": {
|
||||
@@ -2067,89 +2053,6 @@
|
||||
"effect": "pokemon.dragonite.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.dragonite.shock": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"pupil_left": {
|
||||
"scale": [0.7, 0.7, 1]
|
||||
},
|
||||
"eye_shine_left": {
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"pupil_right": {
|
||||
"scale": [0.7, 0.7, 1]
|
||||
},
|
||||
"eye_shine_right": {
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [27.5, 0, 0]
|
||||
},
|
||||
"eye_left": {
|
||||
"position": [0, 0, 0],
|
||||
"scale": 1
|
||||
},
|
||||
"eye_shocked_left": {
|
||||
"position": [0.25, 0, -0.26]
|
||||
},
|
||||
"eye_shocked_right": {
|
||||
"position": [-0.125, 0, -0.18]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.dragonite.angry": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_angry_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eye_shine_left": {
|
||||
"position": [0, -1, 0]
|
||||
},
|
||||
"eye_shine_right": {
|
||||
"position": [0, -1, 0]
|
||||
},
|
||||
"eye_angry_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.dragonite.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_sad_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eye_sad_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.dragonite.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_happy_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelid_happy_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [27.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.dragonite.hurt": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_recoil_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelid_recoil_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -188,14 +188,6 @@
|
||||
"rotation": [12.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.espeon.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.espeon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -233,14 +233,6 @@
|
||||
"rotation": [-20, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.umbreon.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.umbreon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+253
-368
@@ -2,102 +2,257 @@
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.treecko.test": {
|
||||
"loop": true,
|
||||
"animation_length": 1.2,
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": [-10, 0, 0],
|
||||
"position": [0, 0.1, -0.3]
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [32.5, 0, 0]
|
||||
"rotation": [42.5, 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [-45, 0, 0],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"tail_left": {
|
||||
"left_tail": {
|
||||
"rotation": [10, 0, 2.5]
|
||||
},
|
||||
"tail_left2": {
|
||||
"left_tail2": {
|
||||
"rotation": [17.5, 0, 0]
|
||||
},
|
||||
"tail_right": {
|
||||
"right_tail": {
|
||||
"rotation": [10, 0, -2.5]
|
||||
},
|
||||
"tail_right2": {
|
||||
"right_tail2": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [0, 0, -5]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [0, 0, -57.5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"left_middle_finger": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"left_middle_finger2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"arm_right": {
|
||||
"right_upper_arm": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [7.5, 0, 0]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [0, 0, 57.5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"right_middle_finger": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"right_middle_finger2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": [1.18155, -9.91358, -2.38565]
|
||||
},
|
||||
"foot_left": {
|
||||
"left_foot": {
|
||||
"rotation": [-0.4165, -7.26605, 3.29302]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": [1.18155, 9.91358, 2.38565]
|
||||
},
|
||||
"foot_right": {
|
||||
"right_foot": {
|
||||
"rotation": [-0.4165, 7.26605, -3.29302]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.test2": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": [-4.73298, 2.77592, 27.09295]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [-6.80313, 33.64286, -11.17316],
|
||||
"position": [0.25, 0, 0]
|
||||
},
|
||||
"left_tail": {
|
||||
"rotation": [15.32536, 9.84392, 1.79183]
|
||||
},
|
||||
"left_tail2": {
|
||||
"rotation": [15.64835, 14.47267, 4.00563]
|
||||
},
|
||||
"right_tail": {
|
||||
"rotation": [20.05865, 9.84795, 1.74036]
|
||||
},
|
||||
"right_tail2": {
|
||||
"rotation": [17.62876, 9.658, 2.59914]
|
||||
},
|
||||
"upper_torso": {
|
||||
"rotation": [12.06953, 5.56451, -12.40436]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [3.59647, 22.86202, -3.90796]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [8.6876, -10.06991, 4.69965],
|
||||
"position": [0, 0, -0.5]
|
||||
},
|
||||
"right_pupil": {
|
||||
"position": [0, 0, -0.5]
|
||||
},
|
||||
"left_upper_arm": {
|
||||
"rotation": [0, 22.5, -25],
|
||||
"position": [0, 0, 0.25]
|
||||
},
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, 5, 0]
|
||||
},
|
||||
"left_hand": {
|
||||
"rotation": [-17.87814, -19.86103, -49.99202],
|
||||
"position": [-0.15, 0.05, 0]
|
||||
},
|
||||
"left_index_finger": {
|
||||
"rotation": [0, 5, 20]
|
||||
},
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"left_pinky_finger": {
|
||||
"rotation": [0, -5, 20]
|
||||
},
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"left_middle_finger": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"left_middle_finger2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"right_upper_arm": {
|
||||
"rotation": [27.9096, 1.08115, 23.32938]
|
||||
},
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, -10, 0]
|
||||
},
|
||||
"right_hand": {
|
||||
"rotation": [8.98458, -4.04496, 42.82624],
|
||||
"position": [0.15, 0.05, 0]
|
||||
},
|
||||
"right_index_finger": {
|
||||
"rotation": [0, -15, -20]
|
||||
},
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"right_pinky_finger": {
|
||||
"rotation": [0, 15, -20]
|
||||
},
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"right_middle_finger": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"right_middle_finger2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"right_upper_leg": {
|
||||
"rotation": [-118.81845, 9.91358, 2.38565],
|
||||
"position": [0, 0.75, -1.25]
|
||||
},
|
||||
"right_foot": {
|
||||
"rotation": [-11.96634, 26.73797, -15.04829]
|
||||
},
|
||||
"left_upper_leg": {
|
||||
"rotation": [-2.91472, -22.08853, 21.08653]
|
||||
},
|
||||
"left_foot": {
|
||||
"rotation": [65.81573, -6.16374, -15.44323]
|
||||
},
|
||||
"body": {
|
||||
"position": [0, 0.75, 0]
|
||||
},
|
||||
"right_tail3": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [50, 0, 0]
|
||||
},
|
||||
"right_lower_leg": {
|
||||
"rotation": [70.02991, 6.8466, -10.45577]
|
||||
},
|
||||
"right_foot2": {
|
||||
"rotation": [12.5, 0, 0],
|
||||
"position": [0, 0, 0.25]
|
||||
},
|
||||
"right_toes": {
|
||||
"rotation": [17.5, 0, 0]
|
||||
},
|
||||
"left_lower_leg": {
|
||||
"rotation": [16.93839, -4.46375, 14.33501]
|
||||
},
|
||||
"left_foot2": {
|
||||
"rotation": [-40.67815, -9.54385, 8.11019]
|
||||
},
|
||||
"left_toes": {
|
||||
"rotation": [-24.91643, -2.11089, -4.53359]
|
||||
},
|
||||
"left_pupil": {
|
||||
"position": [0, 0, 0.5]
|
||||
},
|
||||
"right_inner_toe": {
|
||||
"rotation": [25, -20, 0]
|
||||
},
|
||||
"right_outer_toe": {
|
||||
"rotation": [22.5, 20, 0]
|
||||
},
|
||||
"right_middle_toe": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"left_inner_toe": {
|
||||
"rotation": [-32.5, 0, 0]
|
||||
},
|
||||
"left_outer_toe": {
|
||||
"rotation": [-25, 0, 0]
|
||||
},
|
||||
"left_middle_toe": {
|
||||
"rotation": [-25, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.ground_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
@@ -107,19 +262,19 @@
|
||||
"tail": {
|
||||
"rotation": [-45, 0, 0]
|
||||
},
|
||||
"tail_left": {
|
||||
"left_tail": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"tail_left2": {
|
||||
"left_tail2": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"tail_right": {
|
||||
"right_tail": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"tail_right2": {
|
||||
"right_tail2": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
@@ -128,106 +283,95 @@
|
||||
"head": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"pupil_right": {
|
||||
"right_pupil": {
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [10.08453, -7.38542, 48.69038]
|
||||
},
|
||||
"arm_left2": {
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, 42.5, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [0, 0, 22.5],
|
||||
"position": [-0.15, 0.05, 0]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [6.94363, 7.64256, 14.02881]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [-4.01743, -1.75217, 14.46202]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 30]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"left_middle_finger": {
|
||||
"rotation": [0, 0, 12.5]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"left_middle_finger2": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"arm_right": {
|
||||
"right_upper_arm": {
|
||||
"rotation": [10.08453, 7.38542, -48.69038]
|
||||
},
|
||||
"arm_right2": {
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, -42.5, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [0, 0, -22.5],
|
||||
"position": [0.15, 0.05, 0]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [6.94363, -7.64256, -14.02881]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [-4.01743, 1.75217, -14.46202]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -30]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"right_middle_finger": {
|
||||
"rotation": [0, 0, -12.5]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"right_middle_finger2": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": [1.18155, 9.91358, 2.38565]
|
||||
},
|
||||
"foot_right": {
|
||||
"right_foot": {
|
||||
"rotation": [-0.4165, 7.26605, -3.29302]
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": [1.18155, -9.91358, -2.38565]
|
||||
},
|
||||
"foot_left": {
|
||||
"left_foot": {
|
||||
"rotation": [-0.4165, -7.26605, 3.29302]
|
||||
},
|
||||
"stick": {
|
||||
"rotation": [30, 45, 0],
|
||||
"scale": 0.7
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"animation_length": 0.16667,
|
||||
"bones": {
|
||||
"eyelid_left": {
|
||||
"left_eyelid": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0],
|
||||
"0.125": [0.1, 0, 0],
|
||||
"0.125": {"pre": [0.1, 0, 0], "post": [0.1, 0, 0]},
|
||||
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"right_eyelid": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0],
|
||||
"0.125": [-0.1, 0, 0],
|
||||
"0.125": {"pre": [-0.1, 0, 0], "post": [-0.1, 0, 0]},
|
||||
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0],
|
||||
"0.125": [0.1, 0, 0],
|
||||
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -278,25 +422,25 @@
|
||||
"tail": {
|
||||
"rotation": ["-42.5+math.sin(q.anim_time*90*8+0)*3", "math.sin(q.anim_time*90*4+60)*10", 0]
|
||||
},
|
||||
"tail_left": {
|
||||
"left_tail": {
|
||||
"rotation": ["10+math.sin(q.anim_time*90*8-25)*2", "0+math.sin(q.anim_time*90*4+30)*8", 0]
|
||||
},
|
||||
"tail_left2": {
|
||||
"left_tail2": {
|
||||
"rotation": ["15+math.sin(q.anim_time*90*8-55)*2", "0+math.sin(q.anim_time*90*4+0)*6", 0]
|
||||
},
|
||||
"tail_left3": {
|
||||
"left_tail3": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*8-85)*2", "0+math.sin(q.anim_time*90*4-30)*4", 0]
|
||||
},
|
||||
"tail_right": {
|
||||
"right_tail": {
|
||||
"rotation": ["10+math.sin(q.anim_time*90*8-35)*2", "0+math.sin(q.anim_time*90*4+30)*8", 0]
|
||||
},
|
||||
"tail_right2": {
|
||||
"right_tail2": {
|
||||
"rotation": ["15+math.sin(q.anim_time*90*8-65)*2", "0+math.sin(q.anim_time*90*4+0)*6", 0]
|
||||
},
|
||||
"tail_right3": {
|
||||
"right_tail3": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*8-95)*2", "0+math.sin(q.anim_time*90*4-30)*4", 0]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*8+0)*1", "0+math.sin(q.anim_time*90*4+60+180)*5", "0+math.sin(q.anim_time*90*4+60)*3"]
|
||||
},
|
||||
"neck": {
|
||||
@@ -305,66 +449,66 @@
|
||||
"head": {
|
||||
"rotation": ["2.5+math.sin(q.anim_time*90*8-60)*1.5", "0+math.sin(q.anim_time*90*4+0)*5", "0+math.sin(q.anim_time*90*4+0+180)*3"]
|
||||
},
|
||||
"pupil_right": {
|
||||
"right_pupil": {
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [10.08453, "-7.3854+math.sin(q.anim_time*90*4-90)*25", "48.6904+math.sin(q.anim_time*90*4+0)*2.5"]
|
||||
},
|
||||
"arm_left2": {
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, "42.5+math.sin(q.anim_time*90*4-120)*20", 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*4-150)*2.5", "22.5+math.sin(q.anim_time*90*4-150)*5"],
|
||||
"position": [-0.15, 0.05, 0]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [6.94363, 7.64256, 14.02881]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [-4.01743, -1.75217, 14.46202]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 30]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"left_middle_finger": {
|
||||
"rotation": [0, 0, 12.5]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"left_middle_finger2": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"arm_right": {
|
||||
"right_upper_arm": {
|
||||
"rotation": [10.08453, "7.3854+math.sin(q.anim_time*90*4-90)*25", "-48.6904+math.sin(q.anim_time*90*4+0)*2.5"]
|
||||
},
|
||||
"arm_right2": {
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, "-42.5+math.sin(q.anim_time*90*4-120)*20", 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*4-150)*2.5", "-22.5+math.sin(q.anim_time*90*4-150)*5"],
|
||||
"position": [0.15, 0.05, 0]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [6.94363, -7.64256, -14.02881]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [-4.01743, 1.75217, -14.46202]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -30]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"right_middle_finger": {
|
||||
"rotation": [0, 0, -12.5]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"right_middle_finger2": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [36.50677, 8.43184, 4.42536],
|
||||
@@ -414,7 +558,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"leg_right2": {
|
||||
"right_lower_leg": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [15, 0, 0],
|
||||
@@ -442,7 +586,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"foot_right": {
|
||||
"right_foot": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [24.37394, 0.4385, -6.40588],
|
||||
@@ -470,7 +614,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"foot_right2": {
|
||||
"right_foot2": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [-30, 0, 0],
|
||||
@@ -508,7 +652,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"toes_right": {
|
||||
"right_toes": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [-42.5, 0, 0],
|
||||
@@ -546,7 +690,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [-61.31845, -9.91358, -2.38565],
|
||||
@@ -596,7 +740,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"leg_left2": {
|
||||
"left_lower_leg": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [47.5, 0, 0],
|
||||
@@ -624,7 +768,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"foot_left": {
|
||||
"left_foot": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [-30.4165, -7.26605, 3.29302],
|
||||
@@ -652,7 +796,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"foot_left2": {
|
||||
"left_foot2": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [12.5, 0, 0],
|
||||
@@ -690,7 +834,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"toes_right2": {
|
||||
"left_toes": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [15, 0, 0],
|
||||
@@ -738,265 +882,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.test2": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": [-4.73298, 2.77592, 27.09295]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [-5.82738, 13.76109, -8.78252],
|
||||
"position": [0.25, 0, 0]
|
||||
},
|
||||
"tail_left": {
|
||||
"rotation": [17.07306, 24.25643, 6.31117]
|
||||
},
|
||||
"tail_left2": {
|
||||
"rotation": [24.53554, -3.67372, -4.51152]
|
||||
},
|
||||
"tail_right": {
|
||||
"rotation": [20.05865, 9.84795, 1.74036]
|
||||
},
|
||||
"tail_right2": {
|
||||
"rotation": [25.12876, 9.658, 2.59914]
|
||||
},
|
||||
"torso2": {
|
||||
"rotation": [7.06953, 5.56451, -12.40436],
|
||||
"position": [0, 0, 0.5]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [0.41092, 23.12473, -12.05132],
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [12.80178, -8.52421, -5.3105],
|
||||
"position": [0, 0.5, -1]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [0, 0, -0.5]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [9.29398, -6.81225, -20.04345],
|
||||
"position": [0, 0.25, 1]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0.65426, 4.95712, 7.52832]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [-17.87814, -19.86103, -49.99202],
|
||||
"position": [-0.15, 0.05, 0]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [0, 5, 20]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [0, -5, 20]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [28.39833, -11.25395, 25.21731],
|
||||
"position": [0, 3, -3.25]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, -27.5, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [8.98458, -4.04496, 42.82624],
|
||||
"position": [0.15, 0.05, 0]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [24.55654, -22.88323, -18.35198]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [24.23178, 6.06465, 25.68919]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, 15]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-156.31845, 9.91358, 2.38565],
|
||||
"position": [0, 0.75, -2.25]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [0.53366, 26.73797, -15.04829]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-2.91472, -22.08853, 21.08653],
|
||||
"position": [0, -1, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [65.81573, -6.16374, -15.44323]
|
||||
},
|
||||
"body": {
|
||||
"rotation": [0, 32.5, 0],
|
||||
"position": [0, 1.75, 0]
|
||||
},
|
||||
"tail_right3": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [40, 0, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [77.54738, -0.6465, -10.13344]
|
||||
},
|
||||
"foot_right2": {
|
||||
"rotation": [12.5, 0, 0],
|
||||
"position": [0, 0, 0.25]
|
||||
},
|
||||
"toes_right": {
|
||||
"rotation": [17.5, 0, 0]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [16.93839, -4.46375, 14.33501]
|
||||
},
|
||||
"foot_left2": {
|
||||
"rotation": [-35.67815, -9.54385, 8.11019]
|
||||
},
|
||||
"toes_right2": {
|
||||
"rotation": [-24.91643, -2.11089, -4.53359]
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"rotation": [26.9673, -26.74473, -3.82626]
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"rotation": [22.5, 20, 0]
|
||||
},
|
||||
"toe_middle_right": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"toe_inner_left": {
|
||||
"rotation": [-32.5, 0, 0]
|
||||
},
|
||||
"toe_outer_left": {
|
||||
"rotation": [-25, 0, 0]
|
||||
},
|
||||
"toe_middle_left": {
|
||||
"rotation": [-25, 0, 0]
|
||||
},
|
||||
"pupil_left": {
|
||||
"position": [0, 0, 0.5]
|
||||
},
|
||||
"eye_shine_left": {
|
||||
"position": [0, 0, 0.5]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.eye_wide": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_emote_right2": {
|
||||
"scale": [1, 1.5, 1]
|
||||
},
|
||||
"eye_emote_left2": {
|
||||
"scale": [1, 1.5, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [20, 0, 0]
|
||||
},
|
||||
"eye_right": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eye_left": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eyelid_happy_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eyelid_happy_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.angry": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_emote_right2": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"pupil_emote_right": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eye_emote_left2": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"pupil_emote_left": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_emote_right": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eye_emote_left": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.shocked": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [20, 0, 0]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [0, 0, -0.2],
|
||||
"scale": [1, 0.5, 0.7]
|
||||
},
|
||||
"pupil_left": {
|
||||
"position": [0, 0, -0.2],
|
||||
"scale": [1, 0.5, 0.7]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.hurt": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [20, 0, 0]
|
||||
},
|
||||
"eye_right": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eye_left": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eyelid_hurt_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eyelid_hurt_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
|
||||
+109
-246
@@ -7,7 +7,7 @@
|
||||
"torso": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
@@ -17,122 +17,100 @@
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"leaf7": {
|
||||
"rotation": [-5, 0, 0]
|
||||
"rotation": [12.5, 0, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [2.5, 7.5, 40]
|
||||
},
|
||||
"arm_left2": {
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, 52.5, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [2.5, 0, 32.5]
|
||||
},
|
||||
"arm_leaves_left": {
|
||||
"left_arm_leaves": {
|
||||
"rotation": [-25.08377, -4.53051, 2.11751]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [0, 0, 27.5]
|
||||
},
|
||||
"tail_left": {
|
||||
"left_tail": {
|
||||
"rotation": [-10, 12.5, -2.5]
|
||||
},
|
||||
"tail_left2": {
|
||||
"left_tail2": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": [0, -22.5, 0]
|
||||
},
|
||||
"leg_left2": {
|
||||
"left_lower_leg": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"left_foot": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"toe_inner_left": {
|
||||
"left_inner_toe": {
|
||||
"rotation": [0, 10, 0]
|
||||
},
|
||||
"toe_outer_left": {
|
||||
"left_outer_toe": {
|
||||
"rotation": [0, -10, 0]
|
||||
},
|
||||
"tail_right": {
|
||||
"right_tail": {
|
||||
"rotation": [-10, -12.5, 2.5]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": [0, 22.5, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"right_lower_leg": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"right_foot": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"right_inner_toe": {
|
||||
"rotation": [0, -10, 0]
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"right_outer_toe": {
|
||||
"rotation": [0, 10, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"right_upper_arm": {
|
||||
"rotation": [2.5, -7.5, -40]
|
||||
},
|
||||
"arm_right2": {
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, -52.5, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [2.5, 0, -32.5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [0, 0, -27.5]
|
||||
},
|
||||
"arm_leaves_right": {
|
||||
"right_arm_leaves": {
|
||||
"rotation": [-25.08377, 4.53051, -2.11751]
|
||||
},
|
||||
"tail_right2": {
|
||||
"right_tail2": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 17.5]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -17.5]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"leaf": {
|
||||
"rotation": [-50, 0, 0]
|
||||
},
|
||||
"leaf2": {
|
||||
"rotation": [-35, 0, 0]
|
||||
},
|
||||
"leaf3": {
|
||||
"rotation": [-22.5, 0, 0]
|
||||
},
|
||||
"leaf4": {
|
||||
"rotation": [-25, 0, 0]
|
||||
},
|
||||
"leaf5": {
|
||||
"rotation": [-25, 0, 0]
|
||||
},
|
||||
"leaf6": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"stick": {
|
||||
"rotation": [30, 40, 0],
|
||||
"scale": 0.7
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -142,7 +120,7 @@
|
||||
"torso": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
@@ -157,94 +135,94 @@
|
||||
"jaw": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [-52.5, 5, 27.5]
|
||||
},
|
||||
"arm_left2": {
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, 65, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [2.38443, -0.75155, 49.98436]
|
||||
},
|
||||
"arm_leaves_left": {
|
||||
"left_arm_leaves": {
|
||||
"rotation": [-10, -17.5, 0]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [0, 0, 2.5]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"tail_left": {
|
||||
"left_tail": {
|
||||
"rotation": [-15, 12.5, -2.5]
|
||||
},
|
||||
"tail_left2": {
|
||||
"left_tail2": {
|
||||
"rotation": [7.5, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": [0, -22.5, 0]
|
||||
},
|
||||
"leg_left2": {
|
||||
"left_lower_leg": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"left_foot": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"toe_inner_left": {
|
||||
"left_inner_toe": {
|
||||
"rotation": [0, 10, 0]
|
||||
},
|
||||
"toe_outer_left": {
|
||||
"left_outer_toe": {
|
||||
"rotation": [0, -10, 0]
|
||||
},
|
||||
"tail_right": {
|
||||
"right_tail": {
|
||||
"rotation": [-15, -12.5, 2.5]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": [0, 22.5, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"right_lower_leg": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"right_foot": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"right_inner_toe": {
|
||||
"rotation": [0, -10, 0]
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"right_outer_toe": {
|
||||
"rotation": [0, 10, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"right_upper_arm": {
|
||||
"rotation": [-52.5, -5, -27.5]
|
||||
},
|
||||
"arm_right2": {
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, -65, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [2.38443, 0.75155, -49.98436]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [0, 0, -2.5]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [0, 0, -5]
|
||||
},
|
||||
"arm_leaves_right": {
|
||||
"right_arm_leaves": {
|
||||
"rotation": [-10, 17.5, 0]
|
||||
},
|
||||
"tail_right2": {
|
||||
"right_tail2": {
|
||||
"rotation": [7.5, 0, 0]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 65]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 87.5]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -65]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -87.5]
|
||||
}
|
||||
}
|
||||
@@ -255,7 +233,7 @@
|
||||
"torso": {
|
||||
"rotation": [45.38165, -3.51814, -7.08167]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": [-9.97857, 3.32943, 4.4913]
|
||||
},
|
||||
"neck": {
|
||||
@@ -270,86 +248,86 @@
|
||||
"jaw": {
|
||||
"rotation": [42.5, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [-12.58328, 9.94037, 39.45082]
|
||||
},
|
||||
"arm_left2": {
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, 82.5, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [7.5, 0, 32.5]
|
||||
},
|
||||
"arm_leaves_left": {
|
||||
"left_arm_leaves": {
|
||||
"rotation": [-21.78282, -11.4487, 11.10461]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"tail_left": {
|
||||
"left_tail": {
|
||||
"rotation": [-17.99085, 11.53327, -4.85721]
|
||||
},
|
||||
"tail_left2": {
|
||||
"left_tail2": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": [-37.5, -22.5, 0],
|
||||
"position": [0.5, 0.5, -1]
|
||||
},
|
||||
"leg_left2": {
|
||||
"left_lower_leg": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"left_foot": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"toe_inner_left": {
|
||||
"left_inner_toe": {
|
||||
"rotation": [10, 10, 0]
|
||||
},
|
||||
"toe_outer_left": {
|
||||
"left_outer_toe": {
|
||||
"rotation": [20, -10, 0]
|
||||
},
|
||||
"tail_right": {
|
||||
"right_tail": {
|
||||
"rotation": [-28.32455, -16.15901, -4.25872]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": [38, 7.5, 2.5],
|
||||
"position": [0, -0.5, -0.5]
|
||||
},
|
||||
"leg_right2": {
|
||||
"right_lower_leg": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"right_foot": {
|
||||
"rotation": [27.5, 0, 0]
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"right_inner_toe": {
|
||||
"rotation": [-24.71447, -5.46269, -2.12052],
|
||||
"position": [0, -0.1, 0.6]
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"right_outer_toe": {
|
||||
"rotation": [-24.71447, 5.46269, 2.12052],
|
||||
"position": [0, -0.1, 0.6]
|
||||
},
|
||||
"arm_right": {
|
||||
"right_upper_arm": {
|
||||
"rotation": [-14.26018, -29.40676, -34.54418]
|
||||
},
|
||||
"arm_right2": {
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, -70, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [7.5, 0, -32.5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"arm_leaves_right": {
|
||||
"right_arm_leaves": {
|
||||
"rotation": [-26.39218, 18.05776, -8.74472]
|
||||
},
|
||||
"tail_right2": {
|
||||
"right_tail2": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"body": {
|
||||
@@ -367,191 +345,76 @@
|
||||
"leaf6": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"toe_back_left": {
|
||||
"left_back_toe": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"toe_back_right": {
|
||||
"right_back_toe": {
|
||||
"rotation": [-10, 0, 0]
|
||||
},
|
||||
"toe_outer_left2": {
|
||||
"left_outer_toe2": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"toe_inner_left2": {
|
||||
"left_inner_toe2": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"toe_inner_right2": {
|
||||
"right_inner_toe2": {
|
||||
"rotation": [-45, 0, 0],
|
||||
"position": [0, -0.55, 1.4]
|
||||
},
|
||||
"toe_outer_right2": {
|
||||
"right_outer_toe2": {
|
||||
"rotation": [-45, 0, 0],
|
||||
"position": [0, -0.55, 1.4]
|
||||
},
|
||||
"arm_leaf_middle_left": {
|
||||
"left_leaf1": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"arm_leaf_inner_left": {
|
||||
"left_leaf2": {
|
||||
"rotation": [5.76917, -1.99557, 14.05033]
|
||||
},
|
||||
"arm_leaf_outer_left": {
|
||||
"left_leaf3": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"arm_leaf_middle_right": {
|
||||
"right_leaf1": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"arm_leaf_inner_right": {
|
||||
"right_leaf2": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 30]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -30]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.grovyle.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"animation_length": 0.16667,
|
||||
"bones": {
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0],
|
||||
"0.125": [-0.1, 0, 0],
|
||||
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0],
|
||||
"0.125": [0.1, 0, 0],
|
||||
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eye_left": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0],
|
||||
"0.125": [-0.1, 0, 0],
|
||||
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0],
|
||||
"0.125": [0.1, 0, 0],
|
||||
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.grovyle.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_left": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eye_right": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eyelid_happy_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eyelid_happy_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.grovyle.angry": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_emote_right": {
|
||||
"scale": [1, 1.5, 1]
|
||||
},
|
||||
"eye_brow_right": {
|
||||
"position": [0, -0.3, 0]
|
||||
},
|
||||
"eye_brow_right2": {
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"eye_brow_left": {
|
||||
"position": [0, -0.3, 0]
|
||||
},
|
||||
"eye_brow_left2": {
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"eye_emote_left": {
|
||||
"scale": [1, 1.5, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.grovyle.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_brow_right": {
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"eye_brow_right2": {
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"eye_brow_left": {
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"eye_brow_left2": {
|
||||
"position": [0, -0.5, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.grovyle.shocked": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"pupil_left": {
|
||||
"position": [0, 0, -0.1],
|
||||
"scale": [1, 0.5, 0.5]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [0, 0, -0.1],
|
||||
"scale": [1, 0.5, 0.5]
|
||||
},
|
||||
"eye_emote_right": {
|
||||
"position": [0, -0.5, 0],
|
||||
"scale": [1, 2, 1]
|
||||
},
|
||||
"eye_brow_right": {
|
||||
"position": [0, 0.3, 0]
|
||||
},
|
||||
"eye_brow_left": {
|
||||
"position": [0, 0.3, 0]
|
||||
},
|
||||
"eye_emote_left": {
|
||||
"position": [0, -0.5, 0],
|
||||
"scale": [1, 2, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.grovyle.hurt": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_left": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eye_right": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eyelid_hurt_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eyelid_hurt_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.grovyle.cry": {
|
||||
"animation_length": 1.2,
|
||||
"animation_length": 1.33333,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.grovyle.cry"
|
||||
|
||||
+125
-199
@@ -7,7 +7,7 @@
|
||||
"torso": {
|
||||
"rotation": [17.5, 0, 0]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
@@ -16,34 +16,37 @@
|
||||
"head": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"jaw": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"right_upper_arm": {
|
||||
"rotation": [0, 5, 0]
|
||||
},
|
||||
"arm_right2": {
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, -50, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [0, 0, -27.5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"right_middle_finger": {
|
||||
"rotation": [0, 0, -15]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [0, 0, -25]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -47.5]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -50]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"right_middle_finger2": {
|
||||
"rotation": [0, 0, -40]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": [0, 15, 0]
|
||||
},
|
||||
"tail": {
|
||||
@@ -61,81 +64,77 @@
|
||||
"tail5": {
|
||||
"rotation": [7.5, 0, 0]
|
||||
},
|
||||
"shoulder_right": {
|
||||
"right_shoulder": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": [0, -15, 0]
|
||||
},
|
||||
"shoulder_left": {
|
||||
"left_shoulder": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [0, -5, 0]
|
||||
},
|
||||
"arm_left2": {
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, 50, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [0, 0, 27.5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 50]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"left_middle_finger": {
|
||||
"rotation": [0, 0, 15]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"left_middle_finger2": {
|
||||
"rotation": [0, 0, 40]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 47.5]
|
||||
},
|
||||
"arm_leaf_front_blade_right": {
|
||||
"right_arm_leaf_front_blade": {
|
||||
"scale": [1, 0, 1]
|
||||
},
|
||||
"arm_leaf_back_blade_right": {
|
||||
"right_arm_leaf_back_blade": {
|
||||
"scale": [1, 0, 1]
|
||||
},
|
||||
"arm_leaf_front_blade_left": {
|
||||
"left_arm_leaf_front_blade": {
|
||||
"scale": [1, 0, 1]
|
||||
},
|
||||
"arm_leaf_back_blade_left": {
|
||||
"left_arm_leaf_back_blade": {
|
||||
"scale": [1, 0, 1]
|
||||
},
|
||||
"tail_leaves_top_left": {
|
||||
"left_top_leaves": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"tail_leaves_bottom_left": {
|
||||
"left_bottom_leaves": {
|
||||
"rotation": [0, -2.5, 0]
|
||||
},
|
||||
"tail_leaves_top_left3": {
|
||||
"left_top_leaves3": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"tail_leaves_bottom_left3": {
|
||||
"left_bottom_leaves3": {
|
||||
"rotation": [0, 5, 0]
|
||||
},
|
||||
"tail_leaves_top_right": {
|
||||
"right_top_leaves": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"tail_leaves_bottom_right": {
|
||||
"right_bottom_leaves": {
|
||||
"rotation": [0, 2.5, 0]
|
||||
},
|
||||
"tail_leaves_top_right3": {
|
||||
"right_top_leaves3": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"tail_leaves_bottom_right3": {
|
||||
"right_bottom_leaves3": {
|
||||
"rotation": [0, -5, 0]
|
||||
},
|
||||
"stick": {
|
||||
"rotation": [16, 40, 0],
|
||||
"scale": 0.7
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -145,7 +144,7 @@
|
||||
"torso": {
|
||||
"rotation": [32.40109, 2.68407, -4.22005]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": [4.98107, -0.43523, 4.98107]
|
||||
},
|
||||
"neck": {
|
||||
@@ -157,34 +156,34 @@
|
||||
"jaw": {
|
||||
"rotation": [45, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"right_upper_arm": {
|
||||
"rotation": [-7.5, 2.5, 0]
|
||||
},
|
||||
"arm_right2": {
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, -72.5, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [0, 0, -50]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"right_middle_finger": {
|
||||
"rotation": [0, 0, -15]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [0, 0, -25]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -47.5]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -50]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"right_middle_finger2": {
|
||||
"rotation": [0, 0, -40]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": [22.5, 15, 0],
|
||||
"position": [0, 0.5, 0.5]
|
||||
},
|
||||
@@ -203,92 +202,92 @@
|
||||
"tail5": {
|
||||
"rotation": [12.79362, 12.19908, 2.74715]
|
||||
},
|
||||
"shoulder_right": {
|
||||
"right_shoulder": {
|
||||
"rotation": [-10.01754, 2.34914, -25.85553]
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": [-17.5, -15, 0],
|
||||
"position": [0, 0, -0.5]
|
||||
},
|
||||
"shoulder_left": {
|
||||
"left_shoulder": {
|
||||
"rotation": [-11.9857, 23.12519, 20.20473]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [-5, 10, 0]
|
||||
},
|
||||
"arm_left2": {
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, 47.5, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 50]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"left_middle_finger": {
|
||||
"rotation": [0, 0, 15]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"left_middle_finger2": {
|
||||
"rotation": [0, 0, 40]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 47.5]
|
||||
},
|
||||
"leg_right2": {
|
||||
"right_lower_leg": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"leg_right3": {
|
||||
"right_ankle": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"right_foot": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"toe_middle_right": {
|
||||
"right_middle_toe": {
|
||||
"rotation": [-42.5, 0, 0],
|
||||
"position": [0, -0.5, 0.6]
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"right_inner_toe": {
|
||||
"rotation": [-43.11609, 4.07933, 4.44372],
|
||||
"position": [0, -0.5, 0.6]
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"right_outer_toe": {
|
||||
"rotation": [-43.11609, -4.07933, -4.44372],
|
||||
"position": [0, -0.5, 0.6]
|
||||
},
|
||||
"leg_left2": {
|
||||
"left_lower_leg": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"leg_left3": {
|
||||
"left_ankle": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"left_foot": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"arm_leaf_front_blade_right": {
|
||||
"right_arm_leaf_front_blade": {
|
||||
"scale": [1, 0, 1]
|
||||
},
|
||||
"arm_leaf_back_blade_right": {
|
||||
"right_arm_leaf_back_blade": {
|
||||
"scale": [1, 0, 1]
|
||||
},
|
||||
"arm_leaf_front_blade_left": {
|
||||
"left_arm_leaf_front_blade": {
|
||||
"scale": [1, 0, 1]
|
||||
},
|
||||
"arm_leaf_back_blade_left": {
|
||||
"left_arm_leaf_back_blade": {
|
||||
"scale": [1, 0, 1]
|
||||
},
|
||||
"tail_leaves_top_left": {
|
||||
"left_top_leaves": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"tail_leaves_top_left2": {
|
||||
"left_top_leaves2": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"tail_leaves_top_left3": {
|
||||
"left_top_leaves3": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
}
|
||||
}
|
||||
@@ -302,7 +301,7 @@
|
||||
"torso": {
|
||||
"rotation": [49.75757, -7.34759, 2.92368]
|
||||
},
|
||||
"torso2": {
|
||||
"upper_torso": {
|
||||
"rotation": [14.94548, 1.29256, -4.83045]
|
||||
},
|
||||
"neck": {
|
||||
@@ -311,68 +310,68 @@
|
||||
"head": {
|
||||
"rotation": [-55.48448, 3.48051, -3.55608]
|
||||
},
|
||||
"shoulder_right": {
|
||||
"right_shoulder": {
|
||||
"rotation": [-58.62702, 15.46973, -8.28342],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"right_upper_arm": {
|
||||
"rotation": [-7.5, -1, -7.5]
|
||||
},
|
||||
"arm_right2": {
|
||||
"right_lower_arm": {
|
||||
"rotation": [0, -30, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"right_hand": {
|
||||
"rotation": [0, 0, -15]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"right_index_finger": {
|
||||
"rotation": [0, 0, -12.5]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"right_index_finger2": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"right_middle_finger": {
|
||||
"rotation": [0, 0, 22.5],
|
||||
"position": [0.5, 0, 0]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"right_middle_finger2": {
|
||||
"rotation": [0, 0, -35]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"right_pinky_finger": {
|
||||
"rotation": [0, 0, -37.5]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"right_pinky_finger2": {
|
||||
"rotation": [0, 0, -42.5]
|
||||
},
|
||||
"shoulder_left": {
|
||||
"left_shoulder": {
|
||||
"rotation": [-59.92127, -18.02575, 12.77165],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"left_upper_arm": {
|
||||
"rotation": [-7.5, 1, 7.5]
|
||||
},
|
||||
"arm_left2": {
|
||||
"left_lower_arm": {
|
||||
"rotation": [0, 42.5, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"left_hand": {
|
||||
"rotation": [0, 0, 15]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"left_index_finger": {
|
||||
"rotation": [0, 0, 12.5]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"left_index_finger2": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"left_middle_finger": {
|
||||
"rotation": [0, 0, -22.5],
|
||||
"position": [-0.5, 0, 0]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"left_middle_finger2": {
|
||||
"rotation": [0, 0, 35]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"left_pinky_finger": {
|
||||
"rotation": [0, 0, 37.5]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"left_pinky_finger2": {
|
||||
"rotation": [0, 0, 42.5]
|
||||
},
|
||||
"tail": {
|
||||
@@ -391,170 +390,97 @@
|
||||
"tail5": {
|
||||
"rotation": [10.08453, -7.38542, -1.30962]
|
||||
},
|
||||
"leg_right": {
|
||||
"right_upper_leg": {
|
||||
"rotation": [-25.44458, 0.21572, -4.69162],
|
||||
"position": [0, 0, -1]
|
||||
},
|
||||
"leg_right2": {
|
||||
"right_lower_leg": {
|
||||
"rotation": [-5, -2.5, 0]
|
||||
},
|
||||
"leg_right3": {
|
||||
"right_ankle": {
|
||||
"rotation": [35, 0, 0],
|
||||
"position": [0, 0, 0.6]
|
||||
},
|
||||
"foot_right": {
|
||||
"right_foot": {
|
||||
"rotation": [7.74222, 4.81281, 5.7589]
|
||||
},
|
||||
"toe_middle_right": {
|
||||
"right_middle_toe": {
|
||||
"rotation": [-12.5, 0, 0]
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"right_inner_toe": {
|
||||
"rotation": [-12.5, 0, 0]
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"right_outer_toe": {
|
||||
"rotation": [-12.5, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"left_upper_leg": {
|
||||
"rotation": [32.71776, -4.77227, -5.22233],
|
||||
"position": [0, 0, 1]
|
||||
},
|
||||
"leg_left2": {
|
||||
"left_lower_leg": {
|
||||
"rotation": [4.96271, -0.86717, 4.92442]
|
||||
},
|
||||
"leg_left3": {
|
||||
"left_ankle": {
|
||||
"rotation": [42.5, 0, 0],
|
||||
"position": [0, 0, 1]
|
||||
},
|
||||
"foot_left": {
|
||||
"left_foot": {
|
||||
"rotation": [85, 0, 0],
|
||||
"position": [0, 0.35, 1.2]
|
||||
},
|
||||
"toe_middle_left": {
|
||||
"left_middle_toe": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"toe_inner_left": {
|
||||
"left_inner_toe": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"toe_outer_left": {
|
||||
"left_outer_toe": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"tail_leaves_bottom_left": {
|
||||
"left_bottom_leaves": {
|
||||
"rotation": [0, -5, 0]
|
||||
},
|
||||
"tail_leaves_bottom_left3": {
|
||||
"left_bottom_leaves3": {
|
||||
"rotation": [0, 5, 0]
|
||||
},
|
||||
"toe_middle_left2": {
|
||||
"left_middle_toe2": {
|
||||
"rotation": [17.5, 0, 0]
|
||||
},
|
||||
"toe_inner_left2": {
|
||||
"left_inner_toe2": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"toe_outer_left2": {
|
||||
"left_outer_toe2": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"tail_leaves_top_right": {
|
||||
"right_top_leaves": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"tail_leaves_top_right3": {
|
||||
"right_top_leaves3": {
|
||||
"rotation": [-5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sceptile.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"animation_length": 0.16667,
|
||||
"bones": {
|
||||
"eyelid_right": {
|
||||
"right_eyelid": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0],
|
||||
"0.125": [-0.1, 0, 0],
|
||||
"0.125": {"pre": [-0.1, 0, 0], "post": [-0.1, 0, 0]},
|
||||
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"left_eyelid": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0],
|
||||
"0.125": [0.1, 0, 0],
|
||||
"0.125": {"pre": [0.1, 0, 0], "post": [0.1, 0, 0]},
|
||||
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sceptile.hurt_or_happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_hurt_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eyelid_hurt_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sceptile.angry": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_brow_right": {
|
||||
"position": [0, -0.4, 0]
|
||||
},
|
||||
"eye_brow_left": {
|
||||
"position": [0, -0.4, 0]
|
||||
},
|
||||
"eye_brow_left2": {
|
||||
"position": [0, 0.4, 0]
|
||||
},
|
||||
"eye_brow_right2": {
|
||||
"position": [0, 0.4, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sceptile.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"pupil_right": {
|
||||
"position": [0, 0.1, 0]
|
||||
},
|
||||
"pupil_left": {
|
||||
"position": [0, 0.1, 0]
|
||||
},
|
||||
"eye_brow_right": {
|
||||
"position": [0, 0.3, 0]
|
||||
},
|
||||
"eye_brow_left": {
|
||||
"position": [0, 0.3, 0]
|
||||
},
|
||||
"eye_brow_left2": {
|
||||
"position": [0, -0.4, 0]
|
||||
},
|
||||
"eye_brow_right2": {
|
||||
"position": [0, -0.4, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sceptile.shocked": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [35, 0, 0]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [0, 0.1, 0],
|
||||
"scale": [1, 0.5, 0.5]
|
||||
},
|
||||
"pupil_left": {
|
||||
"position": [0, 0.1, 0],
|
||||
"scale": [1, 0.5, 0.5]
|
||||
},
|
||||
"eye_brow_right": {
|
||||
"position": [0, 0.3, 0]
|
||||
},
|
||||
"eye_brow_left": {
|
||||
"position": [0, 0.3, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sceptile.cry": {
|
||||
"animation_length": 1.2,
|
||||
"animation_length": 1.33333,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.sceptile.cry"
|
||||
|
||||
+15
-92
@@ -788,30 +788,34 @@
|
||||
}
|
||||
},
|
||||
"animation.metagross.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"animation_length": 0.16667,
|
||||
"bones": {
|
||||
"eye_open_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
"0.125": [0, 0, 0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eye_closed_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
"0.125": [0, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eye_open_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
"0.125": [0, 0, 0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eye_closed_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
"0.125": [0, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -968,6 +972,12 @@
|
||||
"eye_closed_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eye_open_right": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eye_closed_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": [-20.94102, 8.42106, -69.05898]
|
||||
},
|
||||
@@ -1003,12 +1013,6 @@
|
||||
},
|
||||
"hand_back_right": {
|
||||
"rotation": [0, 0, -15]
|
||||
},
|
||||
"eye_open_right": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eye_closed_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1019,87 +1023,6 @@
|
||||
"position": [0, 0, "-q.anim_time*90*0.2"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.metagross.shock": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"pupil_left": {
|
||||
"scale": [0.7, 0.7, 1]
|
||||
},
|
||||
"eye_shine_left": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"mouth": {
|
||||
"position": [0, 0, -0.2]
|
||||
},
|
||||
"pupil_right": {
|
||||
"scale": [0.7, 0.7, 1]
|
||||
},
|
||||
"eye_shine_right": {
|
||||
"position": [0, 0, 0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.metagross.angry": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_angry_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eye_angry_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.metagross.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_sad_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eye_sad_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.metagross.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"position": [0, 0, -0.2]
|
||||
},
|
||||
"eye_open_left": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eye_happy_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eye_open_right": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eye_happy_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.metagross.hurt": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_open_left": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eye_closed_left": {
|
||||
"rotation": [0, 0, -20],
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eye_open_right": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eye_closed_right": {
|
||||
"rotation": [0, 0, 20],
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+267
-1077
File diff suppressed because it is too large
Load Diff
+26
-165
@@ -5,11 +5,7 @@
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [
|
||||
"45*q.riding.velocity_forward(0)",
|
||||
"0 - Math.Sin(((q.anim_time + 0.1) * 180 * 0.5) * 1) * 5",
|
||||
"Math.Sin(((q.anim_time + 0.4) * 180 * 0.5) * 1) * 5 + 45*q.riding.velocity_right(0)"
|
||||
],
|
||||
"rotation": [0, "0 - Math.Sin(((q.anim_time + 0.1) * 180 * 0.5) * 1) * 5", "Math.Sin(((q.anim_time + 0.4) * 180 * 0.5) * 1) * 5"],
|
||||
"position": ["Math.Sin((q.anim_time * 180 * 0.5) * 1) * 1.5", "7+Math.Sin((q.anim_time * 90 * 0.5) * 1) * 1.5", 0]
|
||||
},
|
||||
"magnet_back_rotation": {
|
||||
@@ -49,11 +45,7 @@
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [
|
||||
"2.5 + 45*q.riding.velocity_forward(0)",
|
||||
"- Math.Sin(((q.anim_time + 0.1) * 180 * 0.5) * 1) * 5",
|
||||
"Math.Sin(((q.anim_time + 0.4) * 180 * 0.5) * 1) * 5 - 45*q.riding.velocity_right(0)"
|
||||
],
|
||||
"rotation": [15, "0 - Math.Sin(((q.anim_time + 0.1) * 180 * 0.5) * 1) * 5", "Math.Sin(((q.anim_time + 0.4) * 180 * 0.5) * 1) * 5"],
|
||||
"position": ["Math.Sin((q.anim_time * 180 * 0.5) * 1) * 1.5", "7+Math.Sin((q.anim_time * 90 * 0.5) * 1) * 1.5", 0]
|
||||
},
|
||||
"magnet_back_rotation": {
|
||||
@@ -274,117 +266,45 @@
|
||||
"pupil_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0.1]
|
||||
},
|
||||
"1.75": {
|
||||
"pre": [0, 0, 0.1],
|
||||
"post": [0, 0, 0.1]
|
||||
},
|
||||
"1.7917": {
|
||||
"pre": [0, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.125": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0.1]
|
||||
}
|
||||
"0.5": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"0.5417": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
|
||||
"1.75": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
|
||||
"1.7917": {"pre": [0, 0, 0.1], "post": [0, 0, 0]},
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"2.125": {"pre": [0, 0, 0], "post": [0, 0, 0.1]}
|
||||
}
|
||||
},
|
||||
"pupil_closed_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, -0.1]
|
||||
},
|
||||
"1.75": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, -0.1]
|
||||
},
|
||||
"1.7917": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.125": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, -0.1]
|
||||
}
|
||||
"0.5": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"0.5417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
|
||||
"1.75": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
|
||||
"1.7917": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"2.125": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
|
||||
}
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2083": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0, 0, 0.1],
|
||||
"post": [0, 0, 0.1]
|
||||
},
|
||||
"0.5417": {
|
||||
"pre": [0, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.9583": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0.1]
|
||||
}
|
||||
"0.2083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
|
||||
"0.5": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
|
||||
"0.5417": {"pre": [0, 0, 0.1], "post": [0, 0, 0]},
|
||||
"1.9583": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"2.0": {"pre": [0, 0, 0], "post": [0, 0, 0.1]}
|
||||
}
|
||||
},
|
||||
"pupil_closed_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2083": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, -0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, -0.1]
|
||||
},
|
||||
"0.5417": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.9583": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, -0.1]
|
||||
}
|
||||
"0.2083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
|
||||
"0.5": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
|
||||
"0.5417": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
|
||||
"1.9583": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"2.0": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -550,65 +470,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.magnezone.active": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"magnet_lights_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"magnet_lights_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"magnet_lights_back": {
|
||||
"position": [0, 0, 0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.magnezone.shock": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"pupil_left": {
|
||||
"scale": [0.7, 0.7, 1]
|
||||
},
|
||||
"pupil_right": {
|
||||
"scale": [0.7, 0.7, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.magnezone.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"pupil_left": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"pupil_happy_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"pupil_happy_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.magnezone.hurt": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"pupil_left": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"pupil_recoil_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"pupil_recoil_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.magnezone.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
|
||||
-8
@@ -159,14 +159,6 @@
|
||||
"rotation": [-9.99762, -0.10901, 10.00238]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.leafeon.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.leafeon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -177,14 +177,6 @@
|
||||
"rotation": [0, 0, -7.5]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.glaceon.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.glaceon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-427
@@ -1,427 +0,0 @@
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.druddigon.ground_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"arm_right1": {
|
||||
"rotation": [-19.84214, -10.30464, -25.48972]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [7.5, 0, -22.5]
|
||||
},
|
||||
"arm_right3": {
|
||||
"rotation": [0, -40, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, -7.5, -12.5]
|
||||
},
|
||||
"finger_right1": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"claw_right1": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [0, 0, 0],
|
||||
"position": [0, -0.27716, -0.11481]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"tail_1": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"leg_left1": {
|
||||
"rotation": [-6.23088, -21.01584, -15.72279],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [32.5, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-43.40659, -12.60837, 8.19252]
|
||||
},
|
||||
"toe_left2": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"toe_left3": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"leg_right1": {
|
||||
"rotation": [-6.23088, 21.01584, 15.72279],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [32.5, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-43.40659, 12.60837, -8.19252]
|
||||
},
|
||||
"toe_right2": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"toe_right3": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"finger_right2": {
|
||||
"rotation": [10, 37.5, 0]
|
||||
},
|
||||
"claw_right2": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"finger_right3": {
|
||||
"rotation": [-5, -37.5, 0]
|
||||
},
|
||||
"claw_right3": {
|
||||
"rotation": [-22.5, 0, 0]
|
||||
},
|
||||
"arm_left1": {
|
||||
"rotation": [-19.84214, 10.30464, 25.48972]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [7.5, 0, 22.5]
|
||||
},
|
||||
"arm_left3": {
|
||||
"rotation": [0, 40, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, 7.5, 12.5]
|
||||
},
|
||||
"finger_left1": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"claw_left1": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"finger_left2": {
|
||||
"rotation": [10, -37.5, 0]
|
||||
},
|
||||
"claw_left2": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"finger_left3": {
|
||||
"rotation": [-5, 37.5, 0]
|
||||
},
|
||||
"claw_left3": {
|
||||
"rotation": [-22.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.battle_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"arm_right1": {
|
||||
"rotation": [-35.0999, -18.72795, -13.41336]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [1.0804, -5.1849, -12.8416]
|
||||
},
|
||||
"arm_right3": {
|
||||
"rotation": [-29.5083, -47.382, -4.0162]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, -7.5, -12.5]
|
||||
},
|
||||
"finger_right1": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"claw_right1": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"finger_right2": {
|
||||
"rotation": [15, 40, 0]
|
||||
},
|
||||
"claw_right2": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"body": {
|
||||
"rotation": [0, -12.5, 0],
|
||||
"position": [0, 2, -0.6]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [9.9863, 0.22463, 0.3039],
|
||||
"position": [0, -1, 1]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [-10.08226, 3.37738, -3.68895]
|
||||
},
|
||||
"wing_left": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [12.48609, 1.84353, -1.68884],
|
||||
"position": [0, 0, -0.2]
|
||||
},
|
||||
"neck_mouth_closed": {
|
||||
"scale": 0
|
||||
},
|
||||
"head": {
|
||||
"rotation": [-22.54365, 1.71046, -4.69895]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [20, 0, 0],
|
||||
"position": [0, -0.47716, -0.11481]
|
||||
},
|
||||
"leg_left1": {
|
||||
"rotation": [1.06967, -28.21899, -16.6831]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [35, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-8.00865, -10.6666, 5.52624]
|
||||
},
|
||||
"toe_left1": {
|
||||
"rotation": [-42.60882, -3.68425, 3.38262]
|
||||
},
|
||||
"toe_left3": {
|
||||
"rotation": [-30.96089, -12.57966, -9.31627]
|
||||
},
|
||||
"toe_left2": {
|
||||
"rotation": [-37.82102, 5.54652, 13.22471]
|
||||
},
|
||||
"toe_claw_left2": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"toe_claw_left3": {
|
||||
"rotation": [-10, 0, 0]
|
||||
},
|
||||
"leg_right1": {
|
||||
"rotation": [-1.23088, 21.01584, 15.72279]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [35, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-8.00865, 10.6666, -5.52624]
|
||||
},
|
||||
"toe_right1": {
|
||||
"rotation": [-42.60882, 3.68425, -3.38262]
|
||||
},
|
||||
"toe_right2": {
|
||||
"rotation": [-37.82102, -5.54652, -13.22471]
|
||||
},
|
||||
"toe_claw_right2": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"toe_right3": {
|
||||
"rotation": [-30.96089, 12.57966, 9.31627]
|
||||
},
|
||||
"toe_claw_right3": {
|
||||
"rotation": [-10, 0, 0]
|
||||
},
|
||||
"head_hidden": {
|
||||
"scale": 0
|
||||
},
|
||||
"wing_right": {
|
||||
"rotation": [-6.76783, 4.83809, -1.4594]
|
||||
},
|
||||
"tail_3": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"tail_4": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"wing_left2": {
|
||||
"rotation": [0, 7.5, 0]
|
||||
},
|
||||
"finger_right3": {
|
||||
"rotation": [-7.5, -40, 0]
|
||||
},
|
||||
"claw_right3": {
|
||||
"rotation": [-22.5, 0, 0]
|
||||
},
|
||||
"arm_left1": {
|
||||
"rotation": [-9.21772, 22.54829, 25.90265]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [1.0804, 5.1849, 12.8416]
|
||||
},
|
||||
"arm_left3": {
|
||||
"rotation": [-40.89335, 59.21695, -14.63464]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, 7.5, 12.5]
|
||||
},
|
||||
"finger_left1": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"claw_left1": {
|
||||
"rotation": [0, 0, 97.5],
|
||||
"position": [0, -1.8, 0]
|
||||
},
|
||||
"finger_left2": {
|
||||
"rotation": [10.07885, -31.4612, 2.60512]
|
||||
},
|
||||
"claw_left2": {
|
||||
"rotation": [100, 0, 0],
|
||||
"position": [0, -1.8, 0]
|
||||
},
|
||||
"finger_left3": {
|
||||
"rotation": [-20.94706, 24.49001, 0.53086]
|
||||
},
|
||||
"claw_left3": {
|
||||
"rotation": [-90, 0, 0],
|
||||
"position": [0, -2, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.mouth_test": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [22.5, 0, 0],
|
||||
"position": [0, -1, -0.5]
|
||||
},
|
||||
"neck_mouth_closed": {
|
||||
"scale": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.new": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": [-12.5, 0, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [27.5, 0, 0]
|
||||
},
|
||||
"head_hidden": {
|
||||
"scale": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.angry": {
|
||||
"loop": true
|
||||
},
|
||||
"animation.druddigon.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_angry_left": {
|
||||
"position": [-0.1, 0, 0.1]
|
||||
},
|
||||
"eyelid_sad_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"eyelid_angry_right": {
|
||||
"position": [0.1, 0, 0.1]
|
||||
},
|
||||
"eyelid_sad_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.unamused": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_angry_left": {
|
||||
"position": [-0.1, 0, 0.1]
|
||||
},
|
||||
"eyelid_unamused_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelid_angry_right": {
|
||||
"position": [0.1, 0, 0.1]
|
||||
},
|
||||
"eyelid_unamused_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_angry_left": {
|
||||
"position": [-0.1, 0, 0.1]
|
||||
},
|
||||
"eyelid_happy_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelid_angry_right": {
|
||||
"position": [0.1, 0, 0.1]
|
||||
},
|
||||
"eyelid_happy_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.surpised": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"neck_mouth_closed": {
|
||||
"scale": 0
|
||||
},
|
||||
"pupil_left": {
|
||||
"scale": [1, 0.7, 0.7]
|
||||
},
|
||||
"head_hidden": {
|
||||
"scale": 0
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [27.5, 0, 0]
|
||||
},
|
||||
"eyelid_angry_left": {
|
||||
"position": [-0.1, 0, 0.1]
|
||||
},
|
||||
"pupil_right": {
|
||||
"scale": [1, 0.7, 0.7]
|
||||
},
|
||||
"eyelid_angry_right": {
|
||||
"position": [0.1, 0, 0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.rage": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"neck_mouth_closed": {
|
||||
"scale": 0
|
||||
},
|
||||
"pupil_left": {
|
||||
"scale": [1, 0.7, 0.7]
|
||||
},
|
||||
"head_hidden": {
|
||||
"scale": 0
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [27.5, 0, 0]
|
||||
},
|
||||
"eyelid_angry_left": {
|
||||
"position": [0, 0.4, 0]
|
||||
},
|
||||
"pupil_right": {
|
||||
"scale": [1, 0.7, 0.7]
|
||||
},
|
||||
"eyelid_angry_right": {
|
||||
"position": [0, 0.4, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.druddigon.hold_item": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"claw_right1": {
|
||||
"rotation": [0, 0, -67.5],
|
||||
"position": [0, -2, 0]
|
||||
},
|
||||
"finger_right2": {
|
||||
"rotation": [20.11852, -67.56738, 9.02949],
|
||||
"position": [0.6, -0.3, 1.1]
|
||||
},
|
||||
"claw_right2": {
|
||||
"rotation": [82.5, 0, 0],
|
||||
"position": [0, -2, 0]
|
||||
},
|
||||
"claw_right3": {
|
||||
"rotation": [-70, 0, 0],
|
||||
"position": [0, -2, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+309
-203
@@ -4,36 +4,112 @@
|
||||
"animation.braixen.ground_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
"torso_bottom": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*2.5-45)*0.75", 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["10-math.sin(q.anim_time*90*2.5)*2", 0, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["2.5+math.sin(q.anim_time*90*2.5+45)*2", 0, 0]
|
||||
},
|
||||
"ear_ruff_right": {
|
||||
"rotation": [0, 5, "-1-math.sin(q.anim_time*90*2.5+45)*1"]
|
||||
},
|
||||
"ear_ruff_right2": {
|
||||
"rotation": [0, 10, "-math.sin(q.anim_time*90*2.5)*1"]
|
||||
},
|
||||
"ear_ruff_right3": {
|
||||
"rotation": [0, 10, "-math.sin(q.anim_time*90*2.5-45)*1"]
|
||||
},
|
||||
"ear_ruff_left": {
|
||||
"rotation": [0, -2.5, "1+math.sin(q.anim_time*90*2.5+45)*1"]
|
||||
},
|
||||
"ear_ruff_left2": {
|
||||
"rotation": [0, -10, "math.sin(q.anim_time*90*2.5)*1"]
|
||||
},
|
||||
"ear_ruff_left3": {
|
||||
"rotation": [0, -10, "math.sin(q.anim_time*90*2.5-45)*1"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-1.56101, "12.3977-math.sin(q.anim_time*90*2.5+45)", -55.15982]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [-3.88714, -27.24513, 8.44236]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [-1.465, "-12.404+math.sin(q.anim_time*90*2.5+45)*2", 55.14094]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [-6.31274, 31.94715, -11.80868]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*2.5)*2", "math.sin(q.anim_time*90*1.25-90)*4", "math.sin(q.anim_time*90*1.25-90)*2"],
|
||||
"position": [0, 0, 0.5]
|
||||
},
|
||||
"stick_tail": {
|
||||
"rotation": [0, 0, "-math.sin(q.anim_time*90*1.25-45)*4"]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [0, 0, "math.sin(q.anim_time*90*1.25-45)*4"]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2.5-90)*2", 0, 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2.5-135)*2", 0, 0]
|
||||
},
|
||||
"finger_index_right": {
|
||||
"rotation": [0, 0, -15]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"finger_ring_right": {
|
||||
"rotation": [0, 0, -5]
|
||||
},
|
||||
"finger_index_left": {
|
||||
"rotation": [0, 0, 15]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"finger_ring_left": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"waist": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [0, 7.5, 70]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [-5, 37.5, -2.5]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [57.5, -10, 7.5]
|
||||
"rotation": [0, 0, -7.5]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [-5, 0, 0]
|
||||
"finger_front_left": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [12.5, 0, 0]
|
||||
"finger_back_left": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"tail": {
|
||||
"hand_right": {
|
||||
"rotation": [0, 0, 7.5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [0, 0, -25]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"stick_hand": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_right": {
|
||||
"scale": 0
|
||||
},
|
||||
"skirt_front2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"stick_tail": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [0.88045, -9.96156, -5.07673]
|
||||
},
|
||||
@@ -49,78 +125,8 @@
|
||||
"leg_right3": {
|
||||
"rotation": [0.00039, 5.00185, -5.99069]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [9.99527, 9.84653, 30.20756]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [-4.26175, -9.05478, 25.33761]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, 27.5]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [65, 22.5, -45],
|
||||
"position": [0, 0, 0.5]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [-15, -82.5, 15]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [-10, -22.5, 70]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [9.99527, -9.84653, -30.20756]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, -27.5]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [-4.26175, 9.05478, -25.33761]
|
||||
},
|
||||
"ear_ruff_left2": {
|
||||
"rotation": [0, -7.5, 0]
|
||||
},
|
||||
"ear_ruff_left3": {
|
||||
"rotation": [0, -7.5, 0]
|
||||
},
|
||||
"ear_ruff_left4": {
|
||||
"rotation": [0, -7.5, 0]
|
||||
},
|
||||
"skirt_front2": {
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [1, 0, 0]
|
||||
},
|
||||
"ear_ruff_left": {
|
||||
"rotation": [0, -7.5, 0]
|
||||
},
|
||||
"ear_ruff_right": {
|
||||
"rotation": [0, 7.5, 0]
|
||||
},
|
||||
"ear_ruff_right2": {
|
||||
"rotation": [0, 7.5, 0]
|
||||
},
|
||||
"ear_ruff_right3": {
|
||||
"rotation": [0, 7.5, 0]
|
||||
},
|
||||
"ear_ruff_right4": {
|
||||
"rotation": [0, 7.5, 0]
|
||||
},
|
||||
"skirt_front_left": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"skirt_front_right": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_right": {
|
||||
"scale": 0
|
||||
},
|
||||
"wand": {
|
||||
"scale": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -128,14 +134,13 @@
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [0, -52.5, 0],
|
||||
"position": [-0.5, -2.05, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [15, -10, 0]
|
||||
},
|
||||
"waist": {
|
||||
"rotation": [-2.5, -2.5, 0]
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [-5, 2.5, 0]
|
||||
@@ -162,10 +167,10 @@
|
||||
"rotation": [0, -10, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-60.09473, -14.92923, -20.56425]
|
||||
"rotation": [-35.09473, -47.42923, -40.56425]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, -45, 0]
|
||||
"rotation": [0, -40, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, 27.5, 15]
|
||||
@@ -180,10 +185,10 @@
|
||||
"rotation": [0, 0, -77.5]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [0, 32.5, -7.5]
|
||||
"rotation": [0, 5, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [-7.5, 20, -5]
|
||||
"rotation": [-10, 0, 0]
|
||||
},
|
||||
"ear_ruff_left2": {
|
||||
"rotation": [0, -12.5, 0]
|
||||
@@ -216,32 +221,28 @@
|
||||
"scale": 0
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-0.5, -35, -26],
|
||||
"position": [1, 0, 0]
|
||||
"rotation": [5.38152, -19.291, -15.91527]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [10, 0, 0]
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"leg_left3": {
|
||||
"rotation": [-22.5, 0, 0]
|
||||
"rotation": [-16.28567, 14.26008, -10.25103]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [29.78634, -18.01295, 11.28749],
|
||||
"position": [0, -0.5, 0]
|
||||
"rotation": [-12.32417, 1.61888, 12.39638]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-7.80674, 36.44232, 19.22515],
|
||||
"position": [-1, -0.75, -0.75]
|
||||
"rotation": [-27.5, 0, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [29.75489, -5.05904, 8.04401]
|
||||
"rotation": [27.25489, -5.05904, 5.54401]
|
||||
},
|
||||
"leg_right3": {
|
||||
"rotation": [-30.5, -2, -1]
|
||||
"rotation": [-25, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [22.5, 20, -10],
|
||||
"position": [0, -0.5, 0]
|
||||
"rotation": [24.78729, 3.74196, -6.50446]
|
||||
},
|
||||
"ear_ruff_right2": {
|
||||
"rotation": [0, 12.5, 0]
|
||||
@@ -252,111 +253,24 @@
|
||||
"ear_ruff_right4": {
|
||||
"rotation": [0, 17.5, 0]
|
||||
},
|
||||
"stick_hand": {
|
||||
"rotation": [90, 10, 0],
|
||||
"position": [6.5, -1, -0.5]
|
||||
},
|
||||
"skirt_front_left": {
|
||||
"rotation": [0, 0, 7.5]
|
||||
},
|
||||
"skirt_front_right": {
|
||||
"rotation": [0, 0, -2.5]
|
||||
},
|
||||
"fire": {
|
||||
"rotation": [-7.15656, 2.24944, 17.35932]
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_right": {
|
||||
"scale": 0
|
||||
},
|
||||
"skirt": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"body_wand": {
|
||||
"rotation": [0, -52.5, 0],
|
||||
"position": [-0.5, -2.05, 0]
|
||||
},
|
||||
"torso_wand": {
|
||||
"rotation": [15, -10, 0]
|
||||
},
|
||||
"waist_wand": {
|
||||
"rotation": [-2.5, -2.5, 0]
|
||||
},
|
||||
"chest_wand": {
|
||||
"rotation": [-5, 2.5, 0]
|
||||
},
|
||||
"arm_wand": {
|
||||
"rotation": [-60.09473, -14.92923, -20.56425]
|
||||
},
|
||||
"arm2_wand": {
|
||||
"rotation": [0, -45, 0]
|
||||
},
|
||||
"hand_wand": {
|
||||
"rotation": [0, 27.5, 15]
|
||||
},
|
||||
"wand": {
|
||||
"rotation": [90, 10, 0],
|
||||
"position": [6.5, -1, -0.5]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, -0.1],
|
||||
"0.125": {"pre": [0.1, 0, -0.1], "post": [0.1, 0, -0.1]},
|
||||
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, -0.1],
|
||||
"0.125": {"pre": [-0.1, 0, -0.1], "post": [-0.1, 0, -0.1]},
|
||||
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.cry": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [-2.05, 0, 0],
|
||||
"0.0833": [-2.7, 0, 0],
|
||||
"0.1667": [4, 0, 0],
|
||||
"0.2083": [3.72, 0, 0],
|
||||
"0.375": [-2.38, 0, 0],
|
||||
"0.4167": [-2.7, 0, 0],
|
||||
"0.5": [-2.4, 0, 0],
|
||||
"0.6667": [-0.3, 0, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [27.2, 0, 0],
|
||||
"0.0833": [30, 0, 0],
|
||||
"0.1667": [19, 0, 0],
|
||||
"0.2083": [17.65, 0, 0],
|
||||
"0.3333": [57.56, 0, 0],
|
||||
"0.375": [60, 0, 0],
|
||||
"0.4167": [56.99, 0, 0],
|
||||
"0.7083": [4.23, 0, 0],
|
||||
"0.7917": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"fangs": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, -0.5, 0],
|
||||
"0.625": [0, -0.5, 0],
|
||||
"0.6667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "pokemon.braixen.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -478,7 +392,7 @@
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"wand": {
|
||||
"stick_hand": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
@@ -494,6 +408,198 @@
|
||||
"rotation": [0, -12.5, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, -0.1],
|
||||
"0.125": [0.1, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, -0.1],
|
||||
"0.125": [-0.1, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.cry": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [-2.05, 0, 0],
|
||||
"0.0833": [-2.7, 0, 0],
|
||||
"0.1667": [4, 0, 0],
|
||||
"0.2083": [3.72, 0, 0],
|
||||
"0.375": [-2.38, 0, 0],
|
||||
"0.4167": [-2.7, 0, 0],
|
||||
"0.5": [-2.4, 0, 0],
|
||||
"0.6667": [-0.3, 0, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [27.2, 0, 0],
|
||||
"0.0833": [30, 0, 0],
|
||||
"0.1667": [19, 0, 0],
|
||||
"0.2083": [17.65, 0, 0],
|
||||
"0.3333": [57.56, 0, 0],
|
||||
"0.375": [60, 0, 0],
|
||||
"0.4167": [56.99, 0, 0],
|
||||
"0.7083": [4.23, 0, 0],
|
||||
"0.7917": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"fangs": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, -0.5, 0],
|
||||
"0.625": [0, -0.5, 0],
|
||||
"0.6667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "pokemon.braixen.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.surprise_hair": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"ear_ruff_left": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"ear_ruff_left2": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"ear_ruff_side_left": {
|
||||
"rotation": [3.57152, 21.79524, -14.03271]
|
||||
},
|
||||
"ear_ruff_left3": {
|
||||
"rotation": [0, 0, -2.5]
|
||||
},
|
||||
"ear_ruff_left4": {
|
||||
"rotation": [0, 0, -12.5]
|
||||
},
|
||||
"ear_ruff_right": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"ear_ruff_right2": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"ear_ruff_side_right": {
|
||||
"rotation": [3.57152, -21.79524, 14.03271]
|
||||
},
|
||||
"ear_ruff_right3": {
|
||||
"rotation": [0, 0, 2.5]
|
||||
},
|
||||
"ear_ruff_right4": {
|
||||
"rotation": [0, 0, 12.5]
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
"rotation": [0, 0, 2.5]
|
||||
},
|
||||
"ear_ruff_shock_left2": {
|
||||
"rotation": [0, 0, -12.5]
|
||||
},
|
||||
"ear_ruff_shock_right": {
|
||||
"rotation": [0, 0, -2.5]
|
||||
},
|
||||
"ear_ruff_shock_right2": {
|
||||
"rotation": [0, 0, 12.5]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.shock": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [47.5, 0, 0]
|
||||
},
|
||||
"pupil_left": {
|
||||
"position": [-0.1, 0, 0],
|
||||
"scale": [0.6, 0.6, 1]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [0.1, 0, 0],
|
||||
"scale": [0.6, 0.6, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.angry": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_angry_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eye_angry_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_sad_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eye_sad_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
},
|
||||
"pupil_left": {
|
||||
"position": [0.09, 0, 0]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [-0.09, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_happy_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelid_happy_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [47.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.blush": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"blush_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"blush_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.braixen.hurt": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_recoil_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelid_recoil_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+439
-418
@@ -3,443 +3,295 @@
|
||||
"animations": {
|
||||
"animation.delphox.ground_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 8,
|
||||
"bones": {
|
||||
"arm_left": {
|
||||
"rotation": [0, -5, 60]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, 12.5, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, 0, 15]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [0, 0, 17.5]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, 12.5]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [0, 0, 30]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 5, -60]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, -12.5, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, 0, -15]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [0, 0, -17.5]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 0, -30]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*1)*-1", 0, 0]
|
||||
},
|
||||
"ear_left_ruff_main": {
|
||||
"rotation": [0.18349, -15.01207, 0.11941]
|
||||
},
|
||||
"ear_ruff_top_left": {
|
||||
"rotation": [0, -5, 0]
|
||||
},
|
||||
"ear_ruff_middle_left": {
|
||||
"rotation": [-5, 10, 0]
|
||||
},
|
||||
"ear_right_ruff_main": {
|
||||
"rotation": [0.18349, 15.01207, -0.11941]
|
||||
"rotation": ["10+math.sin(q.anim_time*90*1-15)*2", 0, 0]
|
||||
},
|
||||
"ear_ruff_top_right": {
|
||||
"rotation": [0, 5, 0]
|
||||
"rotation": [0, 7.5, -10],
|
||||
"position": [-0.3, 0, 0.5]
|
||||
},
|
||||
"ear_ruff_top_right2": {
|
||||
"rotation": [0, 15, "-math.sin(q.anim_time*90*1-180)*3"]
|
||||
},
|
||||
"ear_ruff_top_right3": {
|
||||
"rotation": [0, 7.5, "10-math.sin(q.anim_time*90*1-215)*3"]
|
||||
},
|
||||
"ear_ruff_middle_right": {
|
||||
"rotation": [-5, -10, 0]
|
||||
"rotation": [0, -2.5, -12.5]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-10.50431, -1.61684, -2.5578],
|
||||
"position": [0, 0, -0.5]
|
||||
"ear_ruff_middle_right2": {
|
||||
"rotation": [0, 20, "5-math.sin(q.anim_time*90*1-180)*3"]
|
||||
},
|
||||
"leg_left3": {
|
||||
"rotation": [1.5, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [4.48529, -0.57217, 2.94498]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [1.10693, 12.45167, 5.12076]
|
||||
},
|
||||
"leg_right3": {
|
||||
"rotation": [0, 0, -2.5]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [0, 0, -3]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["2.5+math.sin(q.anim_time*90*1)*1", 0, 0],
|
||||
"position": [0, "math.cos(q.anim_time*90*1)*0.2", 0]
|
||||
},
|
||||
"waist": {
|
||||
"rotation": ["-1+math.sin(q.anim_time*90*1-30)*1", 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [-23, 0, 0]
|
||||
},
|
||||
"robe_left": {
|
||||
"rotation": [0, 2.5, 0]
|
||||
},
|
||||
"robe_left_outer2": {
|
||||
"rotation": [0, -2.5, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [-12.5, 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [-20, 0, 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"tail6": {
|
||||
"rotation": [17.5, 0, 0]
|
||||
},
|
||||
"tail7": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
"rotation": [0, -5, 0],
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_right": {
|
||||
"rotation": [0, 5, 0],
|
||||
"scale": 0
|
||||
},
|
||||
"body": {
|
||||
"position": [0, -0.2, 0]
|
||||
},
|
||||
"torso_cloak": {
|
||||
"rotation": [-1, 0, 0]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, -12.5]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["-2.5+math.sin(q.anim_time*90*1-30)*-2", 0, 0]
|
||||
},
|
||||
"ear_ruff_bottom_left": {
|
||||
"rotation": [0, -2.5, 15]
|
||||
"ear_ruff_middle_right3": {
|
||||
"rotation": [0, 15, "7.5-math.sin(q.anim_time*90*1-215)*3"]
|
||||
},
|
||||
"ear_ruff_bottom_right": {
|
||||
"rotation": [0, 2.5, -15]
|
||||
"rotation": [0, 10, -17.5],
|
||||
"position": [-0.1, 0, 0.25]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [5, 0, 0]
|
||||
"ear_ruff_bottom_right2": {
|
||||
"rotation": [0, 10, "12.5-math.sin(q.anim_time*90*1-180)*3"]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
"ear_ruff_bottom_right3": {
|
||||
"rotation": [0, 17.5, "12.5-math.sin(q.anim_time*90*1-215)*3"]
|
||||
},
|
||||
"robe_left_outer": {
|
||||
"rotation": [0, 2.5, 0]
|
||||
"ear_ruff_top_left": {
|
||||
"rotation": [0, -7.5, 10],
|
||||
"position": [0.3, 0, 0.5]
|
||||
},
|
||||
"robe_left_outer3": {
|
||||
"rotation": [0, -2.5, 0]
|
||||
"ear_ruff_top_left2": {
|
||||
"rotation": [0, -15, "math.sin(q.anim_time*90*1-180)*3"]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": ["math.sin(q.anim_time*90*1)*-1", 0, 0]
|
||||
"ear_ruff_top_left3": {
|
||||
"rotation": [0, -7.5, "-10+math.sin(q.anim_time*90*1-215)*3"]
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": [0, 0, "math.sin(q.anim_time*90*1-60)*2"]
|
||||
"ear_ruff_middle_left": {
|
||||
"rotation": [0, 2.5, 12.5]
|
||||
},
|
||||
"ear_right_main": {
|
||||
"rotation": [0, 0, "math.sin(q.anim_time*90*1-30)*1"]
|
||||
"ear_ruff_middle_left2": {
|
||||
"rotation": [0, -20, "-5+math.sin(q.anim_time*90*1-180)*3"]
|
||||
},
|
||||
"robe_right": {
|
||||
"rotation": [0, 2.5, 0]
|
||||
"ear_ruff_middle_left3": {
|
||||
"rotation": [0, -15, "-7.5+math.sin(q.anim_time*90*1-215)*3"]
|
||||
},
|
||||
"robe_right_outer": {
|
||||
"rotation": [0, 2.5, 0]
|
||||
"ear_ruff_bottom_left": {
|
||||
"rotation": [0, -10, 17.5],
|
||||
"position": [0.1, 0, 0.25]
|
||||
},
|
||||
"robe_right_outer2": {
|
||||
"rotation": [0, -2.5, 0]
|
||||
"ear_ruff_bottom_left2": {
|
||||
"rotation": [0, -10, "-12.5+math.sin(q.anim_time*90*1-180)*3"]
|
||||
},
|
||||
"robe_right_outer3": {
|
||||
"rotation": [0, -2.5, 0]
|
||||
},
|
||||
"wand": {
|
||||
"scale": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.battle_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 8,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [0, -10, 0],
|
||||
"position": [0, -3, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["30+math.sin(q.anim_time*90*1.5)*1", -17.5, -2.5],
|
||||
"position": [0.25, "0.25+math.cos(q.anim_time*90*1.5)*-0.2", -0.5]
|
||||
},
|
||||
"waist": {
|
||||
"rotation": ["-12.5+math.sin(q.anim_time*90*1.5-30)*1", -2.5, 5]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": ["-7.5+math.sin(q.anim_time*90*1.5-75)*1", -5, -2.5]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [-10, -27.5, 25],
|
||||
"position": [1, -0.35, 1]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [-7.5, 75, -7.5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [0, 0, 47.5]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, 62.5]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [0, 0, 75]
|
||||
"ear_ruff_bottom_left3": {
|
||||
"rotation": [0, -17.5, "-12.5+math.sin(q.anim_time*90*1-215)*3"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-57.5, -30, -25],
|
||||
"position": [-1, -0.75, 0.25]
|
||||
"rotation": [0, "-12.5+math.sin(q.anim_time*90*1+30)*2", -52.5]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [7.5, -55, -17.5]
|
||||
},
|
||||
"arm_right_ruff": {
|
||||
"rotation": [-15, 15, -7.5]
|
||||
"rotation": [3.31914, "-14.6364+math.sin(q.anim_time*90*1+90)*2", -12.92638]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, 22.5, 0],
|
||||
"position": [-0.25, 0, 0]
|
||||
"rotation": [0, 0, -12.5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"finger_index_right": {
|
||||
"rotation": [0, 0, -50]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, -55]
|
||||
"rotation": [0, 0, -52.5]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 0, -65]
|
||||
"finger_ring_right": {
|
||||
"rotation": [0, 0, -60]
|
||||
},
|
||||
"ear_left_ruff_main": {
|
||||
"rotation": [0.18349, -15.01207, 0.11941]
|
||||
"arm_left": {
|
||||
"rotation": [1.36797, "-32.4703+math.sin(q.anim_time*90*1-15)*2", "57.0477+math.sin(q.anim_time*90*1-60)*3"]
|
||||
},
|
||||
"ear_ruff_top_left": {
|
||||
"rotation": [0, -5, 0]
|
||||
},
|
||||
"ear_ruff_middle_left": {
|
||||
"rotation": [-5, 10, 0]
|
||||
},
|
||||
"ear_ruff_bottom_left": {
|
||||
"rotation": [0, -2.5, 15]
|
||||
},
|
||||
"ear_right_ruff_main": {
|
||||
"rotation": [0.18349, 15.01207, -0.11941]
|
||||
},
|
||||
"ear_ruff_top_right": {
|
||||
"rotation": [0, 5, 0]
|
||||
},
|
||||
"ear_ruff_middle_right": {
|
||||
"rotation": [-5, -10, 0]
|
||||
},
|
||||
"ear_ruff_bottom_right": {
|
||||
"rotation": [0, 2.5, -15]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [7.5, -10, -15],
|
||||
"position": [0.25, -0.25, 1]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [22.5, 0, -7.5]
|
||||
},
|
||||
"leg_left3": {
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-21.5, 0, 20],
|
||||
"position": [-0.5, -1.5, -0.75]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-27.5, 0, 7.5],
|
||||
"position": [0, 0, -1]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [17.5, 0, 0]
|
||||
},
|
||||
"leg_right3": {
|
||||
"rotation": [-7.5, 7.5, 10]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [17.5, 17.5, -12.5],
|
||||
"position": [0.25, -0.25, 0]
|
||||
},
|
||||
"wand": {
|
||||
"rotation": [0, 0, 77.5],
|
||||
"position": [1, 0, 0]
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
"rotation": [0, -5, 0],
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_right": {
|
||||
"rotation": [0, 5, 0],
|
||||
"scale": 0
|
||||
},
|
||||
"body_wand": {
|
||||
"rotation": [0, -10, 0],
|
||||
"position": [0, -3, 0]
|
||||
},
|
||||
"torso_wand": {
|
||||
"rotation": ["30+math.sin(q.anim_time*90*1.5)*1", -17.5, -2.5],
|
||||
"position": [0.25, "0.25+math.cos(q.anim_time*90*1.5)*-0.2", -0.5]
|
||||
},
|
||||
"waist_wand": {
|
||||
"rotation": ["-12.5+math.sin(q.anim_time*90*1.5-30)*1", -2.5, 5]
|
||||
},
|
||||
"chest_wand": {
|
||||
"rotation": ["-7.5+math.sin(q.anim_time*90*1.5-75)*1", -5, -2.5]
|
||||
},
|
||||
"arm_wand": {
|
||||
"rotation": [-57.5, -30, -25],
|
||||
"position": [-1, -0.75, 0.25]
|
||||
},
|
||||
"arm2_wand": {
|
||||
"rotation": [7.5, -55, -17.5]
|
||||
},
|
||||
"hand_wand": {
|
||||
"rotation": [0, 22.5, 0],
|
||||
"position": [-0.25, 0, 0]
|
||||
"arm_left2": {
|
||||
"rotation": [-0.82097, "60.3299+math.sin(q.anim_time*90*1-95)*4", "3.238+math.sin(q.anim_time*90*1-180)*4"]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [-12.5, 32.5, -15]
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"shoulder_right_ruff": {
|
||||
"rotation": [0, 10, 0]
|
||||
"finger_index_left": {
|
||||
"rotation": [0, 0, 15]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"finger_ring_left": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["-12.5+math.sin(q.anim_time*90*2)*4", "math.sin(q.anim_time*90*1-90)*8", "math.sin(q.anim_time*90*1-90)*2"]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [-15, "math.sin(q.anim_time*90*1-90-45)*8", 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [-12.5, "math.sin(q.anim_time*90*1-90-90)*8", 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [15, "math.sin(q.anim_time*90*1-90-135)*8", 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": [12.5, "math.sin(q.anim_time*90*1-90-180)*8", 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [0, 15, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [0, -17.5, 0]
|
||||
},
|
||||
"body": {
|
||||
"rotation": [0, -12.5, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["math.sin(q.anim_time*90*1-135)*1", 3.5, 0],
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": ["-2.5+math.sin(q.anim_time*90*1-90)*2", 8, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [0, 0, 0],
|
||||
"position": [0, 0, -0.25]
|
||||
},
|
||||
"head_ruff_right": {
|
||||
"rotation": [0, "7.5+math.sin(q.anim_time*90*1-90)*2", 0]
|
||||
},
|
||||
"head_ruff_left": {
|
||||
"rotation": [0, "-7.5-math.sin(q.anim_time*90*1-90)*2", 0]
|
||||
},
|
||||
"ear_right_main": {
|
||||
"rotation": ["-10+math.sin(q.anim_time*90*1-150)*3", 0, 0]
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": [0, 0, "2.55+math.sin(q.anim_time*90*1-150)*1"]
|
||||
},
|
||||
"ear_right_ruff_main": {
|
||||
"rotation": [0, "2.5+math.sin(q.anim_time*90*1-45)*3", "4-math.sin(q.anim_time*90*1-135)*1.5"],
|
||||
"position": [-0.2, 0, 0]
|
||||
},
|
||||
"ear_left_main": {
|
||||
"rotation": ["-10+math.sin(q.anim_time*90*1-150)*3", 0, 0]
|
||||
},
|
||||
"ear_left": {
|
||||
"rotation": [0, 0, "-2.55-math.sin(q.anim_time*90*1-150)*1"]
|
||||
},
|
||||
"ear_left_ruff_main": {
|
||||
"rotation": [0, "-2.5-math.sin(q.anim_time*90*1-45)*3", "-4+math.sin(q.anim_time*90*1-135)*1.5"],
|
||||
"position": [0.2, 0, 0]
|
||||
},
|
||||
"hand_stick": {
|
||||
"position": [4.9, -1, 0]
|
||||
},
|
||||
"finger_index_right2": {
|
||||
"rotation": [0, 0, -60]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"rotation": [0, 0, -57.5]
|
||||
},
|
||||
"finger_ring_right2": {
|
||||
"rotation": [0, 0, -42.5]
|
||||
},
|
||||
"arm_left_ruff": {
|
||||
"rotation": ["-15+math.sin(q.anim_time*90*1+45)*10", 0, 0]
|
||||
},
|
||||
"chest_ruff_top_right": {
|
||||
"rotation": [0, 0, -40]
|
||||
},
|
||||
"chest_ruff_top_left": {
|
||||
"rotation": [0, 0, 40]
|
||||
},
|
||||
"chest_ruff_right_top": {
|
||||
"rotation": [0, 0, "7.5+math.sin(q.anim_time*90*1)*2"]
|
||||
},
|
||||
"chest_ruff_right_bottom": {
|
||||
"rotation": [0, 0, "-2.5+math.sin(q.anim_time*90*1-45)*2"]
|
||||
},
|
||||
"chest_ruff_right_bottom2": {
|
||||
"rotation": [0, 0, "-20+math.sin(q.anim_time*90*1-90)*2"]
|
||||
},
|
||||
"chest_ruff_left_top": {
|
||||
"rotation": [0, 0, "-12.5-math.sin(q.anim_time*90*1)*2"]
|
||||
},
|
||||
"chest_ruff_left_bottom": {
|
||||
"rotation": [0, 0, "5-math.sin(q.anim_time*90*1-45)*2"]
|
||||
},
|
||||
"chest_ruff_left_bottom2": {
|
||||
"rotation": [0, 0, "15-math.sin(q.anim_time*90*1-90)*2"]
|
||||
},
|
||||
"leg_right_outer2": {
|
||||
"rotation": [0, 0, "-0.35+math.sin(q.anim_time*90*1-45)*0.5"]
|
||||
},
|
||||
"leg_right_outer4": {
|
||||
"rotation": [0, 0, "0+math.sin(q.anim_time*90*1-90)*2"]
|
||||
},
|
||||
"leg_right_outer5": {
|
||||
"rotation": [0, 0, "0+math.sin(q.anim_time*90*1-135)*2"]
|
||||
},
|
||||
"leg_right_outer6": {
|
||||
"rotation": [0, 0, "0+math.sin(q.anim_time*90*1-180)*2"]
|
||||
},
|
||||
"leg_right_outer7": {
|
||||
"rotation": [0, 0, "0+math.sin(q.anim_time*90*1-215)*2"]
|
||||
},
|
||||
"leg_left_outer": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"leg_left_outer2": {
|
||||
"rotation": [0, 0, "0.35-math.sin(q.anim_time*90*1-45)*0.5"]
|
||||
},
|
||||
"leg_left_outer4": {
|
||||
"rotation": [0, 0, "0-math.sin(q.anim_time*90*1-90)*2"]
|
||||
},
|
||||
"leg_left_outer5": {
|
||||
"rotation": [0, 0, "0-math.sin(q.anim_time*90*1-135)*2"]
|
||||
},
|
||||
"leg_left_outer6": {
|
||||
"rotation": [0, 0, "0-math.sin(q.anim_time*90*1-180)*2"]
|
||||
},
|
||||
"leg_left_outer7": {
|
||||
"rotation": [0, 0, "0-math.sin(q.anim_time*90*1-215)*2"]
|
||||
},
|
||||
"flame": {
|
||||
"rotation": [
|
||||
"-40+3*(math.sin(q.anim_time*90*3*2-90)*1-1)+6*(math.sin(q.anim_time*90*3/2-90)*1-1)",
|
||||
"-35+5*(math.sin(q.anim_time*90*3-150)*1-1)+6*(math.sin(q.anim_time*90*3/2-90)*1-1)",
|
||||
35
|
||||
]
|
||||
},
|
||||
"torso_cloak": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"shoulder_left_ruff": {
|
||||
"rotation": [-12.5, 0, 0]
|
||||
},
|
||||
"arm_left_ruff": {
|
||||
"rotation": [-35, 0, 0]
|
||||
},
|
||||
"arm_left_ruff2": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["17.5+math.sin(q.anim_time*90*1.5-110)*-2", 20, 5],
|
||||
"position": [0, -1, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["-20+math.sin(q.anim_time*90*1.5-90)*3", "15+math.sin(q.anim_time*90*1.5-90)*-2", -15]
|
||||
},
|
||||
"eye_angry_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eye_angry_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
},
|
||||
"head_ruff_right": {
|
||||
"rotation": [-1.64071, -0.82614, -1.75664]
|
||||
},
|
||||
"shoulder_fur_left": {
|
||||
"rotation": [0, 0, -35]
|
||||
},
|
||||
"shoulder_fur_right": {
|
||||
"rotation": [0, 0, 35]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["-8+math.sin(q.anim_time*90*1.5-90)*10", "math.sin(q.anim_time*90*1-90)*20", 0],
|
||||
"position": [0, 1, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["-12.5+math.sin(q.anim_time*90*1.5-120)*12", "math.sin(q.anim_time*90*1-120)*25", 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["-12.5+math.sin(q.anim_time*90*1.5-170)*13", "math.sin(q.anim_time*90*1-170)*30", 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": ["-12.5+math.sin(q.anim_time*90*1.5-210)*18", "math.sin(q.anim_time*90*1-200)*35", 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": ["10+math.sin(q.anim_time*90*1.5-260)*22", "math.sin(q.anim_time*90*1-250)*35", 0]
|
||||
},
|
||||
"tail6": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*1.5-260)*25", "math.sin(q.anim_time*90*1-290)*40", 0]
|
||||
},
|
||||
"tail7": {
|
||||
"rotation": ["math.sin(q.anim_time*90*1.5-290)*50", "math.sin(q.anim_time*90*1-310)*45", 0]
|
||||
},
|
||||
"robe_left": {
|
||||
"rotation": [20, -15, -15],
|
||||
"position": [0, 0, 1]
|
||||
},
|
||||
"robe_left2_rotation": {
|
||||
"rotation": [-5, 0, 2.5]
|
||||
},
|
||||
"robe_left3_rotation": {
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"robe_left_outer": {
|
||||
"rotation": [0, -2.5, 0]
|
||||
},
|
||||
"robe_left_outer2": {
|
||||
"rotation": [0, -5, 0]
|
||||
},
|
||||
"robe_right": {
|
||||
"rotation": [-15, -2.5, 15],
|
||||
"position": [0, -0.75, -1]
|
||||
},
|
||||
"robe_right2_rotation": {
|
||||
"rotation": [5, 0, 2.5]
|
||||
},
|
||||
"robe_right3_rotation": {
|
||||
"rotation": [5, 0, -2.5]
|
||||
},
|
||||
"robe_right_outer": {
|
||||
"rotation": [0, 2.5, 0]
|
||||
},
|
||||
"robe_right_outer2": {
|
||||
"rotation": [2.5, 5, 0]
|
||||
},
|
||||
"robe_right_outer3": {
|
||||
"rotation": [0, 5, 0]
|
||||
},
|
||||
"robe_front_middle": {
|
||||
"rotation": [-7.5, -20, -5],
|
||||
"position": [1.5, 0, -1.65]
|
||||
},
|
||||
"robe_front_middle2_rotation": {
|
||||
"rotation": [-2.5, -7.5, -0.5],
|
||||
"position": [-1, -1, 0]
|
||||
},
|
||||
"robe_front_middle3_rotation": {
|
||||
"rotation": [5, 7.5, -5],
|
||||
"position": [-1.86367, 0.85692, -0.23757]
|
||||
},
|
||||
"robe_middle_front_fur": {
|
||||
"rotation": [-10, 0, 0]
|
||||
},
|
||||
"robe_front_middle3": {
|
||||
"rotation": [0, -10, 7.5]
|
||||
"finger_front_left": {
|
||||
"rotation": [0, 0, 12.5]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [0, 0, 35]
|
||||
},
|
||||
"arm_right_ruff": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"arm_right_ruff2": {
|
||||
"rotation": [-10, 0, 0]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [0, 0, -40]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 0, -60]
|
||||
},
|
||||
"stick_hand": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_top_left4": {
|
||||
"rotation": [0, -12.5, 0]
|
||||
},
|
||||
"ear_ruff_middle_left4": {
|
||||
"rotation": [0, -10, 0]
|
||||
},
|
||||
"ear_ruff_shock_right": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_top_right4": {
|
||||
"rotation": [0, 12.5, 0]
|
||||
},
|
||||
"ear_ruff_middle_right4": {
|
||||
"rotation": [0, 10, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.battle_idle2_wip": {
|
||||
"animation.delphox.battle_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"robe_left": {
|
||||
@@ -629,6 +481,20 @@
|
||||
"foot_right2": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"robe_right": {
|
||||
"rotation": [-34.35188, 12.84924, 4.16618],
|
||||
"position": [0, 0, -1]
|
||||
},
|
||||
"robe_right2": {
|
||||
"rotation": [32.62765, -10.18372, 3.05577],
|
||||
"position": [0, -1, 0]
|
||||
},
|
||||
"robe_right2_rotation": {
|
||||
"rotation": [2.41492, 0.64686, -14.98637]
|
||||
},
|
||||
"robe_right3_rotation": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [-17.56274, -4.76804, 1.50701]
|
||||
},
|
||||
@@ -647,7 +513,7 @@
|
||||
"tail7": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
},
|
||||
"wand": {
|
||||
"stick_hand": {
|
||||
"rotation": [115.18907, -6.79382, 69.31542],
|
||||
"position": [7.5, -2, -2]
|
||||
},
|
||||
@@ -664,34 +530,6 @@
|
||||
"ear_ruff_shock_right": {
|
||||
"rotation": [0, 5, 0],
|
||||
"scale": 0
|
||||
},
|
||||
"robe_right": {
|
||||
"rotation": [28.44706, -2.60661, -11.92606],
|
||||
"position": [1, 0, 0]
|
||||
},
|
||||
"robe_right2_rotation": {
|
||||
"rotation": [-17.10967, 3.73172, 11.93845],
|
||||
"position": [0, -1, 0]
|
||||
},
|
||||
"robe_right3_rotation": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, -0.1],
|
||||
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, -0.1],
|
||||
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -979,7 +817,7 @@
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"wand": {
|
||||
"stick_hand": {
|
||||
"scale": 0
|
||||
},
|
||||
"ear_ruff_shock_left": {
|
||||
@@ -1028,6 +866,25 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, -0.1],
|
||||
"0.125": [0.1, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, -0.1],
|
||||
"0.125": [-0.1, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.cry": {
|
||||
"animation_length": 1.75,
|
||||
"bones": {
|
||||
@@ -1095,6 +952,170 @@
|
||||
"effect": "pokemon.delphox.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.surprise_hair": {
|
||||
"animation_length": 0.0417,
|
||||
"bones": {
|
||||
"ear_ruff_top_left": {
|
||||
"rotation": [0.86996, -0.48705, -9.93723]
|
||||
},
|
||||
"ear_ruff_top_left2": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"ear_ruff_top_left3": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"ear_ruff_top_left4": {
|
||||
"rotation": [0, 0, -25]
|
||||
},
|
||||
"ear_ruff_middle_left": {
|
||||
"rotation": [0, 0, 7.5]
|
||||
},
|
||||
"ear_ruff_middle_left2": {
|
||||
"rotation": [0, 0, -12.5]
|
||||
},
|
||||
"ear_ruff_middle_left3": {
|
||||
"rotation": [-1.63786, -2.36303, 19.89762]
|
||||
},
|
||||
"ear_ruff_middle_left4": {
|
||||
"rotation": [0, 0, -25]
|
||||
},
|
||||
"ear_ruff_bottom_left": {
|
||||
"rotation": {
|
||||
"0.0": [0.1467, 0.51916, 9.98614],
|
||||
"0.0417": [0.23463, 0.48579, 19.98647]
|
||||
}
|
||||
},
|
||||
"ear_ruff_bottom_left2": {
|
||||
"rotation": [-0.08929, 0.02949, 17.49954]
|
||||
},
|
||||
"ear_ruff_bottom_left3": {
|
||||
"rotation": [0, 0, 2.5]
|
||||
},
|
||||
"ear_ruff_top_right": {
|
||||
"rotation": [0.86996, 0.48705, 9.93723]
|
||||
},
|
||||
"ear_ruff_top_right2": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"ear_ruff_top_right3": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"ear_ruff_top_right4": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"ear_ruff_middle_right2": {
|
||||
"rotation": [0, 0, 12.5]
|
||||
},
|
||||
"ear_ruff_middle_right3": {
|
||||
"rotation": [-1.63786, 2.36303, -19.89762]
|
||||
},
|
||||
"ear_ruff_middle_right4": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"ear_ruff_middle_right": {
|
||||
"rotation": [0, 0, -7.5]
|
||||
},
|
||||
"ear_ruff_bottom_right": {
|
||||
"rotation": [0.1467, -0.51916, -9.98614]
|
||||
},
|
||||
"ear_ruff_bottom_right2": {
|
||||
"rotation": [-0.08929, -0.02949, -17.49954]
|
||||
},
|
||||
"ear_ruff_bottom_right3": {
|
||||
"rotation": [0, 0, -2.5]
|
||||
},
|
||||
"ear_ruff_shock_left_top": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"ear_ruff_shock_left_middle": {
|
||||
"rotation": [0, 0, 7.5]
|
||||
},
|
||||
"ear_ruff_shock_left_bottom": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"ear_ruff_shock_right_top": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"ear_ruff_shock_right_middle": {
|
||||
"rotation": [0, 0, -7.5]
|
||||
},
|
||||
"ear_ruff_shock_right_bottom": {
|
||||
"rotation": [0, 0, -25]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.shock": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [62.5, 0, 0]
|
||||
},
|
||||
"pupil_left": {
|
||||
"scale": [0.6, 0.6, 1]
|
||||
},
|
||||
"pupil_right": {
|
||||
"scale": [0.6, 0.6, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.angry": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_angry_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eye_angry_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eye_sad_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eye_sad_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_happy_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelid_happy_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [62.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.blush": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"blush_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"blush_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.delphox.hurt": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyelid_recoil_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelid_recoil_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -280,14 +280,6 @@
|
||||
"rotation": [-5, 10, -7.5]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sylveon.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.sylveon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-8
@@ -155,9 +155,6 @@
|
||||
"back_neck_braid_right4": {
|
||||
"rotation": [2.5, 0, -10],
|
||||
"position": [-0.5, 0, 0]
|
||||
},
|
||||
"body": {
|
||||
"rotation": ["q.riding.velocity_y(0)*-90", 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -653,7 +650,7 @@
|
||||
}
|
||||
},
|
||||
"neck2": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4-60)*2 - math.pow(q.riding.yaw_change(0),2)*20", "q.riding.yaw_change(0)*-10", "q.riding.yaw_change(0)*10"]
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4-60)*2", 0, 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": ["-7.5+math.sin(q.anim_time*90*4-90)*2", "math.sin(q.anim_time*90*2)*1", "math.sin(q.anim_time*90*2)*4"]
|
||||
@@ -680,7 +677,7 @@
|
||||
}
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["3+math.sin(q.anim_time*90*4-30)*1", "q.riding.yaw_change(0)*-10", "math.sin(q.anim_time*90*2-30)*2 + q.riding.yaw_change(0)*10"]
|
||||
"rotation": ["3+math.sin(q.anim_time*90*4-30)*1", 0, "math.sin(q.anim_time*90*2-30)*2"]
|
||||
},
|
||||
"front_neck_braid_left": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4-60)*1", 0.5, 5]
|
||||
@@ -847,7 +844,6 @@
|
||||
"position": [-0.5, 0, 0]
|
||||
},
|
||||
"body": {
|
||||
"rotation": ["q.riding.velocity_y(0)*-90", 0, 0],
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, -0.25, 0],
|
||||
@@ -1261,7 +1257,7 @@
|
||||
}
|
||||
},
|
||||
"neck2": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-60)*4 - math.pow(q.riding.yaw_delta(0),2)*20", "q.riding.yaw_delta(0)*-10", "q.riding.yaw_delta(0)*10"]
|
||||
"rotation": ["math.sin(q.anim_time*90*4-60)*4", 0, 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": ["-10+math.sin(q.anim_time*90*4-100)*6", "math.sin(q.anim_time*90*4-40)*2", "math.sin(q.anim_time*90*4-20)*1"]
|
||||
@@ -1283,7 +1279,7 @@
|
||||
}
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["13+math.sin(q.anim_time*90*4-30)*7", "q.riding.yaw_delta(0)*-10", "q.riding.yaw_delta(0)*10"],
|
||||
"rotation": ["13+math.sin(q.anim_time*90*4-30)*7", 0, 0],
|
||||
"position": [0, 0, "-0.5+math.sin(q.anim_time*90*4-30)*0.2"]
|
||||
},
|
||||
"front_neck_braid_left": {
|
||||
|
||||
+75
-381
@@ -5,20 +5,20 @@
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": [0, -0.6, 0]
|
||||
"position": [0, -0.7, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [-3, 5, 1.5],
|
||||
"waist": {
|
||||
"rotation": [0, 0, 9],
|
||||
"position": [0, -0.2, 0]
|
||||
},
|
||||
"torso2": {
|
||||
"rotation": [4, 0, -1.5]
|
||||
"torso": {
|
||||
"rotation": [0, 0, -9]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [0, -5, 0]
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"feather": {
|
||||
"rotation": [-47.5, 28, 0]
|
||||
"rotation": [-47.5, 22.5, 0]
|
||||
},
|
||||
"feather2": {
|
||||
"rotation": [-35, 0, 0]
|
||||
@@ -30,13 +30,13 @@
|
||||
"rotation": [-32.5, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [30, 22.5, -52]
|
||||
"rotation": [30, 22.5, -46.5]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [45, -90, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [20, 10, -15]
|
||||
"rotation": [10, 5, -15]
|
||||
},
|
||||
"arm_claw_back_right": {
|
||||
"rotation": [0, 0, -30]
|
||||
@@ -63,14 +63,14 @@
|
||||
"rotation": [-20, 0, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [5, 15, 8],
|
||||
"rotation": [1.5, 5, 8],
|
||||
"position": [0, 0.4, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [0, 0, 0]
|
||||
"rotation": [3, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [0, 0, 0]
|
||||
"rotation": [-3.5, 0, 0]
|
||||
},
|
||||
"feather5": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
@@ -85,14 +85,14 @@
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-12.5, -15, -8],
|
||||
"rotation": [-15, -15, -8],
|
||||
"position": [0, -0.8, 0]
|
||||
},
|
||||
"leg_right3": {
|
||||
"rotation": [-2.5, 0, -7]
|
||||
"rotation": [0, 0, -8]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"leg_left3": {
|
||||
"rotation": [0, 0, 8]
|
||||
@@ -102,317 +102,62 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sneasler.battle_idle": {
|
||||
"loop": true,
|
||||
"animation.sneasler.mouth_test": {
|
||||
"animation_length": 2,
|
||||
"bones": {
|
||||
"locator_top": {
|
||||
"position": [0, -4, 0]
|
||||
},
|
||||
"body": {
|
||||
"rotation": [0, 20, 0],
|
||||
"position": [0, -4.6, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [-5, 15, 0]
|
||||
},
|
||||
"torso2": {
|
||||
"rotation": [12, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [20, 0, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [-26, -31, 18],
|
||||
"position": [0, 0, -0.2]
|
||||
},
|
||||
"feather": {
|
||||
"rotation": [-47.5, 28, 0]
|
||||
},
|
||||
"feather2": {
|
||||
"rotation": [-35, 0, 0]
|
||||
},
|
||||
"feather3": {
|
||||
"rotation": [-50, 0, 0]
|
||||
},
|
||||
"feather4": {
|
||||
"rotation": [-32.5, 0, 0]
|
||||
},
|
||||
"feather5": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
},
|
||||
"feather6": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"feather7": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"feather8": {
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-32.5, 50, -65]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, -70, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [5, -5, -5]
|
||||
},
|
||||
"arm_claw_back_right": {
|
||||
"rotation": [0, 5, -10]
|
||||
},
|
||||
"arm_claw_middle_right": {
|
||||
"rotation": [0, 0, -2]
|
||||
},
|
||||
"arm_claw_front_right": {
|
||||
"rotation": [0, -5, 5]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [-5, 85, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [-5, 10, 0]
|
||||
},
|
||||
"arm_claw_back_left": {
|
||||
"rotation": [0, -10, 15]
|
||||
},
|
||||
"arm_claw_middle_left": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"arm_claw_front_left": {
|
||||
"rotation": [0, 10, -5]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-14.5, 40, 45],
|
||||
"position": [-0.5, 0, 1]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [64, 0, 0],
|
||||
"position": [0, 0, 1]
|
||||
},
|
||||
"leg_right3": {
|
||||
"rotation": [-9.5, -2.5, -33.5],
|
||||
"position": [0, -0.4, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-4.5, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-30, -35, -32],
|
||||
"position": [0, 0, -1]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [25, 0, 5]
|
||||
},
|
||||
"leg_left3": {
|
||||
"rotation": [15.5, 0, 24.5]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [5.5, 0, 0],
|
||||
"position": [0, 0.6, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sneasler.ground_idle_basket": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": [0, -0.2, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"torso2": {
|
||||
"rotation": [3, 0, 0]
|
||||
},
|
||||
"basketstrap_right": {
|
||||
"rotation": [-17.5, 10, 5]
|
||||
},
|
||||
"basketstrap_right3": {
|
||||
"rotation": [-22, 0, 0]
|
||||
},
|
||||
"shoulder_fluff_right": {
|
||||
"rotation": [0, 0, -15],
|
||||
"position": [-0.5, 0, 0]
|
||||
},
|
||||
"shoulder_fluff_left": {
|
||||
"rotation": [0, 0, 15],
|
||||
"position": [0.5, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [2, 0, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [-1, 0, 0]
|
||||
},
|
||||
"feather": {
|
||||
"rotation": [-47.5, 33, 0]
|
||||
},
|
||||
"feather2": {
|
||||
"rotation": [-35, 0, 0]
|
||||
},
|
||||
"feather3": {
|
||||
"rotation": [-50, 0, 0]
|
||||
},
|
||||
"feather4": {
|
||||
"rotation": [-32.5, 0, 0]
|
||||
},
|
||||
"feather5": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
},
|
||||
"feather6": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"feather7": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"feather8": {
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-12, 7.5, -62]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, -15, -2.5]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, 0, -2.5]
|
||||
},
|
||||
"arm_claw_middle_right": {
|
||||
"rotation": [0, 0, -5]
|
||||
},
|
||||
"arm_claw_front_right": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [-12, -7.5, 62]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, 15, 2.5]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, 0, 2.5]
|
||||
},
|
||||
"arm_claw_middle_left": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"arm_claw_front_left": {
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-2.5, 12, 5.5],
|
||||
"position": [-0.3, 0, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"leg_right3": {
|
||||
"rotation": [-1, 0, -5]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-2.5, -12, -5.5],
|
||||
"position": [0.3, 0, 0]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"leg_left3": {
|
||||
"rotation": [-1, 0, 5]
|
||||
},
|
||||
"basketstrap_right4": {
|
||||
"rotation": [35, 0, 0]
|
||||
},
|
||||
"shoulder_fluff_back_right": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"shoulder_fluff_front_right": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"shoulder_fluff_back_left": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"shoulder_fluff_front_left": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"basketstrap_right2": {
|
||||
"rotation": [52, 0, 0]
|
||||
},
|
||||
"basketstrap_left": {
|
||||
"rotation": [-17.5, -10, -5]
|
||||
},
|
||||
"basketstrap_left2": {
|
||||
"rotation": [52, 0, 0]
|
||||
},
|
||||
"basketstrap_left3": {
|
||||
"rotation": [-22, 0, 0]
|
||||
},
|
||||
"basketstrap_left4": {
|
||||
"rotation": [35, 0, 0]
|
||||
"fang": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.6667": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"0.7083": {"pre": [0, 0, 0], "post": [0, 0, 11.5]},
|
||||
"1.5": {"pre": [0, 0, 11.5], "post": [0, 0, 11.5]},
|
||||
"1.5417": {"pre": [0, 0, 11.5], "post": [0, 0, 0]}
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.6667": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"0.7083": {"pre": [0, 0, 0], "post": [0, 0.7, 0.4]},
|
||||
"1.5": {"pre": [0, 0.7, 0.4], "post": [0, 0.7, 0.4]},
|
||||
"1.5417": {"pre": [0, 0.7, 0.4], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.6667": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"0.7083": {"pre": [0, 0, 0], "post": [0, 0, 0.61]},
|
||||
"1.5": {"pre": [0, 0, 0.61], "post": [0, 0, 0.61]},
|
||||
"1.5417": {"pre": [0, 0, 0.61], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sneasler.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"animation_length": 0.16667,
|
||||
"bones": {
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, -0.1],
|
||||
"0.125": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"0.1667": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.125": [0, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, -0.1],
|
||||
"0.125": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"0.1667": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelashes_right": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0.1],
|
||||
"0.125": {
|
||||
"pre": [0.1, 0, 0.1],
|
||||
"post": [0.1, 0, 0.1]
|
||||
},
|
||||
"0.1667": {
|
||||
"pre": [0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelashes_left": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0.1],
|
||||
"0.125": {
|
||||
"pre": [-0.1, 0, 0.1],
|
||||
"post": [-0.1, 0, 0.1]
|
||||
},
|
||||
"0.1667": {
|
||||
"pre": [-0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.125": [0, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sneasler.cry": {
|
||||
"animation_length": 1,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.sneasler.cry"
|
||||
}
|
||||
},
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": {
|
||||
@@ -426,25 +171,24 @@
|
||||
"0.5": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"fang_closed": {
|
||||
"fang": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, 11.5]},
|
||||
"0.1667": {"pre": [0, 0, 11.5], "post": [0, 0, 11.5]},
|
||||
"0.2083": {"pre": [0, 0, 11.5], "post": [0, 0, 0]},
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 11.5]},
|
||||
"0.4583": {"pre": [0, 0, 11.5], "post": [0, 0, 11.5]},
|
||||
"0.5": {"pre": [0, 0, 11.5], "post": [0, 0, 0]}
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0.1, 1.1]
|
||||
},
|
||||
"0.2083": {
|
||||
"pre": [0, 0.1, 1.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0.1, 1.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0, 0.1, 1.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0, 0.7, 0.4]},
|
||||
"0.1667": {"pre": [0, 0.7, 0.4], "post": [0, 0.7, 0.4]},
|
||||
"0.2083": {"pre": [0, 0.7, 0.4], "post": [0, 0, 0]},
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0, 0.7, 0.4]},
|
||||
"0.4583": {"pre": [0, 0.7, 0.4], "post": [0, 0.7, 0.4]},
|
||||
"0.5": {"pre": [0, 0.7, 0.4], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"feather": {
|
||||
@@ -462,63 +206,13 @@
|
||||
"jaw": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 1.1]
|
||||
},
|
||||
"0.2083": {
|
||||
"pre": [0, 0, 1.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 1.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0, 0, 1.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, 0.61]},
|
||||
"0.1667": {"pre": [0, 0, 0.61], "post": [0, 0, 0.61]},
|
||||
"0.2083": {"pre": [0, 0, 0.61], "post": [0, 0, 0]},
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0.61]},
|
||||
"0.4583": {"pre": [0, 0, 0.61], "post": [0, 0, 0.61]},
|
||||
"0.5": {"pre": [0, 0, 0.61], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"mouth_open": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, -0.3, -0.1]
|
||||
},
|
||||
"0.2083": {
|
||||
"pre": [0, -0.3, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, -0.3, -0.1]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0, -0.3, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "pokemon.sneasler.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sneasler.item_hold": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"arm_claw_back_right": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"arm_claw_middle_right": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"arm_claw_front_right": {
|
||||
"rotation": [0, 0, -45]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+158
-125
@@ -7,8 +7,8 @@
|
||||
"texture_width": 256,
|
||||
"texture_height": 128,
|
||||
"visible_bounds_width": 10,
|
||||
"visible_bounds_height": 6,
|
||||
"visible_bounds_offset": [0, 2, 0]
|
||||
"visible_bounds_height": 5,
|
||||
"visible_bounds_offset": [0, 1.5, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
@@ -20,7 +20,7 @@
|
||||
"parent": "charizard",
|
||||
"pivot": [0, 0, -1],
|
||||
"locators": {
|
||||
"root": [0, 0, -1]
|
||||
"root": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -28,7 +28,7 @@
|
||||
"parent": "charizard",
|
||||
"pivot": [0, 41, -1],
|
||||
"locators": {
|
||||
"top": [0, 41, -1]
|
||||
"top": [0, 41, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -116,8 +116,7 @@
|
||||
{
|
||||
"name": "head_correction",
|
||||
"parent": "head",
|
||||
"pivot": [0, 43.5, -0.5],
|
||||
"rotation": [-95, 0, 0]
|
||||
"pivot": [0, 43.5, -0.5]
|
||||
},
|
||||
{
|
||||
"name": "head_ai",
|
||||
@@ -128,15 +127,20 @@
|
||||
"name": "head_angle",
|
||||
"parent": "head_ai",
|
||||
"pivot": [0, 43.5, -0.5],
|
||||
"rotation": [95, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 41.5, -2], "size": [7, 7, 5], "uv": [48, 0]},
|
||||
{"origin": [-3.5, 41.5, -4], "size": [7, 4, 2], "uv": [95, 64]},
|
||||
{"origin": [-2.5, 48, -2], "size": [5, 5, 2], "inflate": 0.02, "uv": [37, 31]},
|
||||
{"origin": [-2, 51.48744, -3.03033], "size": [0, 1, 1], "inflate": 0.01, "pivot": [-2, 52.51777, -2], "rotation": [45, 0, 15], "uv": [43, 42]},
|
||||
{"origin": [2, 51.48744, -3.03033], "size": [0, 1, 1], "inflate": 0.01, "pivot": [2, 52.51777, -2], "rotation": [45, 0, -15], "uv": [41, 42]}
|
||||
{"origin": [-3.5, 41.5, -4], "size": [7, 4, 2], "uv": [95, 64]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "item_hat",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 45, 3],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"item_hat": [0, 45, 3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_head",
|
||||
"parent": "head_angle",
|
||||
@@ -146,59 +150,51 @@
|
||||
"head": [0, 46.5, 3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_mouth",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 48.75, -3],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"mouth": [0, 48.75, -3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_special_attack",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 48.75, -3],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"special_attack": [0, 48.75, -3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_jaw_upper",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 51.75, -2.25],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"jaw1": [0, 51.75, -2.25]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "brow",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 48.275, 1.765],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, 48.55, 1], "size": [5, 0, 1], "uv": [0, 14]},
|
||||
{"origin": [-3.5, 47.5, 1.53], "size": [7, 1, 1], "inflate": 0.04, "uv": [0, 12]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, -3.5, 1.5]
|
||||
},
|
||||
{
|
||||
"name": "locator_face",
|
||||
"parent": "eye",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 53.75, -0.25],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"face": [0, 53.75, -0.25]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 48.5, 0.5],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"item_face": [0, 48.5, 0.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_mouth",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 45.75, -2],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"mouth": [0, 45.75, -2],
|
||||
"special": [0, 45.75, -2]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyes",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, -3.5, 1.5]
|
||||
},
|
||||
{
|
||||
"name": "brow",
|
||||
"parent": "eyes",
|
||||
"pivot": [0, 48.275, 1.765],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, 48.55, 1], "size": [5, 0, 1], "uv": [0, 14]},
|
||||
{"origin": [-3.5, 47.5, 1.53], "size": [7, 1, 1], "inflate": 0.04, "uv": [0, 12]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_right",
|
||||
"parent": "eye",
|
||||
"parent": "eyes",
|
||||
"pivot": [-2.75, 47.75, 0.875],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 47.5, 0], "size": [2, 1, 2], "inflate": 0.01, "uv": [106, 36]},
|
||||
@@ -226,7 +222,7 @@
|
||||
},
|
||||
{
|
||||
"name": "eye_left",
|
||||
"parent": "eye",
|
||||
"parent": "eyes",
|
||||
"pivot": [2.75, 47.75, 0.875],
|
||||
"cubes": [
|
||||
{"origin": [1.5, 47.5, 0], "size": [2, 1, 2], "inflate": 0.01, "uv": [44, 82]},
|
||||
@@ -255,6 +251,91 @@
|
||||
{"origin": [2.41, 46.4, 0.5], "size": [1, 1, 1], "inflate": 0.03, "uv": [39, 86]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "muzzle",
|
||||
"parent": "head_angle",
|
||||
"pivot": [-3, 48.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, 48, -2], "size": [5, 5, 2], "inflate": 0.02, "uv": [37, 31]},
|
||||
{"origin": [-2, 51.48744, -3.03033], "size": [0, 1, 1], "inflate": 0.01, "pivot": [-2, 52.51777, -2], "rotation": [45, 0, 15], "uv": [43, 42]},
|
||||
{"origin": [2, 51.48744, -3.03033], "size": [0, 1, 1], "inflate": 0.01, "pivot": [2, 52.51777, -2], "rotation": [45, 0, -15], "uv": [41, 42]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_jaw_upper",
|
||||
"parent": "muzzle",
|
||||
"pivot": [0, 51.75, -2.25],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"jaw1": [0, 51.75, -2.25]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nose",
|
||||
"parent": "muzzle",
|
||||
"pivot": [0, 53, 0],
|
||||
"rotation": [-40, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, 51.36698, -1.67861], "size": [5, 2, 2], "inflate": 0.03, "uv": [48, 12]},
|
||||
{"origin": [-2, 53.40698, -1.17861], "size": [4, 0, 1], "uv": [0, 15]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jaw",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 45.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 45.5, -4], "size": [7, 3, 2], "inflate": 0.01, "uv": [76, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jaw2",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, 48.5, -4],
|
||||
"rotation": [-7.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2, 48.49, -4], "size": [4, 4, 2], "uv": [0, 51]},
|
||||
{"origin": [-1.5, 48.5, -2], "size": [3, 4, 0], "uv": [90, 0]},
|
||||
{"origin": [1.5, 51.49749, -3.03033], "size": [0, 1, 1], "pivot": [1.5, 52.52782, -2], "rotation": [45, 0, -7.5], "uv": [37, 39]},
|
||||
{"origin": [-1.5, 51.49749, -3.03033], "size": [0, 1, 1], "pivot": [-1.5, 52.52782, -2], "rotation": [45, 0, 7.5], "uv": [37, 38]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_jaw_lower",
|
||||
"parent": "jaw2",
|
||||
"pivot": [0, 51.75, -1.75],
|
||||
"locators": {
|
||||
"jaw2": {
|
||||
"offset": [0, 51.75, -1.75],
|
||||
"rotation": [-90, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "tongue",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, 45.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-1.5, 45.5, -2], "size": [3, 3, 0], "uv": [87, 29]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue2",
|
||||
"parent": "tongue",
|
||||
"pivot": [0, 48.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-1, 48.5, -2], "size": [2, 2, 0], "inflate": 0.01, "uv": [46, 38]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue3",
|
||||
"parent": "tongue2",
|
||||
"pivot": [0, 50.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-1, 50.5, -2], "size": [2, 1, 0], "uv": [37, 43]},
|
||||
{"origin": [-0.5, 51.5, -2], "size": [1, 1, 0], "uv": [45, 43]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "horns",
|
||||
"parent": "head_angle",
|
||||
@@ -300,72 +381,6 @@
|
||||
"horn2": [2.5, 39, 2]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nose",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 53, 0],
|
||||
"rotation": [-40, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, 51.36698, -1.67861], "size": [5, 2, 2], "inflate": 0.03, "uv": [48, 12]},
|
||||
{"origin": [-2, 53.40698, -1.17861], "size": [4, 0, 1], "uv": [0, 15]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jaw",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 45.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 45.5, -4], "size": [7, 3, 2], "inflate": 0.01, "uv": [76, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jaw2",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, 48.5, -4],
|
||||
"rotation": [-7.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2, 48.49, -4], "size": [4, 4, 2], "uv": [0, 51]},
|
||||
{"origin": [-1.5, 48.5, -1.99], "size": [3, 4, 0], "uv": [90, 0]},
|
||||
{"origin": [1.5, 51.49749, -3.03033], "size": [0, 1, 1], "pivot": [1.5, 52.52782, -2], "rotation": [45, 0, -7.5], "uv": [37, 39]},
|
||||
{"origin": [-1.5, 51.49749, -3.03033], "size": [0, 1, 1], "pivot": [-1.5, 52.52782, -2], "rotation": [45, 0, 7.5], "uv": [37, 38]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_jaw_lower",
|
||||
"parent": "jaw2",
|
||||
"pivot": [0, 51.75, -1.75],
|
||||
"locators": {
|
||||
"jaw2": {
|
||||
"offset": [0, 51.75, -1.75],
|
||||
"rotation": [-90, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "tongue",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, 45.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-1.5, 45.5, -2], "size": [3, 3, 0], "uv": [87, 29]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue2",
|
||||
"parent": "tongue",
|
||||
"pivot": [0, 48.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-1, 48.5, -2], "size": [2, 2, 0], "inflate": 0.01, "uv": [46, 38]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue3",
|
||||
"parent": "tongue2",
|
||||
"pivot": [0, 50.5, -2],
|
||||
"cubes": [
|
||||
{"origin": [-1, 50.5, -2], "size": [2, 1, 0], "uv": [37, 43]},
|
||||
{"origin": [-0.5, 51.5, -2], "size": [1, 1, 0], "uv": [45, 43]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "arms",
|
||||
"parent": "torso2",
|
||||
@@ -403,6 +418,14 @@
|
||||
{"origin": [-21.5, 22, -1.5], "size": [3, 2, 3], "inflate": 0.1, "uv": [0, 58]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_item",
|
||||
"parent": "hand_right",
|
||||
"pivot": [-21.6, 23, 0],
|
||||
"locators": {
|
||||
"item": [-21.6, 23, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_primary",
|
||||
"parent": "hand_right",
|
||||
@@ -913,6 +936,14 @@
|
||||
{"origin": [0, 9.5, 58.5], "size": [0, 13, 7], "pivot": [0, 14.45, 62], "rotation": [0, 90, 0], "uv": [0, 92]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_fire",
|
||||
"parent": "fire2",
|
||||
"pivot": [0, 11, 62],
|
||||
"locators": {
|
||||
"fire": [0, 11, 62]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "legs",
|
||||
"parent": "body",
|
||||
@@ -945,9 +976,10 @@
|
||||
{
|
||||
"name": "locator_foot_primary",
|
||||
"parent": "foot_right",
|
||||
"pivot": [-9, 1.5, -7],
|
||||
"pivot": [-9, 1.5, -5],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"foot_primary": [-9, 1.5, -7]
|
||||
"foot_primary": [-9, 1.5, -5]
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -1009,9 +1041,10 @@
|
||||
{
|
||||
"name": "locator_foot_secondary",
|
||||
"parent": "foot_left",
|
||||
"pivot": [9, 1.5, -7],
|
||||
"pivot": [9, 1.5, -5],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"foot_secondary": [9, 1.5, -7]
|
||||
"foot_secondary": [9, 1.5, -5]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
+32
-59
@@ -15,6 +15,14 @@
|
||||
"name": "lapras",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_root",
|
||||
"parent": "lapras",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"root": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "lapras",
|
||||
@@ -29,11 +37,11 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_middle",
|
||||
"name": "locator_body",
|
||||
"parent": "body",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"middle": [0, 14, 0]
|
||||
"body": [0, 14, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -60,14 +68,6 @@
|
||||
{"origin": [-15.25, 13.5, -7], "size": [3, 3, 3], "pivot": [-12.5, 13.5, -4.5], "rotation": [0, -15, 5], "uv": [12, 120], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "shell",
|
||||
"pivot": [0, 24, 0],
|
||||
"locators": {
|
||||
"seat_1": [0, 24, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "shell2",
|
||||
"parent": "shell",
|
||||
@@ -138,31 +138,6 @@
|
||||
{"origin": [-5.5, 30, -14.5], "size": [11, 10, 8], "inflate": 0.01, "uv": [0, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_item_face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 37.25, -21],
|
||||
"rotation": [-22.5, 0, 0],
|
||||
"locators": {
|
||||
"item_face": [0, 37.25, -21]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 36, -24.1],
|
||||
"locators": {
|
||||
"face": [0, 36, -24.1]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_hat",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 40, -12],
|
||||
"locators": {
|
||||
"item_hat": [0, 40, -12]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_head",
|
||||
"parent": "head_angle",
|
||||
@@ -185,6 +160,14 @@
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 30.75, -11.15]
|
||||
},
|
||||
{
|
||||
"name": "locator_face",
|
||||
"parent": "eyes",
|
||||
"pivot": [0, 36, -24.1],
|
||||
"locators": {
|
||||
"face": [0, 36, -24.1]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eye_right",
|
||||
"parent": "eyes",
|
||||
@@ -323,14 +306,6 @@
|
||||
"jaw_lower": [0, 32.15, -21.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, 32, -22.5],
|
||||
"locators": {
|
||||
"item": [0, 32, -22.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "tongue",
|
||||
"parent": "jaw",
|
||||
@@ -370,15 +345,6 @@
|
||||
{"origin": [-6.5, 1.5, 11], "size": [13, 10, 7], "uv": [78, 40]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_tail",
|
||||
"parent": "tail",
|
||||
"pivot": [0, 5, 17],
|
||||
"rotation": [0, 180, 0],
|
||||
"locators": {
|
||||
"tail": [0, 5, 17]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "tail2",
|
||||
"parent": "tail",
|
||||
@@ -533,19 +499,26 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_root",
|
||||
"parent": "lapras",
|
||||
"name": "bone2",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "bone4",
|
||||
"parent": "bone2",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "bone",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"root": [0, 0, 0]
|
||||
"locator5": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_top",
|
||||
"parent": "lapras",
|
||||
"pivot": [0, 45.2, -6],
|
||||
"name": "bone5",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"top": [0, 45.2, -6]
|
||||
"locator6": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
+276
-483
@@ -7,675 +7,468 @@
|
||||
"texture_width": 256,
|
||||
"texture_height": 128,
|
||||
"visible_bounds_width": 6,
|
||||
"visible_bounds_height": 4.5,
|
||||
"visible_bounds_offset": [0, 1.75, 0]
|
||||
"visible_bounds_height": 3.5,
|
||||
"visible_bounds_offset": [0, 1.25, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
"name": "metagross",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_root",
|
||||
"parent": "metagross",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"root": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_top",
|
||||
"parent": "metagross",
|
||||
"pivot": [0, 35.5, 0],
|
||||
"locators": {
|
||||
"top": [0, 35.5, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "metagross",
|
||||
"pivot": [0, 26, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_middle",
|
||||
"parent": "body",
|
||||
"pivot": [0, 25.5, 0],
|
||||
"locators": {
|
||||
"middle": [0, 25.5, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_target",
|
||||
"parent": "body",
|
||||
"pivot": [0, 25.5, -19],
|
||||
"locators": {
|
||||
"target": [0, 25.5, -19]
|
||||
}
|
||||
"pivot": [0, 28, 0]
|
||||
},
|
||||
{
|
||||
"name": "torso",
|
||||
"parent": "body",
|
||||
"pivot": [-0.5, 18, 0],
|
||||
"pivot": [-0.5, 20, 0.5],
|
||||
"cubes": [
|
||||
{"origin": [-10.5, 16.5, -10.5], "size": [21, 5, 21], "uv": [0, 36]},
|
||||
{"origin": [-16, 21.5, -16], "size": [32, 4, 32], "uv": [0, 0]},
|
||||
{"origin": [-12, 25, -13], "size": [24, 6, 3], "uv": [156, 0]},
|
||||
{"origin": [-13, 25, -3.5], "size": [26, 6, 7], "inflate": 0.01, "uv": [63, 36]},
|
||||
{"origin": [-12, 25, 10], "size": [24, 6, 3], "uv": [156, 12]},
|
||||
{"origin": [-9.5, 23.5, -10.5], "size": [19, 8, 21], "uv": [97, 0]},
|
||||
{"origin": [-10.5, 31, -10.5], "size": [21, 3, 21], "inflate": 0.01, "uv": [0, 62]}
|
||||
{"origin": [-10, 18.5, -9.5], "size": [20, 5, 20], "uv": [0, 64]},
|
||||
{"origin": [-15, 23.5, -14.5], "size": [30, 4, 30], "uv": [0, 30]},
|
||||
{"origin": [-12, 27.25, -11.5], "size": [24, 6, 24], "uv": [0, 0]},
|
||||
{"origin": [-9.5, 32.75, -9], "size": [19, 3, 19], "uv": [72, 2]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_face",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 26.5, -16.5],
|
||||
"locators": {
|
||||
"face": [0, 26.5, -16.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_face",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 27, -16.1],
|
||||
"locators": {
|
||||
"item_face": [0, 27, -16.1]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_mouth",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 19.5, -10.5],
|
||||
"locators": {
|
||||
"mouth": [0, 19.5, -10.5],
|
||||
"special": [0, 19.5, -10.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_hat",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 34, 0],
|
||||
"locators": {
|
||||
"item_hat": [0, 34, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_head",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 34, -8],
|
||||
"locators": {
|
||||
"head": [0, 34, -8]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 37, 5],
|
||||
"locators": {
|
||||
"seat_1": [0, 37, 5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyes",
|
||||
"parent": "torso",
|
||||
"pivot": [-0.5, 18, -1]
|
||||
},
|
||||
{
|
||||
"name": "eye_left",
|
||||
"parent": "eyes",
|
||||
"pivot": [5.9, 27.15, -13.01],
|
||||
"cubes": [
|
||||
{"origin": [2.25, 25.25, -13.01], "size": [6, 4, 0], "uv": [1, 63]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_open_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [5.5, 27.4, -12.72],
|
||||
"cubes": [
|
||||
{"origin": [4.5, 26.4, -12.72], "size": [2, 2, 0], "inflate": 0.3, "uv": [1, 71]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_angry_left",
|
||||
"parent": "eye_open_left",
|
||||
"pivot": [4.5, 28.3, -12.93],
|
||||
"cubes": [
|
||||
{"origin": [3.5, 27.3, -12.93], "size": [2, 2, 0], "inflate": 0.01, "uv": [1, 75]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_sad_left",
|
||||
"parent": "eye_open_left",
|
||||
"pivot": [6.5, 28.3, -12.93],
|
||||
"cubes": [
|
||||
{"origin": [5.5, 27.3, -12.93], "size": [2, 2, 0], "inflate": 0.01, "uv": [1, 73]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_left",
|
||||
"parent": "eye_open_left",
|
||||
"pivot": [5.5, 27.4, -13.03],
|
||||
"cubes": [
|
||||
{"origin": [5, 26.9, -13.03], "size": [1, 1, 0], "uv": [9, 71]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "pupil_left",
|
||||
"pivot": [5.5, 27.4, -13],
|
||||
"locators": {
|
||||
"eye2": [5.5, 27.4, -13]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eye_shine_left",
|
||||
"parent": "eye_open_left",
|
||||
"pivot": [6.3, 28.4, -13.025],
|
||||
"cubes": [
|
||||
{"origin": [5.8, 27.9, -13.025], "size": [1, 1, 0], "uv": [11, 71]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_closed_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [5.3, 27.3, -12.92],
|
||||
"cubes": [
|
||||
{"origin": [4.3, 26.8, -12.92], "size": [2, 1, 0], "uv": [9, 73]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_happy_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [5.3, 27.3, -12.92],
|
||||
"cubes": [
|
||||
{"origin": [3.8, 26.55, -12.92], "size": [3, 1, 0], "uv": [13, 71]},
|
||||
{"origin": [4.8, 27.05, -12.92], "size": [1, 1, 0], "uv": [13, 73]}
|
||||
]
|
||||
"pivot": [-0.5, 20, 0.5]
|
||||
},
|
||||
{
|
||||
"name": "eye_right",
|
||||
"parent": "eyes",
|
||||
"pivot": [-5.25, 27.25, -13.01],
|
||||
"pivot": [-6.65, 29.15, -11.51],
|
||||
"cubes": [
|
||||
{"origin": [-8.25, 25.25, -13.01], "size": [6, 4, 0], "uv": [1, 67], "mirror": true}
|
||||
{"origin": [-9, 27.25, -11.51], "size": [5, 4, 0], "uv": [72, 4], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_open_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-5.5, 27.4, -12.72],
|
||||
"pivot": [-6.65, 29.15, -11.51],
|
||||
"cubes": [
|
||||
{"origin": [-6.5, 26.4, -12.72], "size": [2, 2, 0], "inflate": 0.3, "uv": [5, 71], "mirror": true}
|
||||
{"origin": [-7.8, 28.05, -11.52], "size": [2, 2, 0], "uv": [86, 0], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_angry_right",
|
||||
"name": "eye_shine_right",
|
||||
"parent": "eye_open_right",
|
||||
"pivot": [-4.5, 28.3, -12.93],
|
||||
"pivot": [-7.3, 29.55, -11.525],
|
||||
"cubes": [
|
||||
{"origin": [-5.5, 27.3, -12.93], "size": [2, 2, 0], "inflate": 0.01, "uv": [5, 75], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_sad_right",
|
||||
"parent": "eye_open_right",
|
||||
"pivot": [-6.5, 28.3, -12.93],
|
||||
"cubes": [
|
||||
{"origin": [-7.5, 27.3, -12.93], "size": [2, 2, 0], "inflate": 0.01, "uv": [5, 73], "mirror": true}
|
||||
{"origin": [-7.8, 29.05, -11.525], "size": [1, 1, 0], "uv": [88, 2], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_right",
|
||||
"parent": "eye_open_right",
|
||||
"pivot": [-5.5, 27.4, -13.03],
|
||||
"pivot": [-6.8, 29.05, -11.53],
|
||||
"cubes": [
|
||||
{"origin": [-6, 26.9, -13.03], "size": [1, 1, 0], "uv": [9, 72], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-5.5, 27.4, -13],
|
||||
"locators": {
|
||||
"eye1": [-5.5, 27.4, -13]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eye_shine_right",
|
||||
"parent": "eye_open_right",
|
||||
"pivot": [-6.3, 28.4, -13.025],
|
||||
"cubes": [
|
||||
{"origin": [-6.8, 27.9, -13.025], "size": [1, 1, 0], "uv": [11, 72], "mirror": true}
|
||||
{"origin": [-7.3, 28.55, -11.53], "size": [1, 1, 0], "uv": [86, 2], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_closed_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-5.3, 27.3, -12.92],
|
||||
"pivot": [-6.8, 29.05, -11.42],
|
||||
"cubes": [
|
||||
{"origin": [-6.3, 26.8, -12.92], "size": [2, 1, 0], "uv": [9, 74], "mirror": true}
|
||||
{"origin": [-7.8, 28.55, -11.42], "size": [2, 1, 0], "uv": [86, 3], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_happy_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-5.3, 27.3, -12.92],
|
||||
"name": "eye_left",
|
||||
"parent": "eyes",
|
||||
"pivot": [6.65, 29.15, -11.51],
|
||||
"cubes": [
|
||||
{"origin": [-6.8, 26.55, -12.92], "size": [3, 1, 0], "uv": [13, 72], "mirror": true},
|
||||
{"origin": [-5.8, 27.05, -12.92], "size": [1, 1, 0], "uv": [13, 74], "mirror": true}
|
||||
{"origin": [4, 27.25, -11.51], "size": [5, 4, 0], "uv": [72, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_open_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [6.65, 29.15, -11.51],
|
||||
"cubes": [
|
||||
{"origin": [5.8, 28.05, -11.52], "size": [2, 2, 0], "uv": [82, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_shine_left",
|
||||
"parent": "eye_open_left",
|
||||
"pivot": [7.3, 29.55, -11.525],
|
||||
"cubes": [
|
||||
{"origin": [6.8, 29.05, -11.525], "size": [1, 1, 0], "uv": [84, 2]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_left",
|
||||
"parent": "eye_open_left",
|
||||
"pivot": [6.8, 29.05, -11.53],
|
||||
"cubes": [
|
||||
{"origin": [6.3, 28.55, -11.53], "size": [1, 1, 0], "uv": [82, 2]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_closed_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [6.8, 29.05, -11.42],
|
||||
"cubes": [
|
||||
{"origin": [5.8, 28.55, -11.42], "size": [2, 1, 0], "uv": [82, 3]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mouth",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 19.5, -10.41],
|
||||
"pivot": [0, 21.5, -9.41],
|
||||
"cubes": [
|
||||
{"origin": [-8, 17.5, -10.41], "size": [16, 4, 0], "uv": [64, 50]}
|
||||
{"origin": [-8, 19.5, -9.41], "size": [16, 4, 0], "uv": [0, 89]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "torso_spikes",
|
||||
"parent": "torso",
|
||||
"pivot": [-0.5, 21.5, 0],
|
||||
"pivot": [-0.5, 23.5, 0.5],
|
||||
"cubes": [
|
||||
{"origin": [11.4, 19, -2], "size": [4, 3, 4], "uv": [97, 7]},
|
||||
{"origin": [11.9, 16.5, -1.5], "size": [3, 3, 3], "inflate": -0.1, "uv": [16, 12]},
|
||||
{"origin": [-15.4, 19, -2], "size": [4, 3, 4], "uv": [97, 0], "mirror": true},
|
||||
{"origin": [-14.9, 16.5, -1.5], "size": [3, 3, 3], "inflate": -0.1, "uv": [16, 6], "mirror": true}
|
||||
{"origin": [-13.9, 19, -1], "size": [3, 2, 3], "uv": [18, 40], "mirror": true},
|
||||
{"origin": [-14.4, 21, -1.5], "size": [4, 3, 4], "uv": [14, 33], "mirror": true},
|
||||
{"origin": [10.4, 21, -1.5], "size": [4, 3, 4], "uv": [0, 30]},
|
||||
{"origin": [10.9, 19, -1], "size": [3, 2, 3], "uv": [0, 37]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head_metal",
|
||||
"parent": "torso",
|
||||
"pivot": [-0.5, 29.5, -12.15],
|
||||
"rotation": [-40, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "head_metal_left",
|
||||
"parent": "head_metal",
|
||||
"pivot": [9.5, 31.5, -13.4],
|
||||
"rotation": [-2, -10, 55],
|
||||
"cubes": [
|
||||
{"origin": [8, 21.5, -13.4], "size": [3, 10, 1], "pivot": [9.5, 21.5, -13.4], "rotation": [4.5, 0, 0], "uv": [8, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head_metal_left2",
|
||||
"parent": "head_metal_left",
|
||||
"pivot": [9.5, 21.5, -13.4],
|
||||
"rotation": [15, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [8, 13.5, -13.4], "size": [3, 8, 1], "inflate": 0.01, "uv": [8, 11]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head_metal_left3",
|
||||
"parent": "head_metal_left2",
|
||||
"pivot": [9.5, 13.5, -13.4],
|
||||
"rotation": [20, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [8, 8.5, -13.4], "size": [3, 5, 1], "inflate": 0.02, "uv": [0, 20]},
|
||||
{"origin": [5, 8.5, -13.4], "size": [6, 2, 1], "pivot": [11, 8.5, -12.9], "rotation": [0, 0, -15], "uv": [16, 0]}
|
||||
]
|
||||
"pivot": [-0.5, 30.5, -12.1],
|
||||
"rotation": [-35, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "head_metal_right",
|
||||
"parent": "head_metal",
|
||||
"pivot": [-9.5, 31.5, -13.4],
|
||||
"rotation": [-2, 10, -55],
|
||||
"pivot": [-9.5, 32.5, -13.35],
|
||||
"rotation": [-2, 10, -60],
|
||||
"cubes": [
|
||||
{"origin": [-11, 21.5, -13.4], "size": [3, 10, 1], "pivot": [-9.5, 21.5, -13.4], "rotation": [4.5, 0, 0], "uv": [0, 0], "mirror": true}
|
||||
{"origin": [-11, 22.5, -13.35], "size": [3, 10, 1], "uv": [0, 11], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head_metal_right2",
|
||||
"parent": "head_metal_right",
|
||||
"pivot": [-9.5, 21.5, -13.4],
|
||||
"pivot": [-9.5, 22.5, -13.35],
|
||||
"rotation": [15, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-11, 13.5, -13.4], "size": [3, 8, 1], "inflate": 0.01, "uv": [0, 11], "mirror": true}
|
||||
{"origin": [-11, 14.5, -13.35], "size": [3, 8, 1], "inflate": 0.01, "uv": [8, 9], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head_metal_right3",
|
||||
"parent": "head_metal_right2",
|
||||
"pivot": [-9.5, 13.5, -13.4],
|
||||
"pivot": [-9.5, 14.5, -13.35],
|
||||
"rotation": [20, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-11, 8.5, -13.4], "size": [3, 5, 1], "inflate": 0.02, "uv": [8, 20], "mirror": true},
|
||||
{"origin": [-11, 8.5, -13.4], "size": [6, 2, 1], "pivot": [-11, 8.5, -12.9], "rotation": [0, 0, 15], "uv": [16, 3], "mirror": true}
|
||||
{"origin": [-11, 9.5, -13.35], "size": [3, 5, 1], "inflate": 0.02, "uv": [16, 6], "mirror": true},
|
||||
{"origin": [-8, 9.5, -13.35], "size": [3, 2, 1], "uv": [16, 12], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "legs",
|
||||
"parent": "body",
|
||||
"pivot": [0, 27, 0]
|
||||
},
|
||||
{
|
||||
"name": "leg_front_left",
|
||||
"parent": "legs",
|
||||
"pivot": [10.85, 27, -6.8],
|
||||
"name": "head_metal_left",
|
||||
"parent": "head_metal",
|
||||
"pivot": [9.5, 32.5, -13.35],
|
||||
"rotation": [-2, -10, 60],
|
||||
"cubes": [
|
||||
{"origin": [8.35, 23.75, -9.75], "size": [5, 6, 6], "inflate": 0.01, "uv": [22, 86]},
|
||||
{"origin": [11.85, 25.25, -8.25], "size": [13, 3, 3], "uv": [32, 110]},
|
||||
{"origin": [21.75, 24.75, -8.75], "size": [4, 4, 4], "pivot": [24.75, 24.75, -7.25], "rotation": [0, 0, 2.5], "uv": [60, 86]}
|
||||
{"origin": [8, 22.5, -13.35], "size": [3, 10, 1], "uv": [0, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_front_left2",
|
||||
"parent": "leg_front_left",
|
||||
"pivot": [23.7981, 27.53724, -6.75],
|
||||
"rotation": [0, 0, -2.5],
|
||||
"name": "head_metal_left2",
|
||||
"parent": "head_metal_left",
|
||||
"pivot": [9.5, 22.5, -13.35],
|
||||
"rotation": [15, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [23.2, 30.25, -9.25], "size": [2, 5, 5], "pivot": [21.2, 25.75, -7.25], "rotation": [0, 0, -2.5], "uv": [209, 90]},
|
||||
{"origin": [23.2, 25.75, -9.25], "size": [4, 5, 5], "inflate": 0.01, "pivot": [23.2, 25.75, -7.25], "rotation": [0, 0, -2.5], "uv": [196, 95]},
|
||||
{"origin": [24.75, 14.75, -8.75], "size": [6, 8, 4], "inflate": 0.01, "pivot": [29.25, 13.75, -7.25], "rotation": [0, 0, 2.5], "uv": [224, 93]},
|
||||
{"origin": [26.2, 22.75, -9.25], "size": [5, 7, 5], "inflate": 0.02, "pivot": [31.2, 22.75, -7.25], "rotation": [0, 0, -35], "uv": [209, 100]},
|
||||
{"origin": [20.75, 6.15, -11.25], "size": [9, 11, 9], "uv": [220, 105]},
|
||||
{"origin": [22.5, 14.7, -8.75], "size": [8, 3, 4], "pivot": [23.25, 16.2, -6.25], "rotation": [0, 0, -62.5], "uv": [185, 105]},
|
||||
{"origin": [28.75, 5.7, -9.25], "size": [3, 10, 5], "pivot": [30.75, 6.2, -6.25], "rotation": [0, 0, 2.5], "uv": [174, 107]}
|
||||
{"origin": [8, 14.5, -13.35], "size": [3, 8, 1], "inflate": 0.01, "uv": [8, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_front_left",
|
||||
"parent": "leg_front_left2",
|
||||
"pivot": [30.25, 6.17602, -6.25],
|
||||
"rotation": [0, 0, 2.5],
|
||||
"name": "head_metal_left3",
|
||||
"parent": "head_metal_left2",
|
||||
"pivot": [9.5, 14.5, -13.35],
|
||||
"rotation": [20, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [19.25, 3.2, -13.25], "size": [13, 3, 13], "inflate": 0.01, "uv": [181, 112]}
|
||||
{"origin": [8, 9.5, -13.35], "size": [3, 5, 1], "inflate": 0.02, "uv": [16, 0]},
|
||||
{"origin": [5, 9.5, -13.35], "size": [3, 2, 1], "uv": [16, 15]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_secondary1",
|
||||
"parent": "hand_front_left",
|
||||
"pivot": [25.75, 4.7, -6.75],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"hand_secondary1": [25.75, 4.7, -6.75]
|
||||
}
|
||||
"name": "leg_holes",
|
||||
"parent": "torso",
|
||||
"pivot": [-0.5, 2.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_left1",
|
||||
"parent": "hand_front_left",
|
||||
"pivot": [29.75, 3.25, -6.75],
|
||||
"name": "leg_hole_right",
|
||||
"parent": "leg_holes",
|
||||
"pivot": [-0.5, 2.5, 0],
|
||||
"cubes": [
|
||||
{"origin": [30.25, -0.25, -8.75], "size": [0, 4, 4], "uv": [227, 29]}
|
||||
{"origin": [-9, 27.25, -8], "size": [0, 6, 17], "uv": [90, 19], "mirror": true},
|
||||
{"origin": [-12, 27.25, -8], "size": [3, 6, 0], "uv": [90, 48], "mirror": true},
|
||||
{"origin": [-12, 27.25, -2], "size": [3, 6, 0], "uv": [96, 48], "mirror": true},
|
||||
{"origin": [-12, 27.25, 3], "size": [3, 6, 0], "uv": [102, 48], "mirror": true},
|
||||
{"origin": [-12, 27.25, 9], "size": [3, 6, 0], "uv": [108, 48], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_left2",
|
||||
"parent": "hand_front_left",
|
||||
"pivot": [23.25, 3.25, -11.15],
|
||||
"rotation": [0, 27.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_left2_rotaiton",
|
||||
"parent": "finger_front_left2",
|
||||
"pivot": [23.25, 3.25, -11.15],
|
||||
"name": "leg_hole_left",
|
||||
"parent": "leg_holes",
|
||||
"pivot": [0.5, 2.5, 0],
|
||||
"cubes": [
|
||||
{"origin": [21.25, -0.25, -11.15], "size": [4, 4, 0], "uv": [227, 39]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_left3",
|
||||
"parent": "hand_front_left",
|
||||
"pivot": [23.25, 3.25, -2.65],
|
||||
"rotation": [0, -27.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_left3_rotation",
|
||||
"parent": "finger_front_left3",
|
||||
"pivot": [23.25, 3.25, -2.65],
|
||||
"cubes": [
|
||||
{"origin": [21.25, -0.25, -2.65], "size": [4, 4, 0], "uv": [227, 45]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_back_left",
|
||||
"parent": "legs",
|
||||
"pivot": [10.85, 27, 6.7],
|
||||
"cubes": [
|
||||
{"origin": [8.35, 23.75, 3.75], "size": [5, 6, 6], "inflate": 0.01, "uv": [22, 98]},
|
||||
{"origin": [11.85, 25.25, 5.25], "size": [13, 3, 3], "uv": [32, 116]},
|
||||
{"origin": [21.75, 24.75, 4.75], "size": [4, 4, 4], "pivot": [24.75, 24.75, 6.25], "rotation": [0, 0, 2.5], "uv": [60, 94]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_back_left2",
|
||||
"parent": "leg_back_left",
|
||||
"pivot": [23.7981, 27.53724, 6.75],
|
||||
"rotation": [0, 0, -2.5],
|
||||
"cubes": [
|
||||
{"origin": [23.2, 30.25, 4.25], "size": [2, 5, 5], "pivot": [21.2, 25.75, 6.25], "rotation": [0, 0, -2.5], "uv": [209, 51]},
|
||||
{"origin": [23.2, 25.75, 4.25], "size": [4, 5, 5], "inflate": 0.01, "pivot": [23.2, 25.75, 6.25], "rotation": [0, 0, -2.5], "uv": [196, 56]},
|
||||
{"origin": [24.75, 14.75, 4.75], "size": [6, 8, 4], "inflate": 0.01, "pivot": [29.25, 13.75, 6.25], "rotation": [0, 0, 2.5], "uv": [224, 54]},
|
||||
{"origin": [26.2, 22.75, 4.25], "size": [5, 7, 5], "inflate": 0.02, "pivot": [31.2, 22.75, 6.25], "rotation": [0, 0, -35], "uv": [209, 61]},
|
||||
{"origin": [20.75, 6.15, 2.25], "size": [9, 11, 9], "uv": [220, 66]},
|
||||
{"origin": [22.5, 14.7, 4.75], "size": [8, 3, 4], "pivot": [23.25, 16.2, 7.25], "rotation": [0, 0, -62.5], "uv": [185, 66]},
|
||||
{"origin": [28.75, 5.7, 4.25], "size": [3, 10, 5], "pivot": [30.75, 6.2, 7.25], "rotation": [0, 0, 2.5], "uv": [174, 68]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_back_left",
|
||||
"parent": "leg_back_left2",
|
||||
"pivot": [30.25, 6.17602, 7.25],
|
||||
"rotation": [0, 0, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [19.25, 3.2, 0.25], "size": [13, 3, 13], "inflate": 0.01, "uv": [181, 73]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_secondary2",
|
||||
"parent": "hand_back_left",
|
||||
"pivot": [25.75, 4.7, 6.75],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"hand_secondary2": [25.75, 4.7, 6.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "finger_back_left1",
|
||||
"parent": "hand_back_left",
|
||||
"pivot": [29.75, 3.25, 6.75],
|
||||
"cubes": [
|
||||
{"origin": [30.25, -0.25, 4.75], "size": [0, 4, 4], "uv": [246, 29]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_left2",
|
||||
"parent": "hand_back_left",
|
||||
"pivot": [23.25, 3.25, 2.35],
|
||||
"rotation": [0, 27.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_left2_rotaiton",
|
||||
"parent": "finger_back_left2",
|
||||
"pivot": [23.25, 3.25, 2.35],
|
||||
"cubes": [
|
||||
{"origin": [21.25, -0.25, 2.35], "size": [4, 4, 0], "uv": [246, 39]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_left3",
|
||||
"parent": "hand_back_left",
|
||||
"pivot": [23.25, 3.25, 10.85],
|
||||
"rotation": [0, -27.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_left3_rotation",
|
||||
"parent": "finger_back_left3",
|
||||
"pivot": [23.25, 3.25, 10.85],
|
||||
"cubes": [
|
||||
{"origin": [21.25, -0.25, 10.85], "size": [4, 4, 0], "uv": [246, 45]}
|
||||
{"origin": [9, 27.25, -8], "size": [0, 6, 17], "uv": [90, 13]},
|
||||
{"origin": [9, 27.25, -8], "size": [3, 6, 0], "uv": [90, 42]},
|
||||
{"origin": [9, 27.25, -2], "size": [3, 6, 0], "uv": [96, 42]},
|
||||
{"origin": [9, 27.25, 3], "size": [3, 6, 0], "uv": [102, 42]},
|
||||
{"origin": [9, 27.25, 9], "size": [3, 6, 0], "uv": [108, 42]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_front_right",
|
||||
"parent": "legs",
|
||||
"pivot": [-10.85, 27, -6.8],
|
||||
"parent": "body",
|
||||
"pivot": [-10.85, 29.5, -5.05],
|
||||
"cubes": [
|
||||
{"origin": [-13.35, 23.75, -9.75], "size": [5, 6, 6], "inflate": 0.01, "uv": [0, 86], "mirror": true},
|
||||
{"origin": [-24.85, 25.25, -8.25], "size": [13, 3, 3], "uv": [0, 110], "mirror": true},
|
||||
{"origin": [-25.75, 24.75, -8.75], "size": [4, 4, 4], "pivot": [-24.75, 24.75, -7.25], "rotation": [0, 0, -2.5], "uv": [44, 86], "mirror": true}
|
||||
{"origin": [-12.85, 27.5, -7], "size": [4, 4, 4], "inflate": 0.01, "uv": [0, 101], "mirror": true},
|
||||
{"origin": [-22.85, 28.5, -6], "size": [11, 2, 2], "uv": [12, 101], "mirror": true},
|
||||
{"origin": [-24.29905, 27.94362, -6.5], "size": [3, 3, 3], "pivot": [-24.29905, 27.94362, -5], "rotation": [0, 0, -2.5], "uv": [36, 103], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_front_right2",
|
||||
"parent": "leg_front_right",
|
||||
"pivot": [-23.7981, 27.53724, -6.75],
|
||||
"pivot": [-22.79905, 29.49362, -5],
|
||||
"rotation": [0, 0, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [-25.2, 30.25, -9.25], "size": [2, 5, 5], "pivot": [-21.2, 25.75, -7.25], "rotation": [0, 0, 2.5], "uv": [126, 90], "mirror": true},
|
||||
{"origin": [-27.2, 25.75, -9.25], "size": [4, 5, 5], "inflate": 0.01, "pivot": [-23.2, 25.75, -7.25], "rotation": [0, 0, 2.5], "uv": [113, 95], "mirror": true},
|
||||
{"origin": [-30.75, 14.75, -8.75], "size": [6, 8, 4], "inflate": 0.01, "pivot": [-29.25, 13.75, -7.25], "rotation": [0, 0, -2.5], "uv": [141, 93], "mirror": true},
|
||||
{"origin": [-31.2, 22.75, -9.25], "size": [5, 7, 5], "inflate": 0.02, "pivot": [-31.2, 22.75, -7.25], "rotation": [0, 0, 35], "uv": [126, 100], "mirror": true},
|
||||
{"origin": [-29.75, 6.15, -11.25], "size": [9, 11, 9], "uv": [137, 105], "mirror": true},
|
||||
{"origin": [-30.5, 14.7, -8.75], "size": [8, 3, 4], "pivot": [-23.25, 16.2, -6.25], "rotation": [0, 0, 62.5], "uv": [102, 105], "mirror": true},
|
||||
{"origin": [-31.75, 5.7, -9.25], "size": [3, 10, 5], "pivot": [-30.75, 6.2, -6.25], "rotation": [0, 0, -2.5], "uv": [91, 107], "mirror": true}
|
||||
{"origin": [-27.57171, 16.5824, -6.5], "size": [6, 3, 3], "pivot": [-22.27171, 18.1324, -4.5], "rotation": [0, 0, 62.5], "uv": [193, 79], "mirror": true},
|
||||
{"origin": [-27.77171, 6.1324, -9], "size": [8, 13, 8], "uv": [153, 93], "mirror": true},
|
||||
{"origin": [-24.17171, 33.1824, -7], "size": [2, 4, 4], "pivot": [-22.17171, 28.7324, -5], "rotation": [0, 0, -2.5], "uv": [199, 106], "mirror": true},
|
||||
{"origin": [-25.17171, 28.6824, -7], "size": [3, 5, 4], "inflate": 0.01, "pivot": [-22.17171, 28.7324, -5], "rotation": [0, 0, -2.5], "uv": [197, 97], "mirror": true},
|
||||
{"origin": [-29.17171, 24.6324, -7], "size": [5, 7, 4], "inflate": 0.02, "pivot": [-29.17171, 24.6324, -5], "rotation": [0, 0, 30], "uv": [193, 86], "mirror": true},
|
||||
{"origin": [-28.77171, 16.6324, -6.5], "size": [6, 8, 3], "inflate": 0.01, "pivot": [-28.27171, 15.6324, -5], "rotation": [0, 0, -2.5], "uv": [193, 114], "mirror": true},
|
||||
{"origin": [-29.27171, 5.6324, -7], "size": [2, 11, 4], "pivot": [-29.27171, 6.1324, -4], "rotation": [0, 0, -2.5], "uv": [185, 99], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_front_right",
|
||||
"parent": "leg_front_right2",
|
||||
"pivot": [-30.25, 6.17602, -6.25],
|
||||
"pivot": [-29.27171, 6.1324, -4.5],
|
||||
"rotation": [0, 0, -2.5],
|
||||
"cubes": [
|
||||
{"origin": [-32.25, 3.2, -13.25], "size": [13, 3, 13], "inflate": 0.01, "uv": [98, 112], "mirror": true}
|
||||
{"origin": [-29.27171, 3.1324, -10.5], "size": [11, 3, 11], "inflate": 0.01, "uv": [160, 114], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_primary1",
|
||||
"parent": "hand_front_right",
|
||||
"pivot": [-25.75, 4.7, -6.75],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"hand_primary": [-25.75, 4.7, -6.75],
|
||||
"physical": [-25.75, 4.7, -6.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item",
|
||||
"parent": "hand_front_right",
|
||||
"pivot": [-25.75, 3.2, -6.75],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"item": [-25.75, 3.2, -6.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "finger_front_right1",
|
||||
"parent": "hand_front_right",
|
||||
"pivot": [-29.75, 3.25, -6.75],
|
||||
"pivot": [-27.77171, 3.1324, -4.5],
|
||||
"cubes": [
|
||||
{"origin": [-30.25, -0.25, -8.75], "size": [0, 4, 4], "uv": [217, 29], "mirror": true}
|
||||
{"origin": [-27.77171, -0.3676, -6.5], "size": [0, 4, 4], "uv": [153, 89], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "bone",
|
||||
"parent": "finger_front_right1",
|
||||
"pivot": [-27.77171, 3.1324, -4.5]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_right2",
|
||||
"parent": "hand_front_right",
|
||||
"pivot": [-23.25, 3.25, -11.15],
|
||||
"rotation": [0, -27.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_right2_rotation",
|
||||
"parent": "finger_front_right2",
|
||||
"pivot": [-23.25, 3.25, -11.15],
|
||||
"pivot": [-21.32171, 3.1324, -8.65],
|
||||
"rotation": [0, -120, 0],
|
||||
"cubes": [
|
||||
{"origin": [-25.25, -0.25, -11.15], "size": [4, 4, 0], "uv": [217, 39], "mirror": true}
|
||||
{"origin": [-21.39671, -0.3676, -10.65], "size": [0, 4, 4], "uv": [153, 93], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_right3",
|
||||
"parent": "hand_front_right",
|
||||
"pivot": [-23.25, 3.25, -2.65],
|
||||
"rotation": [0, 27.5, 0]
|
||||
"pivot": [-21.32171, 3.1324, -1.25],
|
||||
"rotation": [0, 120, 0],
|
||||
"cubes": [
|
||||
{"origin": [-21.39671, -0.3676, -3.25], "size": [0, 4, 4], "uv": [177, 93], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_right3_rotation",
|
||||
"parent": "finger_front_right3",
|
||||
"pivot": [-23.25, 3.25, -2.65],
|
||||
"name": "leg_front_left",
|
||||
"parent": "body",
|
||||
"pivot": [10.85, 29.5, -5.05],
|
||||
"cubes": [
|
||||
{"origin": [-25.25, -0.25, -2.65], "size": [4, 4, 0], "uv": [217, 45], "mirror": true}
|
||||
{"origin": [8.85, 27.5, -7], "size": [4, 4, 4], "inflate": 0.01, "uv": [0, 109]},
|
||||
{"origin": [11.85, 28.5, -6], "size": [11, 2, 2], "uv": [12, 109]},
|
||||
{"origin": [21.29905, 27.94362, -6.5], "size": [3, 3, 3], "pivot": [24.29905, 27.94362, -5], "rotation": [0, 0, 2.5], "uv": [48, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_front_left2",
|
||||
"parent": "leg_front_left",
|
||||
"pivot": [22.79905, 29.49362, -5],
|
||||
"rotation": [0, 0, -2.5],
|
||||
"cubes": [
|
||||
{"origin": [21.57171, 16.5824, -6.5], "size": [6, 3, 3], "pivot": [22.27171, 18.1324, -4.5], "rotation": [0, 0, -62.5], "uv": [95, 76]},
|
||||
{"origin": [19.77171, 6.1324, -9], "size": [8, 13, 8], "uv": [73, 93]},
|
||||
{"origin": [22.17171, 33.1824, -7], "size": [2, 4, 4], "pivot": [22.17171, 28.7324, -5], "rotation": [0, 0, 2.5], "uv": [73, 74]},
|
||||
{"origin": [22.17171, 28.6824, -7], "size": [3, 5, 4], "inflate": 0.01, "pivot": [22.17171, 28.7324, -5], "rotation": [0, 0, 2.5], "uv": [81, 69]},
|
||||
{"origin": [24.17171, 24.6324, -7], "size": [5, 7, 4], "inflate": 0.02, "pivot": [29.17171, 24.6324, -5], "rotation": [0, 0, -30], "uv": [95, 65]},
|
||||
{"origin": [22.77171, 16.6324, -6.5], "size": [6, 8, 3], "inflate": 0.01, "pivot": [28.27171, 15.6324, -5], "rotation": [0, 0, 2.5], "uv": [93, 82]},
|
||||
{"origin": [27.27171, 5.6324, -7], "size": [2, 11, 4], "pivot": [29.27171, 6.1324, -4], "rotation": [0, 0, 2.5], "uv": [81, 78]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_front_left",
|
||||
"parent": "leg_front_left2",
|
||||
"pivot": [29.27171, 6.1324, -4.5],
|
||||
"rotation": [0, 0, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [18.27171, 3.1324, -10.5], "size": [11, 3, 11], "inflate": 0.01, "uv": [73, 114]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_left1",
|
||||
"parent": "hand_front_left",
|
||||
"pivot": [27.77171, 3.1324, -4.5],
|
||||
"cubes": [
|
||||
{"origin": [27.77171, -0.3676, -6.5], "size": [0, 4, 4], "uv": [73, 89]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_left2",
|
||||
"parent": "hand_front_left",
|
||||
"pivot": [21.32171, 3.1324, -8.65],
|
||||
"rotation": [0, 120, 0],
|
||||
"cubes": [
|
||||
{"origin": [21.39671, -0.3676, -10.65], "size": [0, 4, 4], "uv": [73, 93]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_front_left3",
|
||||
"parent": "hand_front_left",
|
||||
"pivot": [21.32171, 3.1324, -1.25],
|
||||
"rotation": [0, -120, 0],
|
||||
"cubes": [
|
||||
{"origin": [21.39671, -0.3676, -3.25], "size": [0, 4, 4], "uv": [97, 93]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_back_right",
|
||||
"parent": "legs",
|
||||
"pivot": [-10.85, 27, 6.7],
|
||||
"parent": "body",
|
||||
"pivot": [-10.85, 29.5, 5.95],
|
||||
"cubes": [
|
||||
{"origin": [-13.35, 23.75, 3.75], "size": [5, 6, 6], "inflate": 0.01, "uv": [0, 98], "mirror": true},
|
||||
{"origin": [-24.85, 25.25, 5.25], "size": [13, 3, 3], "uv": [0, 116], "mirror": true},
|
||||
{"origin": [-25.75, 24.75, 4.75], "size": [4, 4, 4], "pivot": [-24.75, 24.75, 6.25], "rotation": [0, 0, -2.5], "uv": [44, 94], "mirror": true}
|
||||
{"origin": [-12.85, 27.5, 4], "size": [4, 4, 4], "inflate": 0.01, "uv": [0, 93], "mirror": true},
|
||||
{"origin": [-22.85, 28.5, 5], "size": [11, 2, 2], "uv": [12, 93], "mirror": true},
|
||||
{"origin": [-24.29905, 27.94362, 4.5], "size": [3, 3, 3], "pivot": [-24.29905, 27.94362, 6], "rotation": [0, 0, -2.5], "uv": [36, 110], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_back_right2",
|
||||
"parent": "leg_back_right",
|
||||
"pivot": [-23.7981, 27.53724, 6.75],
|
||||
"pivot": [-22.79905, 29.49362, 6],
|
||||
"rotation": [0, 0, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [-25.2, 30.25, 4.25], "size": [2, 5, 5], "pivot": [-21.2, 25.75, 6.25], "rotation": [0, 0, 2.5], "uv": [126, 51], "mirror": true},
|
||||
{"origin": [-27.2, 25.75, 4.25], "size": [4, 5, 5], "inflate": 0.01, "pivot": [-23.2, 25.75, 6.25], "rotation": [0, 0, 2.5], "uv": [113, 56], "mirror": true},
|
||||
{"origin": [-30.75, 14.75, 4.75], "size": [6, 8, 4], "inflate": 0.01, "pivot": [-29.25, 13.75, 6.25], "rotation": [0, 0, -2.5], "uv": [141, 54], "mirror": true},
|
||||
{"origin": [-31.2, 22.75, 4.25], "size": [5, 7, 5], "inflate": 0.02, "pivot": [-31.2, 22.75, 6.25], "rotation": [0, 0, 35], "uv": [126, 61], "mirror": true},
|
||||
{"origin": [-29.75, 6.15, 2.25], "size": [9, 11, 9], "uv": [137, 66], "mirror": true},
|
||||
{"origin": [-30.5, 14.7, 4.75], "size": [8, 3, 4], "pivot": [-23.25, 16.2, 7.25], "rotation": [0, 0, 62.5], "uv": [102, 66], "mirror": true},
|
||||
{"origin": [-31.75, 5.7, 4.25], "size": [3, 10, 5], "pivot": [-30.75, 6.2, 7.25], "rotation": [0, 0, -2.5], "uv": [91, 68], "mirror": true}
|
||||
{"origin": [-27.57171, 16.5824, 4.5], "size": [6, 3, 3], "pivot": [-22.27171, 18.1324, 5.5], "rotation": [0, 0, 62.5], "uv": [188, 0], "mirror": true},
|
||||
{"origin": [-27.77171, 6.1324, 2], "size": [8, 13, 8], "uv": [148, 14], "mirror": true},
|
||||
{"origin": [-24.17171, 33.1824, 4], "size": [2, 4, 4], "pivot": [-22.17171, 28.7324, 6], "rotation": [0, 0, -2.5], "uv": [194, 27], "mirror": true},
|
||||
{"origin": [-25.17171, 28.6824, 4], "size": [3, 5, 4], "inflate": 0.01, "pivot": [-22.17171, 28.7324, 6], "rotation": [0, 0, -2.5], "uv": [192, 18], "mirror": true},
|
||||
{"origin": [-29.17171, 24.6324, 4], "size": [5, 7, 4], "inflate": 0.02, "pivot": [-29.17171, 24.6324, 6], "rotation": [0, 0, 30], "uv": [188, 7], "mirror": true},
|
||||
{"origin": [-28.77171, 16.6324, 4.5], "size": [6, 8, 3], "inflate": 0.01, "pivot": [-28.27171, 15.6324, 6], "rotation": [0, 0, -2.5], "uv": [188, 35], "mirror": true},
|
||||
{"origin": [-29.27171, 5.6324, 4], "size": [2, 11, 4], "pivot": [-29.27171, 6.1324, 5], "rotation": [0, 0, -2.5], "uv": [180, 20], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_back_right",
|
||||
"parent": "leg_back_right2",
|
||||
"pivot": [-30.25, 6.17602, 7.25],
|
||||
"pivot": [-29.27171, 6.1324, 5.5],
|
||||
"rotation": [0, 0, -2.5],
|
||||
"cubes": [
|
||||
{"origin": [-32.25, 3.2, 0.25], "size": [13, 3, 13], "inflate": 0.01, "uv": [98, 73], "mirror": true}
|
||||
{"origin": [-29.27171, 3.1324, 0.5], "size": [11, 3, 11], "inflate": 0.01, "uv": [155, 35], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_primary2",
|
||||
"name": "finger_back_right",
|
||||
"parent": "hand_back_right",
|
||||
"pivot": [-25.75, 4.7, 6.75],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"hand_primary2": [-25.75, 4.7, 6.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "finger_back_right1",
|
||||
"parent": "hand_back_right",
|
||||
"pivot": [-29.75, 3.25, 6.75],
|
||||
"pivot": [-27.77171, 3.1324, 5.5],
|
||||
"cubes": [
|
||||
{"origin": [-30.25, -0.25, 4.75], "size": [0, 4, 4], "uv": [237, 29], "mirror": true}
|
||||
{"origin": [-27.77171, -0.3676, 3.5], "size": [0, 4, 4], "uv": [148, 10], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_right2",
|
||||
"parent": "hand_back_right",
|
||||
"pivot": [-23.25, 3.25, 2.35],
|
||||
"rotation": [0, -27.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_right2_rotaiton",
|
||||
"parent": "finger_back_right2",
|
||||
"pivot": [-23.25, 3.25, 2.35],
|
||||
"pivot": [-21.32171, 3.1324, 9.65],
|
||||
"rotation": [0, 120, 0],
|
||||
"cubes": [
|
||||
{"origin": [-25.25, -0.25, 2.35], "size": [4, 4, 0], "uv": [237, 39], "mirror": true}
|
||||
{"origin": [-21.39671, -0.3676, 7.65], "size": [0, 4, 4], "uv": [148, 14], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_right3",
|
||||
"parent": "hand_back_right",
|
||||
"pivot": [-23.25, 3.25, 10.85],
|
||||
"rotation": [0, 27.5, 0]
|
||||
"pivot": [-21.32171, 3.1324, 2.25],
|
||||
"rotation": [0, -120, 0],
|
||||
"cubes": [
|
||||
{"origin": [-21.39671, -0.3676, 0.25], "size": [0, 4, 4], "uv": [172, 14], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_right3_rotation",
|
||||
"parent": "finger_back_right3",
|
||||
"pivot": [-23.25, 3.25, 10.85],
|
||||
"name": "leg_back_left",
|
||||
"parent": "body",
|
||||
"pivot": [10.85, 29.5, 5.95],
|
||||
"cubes": [
|
||||
{"origin": [-25.25, -0.25, 10.85], "size": [4, 4, 0], "uv": [237, 45], "mirror": true}
|
||||
{"origin": [8.85, 27.5, 4], "size": [4, 4, 4], "inflate": 0.01, "uv": [0, 117]},
|
||||
{"origin": [11.85, 28.5, 5], "size": [11, 2, 2], "uv": [12, 117]},
|
||||
{"origin": [21.29905, 27.94362, 4.5], "size": [3, 3, 3], "pivot": [24.29905, 27.94362, 6], "rotation": [0, 0, 2.5], "uv": [48, 110]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_back_left2",
|
||||
"parent": "leg_back_left",
|
||||
"pivot": [22.79905, 29.49362, 6],
|
||||
"rotation": [0, 0, -2.5],
|
||||
"cubes": [
|
||||
{"origin": [21.57171, 16.5824, 4.5], "size": [6, 3, 3], "pivot": [22.27171, 18.1324, 6.5], "rotation": [0, 0, -62.5], "uv": [139, 76]},
|
||||
{"origin": [19.77171, 6.1324, 2], "size": [8, 13, 8], "uv": [117, 93]},
|
||||
{"origin": [22.17171, 33.1824, 4], "size": [2, 4, 4], "pivot": [22.17171, 28.7324, 6], "rotation": [0, 0, 2.5], "uv": [117, 74]},
|
||||
{"origin": [22.17171, 28.6824, 4], "size": [3, 5, 4], "inflate": 0.01, "pivot": [22.17171, 28.7324, 6], "rotation": [0, 0, 2.5], "uv": [125, 69]},
|
||||
{"origin": [24.17171, 24.6324, 4], "size": [5, 7, 4], "inflate": 0.02, "pivot": [29.17171, 24.6324, 6], "rotation": [0, 0, -30], "uv": [139, 65]},
|
||||
{"origin": [22.77171, 16.6324, 4.5], "size": [6, 8, 3], "inflate": 0.01, "pivot": [28.27171, 15.6324, 6], "rotation": [0, 0, 2.5], "uv": [137, 82]},
|
||||
{"origin": [27.27171, 5.6324, 4], "size": [2, 11, 4], "pivot": [29.27171, 6.1324, 7], "rotation": [0, 0, 2.5], "uv": [125, 78]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_back_left",
|
||||
"parent": "leg_back_left2",
|
||||
"pivot": [29.27171, 6.1324, 6.5],
|
||||
"rotation": [0, 0, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [18.27171, 3.1324, 0.5], "size": [11, 3, 11], "inflate": 0.01, "uv": [117, 114]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_left",
|
||||
"parent": "hand_back_left",
|
||||
"pivot": [27.77171, 3.1324, 6.5],
|
||||
"cubes": [
|
||||
{"origin": [27.77171, -0.3676, 4.5], "size": [0, 4, 4], "uv": [117, 89]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_left2",
|
||||
"parent": "hand_back_left",
|
||||
"pivot": [21.32171, 3.1324, 2.35],
|
||||
"rotation": [0, 120, 0],
|
||||
"cubes": [
|
||||
{"origin": [21.39671, -0.3676, 0.35], "size": [0, 4, 4], "uv": [117, 93]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_back_left3",
|
||||
"parent": "hand_back_left",
|
||||
"pivot": [21.32171, 3.1324, 9.75],
|
||||
"rotation": [0, -120, 0],
|
||||
"cubes": [
|
||||
{"origin": [21.39671, -0.3676, 7.75], "size": [0, 4, 4], "uv": [141, 93]}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
+11
-226
@@ -18,22 +18,6 @@
|
||||
"collapse": [0, 0.25, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_root",
|
||||
"parent": "magnezone",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"root": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_top",
|
||||
"parent": "magnezone",
|
||||
"pivot": [0, 27.5, 0],
|
||||
"locators": {
|
||||
"top": [0, 27.5, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "magnezone",
|
||||
@@ -50,63 +34,6 @@
|
||||
"sparks3": [-1.5, 5.5, -11.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_target",
|
||||
"parent": "body",
|
||||
"pivot": [0, 10, -18],
|
||||
"locators": {
|
||||
"target": [0, 10, -18]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_middle",
|
||||
"parent": "body",
|
||||
"pivot": [0, 10, 0],
|
||||
"locators": {
|
||||
"middle": [0, 10, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_head",
|
||||
"parent": "body",
|
||||
"pivot": [0, 15.5, -9.5],
|
||||
"locators": {
|
||||
"head": [0, 15.5, -9.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "body",
|
||||
"pivot": [0, 21, 6],
|
||||
"locators": {
|
||||
"seat1": [0, 21, 6]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_face",
|
||||
"parent": "body",
|
||||
"pivot": [0, 10, -15],
|
||||
"locators": {
|
||||
"face": [0, 10, -15],
|
||||
"physical": [0, 10, -15]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_face",
|
||||
"parent": "body",
|
||||
"pivot": [0, 13.5, -11.5],
|
||||
"locators": {
|
||||
"item_face": [0, 13.5, -11.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_tera_hat",
|
||||
"parent": "body",
|
||||
"pivot": [0, 18, 0],
|
||||
"locators": {
|
||||
"tera_hat": [0, 18, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "red_light",
|
||||
"parent": "body",
|
||||
@@ -116,15 +43,6 @@
|
||||
{"origin": [-1.5, 12, -11.52], "size": [3, 3, 0], "uv": [0, 12]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_center",
|
||||
"parent": "red_light",
|
||||
"pivot": [0, 13.5, -11.5],
|
||||
"locators": {
|
||||
"eye1": [0, 13.5, -11.5],
|
||||
"special3": [0, 13.5, -11.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "antenna",
|
||||
"parent": "body",
|
||||
@@ -135,14 +53,6 @@
|
||||
{"origin": [-1.5, 24.5, -1.5], "size": [3, 3, 3], "uv": [70, 17]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_item_hat",
|
||||
"parent": "antenna",
|
||||
"pivot": [0, 27.5, 0],
|
||||
"locators": {
|
||||
"item_hat": [0, 27.5, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "body_left",
|
||||
"parent": "body",
|
||||
@@ -160,14 +70,6 @@
|
||||
{"origin": [13.5, 10.1, -4.51], "size": [4, 4, 0], "uv": [0, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [15.5, 12.1, -4.5],
|
||||
"locators": {
|
||||
"eye3": [15.5, 12.1, -4.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "pupil_left",
|
||||
"parent": "eye_left",
|
||||
@@ -184,23 +86,6 @@
|
||||
{"origin": [14, 11.6, -4.42], "size": [3, 1, 0], "uv": [8, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_happy_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [15.5, 12.1, -4.42],
|
||||
"cubes": [
|
||||
{"origin": [14, 11.1, -4.42], "size": [3, 2, 0], "uv": [14, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_recoil_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [15.5, 12.1, -4.42],
|
||||
"rotation": [0, 0, -45],
|
||||
"cubes": [
|
||||
{"origin": [14, 10.6, -4.42], "size": [3, 3, 0], "uv": [8, 4]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "magnet_left",
|
||||
"parent": "body_left",
|
||||
@@ -212,26 +97,9 @@
|
||||
"parent": "magnet_left",
|
||||
"pivot": [13.5, 8, -5],
|
||||
"cubes": [
|
||||
{"origin": [8.5, 6.5, -9], "size": [10, 3, 4], "inflate": 0.02, "uv": [0, 82]},
|
||||
{"origin": [8.5, 6.5, -19], "size": [4, 3, 10], "inflate": 0.01, "uv": [0, 89]},
|
||||
{"origin": [14.5, 6.5, -19], "size": [4, 3, 10], "inflate": 0.01, "uv": [0, 102]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_cannon_left",
|
||||
"parent": "magnet_left_rotation",
|
||||
"pivot": [13.5, 8, -19],
|
||||
"locators": {
|
||||
"cannon2": [13.5, 8, -19],
|
||||
"special2": [13.5, 8, -19]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "magnet_lights_left",
|
||||
"parent": "magnet_left_rotation",
|
||||
"pivot": [13.5, 8, -18.92],
|
||||
"cubes": [
|
||||
{"origin": [8.5, 6.5, -18.92], "size": [10, 3, 0], "uv": [18, 96]}
|
||||
{"origin": [8.5, 6.5, -9], "size": [10, 3, 4], "uv": [0, 82]},
|
||||
{"origin": [8.5, 6.5, -19], "size": [4, 3, 10], "uv": [0, 89]},
|
||||
{"origin": [14.5, 6.5, -19], "size": [4, 3, 10], "uv": [0, 102]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -267,14 +135,6 @@
|
||||
{"origin": [-17.5, 10.1, -4.51], "size": [4, 4, 0], "uv": [0, 4], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-15.5, 12.1, -4.5],
|
||||
"locators": {
|
||||
"eye2": [-15.5, 12.1, -4.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "pupil_right",
|
||||
"parent": "eye_right",
|
||||
@@ -291,23 +151,6 @@
|
||||
{"origin": [-17, 11.6, -4.42], "size": [3, 1, 0], "uv": [8, 1], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_happy_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-15.5, 12.1, -4.42],
|
||||
"cubes": [
|
||||
{"origin": [-17, 11.1, -4.42], "size": [3, 2, 0], "uv": [10, 2], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_recoil_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-15.5, 12.1, -4.42],
|
||||
"rotation": [0, 0, 45],
|
||||
"cubes": [
|
||||
{"origin": [-17, 10.6, -4.42], "size": [3, 3, 0], "uv": [8, 7], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "magnet_right",
|
||||
"parent": "body_right",
|
||||
@@ -319,34 +162,9 @@
|
||||
"parent": "magnet_right",
|
||||
"pivot": [-13.5, 8, -5],
|
||||
"cubes": [
|
||||
{"origin": [-18.5, 6.5, -9], "size": [10, 3, 4], "inflate": 0.02, "uv": [28, 82], "mirror": true},
|
||||
{"origin": [-12.5, 6.5, -19], "size": [4, 3, 10], "inflate": 0.01, "uv": [28, 89], "mirror": true},
|
||||
{"origin": [-18.5, 6.5, -19], "size": [4, 3, 10], "inflate": 0.01, "uv": [28, 102], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_cannon_right",
|
||||
"parent": "magnet_right_rotation",
|
||||
"pivot": [-13.5, 8, -19],
|
||||
"locators": {
|
||||
"cannon1": [-13.5, 8, -19],
|
||||
"special1": [-13.5, 8, -19]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item",
|
||||
"parent": "magnet_right_rotation",
|
||||
"pivot": [-13.5, 8, -19],
|
||||
"locators": {
|
||||
"item": [-13.5, 8, -19]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "magnet_lights_right",
|
||||
"parent": "magnet_right_rotation",
|
||||
"pivot": [-13.5, 8, -18.92],
|
||||
"cubes": [
|
||||
{"origin": [-18.5, 6.5, -18.92], "size": [10, 3, 0], "uv": [18, 109], "mirror": true}
|
||||
{"origin": [-18.5, 6.5, -9], "size": [10, 3, 4], "uv": [28, 82], "mirror": true},
|
||||
{"origin": [-12.5, 6.5, -19], "size": [4, 3, 10], "uv": [28, 89], "mirror": true},
|
||||
{"origin": [-18.5, 6.5, -19], "size": [4, 3, 10], "uv": [28, 102], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -368,51 +186,18 @@
|
||||
{
|
||||
"name": "magnet_back",
|
||||
"parent": "body",
|
||||
"pivot": [0, 8, 12]
|
||||
"pivot": [0, 8, 12],
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "magnet_back_rotation",
|
||||
"parent": "magnet_back",
|
||||
"pivot": [0, 8, 12],
|
||||
"cubes": [
|
||||
{"origin": [-5, 6.5, 12], "size": [10, 3, 4], "inflate": 0.02, "uv": [69, 0]},
|
||||
{"origin": [-5, 6.5, 16], "size": [4, 3, 10], "inflate": 0.01, "uv": [87, 0]},
|
||||
{"origin": [1, 6.5, 16], "size": [4, 3, 10], "inflate": 0.01, "uv": [92, 13]}
|
||||
{"origin": [-5, 6.5, 12], "size": [10, 3, 4], "uv": [69, 0]},
|
||||
{"origin": [-5, 6.5, 16], "size": [4, 3, 10], "uv": [87, 0]},
|
||||
{"origin": [1, 6.5, 16], "size": [4, 3, 10], "uv": [92, 13]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_tail",
|
||||
"parent": "magnet_back_rotation",
|
||||
"pivot": [0, 8, 19.5],
|
||||
"rotation": [180, 0, -180],
|
||||
"locators": {
|
||||
"locator": [0, 8, 19.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_tail_tip",
|
||||
"parent": "magnet_back_rotation",
|
||||
"pivot": [0, 8, 26],
|
||||
"rotation": [180, 0, -180],
|
||||
"locators": {
|
||||
"tail_tip": [0, 8, 26]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "magnet_lights_back",
|
||||
"parent": "magnet_back_rotation",
|
||||
"pivot": [0, 8, 25.92],
|
||||
"cubes": [
|
||||
{"origin": [-5, 6.5, 25.92], "size": [10, 3, 0], "uv": [77, 7]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "body",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"seat_1": [0, 17.5, 4]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
-936
@@ -1,936 +0,0 @@
|
||||
{
|
||||
"format_version": "1.12.0",
|
||||
"minecraft:geometry": [
|
||||
{
|
||||
"description": {
|
||||
"identifier": "geometry.unknown",
|
||||
"texture_width": 256,
|
||||
"texture_height": 256,
|
||||
"visible_bounds_width": 5,
|
||||
"visible_bounds_height": 4.5,
|
||||
"visible_bounds_offset": [0, 1.75, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
"name": "druddigon",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_root",
|
||||
"parent": "druddigon",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"root": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_top",
|
||||
"parent": "druddigon",
|
||||
"pivot": [0, 35, 0],
|
||||
"locators": {
|
||||
"top": [0, 35, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "druddigon",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_middle",
|
||||
"parent": "body",
|
||||
"pivot": [0, 15, 0],
|
||||
"locators": {
|
||||
"middle": [0, 15, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_target",
|
||||
"parent": "body",
|
||||
"pivot": [0, 15, -8],
|
||||
"locators": {
|
||||
"target": [0, 15, -8]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "torso",
|
||||
"parent": "body",
|
||||
"pivot": [0, 11, 0],
|
||||
"rotation": [37.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-5, 6, -3.4], "size": [10, 12, 10.8], "uv": [34, 0]},
|
||||
{"origin": [-5, 6, -3.4], "size": [10, 12, 10.8], "inflate": 0.4, "uv": [34, 22]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail_1",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 7.95, 2],
|
||||
"rotation": [-60, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4, 3.45, 0], "size": [8, 8, 12], "uv": [34, 44]},
|
||||
{"origin": [0, 9.45, 7], "size": [0, 7, 4], "uv": [26, 83]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail_2",
|
||||
"parent": "tail_1",
|
||||
"pivot": [0, 7.45, 12],
|
||||
"rotation": [17.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-3, 4.45, 10], "size": [6, 6, 9], "uv": [74, 17]},
|
||||
{"origin": [0, 9.95, 13], "size": [0, 7, 5], "pivot": [0, 10.45, 16], "rotation": [-5, 0, 0], "uv": [116, 100]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_tail",
|
||||
"parent": "tail_2",
|
||||
"pivot": [0, 8, 18],
|
||||
"locators": {
|
||||
"tail": [0, 8, 18]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "tail_3",
|
||||
"parent": "tail_2",
|
||||
"pivot": [0, 7.95, 19],
|
||||
"rotation": [10, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2, 5.95, 17], "size": [4, 4, 8], "uv": [100, 43]},
|
||||
{"origin": [0, 8.95, 19], "size": [0, 5, 4], "pivot": [0, 9.95, 21], "rotation": [-7.5, 0, 0], "uv": [76, 95]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail_4",
|
||||
"parent": "tail_3",
|
||||
"pivot": [0, 7.95, 25],
|
||||
"rotation": [7.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-1.5, 6.45, 23], "size": [3, 3, 6], "uv": [52, 108]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_tail_tip",
|
||||
"parent": "tail_4",
|
||||
"pivot": [0, 8, 29],
|
||||
"locators": {
|
||||
"tail_tip": [0, 8, 29]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "chest",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 18, 4],
|
||||
"rotation": [5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4, 17, -2], "size": [8, 9, 8], "uv": [0, 66]},
|
||||
{"origin": [-4, 17, -2], "size": [8, 9, 8], "inflate": 0.4, "uv": [74, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "wing_left",
|
||||
"parent": "chest",
|
||||
"pivot": [3, 24.5, 5.5],
|
||||
"rotation": [-7.5, 32.5, 0],
|
||||
"cubes": [
|
||||
{"origin": [3, 14.5, 4.5], "size": [0, 18, 13], "uv": [34, 64]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_wing_left",
|
||||
"parent": "wing_left",
|
||||
"pivot": [3, 29, 15.5],
|
||||
"locators": {
|
||||
"wing2": [3, 29, 15.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "wing_left2",
|
||||
"parent": "wing_left",
|
||||
"pivot": [3, 24.5, 17.5],
|
||||
"cubes": [
|
||||
{"origin": [3, 15.5, 17.5], "size": [0, 16, 17], "uv": [0, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "wing_right",
|
||||
"parent": "chest",
|
||||
"pivot": [-3, 24.5, 5.5],
|
||||
"rotation": [-7.5, -32.5, 0],
|
||||
"cubes": [
|
||||
{"origin": [-3, 14.5, 4.5], "size": [0, 18, 13], "uv": [60, 64]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_wing_right",
|
||||
"parent": "wing_right",
|
||||
"pivot": [-3, 29, 15.5],
|
||||
"locators": {
|
||||
"wing1": [-3, 29, 15.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "wing_right2",
|
||||
"parent": "wing_right",
|
||||
"pivot": [-3, 24.5, 17.5],
|
||||
"cubes": [
|
||||
{"origin": [-3, 15.5, 17.5], "size": [0, 16, 17], "uv": [0, 33]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "arms",
|
||||
"parent": "chest",
|
||||
"pivot": [0.25, 23.1, 1.3]
|
||||
},
|
||||
{
|
||||
"name": "arm_right1",
|
||||
"parent": "arms",
|
||||
"pivot": [-3.25, 23.1, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [-7.25, 22.1, -0.2], "size": [5, 3, 3], "uv": [48, 117]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "shoulder_spike_right",
|
||||
"parent": "arm_right1",
|
||||
"pivot": [-5.95, 24.6, 0.8],
|
||||
"rotation": [0, 0, -17.5],
|
||||
"cubes": [
|
||||
{"origin": [-7.45, 23.6, 1.3], "size": [3, 5, 0], "pivot": [-5.95, 24.6, 1.3], "rotation": [0, 0, -9], "uv": [128, 6]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "arm_right2",
|
||||
"parent": "arm_right1",
|
||||
"pivot": [-5, 23.2, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [-13, 22.2, 0.3], "size": [9, 2, 2], "uv": [112, 66]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "arm_right3",
|
||||
"parent": "arm_right2",
|
||||
"pivot": [-12, 23.2, 2.3],
|
||||
"cubes": [
|
||||
{"origin": [-18, 21.2, -0.7], "size": [6, 4, 4], "uv": [76, 106]},
|
||||
{"origin": [-16.5, 25.2, 1.3], "size": [2, 3, 0], "uv": [42, 129]},
|
||||
{"origin": [-23, 21.7, -0.2], "size": [5, 3, 3], "uv": [118, 112]},
|
||||
{"origin": [-20.5, 24.7, 1.3], "size": [3, 4, 0], "uv": [46, 128]},
|
||||
{"origin": [-23, 24.7, 1.3], "size": [2, 2, 0], "uv": [86, 130]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_right",
|
||||
"parent": "arm_right3",
|
||||
"pivot": [-23, 23.2, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [-25, 22.2, -0.2], "size": [2, 2, 3], "inflate": 0.01, "uv": [102, 121]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_blade_primary",
|
||||
"parent": "hand_right",
|
||||
"pivot": [-24, 23.2, 1.3],
|
||||
"rotation": [0, 90, 0],
|
||||
"locators": {
|
||||
"blade_primary": [-24, 23.2, 1.3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_primary",
|
||||
"parent": "hand_right",
|
||||
"pivot": [-24, 23.2, 1.3],
|
||||
"rotation": [0, 90, 0],
|
||||
"locators": {
|
||||
"hand_primary": [-24, 23.2, 0.3],
|
||||
"physical": [-24, 23.2, 1.3],
|
||||
"item": [-24, 23.2, 1.3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "finger_right1",
|
||||
"parent": "hand_right",
|
||||
"pivot": [-25, 24.2, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [-28, 22.2, 0.3], "size": [3, 2, 2], "uv": [0, 123]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "claw_right1",
|
||||
"parent": "finger_right1",
|
||||
"pivot": [-28, 24.2, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [-29.9, 22.2, 0.3], "size": [2, 2, 2], "inflate": -0.1, "uv": [86, 126]},
|
||||
{"origin": [-31.4, 21.7, 1.3], "size": [2, 2, 0], "inflate": 0.01, "uv": [90, 130]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_right2",
|
||||
"parent": "hand_right",
|
||||
"pivot": [-23, 24.2, -0.2],
|
||||
"cubes": [
|
||||
{"origin": [-25, 22.2, -3.2], "size": [2, 2, 3], "uv": [1, 162]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "claw_right2",
|
||||
"parent": "finger_right2",
|
||||
"pivot": [-24, 24.2, -3.2],
|
||||
"cubes": [
|
||||
{"origin": [-25, 22.2, -5.1], "size": [2, 2, 2], "inflate": -0.1, "uv": [127, 88]},
|
||||
{"origin": [-23.9, 21.7, -6.7], "size": [0, 2, 2], "uv": [130, 90]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_right3",
|
||||
"parent": "hand_right",
|
||||
"pivot": [-23, 24.2, 2.8],
|
||||
"cubes": [
|
||||
{"origin": [-25, 22.2, 2.8], "size": [2, 2, 3], "uv": [21, 162]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "claw_right3",
|
||||
"parent": "finger_right3",
|
||||
"pivot": [-24, 24.2, 5.8],
|
||||
"cubes": [
|
||||
{"origin": [-25, 22.2, 5.7], "size": [2, 2, 2], "inflate": -0.1, "uv": [27, 154]},
|
||||
{"origin": [-23.9, 21.7, 7.3], "size": [0, 2, 2], "uv": [117, 145]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "arm_left1",
|
||||
"parent": "arms",
|
||||
"pivot": [3.25, 23.1, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [2.25, 22.1, -0.2], "size": [5, 3, 3], "uv": [48, 117], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "shoulder_spike_left",
|
||||
"parent": "arm_left1",
|
||||
"pivot": [5.95, 24.6, 0.8],
|
||||
"rotation": [0, 0, 17.5],
|
||||
"cubes": [
|
||||
{"origin": [4.45, 23.6, 1.3], "size": [3, 5, 0], "pivot": [5.95, 24.6, 1.3], "rotation": [0, 0, 9], "uv": [128, 6], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "arm_left2",
|
||||
"parent": "arm_left1",
|
||||
"pivot": [5, 23.2, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [4, 22.2, 0.3], "size": [9, 2, 2], "uv": [112, 66], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "arm_left3",
|
||||
"parent": "arm_left2",
|
||||
"pivot": [12, 23.2, 2.3],
|
||||
"cubes": [
|
||||
{"origin": [12, 21.2, -0.7], "size": [6, 4, 4], "uv": [76, 106], "mirror": true},
|
||||
{"origin": [14.5, 25.2, 1.3], "size": [2, 3, 0], "uv": [42, 129], "mirror": true},
|
||||
{"origin": [18, 21.7, -0.2], "size": [5, 3, 3], "uv": [118, 112], "mirror": true},
|
||||
{"origin": [17.5, 24.7, 1.3], "size": [3, 4, 0], "uv": [46, 128], "mirror": true},
|
||||
{"origin": [21, 24.7, 1.3], "size": [2, 2, 0], "uv": [86, 130], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_left",
|
||||
"parent": "arm_left3",
|
||||
"pivot": [23, 23.2, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [23, 22.2, -0.2], "size": [2, 2, 3], "inflate": 0.01, "uv": [102, 121], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_blade_secondary",
|
||||
"parent": "hand_left",
|
||||
"pivot": [24, 23.2, 1.3],
|
||||
"rotation": [0, -90, 0],
|
||||
"locators": {
|
||||
"blade_secondary": [24, 23.2, 1.3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_secondary",
|
||||
"parent": "hand_left",
|
||||
"pivot": [24, 23.2, 1.3],
|
||||
"rotation": [0, -90, 0],
|
||||
"locators": {
|
||||
"hand_secondary": [24, 23.2, 1.3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "finger_left1",
|
||||
"parent": "hand_left",
|
||||
"pivot": [25, 24.2, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [25, 22.2, 0.3], "size": [3, 2, 2], "uv": [0, 123], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "claw_left1",
|
||||
"parent": "finger_left1",
|
||||
"pivot": [28, 24.2, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [27.9, 22.2, 0.3], "size": [2, 2, 2], "inflate": -0.1, "uv": [86, 126], "mirror": true},
|
||||
{"origin": [29.4, 21.7, 1.3], "size": [2, 2, 0], "inflate": 0.01, "uv": [90, 130], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_left2",
|
||||
"parent": "hand_left",
|
||||
"pivot": [23, 24.2, -0.2],
|
||||
"cubes": [
|
||||
{"origin": [23, 22.2, -3.2], "size": [2, 2, 3], "uv": [1, 162], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "claw_left2",
|
||||
"parent": "finger_left2",
|
||||
"pivot": [24, 24.2, -3.2],
|
||||
"cubes": [
|
||||
{"origin": [23, 22.2, -5.1], "size": [2, 2, 2], "inflate": -0.1, "uv": [127, 88], "mirror": true},
|
||||
{"origin": [23.9, 21.7, -6.7], "size": [0, 2, 2], "uv": [130, 90], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "finger_left3",
|
||||
"parent": "hand_left",
|
||||
"pivot": [23, 24.2, 2.8],
|
||||
"cubes": [
|
||||
{"origin": [23, 22.2, 2.8], "size": [2, 2, 3], "uv": [21, 162], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "claw_left3",
|
||||
"parent": "finger_left3",
|
||||
"pivot": [24, 24.2, 5.8],
|
||||
"cubes": [
|
||||
{"origin": [23, 22.2, 5.7], "size": [2, 2, 2], "inflate": -0.1, "uv": [27, 154], "mirror": true},
|
||||
{"origin": [23.9, 21.7, 7.3], "size": [0, 2, 2], "uv": [117, 145], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck",
|
||||
"parent": "chest",
|
||||
"pivot": [0, 26, 3],
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "neck_mouth_closed",
|
||||
"parent": "neck",
|
||||
"pivot": [0, 26, 3],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 24, -0.5], "size": [7, 9, 6], "uv": [86, 91]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck_mouth_open",
|
||||
"parent": "neck",
|
||||
"pivot": [0, 26, 3],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 24, -0.5], "size": [7, 9, 6], "inflate": -0.01, "uv": [26, 95]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck_flair_top",
|
||||
"parent": "neck",
|
||||
"pivot": [0, 32, 5.5],
|
||||
"rotation": [7.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4, 26.5, 5.5], "size": [8, 7, 0], "uv": [102, 114]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck_flair_bottom",
|
||||
"parent": "neck",
|
||||
"pivot": [0, 32, -0.5],
|
||||
"rotation": [-7.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4, 27.5, -0.5], "size": [8, 5, 0], "pivot": [0, 32, -0.5], "rotation": [-10, 0, 0], "uv": [118, 118]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck_flair_left",
|
||||
"parent": "neck",
|
||||
"pivot": [3.5, 32, 2.5],
|
||||
"rotation": [0, 0, -8],
|
||||
"cubes": [
|
||||
{"origin": [3.5, 27.5, -1], "size": [0, 5, 7], "uv": [112, 70]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck_flair_right",
|
||||
"parent": "neck",
|
||||
"pivot": [-3.5, 32, 2.5],
|
||||
"rotation": [0, 0, 8],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 27.5, -1], "size": [0, 5, 7], "uv": [112, 82]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head",
|
||||
"parent": "neck",
|
||||
"pivot": [0, 33, 2],
|
||||
"rotation": [-35, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "head_ai",
|
||||
"parent": "head",
|
||||
"pivot": [0, 33, 2]
|
||||
},
|
||||
{
|
||||
"name": "head_angle",
|
||||
"parent": "head_ai",
|
||||
"pivot": [0, 33, 2],
|
||||
"cubes": [
|
||||
{"origin": [-4, 33, -3], "size": [8, 3, 8], "uv": [74, 32]},
|
||||
{"origin": [3.99, 35.5, -3], "size": [0, 3, 8], "uv": [0, 112]},
|
||||
{"origin": [-4, 35.5, -2.99], "size": [1, 1, 0], "uv": [32, 82]},
|
||||
{"origin": [-3.99, 35.5, -3], "size": [0, 3, 8], "uv": [112, 55]},
|
||||
{"origin": [3, 35.5, -2.99], "size": [1, 1, 0], "uv": [84, 61]},
|
||||
{"origin": [-3, 33, -7], "size": [6, 3, 4], "uv": [24, 110]},
|
||||
{"origin": [1, 35.5, -6.99], "size": [2, 2, 0], "uv": [82, 130]},
|
||||
{"origin": [2.99, 35.5, -7], "size": [0, 2, 4], "uv": [30, 123]},
|
||||
{"origin": [-3, 35.5, -6.99], "size": [2, 2, 0], "uv": [130, 94]},
|
||||
{"origin": [-2.99, 35.5, -7], "size": [0, 2, 4], "uv": [38, 123]},
|
||||
{"origin": [-4, 31, 1], "size": [8, 2, 4], "uv": [106, 0]},
|
||||
{"origin": [2.29, 31.2, -6.6], "size": [0, 2, 3], "pivot": [2.29, 33.2, -5.1], "rotation": [0, 25, 0], "uv": [126, 127]},
|
||||
{"origin": [-2.29, 31.2, -6.6], "size": [0, 2, 3], "pivot": [-2.29, 33.2, -5.1], "rotation": [0, -25, 0], "uv": [128, 11]},
|
||||
{"origin": [3.99, 31, -3], "size": [0, 2, 4], "uv": [44, 110]},
|
||||
{"origin": [-3.99, 31, -3], "size": [0, 2, 4], "uv": [70, 122]},
|
||||
{"origin": [-3.99, 32, -3], "size": [1, 1, 0], "uv": [32, 80]},
|
||||
{"origin": [2.99, 32, -3], "size": [1, 1, 0], "uv": [32, 81]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_head",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 36, -1.5],
|
||||
"locators": {
|
||||
"head": [0, 36, -1.5],
|
||||
"item_hat": [0, 36, -1.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 34.4, -7],
|
||||
"locators": {
|
||||
"face": [0, 34.4, -7],
|
||||
"item_face": [0, 34.4, -7]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_mouth",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 33, 1],
|
||||
"locators": {
|
||||
"mouth": [0, 33, 1],
|
||||
"special": [0, 33, 1]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_jaw_upper",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 33, -6.4],
|
||||
"locators": {
|
||||
"jaw1": [0, 33, -6.4]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyes",
|
||||
"parent": "head_angle",
|
||||
"pivot": [4, 34.2, -1.5]
|
||||
},
|
||||
{
|
||||
"name": "eye_left",
|
||||
"parent": "eyes",
|
||||
"pivot": [4, 34.2, -1.5],
|
||||
"cubes": [
|
||||
{"origin": [4, 33.2, -3], "size": [0, 2, 3], "inflate": 0.01, "uv": [70, 108]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [4, 34.2, -2],
|
||||
"locators": {
|
||||
"eye2": [4, 34.2, -2]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "pupil_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [3.5, 34.2, -2.1],
|
||||
"cubes": [
|
||||
{"origin": [3, 33.2, -2.4], "size": [1, 2, 1], "inflate": 0.02, "uv": [128, 63]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [0.9, 32.2, 2],
|
||||
"cubes": [
|
||||
{"origin": [2.9, 33.2, -2.9], "size": [1, 2, 3], "inflate": 0.03, "uv": [126, 28]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_angry_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [1, 32.7, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [3, 34.2, -3], "size": [1, 1, 1], "inflate": 0.03, "uv": [82, 104]},
|
||||
{"origin": [3, 34.7, -2.5], "size": [1, 1, 2], "inflate": 0.03, "uv": [128, 25]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_sad_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [0.9, 32.7, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [2.9, 34.7, -2], "size": [1, 1, 2], "inflate": 0.03, "uv": [128, 53]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_unamused_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [0.9, 32.7, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [2.9, 34.7, -2.89], "size": [1, 1, 3], "inflate": 0.03, "uv": [8, 127]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_happy_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [0.9, 32.2, 2],
|
||||
"cubes": [
|
||||
{"origin": [2.9, 33.2, -2.9], "size": [1, 2, 3], "inflate": 0.03, "uv": [126, 33]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_recoil_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [0.9, 32.2, 2],
|
||||
"cubes": [
|
||||
{"origin": [2.9, 33.2, -2.9], "size": [1, 2, 3], "inflate": 0.03, "uv": [126, 38]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_right",
|
||||
"parent": "eyes",
|
||||
"pivot": [-4, 34.2, -1.5],
|
||||
"cubes": [
|
||||
{"origin": [-4, 33.2, -3], "size": [0, 2, 3], "inflate": 0.01, "uv": [128, 16]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-4, 34.2, -2],
|
||||
"locators": {
|
||||
"eye1": [-4, 34.2, -2]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "pupil_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-3.5, 34.2, -2.1],
|
||||
"cubes": [
|
||||
{"origin": [-4, 33.2, -2.4], "size": [1, 2, 1], "inflate": 0.02, "uv": [130, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-0.9, 32.2, 2],
|
||||
"cubes": [
|
||||
{"origin": [-3.9, 33.2, -2.9], "size": [1, 2, 3], "inflate": 0.03, "uv": [62, 126]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_angry_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-1, 32.7, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [-4, 34.2, -3], "size": [1, 1, 1], "inflate": 0.03, "uv": [130, 96]},
|
||||
{"origin": [-4, 34.7, -2.5], "size": [1, 1, 2], "inflate": 0.03, "uv": [56, 128]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_sad_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-0.9, 32.7, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [-3.9, 34.7, -2], "size": [1, 1, 2], "inflate": 0.03, "uv": [128, 56]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_unamused_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-0.9, 32.7, 2.5],
|
||||
"cubes": [
|
||||
{"origin": [-3.9, 34.7, -2.89], "size": [1, 1, 3], "inflate": 0.03, "uv": [16, 127]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_happy_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-0.9, 32.2, 2],
|
||||
"cubes": [
|
||||
{"origin": [-3.9, 33.2, -2.9], "size": [1, 2, 3], "inflate": 0.03, "uv": [126, 70]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_recoil_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-0.9, 32.2, 2],
|
||||
"cubes": [
|
||||
{"origin": [-3.9, 33.2, -2.9], "size": [1, 2, 3], "inflate": 0.03, "uv": [126, 75]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head_hidden",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 32.5, 3],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 29.5, 0], "size": [7, 6, 5], "inflate": -0.02, "uv": [104, 17]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jaw",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 33, 2.5],
|
||||
"rotation": [-27.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4, 29, 0.5], "size": [8, 5, 2], "inflate": 0.01, "uv": [106, 36]},
|
||||
{"origin": [3.8, 28, 0.5], "size": [0, 6, 3], "inflate": 0.01, "pivot": [3.8, 31.5, 1], "rotation": [-2.81797, 27.47162, -1.30078], "uv": [64, 117]},
|
||||
{"origin": [-3.8, 28, 0.5], "size": [0, 6, 3], "inflate": 0.01, "pivot": [-3.8, 31.5, 1], "rotation": [-2.81797, -27.47162, 1.30078], "uv": [112, 121]},
|
||||
{"origin": [-3.5, 28.8, -1], "size": [7, 2, 4], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [106, 6]},
|
||||
{"origin": [-2, 30.3, -3], "size": [4, 2, 6], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [96, 106]},
|
||||
{"origin": [-2.5, 28.8, -4.5], "size": [5, 2, 4], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [112, 94]},
|
||||
{"origin": [2.5, 30.8, -3], "size": [0, 2, 2], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [98, 122]},
|
||||
{"origin": [2.5, 30.8, -1], "size": [1, 1, 0], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [84, 59]},
|
||||
{"origin": [3.5, 30.8, -1], "size": [0, 1, 1], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [32, 76]},
|
||||
{"origin": [-3.5, 30.8, -1], "size": [1, 1, 0], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [84, 60]},
|
||||
{"origin": [-3.5, 30.8, -1], "size": [0, 1, 1], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [32, 78]},
|
||||
{"origin": [-2.5, 30.8, -3], "size": [0, 2, 2], "inflate": 0.01, "pivot": [0, 29, 2.5], "rotation": [27.5, 0, 0], "uv": [128, 59]},
|
||||
{"origin": [2.5, 26.24473, -1.8992], "size": [0, 1, 1], "pivot": [2.5, 26.74473, -1.3992], "rotation": [-17.5, 0, 0], "uv": [32, 72]},
|
||||
{"origin": [-2.5, 26.24473, -1.8992], "size": [0, 1, 1], "pivot": [-2.5, 26.74473, -1.3992], "rotation": [-17.5, 0, 0], "uv": [32, 74]},
|
||||
{"origin": [-1.5, 27.36438, -4.54022], "size": [3, 2, 0], "pivot": [0, 27.36438, -4.54022], "rotation": [37.5, 0, 0], "uv": [76, 104]},
|
||||
{"origin": [1.5, 26.36438, -4.54022], "size": [0, 2, 1], "pivot": [0, 27.36438, -4.54022], "rotation": [37.5, 0, 0], "uv": [32, 66]},
|
||||
{"origin": [-1.5, 26.36438, -4.54022], "size": [0, 2, 1], "pivot": [0, 27.36438, -4.54022], "rotation": [37.5, 0, 0], "uv": [32, 69]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_jaw_lower",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, 27.59235, -4.11544],
|
||||
"rotation": [27.5, 0, 0],
|
||||
"locators": {
|
||||
"jaw2": {
|
||||
"offset": [0, 27.59235, -4.11544],
|
||||
"rotation": [-90, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "leg_left1",
|
||||
"parent": "body",
|
||||
"pivot": [4.5, 11, 0],
|
||||
"rotation": [-37.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [2.5, 3.5, -4], "size": [6, 9, 7], "uv": [74, 43]},
|
||||
{"origin": [2.5, 3.5, -4], "size": [6, 9, 7], "inflate": 0.25, "uv": [0, 83]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_left2",
|
||||
"parent": "leg_left1",
|
||||
"pivot": [5.5, 3.6, -0.5],
|
||||
"rotation": [-32.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [4, 1.6, -2.5], "size": [3, 4, 9], "uv": [52, 95]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "foot_left",
|
||||
"parent": "leg_left2",
|
||||
"pivot": [5.5, 5.6, 6],
|
||||
"rotation": [2.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [3, 0.6, 6], "size": [5, 5, 3], "inflate": -0.01, "uv": [70, 114]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_foot_secondary",
|
||||
"parent": "foot_left",
|
||||
"pivot": [5.5, 2.6, 7.5],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"foot_secondary": [5.5, 2.6, 7.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "toe_left1",
|
||||
"parent": "foot_left",
|
||||
"pivot": [5.5, 0.6, 8],
|
||||
"cubes": [
|
||||
{"origin": [4.5, -1.9, 6.9], "size": [2, 3, 2], "inflate": 0.1, "uv": [16, 112]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_claw_left1",
|
||||
"parent": "toe_left1",
|
||||
"pivot": [5.5, -2, 7],
|
||||
"cubes": [
|
||||
{"origin": [4.5, -4, 6.9], "size": [2, 2, 2], "uv": [126, 100]},
|
||||
{"origin": [5.5, -5.5, 6.9], "size": [0, 2, 2], "uv": [70, 128]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_left2",
|
||||
"parent": "foot_left",
|
||||
"pivot": [3.5, 1.1, 8],
|
||||
"cubes": [
|
||||
{"origin": [2.5, -1.4, 6.9], "size": [2, 3, 2], "inflate": 0.1, "uv": [46, 123]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_claw_left2",
|
||||
"parent": "toe_left2",
|
||||
"pivot": [3.5, -1.5, 7],
|
||||
"cubes": [
|
||||
{"origin": [2.5, -3.5, 6.9], "size": [2, 2, 2], "uv": [102, 126]},
|
||||
{"origin": [3.5, -5, 6.9], "size": [0, 2, 2], "uv": [74, 128]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_left3",
|
||||
"parent": "foot_left",
|
||||
"pivot": [7.5, 1.1, 8],
|
||||
"cubes": [
|
||||
{"origin": [6.5, -1.4, 6.9], "size": [2, 3, 2], "inflate": 0.1, "uv": [54, 123]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_claw_left3",
|
||||
"parent": "toe_left3",
|
||||
"pivot": [7.5, -1.5, 7],
|
||||
"cubes": [
|
||||
{"origin": [6.5, -3.5, 6.9], "size": [2, 2, 2], "uv": [126, 104]},
|
||||
{"origin": [7.5, -5, 6.9], "size": [0, 2, 2], "uv": [118, 128]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "spike_foot_left",
|
||||
"parent": "foot_left",
|
||||
"pivot": [5.5, 5.6, 7],
|
||||
"rotation": [27.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [5.5, 5.1, 6], "size": [0, 4, 2], "uv": [112, 100]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_right1",
|
||||
"parent": "body",
|
||||
"pivot": [-4.5, 11, 0],
|
||||
"rotation": [-37.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-8.5, 3.5, -4], "size": [6, 9, 7], "uv": [86, 59]},
|
||||
{"origin": [-8.5, 3.5, -4], "size": [6, 9, 7], "inflate": 0.25, "uv": [86, 75]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leg_right2",
|
||||
"parent": "leg_right1",
|
||||
"pivot": [-5.5, 3.6, -0.5],
|
||||
"rotation": [-32.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-7, 1.6, -2.5], "size": [3, 4, 9], "uv": [0, 99]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "foot_right",
|
||||
"parent": "leg_right2",
|
||||
"pivot": [-5.5, 5.6, 6],
|
||||
"rotation": [2.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-8, 0.6, 6], "size": [5, 5, 3], "inflate": -0.01, "uv": [86, 114]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_foot_primary",
|
||||
"parent": "foot_right",
|
||||
"pivot": [-5.5, 2.6, 7.5],
|
||||
"rotation": [90, 0, 0],
|
||||
"locators": {
|
||||
"foot_primary": [-5.5, 2.6, 7.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "toe_right1",
|
||||
"parent": "foot_right",
|
||||
"pivot": [-5.5, 0.6, 8],
|
||||
"cubes": [
|
||||
{"origin": [-6.5, -1.9, 6.9], "size": [2, 3, 2], "inflate": 0.1, "uv": [118, 123]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_claw_right1",
|
||||
"parent": "toe_right1",
|
||||
"pivot": [-5.5, -2, 7],
|
||||
"cubes": [
|
||||
{"origin": [-6.5, -4, 6.9], "size": [2, 2, 2], "uv": [126, 108]},
|
||||
{"origin": [-5.5, -5.5, 6.9], "size": [0, 2, 2], "uv": [122, 128]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_right2",
|
||||
"parent": "foot_right",
|
||||
"pivot": [-3.5, 1.1, 8],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, -1.4, 6.9], "size": [2, 3, 2], "inflate": 0.1, "uv": [124, 43]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_claw_right2",
|
||||
"parent": "toe_right2",
|
||||
"pivot": [-3.5, -1.5, 7],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, -3.5, 6.9], "size": [2, 2, 2], "uv": [126, 123]},
|
||||
{"origin": [-3.5, -5, 6.9], "size": [0, 2, 2], "uv": [30, 129]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_right3",
|
||||
"parent": "foot_right",
|
||||
"pivot": [-7.5, 1.1, 8],
|
||||
"cubes": [
|
||||
{"origin": [-8.5, -1.4, 6.9], "size": [2, 3, 2], "inflate": 0.1, "uv": [124, 48]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toe_claw_right3",
|
||||
"parent": "toe_right3",
|
||||
"pivot": [-7.5, -1.5, 7],
|
||||
"cubes": [
|
||||
{"origin": [-8.5, -3.5, 6.9], "size": [2, 2, 2], "uv": [0, 127]},
|
||||
{"origin": [-7.5, -5, 6.9], "size": [0, 2, 2], "uv": [34, 129]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "spike_foot_right",
|
||||
"parent": "foot_right",
|
||||
"pivot": [-5.5, 5.6, 7],
|
||||
"rotation": [27.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-5.5, 5.1, 6], "size": [0, 4, 2], "uv": [52, 128]}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+2
-2
@@ -69,13 +69,13 @@
|
||||
{"origin": [-25.5, 35.75, 5.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [236, 85]},
|
||||
{"origin": [-25.5, 36.75, 6.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [242, 85]},
|
||||
{"origin": [-25.5, 38.75, 8.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [242, 89]},
|
||||
{"origin": [-25.5, 40.75, 9.5], "size": [1, 1, 1], "pivot": [-27, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [240, 77]},
|
||||
{"origin": [-26, 40.75, 9.5], "size": [1, 1, 1], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [240, 77]},
|
||||
{"origin": [-25.5, 39.75, 10.5], "size": [1, 5, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [236, 93]},
|
||||
{"origin": [-25.5, 39.75, 12.5], "size": [1, 3, 1], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 95]},
|
||||
{"origin": [-25.5, 40.75, 13.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 77]},
|
||||
{"origin": [-25.5, 41.75, 14.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 81]},
|
||||
{"origin": [-25.5, 42.75, 15.5], "size": [1, 4, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [242, 93]},
|
||||
{"origin": [-25.5, 44.75, 11.5], "size": [1, 1, 1], "pivot": [-27, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [246, 77]},
|
||||
{"origin": [-26, 44.75, 11.5], "size": [1, 1, 1], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [246, 77]},
|
||||
{"origin": [-25.5, 32.75, 3.5], "size": [1, 3, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 85]},
|
||||
{"origin": [-25.5, 37.75, 7.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [236, 89]},
|
||||
{"origin": [-25.5, 38.75, 4.5], "size": [1, 2, 3], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [247, 117]},
|
||||
|
||||
+2
-10
@@ -7,8 +7,8 @@
|
||||
"texture_width": 128,
|
||||
"texture_height": 128,
|
||||
"visible_bounds_width": 6,
|
||||
"visible_bounds_height": 5,
|
||||
"visible_bounds_offset": [0, 1.5, 0]
|
||||
"visible_bounds_height": 4.5,
|
||||
"visible_bounds_offset": [0, 1.75, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
@@ -480,14 +480,6 @@
|
||||
{"origin": [-4.5, 24.5, 26.5], "size": [9, 9, 7], "uv": [66, 109]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"seat_1": [0, 30, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "legs",
|
||||
"parent": "body",
|
||||
|
||||
+2
-16
@@ -99,14 +99,7 @@
|
||||
"poseTypes": ["FLY"],
|
||||
"isBattle": false,
|
||||
"condition": "!q.is_gliding",
|
||||
"animations": [
|
||||
"q.look('head_ai')",
|
||||
"q.bedrock('charizard', 'air_fly')",
|
||||
{
|
||||
"condition": "q.is_ridden",
|
||||
"animation": "q.bedrock('charizard', 'ride_air_look')"
|
||||
}
|
||||
],
|
||||
"animations": ["q.look('head_ai')", "q.bedrock('charizard', 'air_fly')"],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('charizard', 'blink')",
|
||||
"q.bedrock_quirk('charizard', 'air_fly_quirk')"
|
||||
@@ -116,14 +109,7 @@
|
||||
"poseTypes": ["FLY"],
|
||||
"isBattle": false,
|
||||
"condition": "q.is_gliding",
|
||||
"animations": [
|
||||
"q.look('head_ai')",
|
||||
"q.bedrock('charizard', 'air_glide_TEST')",
|
||||
{
|
||||
"condition": "q.is_ridden",
|
||||
"animation": "q.bedrock('charizard', 'ride_air_look')"
|
||||
}
|
||||
],
|
||||
"animations": ["q.look('head_ai')", "q.bedrock('charizard', 'air_glide_TEST')"],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('charizard', 'blink')"
|
||||
]
|
||||
|
||||
+27
-41
@@ -1,46 +1,32 @@
|
||||
{
|
||||
"portraitScale": 1.94,
|
||||
"portraitTranslation": [-0.32, -0.41, 0],
|
||||
"profileScale": 0.77,
|
||||
"profileTranslation": [0, 0.6, 0],
|
||||
"rootBone": "eevee",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('eevee', 'cry')"
|
||||
},
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": [
|
||||
"STAND",
|
||||
"NONE",
|
||||
"PORTRAIT",
|
||||
"PROFILE",
|
||||
"FLOAT"
|
||||
],
|
||||
"isBattle": false,
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('eevee', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('eevee', 'blink')"
|
||||
]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": [
|
||||
"WALK",
|
||||
"SWIM"
|
||||
],
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('eevee', 'ground_idle')",
|
||||
"q.quadruped_walk(0.66, 1.4, 'front_leg_left', 'front_leg_right', 'back_leg_left', 'back_leg_right')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('eevee', 'blink')"
|
||||
]
|
||||
"portraitScale": 1.94,
|
||||
"portraitTranslation": [-0.32, -0.41, 0],
|
||||
"profileScale": 0.77,
|
||||
"profileTranslation": [0, 0.6, 0],
|
||||
"animations": {},
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE", "FLOAT"],
|
||||
"isBattle": false,
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('eevee', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('eevee', 'blink')"
|
||||
]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": ["WALK", "SWIM"],
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('eevee', 'ground_idle')",
|
||||
"q.quadruped_walk(0.66, 1.4, 'front_leg_left', 'front_leg_right', 'back_leg_left', 'back_leg_right')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('eevee', 'blink')"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+27
-41
@@ -1,46 +1,32 @@
|
||||
{
|
||||
"portraitScale": 2.08,
|
||||
"portraitTranslation": [-0.7, -0.37, 0],
|
||||
"profileScale": 0.85,
|
||||
"profileTranslation": [0, 0.45, 0],
|
||||
"rootBone": "vaporeon",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('vaporeon', 'cry')"
|
||||
},
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": [
|
||||
"STAND",
|
||||
"NONE",
|
||||
"PORTRAIT",
|
||||
"PROFILE",
|
||||
"FLOAT"
|
||||
],
|
||||
"isBattle": false,
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('vaporeon', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('vaporeon', 'blink')"
|
||||
]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": [
|
||||
"WALK",
|
||||
"SWIM"
|
||||
],
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('vaporeon', 'ground_idle')",
|
||||
"q.quadruped_walk(0.66, 1.4, 'frontleg_left', 'frontleg_right', 'back_leg_left', 'back_leg_right')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('vaporeon', 'blink')"
|
||||
]
|
||||
"portraitScale": 2.08,
|
||||
"portraitTranslation": [-0.7, -0.37, 0],
|
||||
"profileScale": 0.85,
|
||||
"profileTranslation": [0, 0.45, 0],
|
||||
"animations": {},
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE", "FLOAT"],
|
||||
"isBattle": false,
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('vaporeon', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('vaporeon', 'blink')"
|
||||
]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": ["WALK", "SWIM"],
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('vaporeon', 'ground_idle')",
|
||||
"q.quadruped_walk(0.66, 1.4, 'frontleg_left', 'frontleg_right', 'back_leg_left', 'back_leg_right')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('vaporeon', 'blink')"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+27
-49
@@ -1,54 +1,32 @@
|
||||
{
|
||||
"portraitScale": 2.14,
|
||||
"portraitTranslation": [-0.75, -0.11, 0],
|
||||
"profileScale": 0.75,
|
||||
"profileTranslation": [0, 0.62, 0],
|
||||
"rootBone": "jolteon",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('jolteon', 'cry')"
|
||||
},
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": [
|
||||
"STAND",
|
||||
"NONE",
|
||||
"PORTRAIT",
|
||||
"PROFILE",
|
||||
"FLOAT"
|
||||
],
|
||||
"isBattle": false,
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('jolteon', 'ground_idle')",
|
||||
{
|
||||
"condition": "q.is_holding_item",
|
||||
"animation": "q.bedrock('jolteon', 'hold_item')"
|
||||
}
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('jolteon', 'blink')"
|
||||
]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": [
|
||||
"WALK",
|
||||
"SWIM"
|
||||
],
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('jolteon', 'ground_idle')",
|
||||
"q.quadruped_walk(0.66, 1.4, 'front_leg_left', 'front_leg_right', 'backleg_left', 'backleg_right')",
|
||||
{
|
||||
"condition": "q.is_holding_item",
|
||||
"animation": "q.bedrock('jolteon', 'hold_item')"
|
||||
}
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('jolteon', 'blink')"
|
||||
]
|
||||
"portraitScale": 2.14,
|
||||
"portraitTranslation": [-0.75, -0.11, 0],
|
||||
"profileScale": 0.75,
|
||||
"profileTranslation": [0, 0.62, 0],
|
||||
"animations": {},
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE", "FLOAT"],
|
||||
"isBattle": false,
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('jolteon', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('jolteon', 'blink')"
|
||||
]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": ["WALK", "SWIM"],
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 70, -45, 45, -45)",
|
||||
"q.bedrock('jolteon', 'ground_idle')",
|
||||
"q.quadruped_walk(0.66, 1.4, 'front_leg_left', 'front_leg_right', 'backleg_left', 'backleg_right')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('jolteon', 'blink')"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user