forked from mirrors/cobblemon
Compare commits
90
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ccd0bbe11 | ||
|
|
d289880cc8 | ||
|
|
6609c7d038 | ||
|
|
88afe05c16 | ||
|
|
99aa25e1bf | ||
|
|
76faa50035 | ||
|
|
8ce989cb6b | ||
|
|
02030950aa | ||
|
|
6148b58fdc | ||
|
|
1e4936aeac | ||
|
|
15ea72e777 | ||
|
|
3c3d4e4552 | ||
|
|
796e416578 | ||
|
|
7608dfde94 | ||
|
|
b2b871617a | ||
|
|
bc4c8d13b7 | ||
|
|
0f9c51f7dd | ||
|
|
2c2623e0f9 | ||
|
|
8ec85e7d2f | ||
|
|
d5a08314eb | ||
|
|
062c32be2a | ||
|
|
09590b49cd | ||
|
|
420cbd2c99 | ||
|
|
0380013f37 | ||
|
|
6c1fcc103a | ||
|
|
59b01c3988 | ||
|
|
678fa2d0ce | ||
|
|
94abd79923 | ||
|
|
0a1931aaae | ||
|
|
85d76dcc29 | ||
|
|
bd0a9ef654 | ||
|
|
7a702e276c | ||
|
|
3f9a2825cb | ||
|
|
d1462bc27b | ||
|
|
211b14dbd0 | ||
|
|
47e83003c3 | ||
|
|
59134c4212 | ||
|
|
44b434562c | ||
|
|
7af9b0854a | ||
|
|
344b0750f9 | ||
|
|
10d9d97c11 | ||
|
|
94bcfba076 | ||
|
|
69a75ffcd4 | ||
|
|
cc1317dd06 | ||
|
|
e15ac73b1b | ||
|
|
6c6576c117 | ||
|
|
ebdfa7edc0 | ||
|
|
297e8eae77 | ||
|
|
ea8179018d | ||
|
|
14fccfae1d | ||
|
|
26386638ad | ||
|
|
5d1d99b64a | ||
|
|
a3c5a6c377 | ||
|
|
eb2a5837eb | ||
|
|
93298d9a87 | ||
|
|
abb5346305 | ||
|
|
9466f66721 | ||
|
|
716ea55bc7 | ||
|
|
4d1f46c37c | ||
|
|
15f0ad1821 | ||
|
|
a2101b5759 | ||
|
|
187a190ec6 | ||
|
|
0d433ff394 | ||
|
|
a16975c750 | ||
|
|
c0e6d87c40 | ||
|
|
91078b917e | ||
|
|
b7e27fa52a | ||
|
|
dc87ffd2a8 | ||
|
|
d873399d05 | ||
|
|
a7aab51e0d | ||
|
|
e8e2057558 | ||
|
|
56b5dba911 | ||
|
|
f0a66458e5 | ||
|
|
dba6a38f9e | ||
|
|
342c0041e9 | ||
|
|
cbeda361d4 | ||
|
|
a811b3347c | ||
|
|
80e593f5c6 | ||
|
|
ff617348fe | ||
|
|
1adecbf5f6 | ||
|
|
29dbb13a0e | ||
|
|
67e03ecebd | ||
|
|
215f48bdc7 | ||
|
|
d4beab1bfb | ||
|
|
f2c21ec902 | ||
|
|
c9f3912677 | ||
|
|
c21b7d1a7d | ||
|
|
26068694ad | ||
|
|
079a2fb50d | ||
|
|
5b5dcddb25 |
+37
-10
@@ -42,9 +42,8 @@
|
||||
- All ruin structures gilded chest loot tables have been updated to include a guaranteed TM not learned naturally by any Pokémon through their level-up moveset. Each ruin gets its own specific TM, so you can now go hunting ruins to complete your move dex!
|
||||
- All fossil structures have been transferred over to biome features, allowing for better placement in generation.
|
||||
- The prehistoric_underwater_fissure & prehistoric_submerged_impact fossil structures now use the biome tag `#cobblemon:is_temperate_ocean`.
|
||||
- A new Biome tag called `#cobblemon:is_stony_beach` has been added.
|
||||
- Gimmighoul towers now generate at ground level rather than sinking one block into the ground.
|
||||
- 1 New shipwreck cove structure called the "magma_shipwreck_cove" has been added.
|
||||
- A new shipwreck cove structure called the "magma_shipwreck_cove" has been added.
|
||||
- Shipwreck coves now generate slightly more frequently.
|
||||
- Added equipment loot tables for shipwreck cove enemies.
|
||||
- Maps from abandoned fishing boats leading to shipwreck coves now will skip explored chunks, allowing the player to find more shipwreck coves easier.
|
||||
@@ -57,6 +56,7 @@
|
||||
- Pokémon cries now play when clicking Pokémon in the summary screen.
|
||||
- Pressing the Summary key while either the starter selection or summary screen are open now closes those screens
|
||||
- Ice type Pokémon are now immune to Packed Snow
|
||||
- Held item visibility can now be controlled by the held_item_visible command argument.
|
||||
|
||||
### New rideable Pokémon
|
||||
- Drampa
|
||||
@@ -68,6 +68,7 @@
|
||||
- Milotic
|
||||
|
||||
### Pokémon Added
|
||||
#### Generation 3
|
||||
- Wurmple
|
||||
- Silcoon
|
||||
- Beautifly
|
||||
@@ -77,18 +78,27 @@
|
||||
- Delcatty
|
||||
- Seviper
|
||||
- Zangoose
|
||||
|
||||
#### Generation 4
|
||||
- Cherubi
|
||||
- Cherrim
|
||||
- Stunky
|
||||
- Skuntank
|
||||
|
||||
#### Generation 5
|
||||
- Audino
|
||||
- Pawniard
|
||||
- Bisharp
|
||||
- Kingambit
|
||||
|
||||
#### Generation 6
|
||||
- Pancham (+ Cosmetic with Black Glasses)
|
||||
- Pangoro (+ Cosmetic with Black Glasses)
|
||||
|
||||
#### Generation 7
|
||||
- Rockruff
|
||||
- Lycanroc
|
||||
|
||||
#### Generation 8
|
||||
- Rolycoly
|
||||
- Carkol
|
||||
- Coalossal
|
||||
@@ -97,20 +107,24 @@
|
||||
- Frosmoth
|
||||
- Indeedee
|
||||
- Duraludon
|
||||
- Archaludon
|
||||
- Applin
|
||||
- Flapple
|
||||
- Appletun
|
||||
- Dipplin
|
||||
- Hydrapple
|
||||
|
||||
#### Generation 9
|
||||
|
||||
- Nymble
|
||||
- Lokix
|
||||
- Kingambit
|
||||
- Dipplin
|
||||
- Archaludon
|
||||
- Hydrapple
|
||||
|
||||
#### Regional Forms
|
||||
- Sandshrew (Alolan)
|
||||
- Sandslash (Alolan)
|
||||
- Yamask (Galarian)
|
||||
- Avalugg (Hisuian)
|
||||
- Sandshrew (Alolan Form)
|
||||
- Sandslash (Alolan Form)
|
||||
- Yamask (Galarian Form)
|
||||
- Avalugg (Hisuian Form)
|
||||
|
||||
### Model updates for the following Pokémon
|
||||
|
||||
@@ -125,6 +139,7 @@
|
||||
- Porygon2
|
||||
- Porygon-Z
|
||||
- Skarmory
|
||||
- Smoochum
|
||||
- Jynx
|
||||
- Popplio
|
||||
- Brionne
|
||||
@@ -147,6 +162,7 @@
|
||||
- Cofagrigus
|
||||
- Tyranitar
|
||||
- Turtonator
|
||||
- Arbok (New Patterns: Angry, Cartoon, Clown, Comedic, Crow, Grin, Ink, Modern, Rain, Scribble, Silence, Sloth, Suspicious, Will)
|
||||
|
||||
#### Model changes to the regional bias resource pack:
|
||||
|
||||
@@ -284,6 +300,13 @@
|
||||
- Regional Foods will now prioritize being eaten instead of used for healing Pokémon, shift clicking will use it as healing
|
||||
- Resolved Z-Fighting on Pokédex Models
|
||||
- Restored Ninjask's ability to do barrel rolls
|
||||
- Fixed a crash caused by adding enchanted items to the Resurrection Machine
|
||||
- Fixed a crash that could occur when starting a PvN battle with only fainted Pokémon.
|
||||
- Fixed the Remember Riding Camera config not being respected when dismounting and resolved the incompatibility with the Auto Third Person mod
|
||||
- Fixed Full Heal block not dropping Full Heals
|
||||
- Fixed status cure items not returning an empty bottle when used
|
||||
- Fixed Panpour consuming its held item when evolving with a Water Stone
|
||||
- Fixed Smoked Tail Curry returning a Wooden Bowl when consumed despite it not being included in the recipe
|
||||
|
||||
### Fixes
|
||||
- Fixed Croagunk's walkspeed
|
||||
@@ -334,6 +357,8 @@
|
||||
- Fixed Guilded chests being more accessible than intended
|
||||
- Fixed fished up Pokémon not being added as "seen" to the Pokedex
|
||||
- Fixed surprised Gimmighoul encounters not being added as "seen" to the Pokedex
|
||||
- Fixed a crash involving berry trees that have been world edited.
|
||||
- Fixed visual desync in multiplayer for players mounting Pokémon outside other players' loaded chunks
|
||||
|
||||
### Developer
|
||||
- Added `PokeSnackSpawnerFactory` which allows influence registration on PokeSnack encounters
|
||||
@@ -344,6 +369,8 @@
|
||||
- Separated all the functions of MoLangFunctions.kt into their own files.
|
||||
- Spawn buckets and their base weights are now provided by the spawner, with different base weights for world, fishing, snack, and habitat spawn buckets.
|
||||
- Removed "SpawnBucket" class in favour of just storing maps of bucket names to weights.
|
||||
- Fixed nicknames not being applied to Pokémon spawned from `spawn_pool_world` files.
|
||||
- Added support for `profilePokedexScale`, `profilePokedexTranslation`, `profileSummaryScale`, and `profileSummaryTranslation` in poser files for finer control over profile displays.
|
||||
|
||||
### Molang & Datapacks
|
||||
- Added `moveset_builders` datapack folder for different styles of movesets.
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.mixin;
|
||||
|
||||
import com.cobblemon.mod.common.mixin.accessor.SinglePoolElementAccessor;
|
||||
import com.cobblemon.mod.common.world.structureprocessors.HeightRangeStructureProcessor;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.level.levelgen.Heightmap;
|
||||
import net.minecraft.world.level.levelgen.structure.Structure;
|
||||
import net.minecraft.world.level.levelgen.structure.pools.*;
|
||||
import net.minecraft.world.level.levelgen.structure.pools.alias.PoolAliasLookup;
|
||||
import net.minecraft.world.level.levelgen.structure.templatesystem.LiquidSettings;
|
||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor;
|
||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@Mixin(JigsawPlacement.class)
|
||||
public class JigsawPlacementMixin {
|
||||
|
||||
@Inject(
|
||||
method = "addPieces(Lnet/minecraft/world/level/levelgen/structure/Structure$GenerationContext;Lnet/minecraft/core/Holder;Ljava/util/Optional;ILnet/minecraft/core/BlockPos;ZLjava/util/Optional;ILnet/minecraft/world/level/levelgen/structure/pools/alias/PoolAliasLookup;Lnet/minecraft/world/level/levelgen/structure/pools/DimensionPadding;Lnet/minecraft/world/level/levelgen/structure/templatesystem/LiquidSettings;)Ljava/util/Optional;",
|
||||
at = @At("RETURN"),
|
||||
cancellable = true
|
||||
)
|
||||
private static void onAddPieces(
|
||||
Structure.GenerationContext context,
|
||||
Holder<StructureTemplatePool> startPool,
|
||||
Optional<ResourceLocation> startJigsawName,
|
||||
int maxDepth,
|
||||
BlockPos pos,
|
||||
boolean useExpansionHack,
|
||||
Optional<Heightmap.Types> projectStartToHeightmap,
|
||||
int maxDistanceFromCenter,
|
||||
PoolAliasLookup aliasLookup,
|
||||
DimensionPadding dimensionPadding,
|
||||
LiquidSettings liquidSettings,
|
||||
CallbackInfoReturnable<Optional<Structure.GenerationStub>> cir
|
||||
) {
|
||||
Optional<Structure.GenerationStub> result = cir.getReturnValue();
|
||||
if (result.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
BlockPos spawnPos = result.get().position();
|
||||
boolean canPlace = cobblemon$canAnyStartElementPlace(context, startPool, spawnPos);
|
||||
|
||||
if (canPlace) {
|
||||
return;
|
||||
}
|
||||
|
||||
cir.setReturnValue(Optional.empty());
|
||||
}
|
||||
|
||||
@Unique
|
||||
private static boolean cobblemon$canAnyStartElementPlace(
|
||||
Structure.GenerationContext generationContext,
|
||||
Holder<StructureTemplatePool> startPool,
|
||||
BlockPos startPos
|
||||
) {
|
||||
for (StructurePoolElement element : startPool.value().templates) {
|
||||
Optional<HeightRangeStructureProcessor> heightRangeProcessor = cobblemon$getHeightRangeProcessor(element);
|
||||
|
||||
if (heightRangeProcessor.isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
HeightRangeStructureProcessor processor = heightRangeProcessor.get();
|
||||
boolean valid = processor.isValidPlacement(
|
||||
generationContext.chunkGenerator(),
|
||||
generationContext.heightAccessor(),
|
||||
generationContext.randomState(),
|
||||
startPos
|
||||
);
|
||||
|
||||
if (valid) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private static Optional<HeightRangeStructureProcessor> cobblemon$getHeightRangeProcessor(StructurePoolElement element) {
|
||||
if (!(element instanceof SinglePoolElement)) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
StructureProcessorList processorList = ((SinglePoolElementAccessor) element).getProcessors().value();
|
||||
for (StructureProcessor processor : processorList.list()) {
|
||||
if (processor instanceof HeightRangeStructureProcessor heightRangeStructureProcessor) {
|
||||
return Optional.of(heightRangeStructureProcessor);
|
||||
}
|
||||
}
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.mixin.accessor;
|
||||
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.world.level.levelgen.structure.pools.SinglePoolElement;
|
||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(SinglePoolElement.class)
|
||||
public interface SinglePoolElementAccessor {
|
||||
@Accessor("processors")
|
||||
Holder<StructureProcessorList> getProcessors();
|
||||
}
|
||||
|
||||
@@ -108,6 +108,7 @@ import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
||||
import com.cobblemon.mod.common.pokemon.properties.AspectPropertyType
|
||||
import com.cobblemon.mod.common.pokemon.properties.BattleCloneProperty
|
||||
import com.cobblemon.mod.common.pokemon.properties.FreezeFrameProperty
|
||||
import com.cobblemon.mod.common.pokemon.properties.HeldItemVisibleProperty
|
||||
import com.cobblemon.mod.common.pokemon.properties.HiddenAbilityPropertyType
|
||||
import com.cobblemon.mod.common.pokemon.properties.LabelProperty
|
||||
import com.cobblemon.mod.common.pokemon.properties.NoAIProperty
|
||||
@@ -308,7 +309,9 @@ object Cobblemon {
|
||||
this.config.maxPokemonLevel,
|
||||
this.config.maxPokemonFriendship,
|
||||
this.config.maxDynamaxLevel,
|
||||
this.config.unlockAllMoveDexMovesByDefault
|
||||
this.config.unlockAllMoveDexMovesByDefault,
|
||||
this.config.pokemonIntrinsicSizeMin,
|
||||
this.config.pokemonIntrinsicSizeMax
|
||||
).sendToPlayer(player)
|
||||
}
|
||||
|
||||
@@ -348,6 +351,7 @@ object Cobblemon {
|
||||
CustomPokemonProperty.register(UnaspectPropertyType)
|
||||
CustomPokemonProperty.register(FreezeFrameProperty)
|
||||
CustomPokemonProperty.register(NoAIProperty)
|
||||
CustomPokemonProperty.register(HeldItemVisibleProperty)
|
||||
|
||||
CobblemonEvents.POKEMON_PROPERTY_INITIALISED.emit(Unit)
|
||||
|
||||
|
||||
@@ -405,7 +405,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
@JvmField
|
||||
val BIG_MALASADA = regionalFoodItem("big_malasada", 64, 7, 0.3f, false)
|
||||
@JvmField
|
||||
val SMOKED_TAIL_CURRY = regionalFoodItem("smoked_tail_curry", 64, 10, 0.6f, false, ItemStack(Items.BOWL, 1))
|
||||
val SMOKED_TAIL_CURRY = regionalFoodItem("smoked_tail_curry", 64, 10, 0.6f, false)
|
||||
@JvmField
|
||||
val JUBILIFE_MUFFIN = regionalFoodItem("jubilife_muffin", 64, 7, 0.3f, false)
|
||||
@JvmField
|
||||
|
||||
@@ -35,6 +35,7 @@ import com.cobblemon.mod.common.client.net.gui.PokedexUIPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.gui.SetActiveTMPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.gui.SetTMMachineContainerDataPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.gui.SummaryUIPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.gui.SynchronizeActiveTMHandler
|
||||
import com.cobblemon.mod.common.client.net.habitat.OpenHabitatBlockEditorHandler
|
||||
import com.cobblemon.mod.common.client.net.npc.CloseNPCEditorHandler
|
||||
import com.cobblemon.mod.common.client.net.npc.OpenNPCEditorHandler
|
||||
@@ -131,6 +132,7 @@ import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.ChangeP
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.RequestPCBoxWallpapersPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.SetPCBoxWallpapersPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.UnlockPCBoxWallpaperPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.tms.TechnicalMachineRegistrySyncPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.toast.ToastPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeAcceptanceChangedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeCancelledPacket
|
||||
@@ -146,6 +148,7 @@ import com.cobblemon.mod.common.net.messages.client.ui.PokedexUIPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.SetActiveTMPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.SetTMMachineContainerDataPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.BattleChallengePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.BattleChallengeResponsePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.BenchMovePacket
|
||||
@@ -374,6 +377,7 @@ object CobblemonNetwork {
|
||||
list.add(PacketRegisterInfo(PlayerInteractOptionsPacket.ID, PlayerInteractOptionsPacket::decode, PlayerInteractOptionsHandler))
|
||||
list.add(PacketRegisterInfo(PokedexUIPacket.ID, PokedexUIPacket::decode, PokedexUIPacketHandler))
|
||||
list.add(PacketRegisterInfo(ExpGainedDataPacket.ID, ExpGainedDataPacket::decode, ExpGainedDataPacketHandler))
|
||||
list.add(PacketRegisterInfo(SynchronizeActiveTMPacket.ID, SynchronizeActiveTMPacket::decode, SynchronizeActiveTMHandler))
|
||||
|
||||
// Starter packets
|
||||
list.add(PacketRegisterInfo(OpenStarterUIPacket.ID, OpenStarterUIPacket::decode, StarterUIPacketHandler))
|
||||
@@ -439,6 +443,7 @@ object CobblemonNetwork {
|
||||
list.add(PacketRegisterInfo(BehaviourSyncPacket.ID, BehaviourSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(MarkRegistrySyncPacket.ID, MarkRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(RideSettingsSyncPacket.ID, RideSettingsSyncPacket::decode, RideSettingsSyncHandler))
|
||||
list.add(PacketRegisterInfo(TechnicalMachineRegistrySyncPacket.ID, TechnicalMachineRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
|
||||
// Effects
|
||||
list.add(PacketRegisterInfo(SpawnSnowstormParticlePacket.ID, SpawnSnowstormParticlePacket::decode, SpawnSnowstormParticleHandler))
|
||||
|
||||
@@ -69,7 +69,7 @@ class HabitatPool {
|
||||
pool.spawns = spawns
|
||||
return pool
|
||||
} else {
|
||||
return HabitatPools.habitatPoolsById[poolId] ?: HabitatPool.default()
|
||||
return HabitatPools.habitatPoolsById[poolId] ?: default()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -94,6 +94,14 @@ class HabitatPool {
|
||||
return spawns.mapNotNull { it.createSpawnDetail(habitatBlockEntity) }
|
||||
}
|
||||
|
||||
fun getPhaseCount(): Int {
|
||||
return spawns
|
||||
.flatMap { it.phases?.ranges?.flatten() ?: emptySet() }
|
||||
.toSet()
|
||||
.count()
|
||||
.coerceAtLeast(1)
|
||||
}
|
||||
|
||||
fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeResourceLocation(id)
|
||||
buffer.writeUtf(name)
|
||||
|
||||
@@ -17,7 +17,6 @@ import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
|
||||
class HabitatSettingsDTO() {
|
||||
var numberOfPhases = 1
|
||||
var phaseOrder = HabitatPhaseOrder.SIMPLE
|
||||
lateinit var levelRange: IntRange
|
||||
var modifiers: String = ""
|
||||
@@ -28,7 +27,6 @@ class HabitatSettingsDTO() {
|
||||
var naturalSettings: NaturalHabitatSettingsDTO? = null
|
||||
|
||||
constructor(habitatBlockEntity: HabitatBlockEntity) : this() {
|
||||
this.numberOfPhases = habitatBlockEntity.numberOfPhases
|
||||
this.phaseOrder = habitatBlockEntity.phaseOrder
|
||||
this.levelRange = habitatBlockEntity.levelRange
|
||||
this.modifiers = habitatBlockEntity.modifiers.asString()
|
||||
@@ -44,7 +42,6 @@ class HabitatSettingsDTO() {
|
||||
}
|
||||
|
||||
fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeInt(numberOfPhases)
|
||||
buffer.writeEnum(phaseOrder)
|
||||
buffer.writeInt(levelRange.first)
|
||||
buffer.writeInt(levelRange.last)
|
||||
@@ -60,7 +57,6 @@ class HabitatSettingsDTO() {
|
||||
}
|
||||
|
||||
fun decode(buffer: RegistryFriendlyByteBuf) {
|
||||
this.numberOfPhases = buffer.readInt()
|
||||
this.phaseOrder = buffer.readEnum(HabitatPhaseOrder::class.java)
|
||||
val levelRangeStart = buffer.readInt()
|
||||
val levelRangeEnd = buffer.readInt()
|
||||
|
||||
@@ -759,6 +759,7 @@ open class PokemonProperties {
|
||||
shiny?.let { json.addProperty(DataKeys.POKEMON_SHINY, it) }
|
||||
gender?.let { json.addProperty(DataKeys.POKEMON_GENDER, it.name) }
|
||||
species?.let { json.addProperty(DataKeys.POKEMON_SPECIES_TEXT, it) }
|
||||
nickname?.let { json.addProperty(DataKeys.POKEMON_NICKNAME, it.string) }
|
||||
form?.let { json.addProperty(DataKeys.POKEMON_FORM_ID, it) }
|
||||
friendship?.let { json.addProperty(DataKeys.POKEMON_FRIENDSHIP, it) }
|
||||
fullness?.let { json.addProperty(DataKeys.POKEMON_FULLNESS, it) }
|
||||
@@ -795,6 +796,7 @@ open class PokemonProperties {
|
||||
shiny = json.get(DataKeys.POKEMON_SHINY)?.asBoolean
|
||||
gender = json.get(DataKeys.POKEMON_GENDER)?.asString?.let { Gender.valueOf(it) }
|
||||
species = json.get(DataKeys.POKEMON_SPECIES_TEXT)?.asString
|
||||
nickname = json.get(DataKeys.POKEMON_NICKNAME)?.asString?.let(Component::literal)
|
||||
form = json.get(DataKeys.POKEMON_FORM_ID)?.asString
|
||||
friendship = json.get(DataKeys.POKEMON_FRIENDSHIP)?.asInt
|
||||
fullness = json.get(DataKeys.POKEMON_FULLNESS)?.asInt
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||
import com.cobblemon.mod.common.api.moves.MoveTemplate
|
||||
import com.cobblemon.mod.common.api.moves.adapters.MoveTemplateAdapter
|
||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||
import com.cobblemon.mod.common.net.messages.client.tms.TechnicalMachineRegistrySyncPacket
|
||||
import com.cobblemon.mod.common.util.adapters.TMObtainMethodAdapter
|
||||
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
@@ -70,5 +71,7 @@ object TechnicalMachines : JsonDataRegistry<TechnicalMachine> {
|
||||
|
||||
fun getByResourceLocation(resourceLocation: ResourceLocation) = tmMap[resourceLocation]
|
||||
fun getAllResourceLocations() = tmMap.keys.toSet()
|
||||
override fun sync(player: ServerPlayer) {}
|
||||
override fun sync(player: ServerPlayer) {
|
||||
TechnicalMachineRegistrySyncPacket(tmMap.values.toList()).sendToPlayer(player)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,11 +349,12 @@ object BattleBuilder {
|
||||
npcPartyStores.add(npcParty)
|
||||
}
|
||||
|
||||
if (playerActor.pokemonList.size < battleFormat.battleType.slotsPerActor) {
|
||||
val playerAvailablePokemon = playerActor.pokemonList.count { it.health > 0 }
|
||||
if (playerAvailablePokemon < battleFormat.battleType.slotsPerActor) {
|
||||
errors.participantErrors[playerActor] += BattleStartError.insufficientPokemon(
|
||||
actorEntity = player,
|
||||
requiredCount = battleFormat.battleType.slotsPerActor,
|
||||
hadCount = playerActor.pokemonList.size
|
||||
hadCount = playerAvailablePokemon
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+4
-2
@@ -163,7 +163,8 @@ class TrackerActor(val uuid: UUID) {
|
||||
//we assume that AI knows it all about our allies
|
||||
trackerActor.party.addAll(actor.pokemonList.map { createAllied(it) })
|
||||
actor.activePokemon.forEach {
|
||||
val active = trackerActor.party.first { trackMon -> trackMon.id == it.battlePokemon!!.uuid }
|
||||
val battlePokemon = it.battlePokemon ?: return@forEach
|
||||
val active = trackerActor.party.first { trackMon -> trackMon.id == battlePokemon.uuid }
|
||||
trackerActor.party.remove(active)
|
||||
trackerActor.activePokemon.add(active)
|
||||
}
|
||||
@@ -176,7 +177,8 @@ class TrackerActor(val uuid: UUID) {
|
||||
//only know basics of what we see right now
|
||||
trackerActor.party.addAll(actor.pokemonList.map { createOpposing(it) })
|
||||
actor.activePokemon.forEach {
|
||||
val active = trackerActor.party.first { trackMon -> trackMon.id == it.battlePokemon!!.uuid }
|
||||
val battlePokemon = it.battlePokemon ?: return@forEach
|
||||
val active = trackerActor.party.first { trackMon -> trackMon.id == battlePokemon.uuid }
|
||||
trackerActor.party.remove(active)
|
||||
trackerActor.activePokemon.add(active)
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
package com.cobblemon.mod.common.block
|
||||
|
||||
//import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler.pos
|
||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.api.berry.Berries
|
||||
import com.cobblemon.mod.common.api.berry.Berry
|
||||
@@ -40,7 +39,11 @@ import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.LevelAccessor
|
||||
import net.minecraft.world.level.LevelReader
|
||||
import net.minecraft.world.level.block.*
|
||||
import net.minecraft.world.level.block.BaseEntityBlock
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.Blocks
|
||||
import net.minecraft.world.level.block.BonemealableBlock
|
||||
import net.minecraft.world.level.block.RenderShape
|
||||
import net.minecraft.world.level.block.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.entity.BlockEntityTicker
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
@@ -128,7 +131,10 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
|
||||
val newAge = curAge + 1
|
||||
if (newAge > FRUIT_AGE) return
|
||||
val newState = state.setValue(AGE, newAge)
|
||||
val treeEntity = world.getBlockEntity(pos) as BerryBlockEntity
|
||||
val treeEntity = world.getBlockEntity(pos) as? BerryBlockEntity ?: run {
|
||||
world.setBlock(pos, Blocks.AIR.defaultBlockState(), UPDATE_CLIENTS)
|
||||
return
|
||||
}
|
||||
if (curAge == MATURE_AGE) {
|
||||
treeEntity.generateGrowthPoints(world, newState, pos, null)
|
||||
determineMutation(world, random, pos, newState)
|
||||
|
||||
+5
-27
@@ -16,24 +16,20 @@ import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.core.HolderLookup
|
||||
import net.minecraft.core.NonNullList
|
||||
import net.minecraft.core.component.DataComponents
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket
|
||||
import net.minecraft.sounds.SoundEvent
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.world.ContainerHelper
|
||||
import net.minecraft.world.Containers
|
||||
import net.minecraft.world.InteractionResult
|
||||
import net.minecraft.world.ItemInteractionResult
|
||||
import net.minecraft.world.WorldlyContainer
|
||||
import net.minecraft.world.*
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import net.minecraft.world.level.gameevent.GameEvent
|
||||
import java.util.OptionalInt
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import java.util.*
|
||||
import kotlin.math.pow
|
||||
|
||||
class DiscShelfBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(CobblemonBlockEntities.DISC_SHELF, pos, state), WorldlyContainer {
|
||||
@@ -134,25 +130,7 @@ class DiscShelfBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobbl
|
||||
return stack.item is TechnicalMachineItem
|
||||
|| stack.item == CobblemonItems.UPGRADE
|
||||
|| stack.item == CobblemonItems.DUBIOUS_DISC
|
||||
|| stack.item == Items.MUSIC_DISC_13
|
||||
|| stack.item == Items.MUSIC_DISC_CAT
|
||||
|| stack.item == Items.MUSIC_DISC_BLOCKS
|
||||
|| stack.item == Items.MUSIC_DISC_CHIRP
|
||||
|| stack.item == Items.MUSIC_DISC_FAR
|
||||
|| stack.item == Items.MUSIC_DISC_MALL
|
||||
|| stack.item == Items.MUSIC_DISC_MELLOHI
|
||||
|| stack.item == Items.MUSIC_DISC_STAL
|
||||
|| stack.item == Items.MUSIC_DISC_STRAD
|
||||
|| stack.item == Items.MUSIC_DISC_WARD
|
||||
|| stack.item == Items.MUSIC_DISC_11
|
||||
|| stack.item == Items.MUSIC_DISC_WAIT
|
||||
|| stack.item == Items.MUSIC_DISC_OTHERSIDE
|
||||
|| stack.item == Items.MUSIC_DISC_5
|
||||
|| stack.item == Items.MUSIC_DISC_RELIC
|
||||
|| stack.item == Items.MUSIC_DISC_PRECIPICE
|
||||
|| stack.item == Items.MUSIC_DISC_CREATOR
|
||||
|| stack.item == Items.MUSIC_DISC_CREATOR_MUSIC_BOX
|
||||
|| stack.item == Items.MUSIC_DISC_PIGSTEP
|
||||
|| stack.has(DataComponents.JUKEBOX_PLAYABLE)
|
||||
}
|
||||
|
||||
fun onNoteBlockPulse(level: Level, noteBlockPos: BlockPos, soundEvent: SoundEvent) {
|
||||
|
||||
@@ -60,10 +60,12 @@ class HabitatBlockEntity(pos: BlockPos, state: BlockState) :
|
||||
|
||||
var spawningStyle: HabitatSpawningStyle = ActivatedHabitatSpawning(this)
|
||||
|
||||
var numberOfPhases: Int = 1
|
||||
var phaseOrder = HabitatPhaseOrder.SIMPLE
|
||||
var currentPhase = 1
|
||||
|
||||
val numberOfPhases: Int
|
||||
get() = pool.getPhaseCount()
|
||||
|
||||
var levelRange: IntRange = 1..Cobblemon.config.maxPokemonLevel
|
||||
var modifiers: PokemonProperties = PokemonProperties()
|
||||
var pool: HabitatPool = HabitatPool.default()
|
||||
@@ -139,7 +141,6 @@ class HabitatBlockEntity(pos: BlockPos, state: BlockState) :
|
||||
val activatedSettings = habitatSettingsDTO.activatedSettings
|
||||
val naturalSettings = habitatSettingsDTO.naturalSettings
|
||||
val isActivated = habitatSettingsDTO.isActivatedSpawning
|
||||
this.numberOfPhases = habitatSettingsDTO.numberOfPhases
|
||||
this.phaseOrder = habitatSettingsDTO.phaseOrder
|
||||
this.levelRange = habitatSettingsDTO.levelRange
|
||||
this.modifiers = PokemonProperties.parse(habitatSettingsDTO.modifiers)
|
||||
@@ -169,7 +170,6 @@ class HabitatBlockEntity(pos: BlockPos, state: BlockState) :
|
||||
override fun saveAdditional(tag: CompoundTag, registryLookup: HolderLookup.Provider) {
|
||||
super.saveAdditional(tag, registryLookup)
|
||||
tag.putString(DataKeys.HABITAT_MIMIC, mimicId.toString())
|
||||
tag.putInt(DataKeys.HABITAT_PHASE_COUNT, numberOfPhases)
|
||||
tag.putString(DataKeys.HABITAT_PHASE_ORDER, phaseOrder.toString())
|
||||
// Only save the level range when it's a non-trivial one
|
||||
if (levelRange.first != 1 || levelRange.last != Cobblemon.config.maxPokemonLevel) {
|
||||
@@ -201,7 +201,6 @@ class HabitatBlockEntity(pos: BlockPos, state: BlockState) :
|
||||
return // Client doesn't need to try loading the rest
|
||||
}
|
||||
|
||||
numberOfPhases = tag.getInt(DataKeys.HABITAT_PHASE_COUNT)
|
||||
phaseOrder = HabitatPhaseOrder.valueOf(tag.getString(DataKeys.HABITAT_PHASE_ORDER))
|
||||
levelRange = tag.getString(DataKeys.HABITAT_LEVEL_RANGE).takeIf { it.isNotBlank() }?.let(IntRangeAdapter::deserialize) ?: 1..Cobblemon.config.maxPokemonLevel
|
||||
modifiers = tag.getString(DataKeys.HABITAT_MODIFIERS).takeIf { it.isNotBlank() }?.let(PokemonProperties::parse) ?: PokemonProperties()
|
||||
|
||||
+6
-2
@@ -630,7 +630,8 @@ class FossilMultiblockStructure (
|
||||
result.putInt(DataKeys.ORGANIC_MATERIAL, organicMaterialInside)
|
||||
val fossilInv = ListTag()
|
||||
|
||||
fossilInventory.forEach { fossilInv.add(ItemStack.CODEC.encodeStart(NbtOps.INSTANCE, it).orThrow) }
|
||||
val ops = registryLookup.createSerializationContext(NbtOps.INSTANCE)
|
||||
fossilInventory.forEach { fossilInv.add(ItemStack.CODEC.encodeStart(ops, it).getOrThrow()) }
|
||||
result.put(DataKeys.FOSSIL_INVENTORY, fossilInv)
|
||||
result.putString(DataKeys.CONNECTOR_DIRECTION, tankConnectorDirection?.toString())
|
||||
|
||||
@@ -669,7 +670,10 @@ class FossilMultiblockStructure (
|
||||
|
||||
val fossilInv = if (nbt.contains(DataKeys.FOSSIL_INVENTORY)) { (nbt.get(DataKeys.FOSSIL_INVENTORY) as ListTag) } else ListTag()
|
||||
val actualFossilList = mutableListOf<ItemStack>()
|
||||
fossilInv.forEach { ItemStack.parse(registryLookup, it).ifPresent(actualFossilList::add) }
|
||||
|
||||
val ops = registryLookup.createSerializationContext(NbtOps.INSTANCE)
|
||||
fossilInv.forEach { ItemStack.CODEC.parse(ops, it).result().ifPresent(actualFossilList::add) }
|
||||
|
||||
result.fossilInventory = actualFossilList
|
||||
result.tankConnectorDirection = Direction.byName(nbt.getString(DataKeys.CONNECTOR_DIRECTION))
|
||||
|
||||
|
||||
@@ -10,11 +10,13 @@ package com.cobblemon.mod.common.block.tmmachine
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.CobblemonMenuType
|
||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
||||
import com.cobblemon.mod.common.api.moves.Moves
|
||||
import com.cobblemon.mod.common.api.tms.TechnicalMachine
|
||||
import com.cobblemon.mod.common.api.tms.TechnicalMachines
|
||||
import com.cobblemon.mod.common.block.entity.TMMachineBlockEntity
|
||||
import com.cobblemon.mod.common.util.itemRegistry
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.world.Container
|
||||
import net.minecraft.world.SimpleContainer
|
||||
@@ -35,38 +37,20 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
|
||||
var inventory: Container? = null
|
||||
var containerData: ContainerData? = null
|
||||
|
||||
var currentlySelectedTM: TechnicalMachine? = null
|
||||
private var lastSelectedTM: TechnicalMachine? = null
|
||||
|
||||
var onSelectedTMUpdate: (TechnicalMachine?) -> Unit = {}
|
||||
|
||||
constructor(syncId: Int, playerInventory: Inventory) : this(CobblemonMenuType.TM_MACHINE, syncId) {
|
||||
this.playerInventory = playerInventory
|
||||
this.inventory = SimpleContainer(5)
|
||||
this.containerData = SimpleContainerData(6)
|
||||
this.tmMachineEntity = (inventory as? TMMachineBlockEntity.TMMachineBlockInventory)?.blockEntity
|
||||
|
||||
this.addDataSlots(containerData!!)
|
||||
inventory?.startOpen(playerInventory.player)
|
||||
|
||||
val startX = 15
|
||||
val startY = 144
|
||||
val slotWidth = 18
|
||||
val slotHeight = 18
|
||||
|
||||
for (row in 0..2) {
|
||||
for (col in 0..8) {
|
||||
this.addSlot(Slot(playerInventory, 9 + (row * 9) + col, startX + (slotWidth * col), startY + (slotHeight * row)))
|
||||
}
|
||||
}
|
||||
for (col in 0..8) {
|
||||
this.addSlot(Slot(playerInventory, col, startX + (slotWidth * col), startY + 58))
|
||||
}
|
||||
|
||||
val container = inventory
|
||||
container?.let {
|
||||
this.addSlot(TMResultSlot(container, RESULT_SLOT, startX + 37, startY - 28)) // Output slot
|
||||
this.addSlot(BlankTMSlot(container, BLANK_TM_SLOT, startX + 90, startY - 28)) // Blank TM
|
||||
for (index in INGREDIENT_SLOTS) {
|
||||
this.addSlot(Slot(container, index, startX + 114 + (18 * (index - INGREDIENT_SLOTS.first)), startY - 28))
|
||||
}
|
||||
}
|
||||
this.addSlotListener(this)
|
||||
initiateSlots()
|
||||
}
|
||||
|
||||
constructor(syncId: Int, playerInventory: Inventory, inventory: Container, containerData: ContainerData) : this(CobblemonMenuType.TM_MACHINE, syncId) {
|
||||
@@ -78,6 +62,20 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
|
||||
this.addDataSlots(containerData)
|
||||
inventory.startOpen(playerInventory.player)
|
||||
|
||||
initiateSlots()
|
||||
|
||||
tmMachineEntity?.let {
|
||||
val move = Moves.getByName(it.activeMove)
|
||||
move.let {
|
||||
currentlySelectedTM = TechnicalMachines.moveToTM[it]
|
||||
synchronizeSelectedTM()
|
||||
}
|
||||
}
|
||||
|
||||
this.addSlotListener(this)
|
||||
}
|
||||
|
||||
private fun initiateSlots() {
|
||||
val startX = 15
|
||||
val startY = 144
|
||||
val slotWidth = 18
|
||||
@@ -92,7 +90,7 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
|
||||
this.addSlot(Slot(playerInventory, col, startX + (slotWidth * col), startY + 58))
|
||||
}
|
||||
|
||||
val container = inventory
|
||||
val container = inventory!!
|
||||
container.let {
|
||||
this.addSlot(TMResultSlot(container, RESULT_SLOT, startX + 37, startY - 28)) // Output slot
|
||||
this.addSlot(BlankTMSlot(container, BLANK_TM_SLOT, startX + 90, startY - 28)) // Blank TM
|
||||
@@ -100,7 +98,6 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
|
||||
this.addSlot(Slot(container, index, startX + 114 + (18 * (index - INGREDIENT_SLOTS.first)), startY - 28))
|
||||
}
|
||||
}
|
||||
this.addSlotListener(this)
|
||||
}
|
||||
|
||||
override fun quickMoveStack(player: Player, index: Int): ItemStack {
|
||||
@@ -207,4 +204,25 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
|
||||
override fun dataChanged(containerMenu: AbstractContainerMenu, dataSlotIndex: Int, value: Int) {
|
||||
broadcastChanges()
|
||||
}
|
||||
|
||||
fun synchronizeSelectedTM() {
|
||||
val serverPlayer = playerInventory?.player as? ServerPlayer ?: return
|
||||
serverPlayer.sendPacket(SynchronizeActiveTMPacket(currentlySelectedTM))
|
||||
lastSelectedTM = currentlySelectedTM
|
||||
}
|
||||
|
||||
override fun sendAllDataToRemote() {
|
||||
super.sendAllDataToRemote()
|
||||
synchronizeSelectedTM()
|
||||
}
|
||||
|
||||
override fun broadcastChanges() {
|
||||
super.broadcastChanges()
|
||||
if (lastSelectedTM != currentlySelectedTM) synchronizeSelectedTM()
|
||||
}
|
||||
|
||||
fun clientSetSelectedTM(tm: TechnicalMachine?) {
|
||||
currentlySelectedTM = tm
|
||||
onSelectedTMUpdate(tm)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ object MountedCameraTypeHandler {
|
||||
return
|
||||
}
|
||||
val currentCameraType = mc.options.cameraType
|
||||
if (currentCameraType != unmountedCameraType) {
|
||||
if (Cobblemon.config.rememberRidingCamera && currentCameraType != unmountedCameraType) {
|
||||
mc.options.cameraType = unmountedCameraType
|
||||
}
|
||||
val data = ClientPersistedData.ridingPerspectives
|
||||
|
||||
@@ -27,10 +27,18 @@ import net.minecraft.client.renderer.RenderType
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import org.joml.Quaternionf
|
||||
import org.joml.Vector3f
|
||||
import kotlin.math.atan
|
||||
|
||||
enum class ProfileTransformType {
|
||||
PROFILE,
|
||||
NONE,
|
||||
POKEDEX,
|
||||
SUMMARY,
|
||||
}
|
||||
|
||||
fun drawProfilePokemon(
|
||||
renderablePokemon: RenderablePokemon,
|
||||
matrixStack: PoseStack,
|
||||
@@ -39,7 +47,7 @@ fun drawProfilePokemon(
|
||||
state: PosableState,
|
||||
partialTicks: Float,
|
||||
scale: Float = 20F,
|
||||
applyProfileTransform: Boolean = true,
|
||||
profileTransformType: ProfileTransformType = ProfileTransformType.PROFILE,
|
||||
applyBaseScale: Boolean = false,
|
||||
r: Float = 1F,
|
||||
g: Float = 1F,
|
||||
@@ -56,7 +64,7 @@ fun drawProfilePokemon(
|
||||
state = state.also { it.currentAspects = renderablePokemon.aspects },
|
||||
partialTicks = partialTicks,
|
||||
scale = scale,
|
||||
applyProfileTransform = applyProfileTransform,
|
||||
profileTransformType = profileTransformType,
|
||||
applyBaseScale = applyBaseScale,
|
||||
r = r,
|
||||
g = g,
|
||||
@@ -75,7 +83,7 @@ fun drawProfilePokemon(
|
||||
state: PosableState,
|
||||
partialTicks: Float,
|
||||
scale: Float = 20F,
|
||||
applyProfileTransform: Boolean = true,
|
||||
profileTransformType: ProfileTransformType = ProfileTransformType.PROFILE,
|
||||
applyBaseScale: Boolean = false,
|
||||
doQuirks: Boolean = false,
|
||||
r: Float = 1F,
|
||||
@@ -114,18 +122,38 @@ fun drawProfilePokemon(
|
||||
state.setPoseToFirstSuitable(poseType)
|
||||
state.updatePartialTicks(partialTicks)
|
||||
|
||||
if (applyProfileTransform) {
|
||||
matrixStack.translate(
|
||||
model.profileTranslation.x,
|
||||
model.profileTranslation.y + 1.5 * model.profileScale,
|
||||
model.profileTranslation.z - 4.0
|
||||
)
|
||||
matrixStack.scale(model.profileScale, model.profileScale, 1 / model.profileScale)} else {
|
||||
if (profileTransformType == ProfileTransformType.NONE) {
|
||||
matrixStack.translate(0F, 0F, -4.0F)
|
||||
if (applyBaseScale) {
|
||||
matrixStack.scale(baseScale, baseScale, 1 / baseScale)
|
||||
}
|
||||
} else {
|
||||
var profileScale: Float
|
||||
var profileTranslation: Vec3
|
||||
|
||||
when (profileTransformType) {
|
||||
ProfileTransformType.POKEDEX -> {
|
||||
profileScale = model.profilePokedexScale ?: model.profileScale
|
||||
profileTranslation = model.profilePokedexTranslation ?: model.profileTranslation
|
||||
}
|
||||
ProfileTransformType.SUMMARY -> {
|
||||
profileScale = model.profileSummaryScale ?: model.profileScale
|
||||
profileTranslation = model.profileSummaryTranslation ?: model.profileTranslation
|
||||
}
|
||||
else -> {
|
||||
profileScale = model.profileScale
|
||||
profileTranslation = model.profileTranslation
|
||||
}
|
||||
}
|
||||
|
||||
matrixStack.translate(
|
||||
profileTranslation.x,
|
||||
profileTranslation.y + 1.5 * profileScale,
|
||||
profileTranslation.z - 4.0
|
||||
)
|
||||
matrixStack.scale(profileScale, profileScale, 1 / profileScale)
|
||||
}
|
||||
|
||||
matrixStack.mulPose(rotation)
|
||||
|
||||
model.applyAnimations(null, state, 0F, 0F, 0F, headYaw, headPitch)
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* 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.gui
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
|
||||
import com.mojang.blaze3d.platform.InputConstants
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
fun handleProfileDebugKeys(keyCode: Int, poserResourceLocation: ResourceLocation, state: FloatingState) {
|
||||
if (!Cobblemon.config.enableDebugKeys) {
|
||||
return
|
||||
}
|
||||
val model = VaryingModelRepository.getPoser(poserResourceLocation, state)
|
||||
|
||||
val delta = when (keyCode) {
|
||||
InputConstants.KEY_UP -> Vec3(0.0, -0.01, 0.0)
|
||||
InputConstants.KEY_DOWN -> Vec3(0.0, 0.01, 0.0)
|
||||
InputConstants.KEY_LEFT -> Vec3(-0.01, 0.0, 0.0)
|
||||
InputConstants.KEY_RIGHT -> Vec3(0.01, 0.0, 0.0)
|
||||
else -> null
|
||||
}
|
||||
|
||||
if (delta != null) {
|
||||
model.profileTranslation = model.profileTranslation.add(delta)
|
||||
model.profileSummaryTranslation = model.profileSummaryTranslation?.add(delta)
|
||||
model.profilePokedexTranslation = model.profilePokedexTranslation?.add(delta)
|
||||
}
|
||||
|
||||
val scaleDelta = when (keyCode) {
|
||||
InputConstants.KEY_EQUALS -> 0.01F
|
||||
InputConstants.KEY_MINUS -> -0.01F
|
||||
else -> null
|
||||
}
|
||||
|
||||
if (scaleDelta != null) {
|
||||
model.profileScale += scaleDelta
|
||||
model.profileSummaryScale = model.profileSummaryScale?.plus(scaleDelta)
|
||||
model.profilePokedexScale = model.profilePokedexScale?.plus(scaleDelta)
|
||||
}
|
||||
}
|
||||
|
||||
fun logProfileTranslations(poserResourceLocation: ResourceLocation, state: FloatingState) {
|
||||
if (!Cobblemon.config.enableDebugKeys) {
|
||||
return
|
||||
}
|
||||
|
||||
val model = VaryingModelRepository.getPoser(poserResourceLocation, state)
|
||||
val player = Minecraft.getInstance().player
|
||||
|
||||
fun Double.f2() = "%.2f".format(this)
|
||||
fun Float.f2() = "%.2f".format(this)
|
||||
|
||||
fun sendTranslation(name: String, translation: Vec3) {
|
||||
player?.sendSystemMessage(Component.literal("$name Translation: (${translation.x.f2()}, ${translation.y.f2()}, ${translation.z.f2()})"))
|
||||
}
|
||||
|
||||
fun sendScale(name: String, scale: Float) {
|
||||
player?.sendSystemMessage(Component.literal("$name Scale: ${scale.f2()}"))
|
||||
}
|
||||
|
||||
fun logTranslation(name: String, translation: Vec3) {
|
||||
Cobblemon.LOGGER.info("override var ${name.replaceFirstChar(Char::lowercase)}Translation = Vec3(${translation.x.f2()}, ${translation.y.f2()}, ${translation.z.f2()})")
|
||||
}
|
||||
|
||||
fun logScale(name: String, scale: Float) {
|
||||
Cobblemon.LOGGER.info("override var ${name.replaceFirstChar(Char::lowercase)}Scale = ${scale.f2()}F")
|
||||
}
|
||||
|
||||
sendTranslation("Profile", model.profileTranslation)
|
||||
sendScale("Profile", model.profileScale)
|
||||
|
||||
model.profileSummaryTranslation?.let { sendTranslation("Summary Profile", it) }
|
||||
model.profileSummaryScale?.let { sendScale("Summary Profile", it) }
|
||||
|
||||
model.profilePokedexTranslation?.let { sendTranslation("Pokedex Profile", it) }
|
||||
model.profilePokedexScale?.let { sendScale("Pokedex Profile", it) }
|
||||
|
||||
logTranslation("Profile", model.profileTranslation)
|
||||
logScale("Profile", model.profileScale)
|
||||
|
||||
model.profileSummaryTranslation?.let { logTranslation("ProfileSummary", it) }
|
||||
model.profileSummaryScale?.let { logScale("ProfileSummary", it) }
|
||||
|
||||
model.profilePokedexTranslation?.let { logTranslation("ProfilePokedex", it) }
|
||||
model.profilePokedexScale?.let { logScale("ProfilePokedex", it) }
|
||||
}
|
||||
+18
-29
@@ -115,35 +115,19 @@ class HabitatEditGUI(
|
||||
addOptionWidget(mimicInput)
|
||||
y += spacing
|
||||
|
||||
labels.add(lang("ui.edit.habitat.phase_number") to (10 to y))
|
||||
y += 12
|
||||
val phasesInput = EditBox(font, 10, y, buttonWidth, 20, "Phases".text())
|
||||
phasesInput.value = habitatSettingsDTO.numberOfPhases.toString()
|
||||
phasesInput.setResponder { value ->
|
||||
val phases = value.toIntOrNull()
|
||||
val valid = phases != null && phases > 0
|
||||
if (valid) {
|
||||
habitatSettingsDTO.numberOfPhases = phases
|
||||
}
|
||||
phasesInput.setTextColor(if (valid) validTextColor else invalidTextColor)
|
||||
setFieldValidity("phases", valid, "ui.edit.habitat.validation.phases")
|
||||
// Phase setting only visible if there's more than one phase
|
||||
val phaseCount = habitatSettingsDTO.pool.toHabitatPool()?.getPhaseCount() ?: 1
|
||||
if (phaseCount > 1) {
|
||||
phaseOrderButton = addOptionWidget(
|
||||
Button.builder(getPhaseOrderText()) {
|
||||
val orders = HabitatPhaseOrder.entries
|
||||
val currentIndex = orders.indexOf(habitatSettingsDTO.phaseOrder)
|
||||
habitatSettingsDTO.phaseOrder = orders[(currentIndex + 1) % orders.size]
|
||||
refresh()
|
||||
}.bounds(10, y, buttonWidth, 20).build()
|
||||
)
|
||||
y += spacing
|
||||
}
|
||||
val initialPhases = phasesInput.value.toIntOrNull()
|
||||
val initialPhasesValid = initialPhases != null && initialPhases > 0
|
||||
phasesInput.setTextColor(if (initialPhasesValid) validTextColor else invalidTextColor)
|
||||
setFieldValidity("phases", initialPhasesValid, "ui.edit.habitat.validation.phases")
|
||||
addOptionWidget(phasesInput)
|
||||
y += spacing
|
||||
|
||||
phaseOrderButton = addOptionWidget(
|
||||
Button.builder(getPhaseOrderText()) {
|
||||
val orders = HabitatPhaseOrder.entries
|
||||
val currentIndex = orders.indexOf(habitatSettingsDTO.phaseOrder)
|
||||
habitatSettingsDTO.phaseOrder = orders[(currentIndex + 1) % orders.size]
|
||||
refresh()
|
||||
}.bounds(10, y, buttonWidth, 20).build()
|
||||
)
|
||||
y += spacing
|
||||
|
||||
labels.add(lang("ui.edit.habitat.level_range") to (10 to y))
|
||||
y += 12
|
||||
@@ -390,7 +374,10 @@ class HabitatEditGUI(
|
||||
}
|
||||
|
||||
fun refresh() {
|
||||
phaseOrderButton.message = getPhaseOrderText()
|
||||
val phaseCount = habitatSettingsDTO.pool.toHabitatPool()?.getPhaseCount() ?: 1
|
||||
if (phaseCount > 1 && ::phaseOrderButton.isInitialized) {
|
||||
phaseOrderButton.message = getPhaseOrderText()
|
||||
}
|
||||
spawnModeButton.message = getSpawnModeText()
|
||||
poolSelectorButton.message = getPoolText()
|
||||
viewPoolButton.message = getViewPoolText()
|
||||
@@ -439,6 +426,7 @@ class HabitatEditGUI(
|
||||
}
|
||||
habitatSettingsDTO.pool = newCustomPool
|
||||
}
|
||||
rebuildWidgets()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -451,6 +439,7 @@ class HabitatEditGUI(
|
||||
}
|
||||
|
||||
habitatSettingsDTO.pool = selectedPool
|
||||
rebuildWidgets()
|
||||
}
|
||||
|
||||
private fun validateLevelRangeInputs() {
|
||||
|
||||
+4
-6
@@ -45,7 +45,6 @@ class HabitatSpawnEditorGUI(
|
||||
private val actionButtonBottomMargin = 10
|
||||
private val validTextColor = 0xFFFFFF
|
||||
private val invalidTextColor = 0xFF5555
|
||||
private val moonPhaseRange = 0..7
|
||||
private lateinit var positionTypeButton: Button
|
||||
private lateinit var bucketButton: Button
|
||||
private lateinit var timeOfDayButton: Button
|
||||
@@ -185,7 +184,7 @@ class HabitatSpawnEditorGUI(
|
||||
phasesInput.setTextColor(validTextColor)
|
||||
setFieldValidity("phases_list", true, "ui.edit.habitat.validation.phases_list")
|
||||
} else {
|
||||
val parsed = parseMoonPhases(value)
|
||||
val parsed = parsePhases(value)
|
||||
val valid = parsed != null
|
||||
if (valid) {
|
||||
spawn.phases = parsed
|
||||
@@ -194,7 +193,7 @@ class HabitatSpawnEditorGUI(
|
||||
setFieldValidity("phases_list", valid, "ui.edit.habitat.validation.phases_list")
|
||||
}
|
||||
}
|
||||
val initialPhasesValid = phasesInput.value.isBlank() || parseMoonPhases(phasesInput.value) != null
|
||||
val initialPhasesValid = phasesInput.value.isBlank() || parsePhases(phasesInput.value) != null
|
||||
phasesInput.setTextColor(if (initialPhasesValid) validTextColor else invalidTextColor)
|
||||
setFieldValidity("phases_list", initialPhasesValid, "ui.edit.habitat.validation.phases_list")
|
||||
addOptionWidget(phasesInput)
|
||||
@@ -332,7 +331,7 @@ class HabitatSpawnEditorGUI(
|
||||
return runCatching { PokemonSpecies.getByName(lowered) }.getOrNull()
|
||||
}
|
||||
|
||||
private fun parseMoonPhases(raw: String): IntRanges? {
|
||||
private fun parsePhases(raw: String): IntRanges? {
|
||||
val ranges = mutableListOf<IntRange>()
|
||||
val tokens = raw.split(",").map(String::trim)
|
||||
if (tokens.isEmpty() || tokens.any { it.isEmpty() }) {
|
||||
@@ -344,13 +343,12 @@ class HabitatSpawnEditorGUI(
|
||||
val range = when (parts.size) {
|
||||
1 -> {
|
||||
val value = parts[0].toIntOrNull() ?: return null
|
||||
if (value !in moonPhaseRange) return null
|
||||
value..value
|
||||
}
|
||||
2 -> {
|
||||
val start = parts[0].toIntOrNull() ?: return null
|
||||
val end = parts[1].toIntOrNull() ?: return null
|
||||
if (start !in moonPhaseRange || end !in moonPhaseRange || start > end) {
|
||||
if (start > end) {
|
||||
return null
|
||||
}
|
||||
start..end
|
||||
|
||||
@@ -32,6 +32,8 @@ import com.cobblemon.mod.common.client.ClientMoLangFunctions.setupClient
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.CobblemonResources
|
||||
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
|
||||
import com.cobblemon.mod.common.client.gui.handleProfileDebugKeys
|
||||
import com.cobblemon.mod.common.client.gui.logProfileTranslations
|
||||
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.BASE_HEIGHT
|
||||
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.BASE_WIDTH
|
||||
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_WIDTH
|
||||
@@ -427,6 +429,11 @@ class PokedexGUI private constructor(
|
||||
override fun onClose() {
|
||||
if (blockPos != null) AdjustBlockEntityViewerCountPacket(blockPos, false).sendToServer()
|
||||
playSound(CobblemonSounds.POKEDEX_CLOSE)
|
||||
|
||||
selectedEntry?.speciesId?.let { speciesId ->
|
||||
logProfileTranslations(speciesId, pokemonInfoWidget.state)
|
||||
}
|
||||
|
||||
super.onClose()
|
||||
}
|
||||
|
||||
@@ -757,6 +764,12 @@ class PokedexGUI private constructor(
|
||||
return true
|
||||
}
|
||||
|
||||
if (!searchWidget.isFocused) {
|
||||
selectedEntry?.speciesId?.let { speciesId ->
|
||||
handleProfileDebugKeys(keyCode, speciesId, pokemonInfoWidget.state)
|
||||
}
|
||||
}
|
||||
|
||||
return super.keyPressed(keyCode, scanCode, modifiers)
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -22,6 +22,7 @@ import com.cobblemon.mod.common.api.types.ElementalType
|
||||
import com.cobblemon.mod.common.client.ClientMoLangFunctions.setupClient
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.CobblemonResources
|
||||
import com.cobblemon.mod.common.client.gui.ProfileTransformType
|
||||
import com.cobblemon.mod.common.client.gui.TypeIcon
|
||||
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
|
||||
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_HEIGHT
|
||||
@@ -386,7 +387,8 @@ class PokemonInfoWidget(val pX: Int, val pY: Int, val updateForm: (PokedexForm)
|
||||
partialTicks = delta,
|
||||
rotation = Quaternionf().fromEulerXYZDegrees(rotationVector),
|
||||
state = state,
|
||||
blockLight = 15
|
||||
blockLight = 15,
|
||||
profileTransformType = ProfileTransformType.POKEDEX,
|
||||
)
|
||||
|
||||
matrices.popPose()
|
||||
|
||||
+2
-1
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.gui.pokedex.widgets
|
||||
import com.cobblemon.mod.common.api.gui.blitk
|
||||
import com.cobblemon.mod.common.api.text.bold
|
||||
import com.cobblemon.mod.common.client.CobblemonResources
|
||||
import com.cobblemon.mod.common.client.gui.ProfileTransformType
|
||||
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
|
||||
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_WIDTH
|
||||
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.POKEMON_DESCRIPTION_HEIGHT
|
||||
@@ -90,7 +91,7 @@ class SizeWidget(val pX: Int, val pY: Int) : SoundlessWidget(
|
||||
rotation = Quaternionf().fromEulerXYZDegrees(Vector3f(0F, 0F, 0F)),
|
||||
state = FloatingState(),
|
||||
scale = modelScale,
|
||||
applyProfileTransform = false,
|
||||
profileTransformType = ProfileTransformType.NONE,
|
||||
applyBaseScale = true,
|
||||
r = 0F,
|
||||
g = 0F,
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.gui.summary
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.CobblemonNetwork.sendToServer
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
@@ -21,14 +20,8 @@ import com.cobblemon.mod.common.api.text.bold
|
||||
import com.cobblemon.mod.common.api.text.text
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.CobblemonResources
|
||||
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
|
||||
import com.cobblemon.mod.common.client.gui.ExitButton
|
||||
import com.cobblemon.mod.common.client.gui.TypeIcon
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.EvolutionSelectScreen
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.MarkingsWidget
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.ModelWidget
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.NicknameEntryWidget
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.PartyWidget
|
||||
import com.cobblemon.mod.common.client.gui.*
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.*
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.SummaryTab
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.info.InfoWidget
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.marks.MarksWidget
|
||||
@@ -37,7 +30,6 @@ import com.cobblemon.mod.common.client.gui.summary.widgets.screens.moves.MovesWi
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.stats.StatWidget
|
||||
import com.cobblemon.mod.common.client.keybind.keybinds.SummaryBinding
|
||||
import com.cobblemon.mod.common.client.render.drawScaledText
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetItemHiddenPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.party.MovePartyPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.party.SwapPartyPokemonPacket
|
||||
@@ -715,27 +707,9 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
|
||||
) {
|
||||
this.focused = null
|
||||
}
|
||||
if (Cobblemon.config.enableDebugKeys) {
|
||||
val model = VaryingModelRepository.getPoser(selectedPokemon.species.resourceIdentifier, modelWidget.state)
|
||||
if (keyCode == InputConstants.KEY_UP) {
|
||||
model.profileTranslation = model.profileTranslation.add(0.0, -0.01, 0.0)
|
||||
}
|
||||
if (keyCode == InputConstants.KEY_DOWN) {
|
||||
model.profileTranslation = model.profileTranslation.add(0.0, 0.01, 0.0)
|
||||
}
|
||||
if (keyCode == InputConstants.KEY_LEFT) {
|
||||
model.profileTranslation = model.profileTranslation.add(-0.01, 0.0, 0.0)
|
||||
}
|
||||
if (keyCode == InputConstants.KEY_RIGHT) {
|
||||
model.profileTranslation = model.profileTranslation.add(0.01, 0.0, 0.0)
|
||||
}
|
||||
if (keyCode == InputConstants.KEY_EQUALS) {
|
||||
model.profileScale += 0.01F
|
||||
}
|
||||
if (keyCode == InputConstants.KEY_MINUS) {
|
||||
model.profileScale -= 0.01F
|
||||
}
|
||||
}
|
||||
|
||||
handleProfileDebugKeys(keyCode, selectedPokemon.species.resourceIdentifier, modelWidget.state)
|
||||
|
||||
return super.keyPressed(keyCode, scanCode, modifiers)
|
||||
}
|
||||
|
||||
@@ -744,13 +718,8 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
|
||||
}
|
||||
|
||||
override fun onClose() {
|
||||
if (Cobblemon.config.enableDebugKeys) {
|
||||
val model = VaryingModelRepository.getPoser(selectedPokemon.species.resourceIdentifier, modelWidget.state)
|
||||
Minecraft.getInstance().player?.sendSystemMessage(Component.literal("Profile Translation: ${model.profileTranslation}"))
|
||||
Minecraft.getInstance().player?.sendSystemMessage(Component.literal("Profile Scale: ${model.profileScale}"))
|
||||
Cobblemon.LOGGER.info("override var profileTranslation = Vec3d(${model.profileTranslation.x}, ${model.profileTranslation.y}, ${model.profileTranslation.z})")
|
||||
Cobblemon.LOGGER.info("override var profileScale = ${model.profileScale}F")
|
||||
}
|
||||
logProfileTranslations(selectedPokemon.species.resourceIdentifier, modelWidget.state)
|
||||
|
||||
super.onClose()
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.gui.summary.widgets
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
||||
import com.cobblemon.mod.common.client.gui.ProfileTransformType
|
||||
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
|
||||
import com.cobblemon.mod.common.client.gui.calculateHeadYawAndPitch
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState
|
||||
@@ -116,7 +117,8 @@ class ModelWidget(
|
||||
partialTicks = partialTicks,
|
||||
headYaw = currentYawAndPitch.first,
|
||||
headPitch = currentYawAndPitch.second,
|
||||
blockLight = blockLight
|
||||
blockLight = blockLight,
|
||||
profileTransformType = ProfileTransformType.SUMMARY,
|
||||
)
|
||||
|
||||
heldItemRenderer.renderOnModel(
|
||||
|
||||
+50
-71
@@ -120,7 +120,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
fun getLogoResource(langCode: String?): ResourceLocation =
|
||||
logoResourceMap.entries.find { it.value.contains(langCode?.substringBefore("_")) }?.key ?: logo
|
||||
}
|
||||
var selectedTM: TechnicalMachine? = null
|
||||
|
||||
var heldStackMove: MoveTemplate? = null
|
||||
var tmList: SettableObservable<MutableList<TechnicalMachine>> = SettableObservable(mutableListOf())
|
||||
var output: ItemStack? = null
|
||||
@@ -159,6 +159,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
var oldIngredientItems: Array<Item> = arrayOf(Items.AIR, Items.AIR, Items.AIR)
|
||||
var oldResultTmSlotItem: Item = Items.AIR
|
||||
|
||||
var moveInfoTM: TechnicalMachine? = null
|
||||
|
||||
override fun init() {
|
||||
imageWidth = WIDTH
|
||||
imageHeight = HEIGHT
|
||||
@@ -171,6 +173,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
logoPosY = topPos + 1
|
||||
scanPosY = topPos + 1
|
||||
|
||||
menu.onSelectedTMUpdate = { updateSelectedTM(it) }
|
||||
|
||||
partySlotList.clear()
|
||||
CobblemonClient.storage.party.forEachIndexed { index, pokemon ->
|
||||
partySlotList.add(TMPartySlotWidget(
|
||||
@@ -226,7 +230,14 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
pX = leftPos + 4,
|
||||
pY = topPos + 29,
|
||||
tmList,
|
||||
setTM = { tm, clicked -> setSelectedTM(tm, clicked) }
|
||||
setTM = { tm, clicked ->
|
||||
if (clicked) {
|
||||
if (tm != menu.currentlySelectedTM) SetActiveTMPacket(tm).sendToServer()
|
||||
setScreenFromMode(TM_BURN_MODE)
|
||||
} else {
|
||||
updateMoveInformation(tm)
|
||||
}
|
||||
}
|
||||
)
|
||||
if (!children().contains(movesScrollingList)) addRenderableWidget(movesScrollingList)
|
||||
|
||||
@@ -252,24 +263,21 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
selectedMoveButton = MoveSlotButton(
|
||||
leftPos + 6,
|
||||
topPos + 6,
|
||||
move = selectedTM?.moveName,
|
||||
pp = selectedTM?.moveName?.pp ?: 0,
|
||||
move = menu.currentlySelectedTM?.moveName,
|
||||
pp = menu.currentlySelectedTM?.moveName?.pp ?: 0,
|
||||
ppAsFraction = false
|
||||
) {
|
||||
if ((it as MoveSlotButton).enabled) {
|
||||
if (::movesScrollingList.isInitialized && movesScrollingList.children().isEmpty()) setMoveList()
|
||||
playSound(CobblemonSounds.GUI_CLICK)
|
||||
setScreenFromMode(MOVE_SELECT_MODE)
|
||||
|
||||
// Clear active TM
|
||||
CobblemonNetwork.sendToServer(SetActiveTMPacket(null))
|
||||
}
|
||||
}
|
||||
if (!children().contains(selectedMoveButton)) addRenderableWidget(selectedMoveButton)
|
||||
|
||||
startButton = StartButton(leftPos + 5F, topPos + 35F) {
|
||||
if (!(it as StartButton).disabled) {
|
||||
selectedTM?.let {
|
||||
menu.currentlySelectedTM?.let {
|
||||
val burnActive = menu.containerData?.get(TMMachineBlockEntity.BURN_ACTIVE_INDEX) ?: 0
|
||||
CobblemonNetwork.sendToServer(SetTMMachineContainerDataPacket(
|
||||
TMMachineBlockEntity.BURN_ACTIVE_INDEX,
|
||||
@@ -284,17 +292,14 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
))
|
||||
}*/
|
||||
|
||||
CobblemonNetwork.sendToServer(SetActiveTMPacket(it))
|
||||
//CobblemonNetwork.sendToServer(SetActiveTMPacket(it))
|
||||
if (burnActive != 1) playSound(CobblemonSounds.TM_MACHINE_START)
|
||||
inventory.setChanged()
|
||||
menu.broadcastChanges()
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!children().contains(startButton)) addRenderableWidget(startButton)
|
||||
|
||||
setScreenFromMode(mode)
|
||||
initScreen = false
|
||||
|
||||
updateSlotItemMemory()
|
||||
}
|
||||
@@ -306,7 +311,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
if (scanPosY + 1 >= (topPos + SCREEN_SAVER_HEIGHT) * 2) scanPosY = 0
|
||||
|
||||
if (mode == TM_BURN_MODE) {
|
||||
selectedTM?.let { tm ->
|
||||
menu.currentlySelectedTM?.let { tm ->
|
||||
val resultStack = menu.inventory!!.getItem(TMMachineMenu.RESULT_SLOT)
|
||||
val craftedTmStack = ItemStack(CobblemonItems.TECHNICAL_MACHINE)
|
||||
.also { TMMoveComponent.setTMMove(it, tm.moveName) }
|
||||
@@ -339,7 +344,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
}
|
||||
|
||||
if (::selectedMoveButton.isInitialized) {
|
||||
selectedMoveButton.enabled = !isBurnActive() && (heldStackMove == null || heldStackMove == selectedTM?.moveName)
|
||||
selectedMoveButton.enabled = (heldStackMove == null || heldStackMove == menu.currentlySelectedTM?.moveName)
|
||||
}
|
||||
|
||||
if (isBurnActive()) {
|
||||
@@ -350,9 +355,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Check if screen should be switched upon opening UI
|
||||
if (!initScreen) loadBurnScreenData()
|
||||
}
|
||||
|
||||
if (heldMoveItemChanged) {
|
||||
@@ -400,32 +402,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
return wasScreenSaverActive
|
||||
}
|
||||
|
||||
private fun loadBurnScreenData() {
|
||||
var tm: TechnicalMachine? = null
|
||||
|
||||
val blockPos = menu.containerData?.let {
|
||||
val x = it.get(TMMachineBlockEntity.POSITION_X_INDEX)
|
||||
val y = it.get(TMMachineBlockEntity.POSITION_Y_INDEX)
|
||||
val z = it.get(TMMachineBlockEntity.POSITION_Z_INDEX)
|
||||
BlockPos(x, y, z)
|
||||
}
|
||||
|
||||
inventory.player.level().getBlockEntity(blockPos)?.let { blockEntity ->
|
||||
if (blockEntity is TMMachineBlockEntity) {
|
||||
Moves.getByName(blockEntity.activeMove)?.let {
|
||||
tm = TechnicalMachines.moveToTM[it]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If burn currently in progress or if active TM set, set to burn screen
|
||||
if (isBurnActive() || tm != null) {
|
||||
setSelectedTM(tm, true)
|
||||
}
|
||||
|
||||
initScreen = true
|
||||
}
|
||||
|
||||
private fun isBurnActive(): Boolean = (menu.containerData?.get(TMMachineBlockEntity.BURN_ACTIVE_INDEX) ?: 0) == 1
|
||||
|
||||
private fun setScreenFromMode(screen: Int) {
|
||||
@@ -467,7 +443,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
|
||||
private fun toggleTypeSelect(isVisible: Boolean) {
|
||||
if (isVisible) {
|
||||
setSelectedTM(null, false)
|
||||
if (::moveSearchWidget.isInitialized) moveSearchWidget.value = ""
|
||||
if (selectedPokemon != null) selectedPokemon = null
|
||||
sortType = null
|
||||
@@ -505,7 +480,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
}
|
||||
|
||||
private fun toggleTMBurn(isVisible: Boolean) {
|
||||
if (!isVisible) setSelectedTM(null, false)
|
||||
if (::selectedMoveButton.isInitialized) selectedMoveButton.visible = isVisible
|
||||
if (::startButton.isInitialized) startButton.visible = isVisible
|
||||
}
|
||||
@@ -516,35 +490,40 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
return if (learnableMoves.contains(move)) TMPartySlotWidget.CAN_LEARN else TMPartySlotWidget.CANNOT_LEARN
|
||||
}
|
||||
|
||||
fun setSelectedTM(tm: TechnicalMachine?, clicked: Boolean) {
|
||||
if (selectedTM != tm) {
|
||||
selectedTM = tm
|
||||
updatePartySlotStatus(tm?.moveName)
|
||||
fun updateSelectedTM(tm: TechnicalMachine?) {
|
||||
if (!initScreen) {
|
||||
initScreen = true
|
||||
setScreenFromMode(TM_BURN_MODE)
|
||||
tm?.let {
|
||||
sortType = ElementalTypes.get(tm.type)
|
||||
setMoveList()
|
||||
}
|
||||
}
|
||||
|
||||
if (::movesScrollingList.isInitialized) {
|
||||
movesScrollingList.setSlotHighlighted(if (clicked) null else selectedTM?.id)
|
||||
if (mode == TM_BURN_MODE) updateMoveInformation(tm)
|
||||
|
||||
tm?.let {
|
||||
if (::selectedMoveButton.isInitialized) {
|
||||
selectedMoveButton.apply {
|
||||
move = it.moveName
|
||||
pp = it.moveName.pp
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun updateMoveInformation(tm: TechnicalMachine?) {
|
||||
moveInfoTM = tm
|
||||
|
||||
if (::moveDescriptionWidget.isInitialized) {
|
||||
val selectedDescription = selectedTM?.moveName?.description?.string
|
||||
val selectedDescription = tm?.moveName?.description?.string
|
||||
moveDescriptionWidget.setText(
|
||||
if (selectedDescription != null) listOf(selectedDescription) else emptyList()
|
||||
)
|
||||
}
|
||||
|
||||
if (clicked) {
|
||||
CobblemonNetwork.sendToServer(SetActiveTMPacket(tm))
|
||||
|
||||
selectedTM?.let {
|
||||
if (::selectedMoveButton.isInitialized) {
|
||||
selectedMoveButton.apply {
|
||||
move = it.moveName
|
||||
pp = it.moveName.pp
|
||||
}
|
||||
setScreenFromMode(TM_BURN_MODE)
|
||||
}
|
||||
}
|
||||
if (::movesScrollingList.isInitialized) {
|
||||
movesScrollingList.setSlotHighlighted(tm?.id)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -557,7 +536,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
}
|
||||
|
||||
fun renderDiscTypeOverlay(poseStack: PoseStack, isDiscRotating: Boolean, alpha: Float = 1F) {
|
||||
selectedTM?.let {
|
||||
menu.currentlySelectedTM?.let {
|
||||
val primaryRgb = it.moveName.elementalType.primaryColor.toRGB()
|
||||
val secondaryRgb = it.moveName.elementalType.secondaryColor.toRGB()
|
||||
blitk(
|
||||
@@ -706,7 +685,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
}
|
||||
|
||||
fun renderMoveInfo(context: GuiGraphics, mouseX: Int, mouseY: Int) {
|
||||
val moveTemplate = selectedTM?.moveName
|
||||
val moveTemplate = moveInfoTM?.moveName
|
||||
|
||||
blitk(
|
||||
matrixStack = context.pose(),
|
||||
@@ -1057,7 +1036,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
movesScrollingList.setDisabled(true, TechnicalMachines.moveToTM[heldStackMove])
|
||||
if (mode == MOVE_SELECT_MODE) {
|
||||
val heldStackTm = TechnicalMachines.moveToTM[heldStackMove]
|
||||
setSelectedTM(if (tmList.get().contains(heldStackTm)) heldStackTm else null, false)
|
||||
updateMoveInformation(if (tmList.get().contains(heldStackTm)) heldStackTm else null)
|
||||
|
||||
// Scroll to move if moves list contains held TM move
|
||||
if (tmList.get().contains(heldStackTm)) {
|
||||
@@ -1077,8 +1056,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
heldStackMove = null
|
||||
|
||||
// Reset selected move on move select screen
|
||||
if (mode == MOVE_SELECT_MODE) setSelectedTM(null, false)
|
||||
updatePartySlotStatus(selectedTM?.moveName)
|
||||
if (mode == MOVE_SELECT_MODE) updateMoveInformation(null)
|
||||
updatePartySlotStatus(menu.currentlySelectedTM?.moveName)
|
||||
|
||||
if (::movesScrollingList.isInitialized) {
|
||||
movesScrollingList.setDisabled(false)
|
||||
@@ -1155,7 +1134,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
if (isInventoryKeyPressed(minecraft, keyCode, scanCode)) {
|
||||
if (searchFocused) { return true }
|
||||
else {
|
||||
Minecraft.getInstance().setScreen(null)
|
||||
onClose()
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -1166,7 +1145,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
|
||||
this.focused = null
|
||||
return true
|
||||
} else {
|
||||
Minecraft.getInstance().setScreen(null)
|
||||
onClose()
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
+11
-4
@@ -19,7 +19,6 @@ import net.minecraft.world.level.block.Block
|
||||
object SetActiveTMPacketHandler : ServerNetworkPacketHandler<SetActiveTMPacket> {
|
||||
override fun handle(packet: SetActiveTMPacket, server: MinecraftServer, player: ServerPlayer) {
|
||||
val menu = player.containerMenu as? TMMachineMenu ?: return
|
||||
val inventory = menu.inventory ?: return
|
||||
val tmData = Cobblemon.playerDataManager.getTMData(player)
|
||||
|
||||
if (packet.tm != null && (!packet.tm.isPassivelyObtained() && packet.tm.id !in tmData.learnedTMs)) {
|
||||
@@ -30,9 +29,17 @@ object SetActiveTMPacketHandler : ServerNetworkPacketHandler<SetActiveTMPacket>
|
||||
blockEntity.activeMove = packet.tm?.moveName?.name ?: ""
|
||||
blockEntity.setChanged()
|
||||
player.level().sendBlockUpdated(blockEntity.blockPos, blockEntity.blockState, blockEntity.blockState, Block.UPDATE_CLIENTS)
|
||||
}
|
||||
|
||||
inventory.setChanged()
|
||||
menu.broadcastChanges()
|
||||
blockEntity.burnActive = false
|
||||
blockEntity.burnProgress = 0
|
||||
|
||||
player.level().players().forEach { thePlayer -> //Update all players with matching menu/blockentity
|
||||
val tmmMenu = thePlayer.containerMenu as? TMMachineMenu ?: return@forEach
|
||||
if (tmmMenu.tmMachineEntity == blockEntity) {
|
||||
tmmMenu.currentlySelectedTM = packet.tm
|
||||
tmmMenu.broadcastChanges()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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.net.gui
|
||||
|
||||
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.block.tmmachine.TMMachineMenu
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
|
||||
import net.minecraft.client.Minecraft
|
||||
|
||||
object SynchronizeActiveTMHandler: ClientNetworkPacketHandler<SynchronizeActiveTMPacket> {
|
||||
override fun handle(packet: SynchronizeActiveTMPacket, client: Minecraft) {
|
||||
val tmmMenu = client.player?.containerMenu as? TMMachineMenu ?: return
|
||||
tmmMenu.clientSetSelectedTM(packet.tm)
|
||||
}
|
||||
}
|
||||
+2
@@ -22,6 +22,8 @@ object ServerSettingsPacketHandler : ClientNetworkPacketHandler<ServerSettingsPa
|
||||
ServerSettings.maxPokemonFriendship = packet.maxPokemonFriendship
|
||||
ServerSettings.maxDynamaxLevel = packet.maxDynamaxLevel
|
||||
ServerSettings.unlockAllMoveDexMovesByDefault = packet.unlockAllMoveDexMovesByDefault
|
||||
ServerSettings.pokemonIntrinsicSizeMin = packet.pokemonIntrinsicSizeMin
|
||||
ServerSettings.pokemonIntrinsicSizeMax = packet.pokemonIntrinsicSizeMax
|
||||
}
|
||||
|
||||
}
|
||||
+10
-3
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.mojang.blaze3d.vertex.PoseStack
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer
|
||||
import com.mojang.math.Axis
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.renderer.LevelRenderer
|
||||
import net.minecraft.client.renderer.MultiBufferSource
|
||||
import net.minecraft.client.renderer.RenderType
|
||||
@@ -39,13 +40,13 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
|
||||
private val leftMargin = 1f
|
||||
private val rightMargin = 1f
|
||||
private val topMargin = 1f
|
||||
private val bottomMargin = 1f
|
||||
private val interRowSpacing = 0f
|
||||
private val tmOverlayDepthOffset = -0.0002f
|
||||
private val slotBrightnessMultiplier = 0.65f
|
||||
|
||||
private val tmBaseTexture = cobblemonResource("textures/block/disc_shelf/technical_machine_base.png")
|
||||
private val tmOverlayTexture = cobblemonResource("textures/block/disc_shelf/technical_machine_overlay.png")
|
||||
private val musicDiscUnknownTexture = cobblemonResource("textures/block/disc_shelf/music_disc_unknown.png")
|
||||
|
||||
override fun render(
|
||||
entity: DiscShelfBlockEntity,
|
||||
@@ -77,7 +78,6 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
|
||||
val slotWidth = slotWidthPixels / textureSize
|
||||
val slotHeight = slotHeightPixels / textureSize
|
||||
val verticalSpacing = (slotHeightPixels + interRowSpacing) / textureSize
|
||||
val totalHeight = slotHeight * 7 + interRowSpacing * 6 / textureSize
|
||||
val startY = topMargin / textureSize
|
||||
|
||||
for ((index, item) in entity.items.withIndex()) {
|
||||
@@ -188,6 +188,13 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
|
||||
|
||||
private fun getItemTexture(itemStack: ItemStack): ResourceLocation {
|
||||
val id = BuiltInRegistries.ITEM.getKey(itemStack.item)
|
||||
return cobblemonResource("textures/block/disc_shelf/${id.path}.png")
|
||||
val resource = cobblemonResource("textures/block/disc_shelf/${id.path}.png")
|
||||
|
||||
val resourceManager = Minecraft.getInstance().resourceManager
|
||||
if (resourceManager.getResource(resource).isEmpty) {
|
||||
return musicDiscUnknownTexture
|
||||
}
|
||||
|
||||
return resource
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -134,6 +134,11 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
|
||||
*/
|
||||
open var profileTranslation = Vec3(0.0, 0.0, 0.0)
|
||||
|
||||
open var profilePokedexScale: Float? = null
|
||||
open var profilePokedexTranslation: Vec3? = null
|
||||
open var profileSummaryScale: Float? = null
|
||||
open var profileSummaryTranslation: Vec3? = null
|
||||
|
||||
var red = 1F
|
||||
var green = 1F
|
||||
var blue = 1F
|
||||
|
||||
-121
@@ -1,121 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WaveAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WaveSegment
|
||||
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.ModelPartTransformation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.sineFunction
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class ArbokModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("arbok")
|
||||
override val head = getPart("head_ai")
|
||||
|
||||
override var portraitScale = 1.5F
|
||||
override var portraitTranslation = Vec3(-0.4, 1.0, 0.0)
|
||||
|
||||
override var profileScale = 0.67F
|
||||
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
|
||||
|
||||
lateinit var sleep: Pose
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var summary: Pose
|
||||
|
||||
val tail = getPart("tail")
|
||||
val tail2 = getPart("tail2")
|
||||
val tail3 = getPart("tail3")
|
||||
val tail4 = getPart("tail4")
|
||||
val tail5 = getPart("tail5")
|
||||
val tailWaveSegment = WaveSegment(modelPart = tail, length = 11F)
|
||||
val tail2WaveSegment = WaveSegment(modelPart = tail2, length = 11F)
|
||||
val tail3WaveSegment = WaveSegment(modelPart = tail3, length = 11F)
|
||||
val tail4WaveSegment = WaveSegment(modelPart = tail4, length = 11F)
|
||||
val tail5WaveSegment = WaveSegment(modelPart = tail5, length = 11F)
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("arbok", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("arbok", "blink") }
|
||||
// TODO tongue_flick
|
||||
|
||||
val wave = WaveAnimation(
|
||||
waveFunction = sineFunction(
|
||||
period = 10F,
|
||||
amplitude = 0.5F
|
||||
),
|
||||
basedOnLimbSwing = true,
|
||||
oscillationsScalar = 8F,
|
||||
head = tail,
|
||||
rotationAxis = ModelPartTransformation.Y_AXIS,
|
||||
motionAxis = ModelPartTransformation.X_AXIS,
|
||||
headLength = 0.1F,
|
||||
segments = arrayOf(
|
||||
tailWaveSegment,
|
||||
tail2WaveSegment,
|
||||
tail3WaveSegment,
|
||||
tail4WaveSegment,
|
||||
tail5WaveSegment
|
||||
)
|
||||
)
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("arbok", "sleep"))
|
||||
)
|
||||
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("arbok", "summary_idle"),
|
||||
wave
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("arbok", "ground_walk"),
|
||||
wave
|
||||
)
|
||||
)
|
||||
|
||||
summary = registerPose(
|
||||
poseName = "summary",
|
||||
poseTypes = UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("arbok", "summary_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk, sleep)) bedrockStateful("arbok", "faint") else null
|
||||
}
|
||||
-103
@@ -1,103 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
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 com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class OmanyteModel(root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("omanyte")
|
||||
|
||||
override var portraitScale = 3.15F
|
||||
override var portraitTranslation = Vec3(-0.06, -3.18, 0.0)
|
||||
|
||||
override var profileScale = 1.13F
|
||||
override var profileTranslation = Vec3(0.0, -0.02, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var float: CobblemonPose
|
||||
lateinit var swim: CobblemonPose
|
||||
lateinit var sleep: CobblemonPose
|
||||
lateinit var battleidle: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("omanyte", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("omanyte", "blink") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseName = "sleep",
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("omanyte", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STANDING_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
condition = { !it.isBattling},
|
||||
animations = arrayOf(
|
||||
bedrock("omanyte", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES - PoseType.SWIM,
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
animations = arrayOf(
|
||||
bedrock("omanyte", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
float = registerPose(
|
||||
poseName = "float",
|
||||
poseTypes = setOf(PoseType.FLOAT, PoseType.HOVER),
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
animations = arrayOf(
|
||||
bedrock("omanyte", "water_idle")
|
||||
)
|
||||
)
|
||||
|
||||
swim = registerPose(
|
||||
poseName = "swim",
|
||||
poseTypes = setOf(PoseType.SWIM, PoseType.FLY),
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
animations = arrayOf(
|
||||
bedrock("omanyte", "water_swim")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle-standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
condition = { it.isBattling},
|
||||
animations = arrayOf(
|
||||
bedrock("omanyte", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("omanyte", "faint") else null
|
||||
}
|
||||
-102
@@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
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 com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class OmastarModel(root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("omastar")
|
||||
|
||||
override var portraitTranslation = Vec3(0.02, -2.20, 0.0)
|
||||
override var portraitScale = 2.4F
|
||||
|
||||
override var profileTranslation = Vec3(0.0, 0.066, 0.0)
|
||||
override var profileScale = 1.1F
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var float: CobblemonPose
|
||||
lateinit var swim: CobblemonPose
|
||||
lateinit var sleep: CobblemonPose
|
||||
lateinit var battleidle: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("omastar", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("omastar", "blink") }
|
||||
sleep = registerPose(
|
||||
poseName = "sleep",
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("omastar", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STANDING_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
condition = { !it.isBattling},
|
||||
animations = arrayOf(
|
||||
bedrock("omastar", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES - PoseType.SWIM,
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
animations = arrayOf(
|
||||
bedrock("omastar", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
float = registerPose(
|
||||
poseName = "float",
|
||||
poseTypes = setOf(PoseType.FLOAT, PoseType.HOVER),
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
animations = arrayOf(
|
||||
bedrock("omastar", "water_idle")
|
||||
)
|
||||
)
|
||||
|
||||
swim = registerPose(
|
||||
poseName = "swim",
|
||||
poseTypes = setOf(PoseType.SWIM, PoseType.FLY),
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
animations = arrayOf(
|
||||
bedrock("omastar", "water_swim")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle-standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
transformTicks = 10,
|
||||
condition = { it.isBattling},
|
||||
animations = arrayOf(
|
||||
bedrock("omastar", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("omastar", "faint") else null
|
||||
}
|
||||
-91
@@ -1,91 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.createTransformation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SmoochumModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("smoochum")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 2.3F
|
||||
override var portraitTranslation = Vec3(-0.14, -1.0, 0.0)
|
||||
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var shoulderLeft: Pose
|
||||
lateinit var shoulderRight: Pose
|
||||
|
||||
val shoulderOffset = 1
|
||||
|
||||
override fun registerPoses() {
|
||||
// val blink = quirk { bedrockStateful("smoochum", "blink") }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES + UI_POSES,
|
||||
// quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("smoochum", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = MOVING_POSES,
|
||||
// quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("smoochum", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
shoulderLeft = registerPose(
|
||||
poseType = PoseType.SHOULDER_LEFT,
|
||||
//quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("smoochum", "ground_idle")
|
||||
),
|
||||
transformedParts = arrayOf(
|
||||
rootPart.createTransformation().addPosition(ModelPartTransformation.X_AXIS, shoulderOffset)
|
||||
)
|
||||
)
|
||||
|
||||
shoulderRight = registerPose(
|
||||
poseType = PoseType.SHOULDER_RIGHT,
|
||||
//quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("smoochum", "ground_idle")
|
||||
),
|
||||
transformedParts = arrayOf(
|
||||
rootPart.createTransformation().addPosition(ModelPartTransformation.X_AXIS, -shoulderOffset)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("smoochum", "faint") else null
|
||||
}
|
||||
+1
-1
@@ -21,7 +21,7 @@ import net.minecraft.world.phys.Vec3
|
||||
|
||||
class GalladeModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("gallade")
|
||||
override val head = getPart("Head")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 2.6F
|
||||
override var portraitTranslation = Vec3(-0.15, 2.1, 0.0)
|
||||
|
||||
-4
@@ -248,7 +248,6 @@ object VaryingModelRepository {
|
||||
inbuilt("machop", ::MachopModel)
|
||||
inbuilt("machoke", ::MachokeModel)
|
||||
inbuilt("machamp", ::MachampModel)
|
||||
inbuilt("arbok", ::ArbokModel)
|
||||
inbuilt("chansey", ::ChanseyModel)
|
||||
inbuilt("cubone", ::CuboneModel)
|
||||
inbuilt("dodrio", ::DodrioModel)
|
||||
@@ -277,8 +276,6 @@ object VaryingModelRepository {
|
||||
inbuilt("nidoranm", ::NidoranmModel)
|
||||
inbuilt("nidorina", ::NidorinaModel)
|
||||
inbuilt("nidorino", ::NidorinoModel)
|
||||
inbuilt("omanyte", ::OmanyteModel)
|
||||
inbuilt("omastar", ::OmastarModel)
|
||||
inbuilt("persian", ::PersianModel)
|
||||
inbuilt("pinsir", ::PinsirModel)
|
||||
inbuilt("poliwag", ::PoliwagModel)
|
||||
@@ -292,7 +289,6 @@ object VaryingModelRepository {
|
||||
inbuilt("venomoth", ::VenomothModel)
|
||||
inbuilt("venonat", ::VenonatModel)
|
||||
inbuilt("elekid", ::ElekidModel)
|
||||
inbuilt("smoochum", ::SmoochumModel)
|
||||
inbuilt("hitmontop", ::HitmontopModel)
|
||||
inbuilt("electivire", ::ElectivireModel)
|
||||
inbuilt("tangrowth", ::TangrowthModel)
|
||||
|
||||
@@ -28,5 +28,7 @@ object ServerSettings {
|
||||
var maxPokemonFriendship = Cobblemon.config.maxPokemonFriendship
|
||||
var maxDynamaxLevel = Cobblemon.config.maxDynamaxLevel
|
||||
var unlockAllMoveDexMovesByDefault = Cobblemon.config.unlockAllMoveDexMovesByDefault
|
||||
var pokemonIntrinsicSizeMin = Cobblemon.config.pokemonIntrinsicSizeMin
|
||||
var pokemonIntrinsicSizeMax = Cobblemon.config.pokemonIntrinsicSizeMax
|
||||
|
||||
}
|
||||
@@ -243,18 +243,6 @@ class CobblemonConfig {
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "pokemon_intrinsic_size_max", SERVER)
|
||||
var pokemonIntrinsicSizeMax = 1.05F
|
||||
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "alpha_pokemon_size_small_multiplier", SERVER)
|
||||
var alphaPokemonSizeSmallMultiplier = 1.70F
|
||||
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "alpha_pokemon_size_medium_multiplier", SERVER)
|
||||
var alphaPokemonSizeMediumMultiplier = 1.55F
|
||||
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "alpha_pokemon_size_large_multiplier", SERVER)
|
||||
var alphaPokemonSizeLargeMultiplier = 1.40F
|
||||
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "alpha_pokemon_size_extra_large_multiplier", SERVER)
|
||||
var alphaPokemonSizeExtraLargeMultiplier = 1.25F
|
||||
|
||||
@CobblemonConfigField(Category.Pokemon, lang = "baby_pokemon_level_duration", SERVER)
|
||||
var babyPokemonLevelDuration = 9
|
||||
|
||||
@@ -347,9 +335,6 @@ class CobblemonConfig {
|
||||
// @CobblemonConfigField(Category.Riding, lang = "third_person_view_bobbing", CLIENT)
|
||||
var thirdPersonViewBobbing = true
|
||||
|
||||
@CobblemonConfigField(Category.Riding, lang = "invert_roll", CLIENT)
|
||||
var invertRoll = false
|
||||
|
||||
@CobblemonConfigField(Category.Riding, lang = "invert_pitch", CLIENT)
|
||||
var invertPitch = false
|
||||
|
||||
@@ -365,9 +350,6 @@ class CobblemonConfig {
|
||||
@CobblemonConfigField(Category.Riding, lang = "swap_x_and_y_axes", CLIENT)
|
||||
var swapXAndYAxes = false
|
||||
|
||||
@CobblemonConfigField(Category.Riding, lang = "automatic_righting_delay", CLIENT)
|
||||
var rightingDelay = -1.0
|
||||
|
||||
@CobblemonConfigField(Category.Riding, lang = "disable_roll", CLIENT)
|
||||
var disableRoll = false
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ import net.minecraft.world.level.block.Block
|
||||
class StatusCureItem(val itemName: String, vararg val status: Status, block: Block) : ItemNameBlockItem(block, Properties()), PokemonSelectingItem {
|
||||
override val bagItem = object : BagItem {
|
||||
override val itemName = this@StatusCureItem.itemName
|
||||
override val returnItem = Items.AIR
|
||||
override val returnItem = Items.GLASS_BOTTLE
|
||||
override fun canUse(stack: ItemStack, battle: PokemonBattle, target: BattlePokemon) = canUseOnPokemon(stack, target.effectedPokemon)
|
||||
override fun getShowdownInput(actor: BattleActor, battlePokemon: BattlePokemon, data: String?) = "cure_status${status.takeIf { it.isNotEmpty() }?.let { " ${it.joinToString(separator = " ") { it.showdownName } }" } ?: "" }"
|
||||
}
|
||||
|
||||
+9
-2
@@ -26,7 +26,9 @@ class ServerSettingsPacket internal constructor(
|
||||
val maxPokemonLevel: Int,
|
||||
val maxPokemonFriendship: Int,
|
||||
val maxDynamaxLevel: Int,
|
||||
val unlockAllMoveDexMovesByDefault: Boolean
|
||||
val unlockAllMoveDexMovesByDefault: Boolean,
|
||||
val pokemonIntrinsicSizeMin: Float,
|
||||
val pokemonIntrinsicSizeMax: Float
|
||||
) : NetworkPacket<ServerSettingsPacket> {
|
||||
override val id = ID
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
@@ -37,9 +39,14 @@ class ServerSettingsPacket internal constructor(
|
||||
buffer.writeInt(Cobblemon.config.maxPokemonFriendship)
|
||||
buffer.writeInt(Cobblemon.config.maxDynamaxLevel)
|
||||
buffer.writeBoolean(Cobblemon.config.unlockAllMoveDexMovesByDefault)
|
||||
buffer.writeFloat(Cobblemon.config.pokemonIntrinsicSizeMin)
|
||||
buffer.writeFloat(Cobblemon.config.pokemonIntrinsicSizeMax)
|
||||
}
|
||||
companion object {
|
||||
val ID = cobblemonResource("server_settings")
|
||||
fun decode(buffer: RegistryFriendlyByteBuf) = ServerSettingsPacket(buffer.readBoolean(), buffer.readBoolean(), buffer.readBoolean(), buffer.readInt(), buffer.readInt(), buffer.readInt(), buffer.readBoolean())
|
||||
fun decode(buffer: RegistryFriendlyByteBuf) = ServerSettingsPacket(buffer.readBoolean(),
|
||||
buffer.readBoolean(), buffer.readBoolean(),
|
||||
buffer.readInt(), buffer.readInt(), buffer.readInt(),
|
||||
buffer.readBoolean(), buffer.readFloat(), buffer.readFloat())
|
||||
}
|
||||
}
|
||||
+9
@@ -64,6 +64,7 @@ class SpawnPokemonPacket(
|
||||
var rideStamina: Float,
|
||||
var isAlpha: Boolean,
|
||||
var silent: Boolean,
|
||||
var riders: List<Int>,
|
||||
vanillaSpawnPacket: ClientboundAddEntityPacket,
|
||||
) : SpawnExtraDataEntityPacket<SpawnPokemonPacket, PokemonEntity>(vanillaSpawnPacket) {
|
||||
|
||||
@@ -98,6 +99,7 @@ class SpawnPokemonPacket(
|
||||
entity.entityData.get(PokemonEntity.RIDE_STAMINA),
|
||||
entity.entityData.get(PokemonEntity.IS_ALPHA),
|
||||
entity.isSilent,
|
||||
entity.occupiedSeats.map { entry -> entry.value.id }.toList(),
|
||||
vanillaSpawnPacket
|
||||
)
|
||||
|
||||
@@ -134,6 +136,7 @@ class SpawnPokemonPacket(
|
||||
buffer.writeFloat(rideStamina)
|
||||
buffer.writeBoolean(isAlpha)
|
||||
buffer.writeBoolean(silent)
|
||||
buffer.writeCollection(this.riders) { pb, value -> pb.writeInt(value) }
|
||||
}
|
||||
|
||||
override fun applyData(entity: PokemonEntity, level: ClientLevel) {
|
||||
@@ -184,6 +187,10 @@ class SpawnPokemonPacket(
|
||||
|
||||
entity.tickSpawned = this.tickSpawned
|
||||
entity.delegate.updateAge(this.tickSpawned)
|
||||
|
||||
if (this.riders.isNotEmpty()) {
|
||||
this.riders.forEach { level.getEntity(it)?.startRiding(entity) }
|
||||
}
|
||||
}
|
||||
|
||||
override fun checkType(entity: Entity): Boolean = entity is PokemonEntity
|
||||
@@ -222,6 +229,7 @@ class SpawnPokemonPacket(
|
||||
val rideStamina = buffer.readFloat()
|
||||
val isAlpha = buffer.readBoolean()
|
||||
val silent = buffer.readBoolean()
|
||||
val riders = buffer.readList { it.readInt() }.toList()
|
||||
val vanillaPacket = decodeVanillaPacket(buffer)
|
||||
|
||||
return SpawnPokemonPacket(
|
||||
@@ -253,6 +261,7 @@ class SpawnPokemonPacket(
|
||||
rideStamina,
|
||||
isAlpha,
|
||||
silent,
|
||||
riders,
|
||||
vanillaPacket
|
||||
)
|
||||
}
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* 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.net.messages.client.ui
|
||||
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.api.tms.TechnicalMachine
|
||||
import com.cobblemon.mod.common.api.tms.TechnicalMachines
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
|
||||
class SynchronizeActiveTMPacket(val tm: TechnicalMachine?): NetworkPacket<SynchronizeActiveTMPacket> {
|
||||
override val id = ID
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeNullable(tm?.id) { pb, value -> pb.writeResourceLocation(value) }
|
||||
}
|
||||
|
||||
companion object {
|
||||
val ID = cobblemonResource("synchronize_active_tm")
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): SynchronizeActiveTMPacket {
|
||||
val resourceLocation = buffer.readNullable { it.readResourceLocation() }
|
||||
if (resourceLocation == null) return SynchronizeActiveTMPacket(null)
|
||||
val tm = TechnicalMachines.tmMap[resourceLocation]
|
||||
return SynchronizeActiveTMPacket(tm)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.pokemon
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.client.settings.ServerSettings
|
||||
|
||||
enum class PokemonSizeCategory {
|
||||
XS,
|
||||
@@ -21,7 +21,7 @@ enum class PokemonSizeCategory {
|
||||
// Find which size category corresponds to the given scale modifier.
|
||||
// The scale modifier should be between the intrinsic min and max size.
|
||||
fun fromScale(scaleModifier: Float): PokemonSizeCategory {
|
||||
val config = Cobblemon.config
|
||||
val config = ServerSettings //Don't use cobblemon config here as it will be used by server AND client
|
||||
val minScale = config.pokemonIntrinsicSizeMin
|
||||
val maxScale = config.pokemonIntrinsicSizeMax
|
||||
val range = (maxScale - minScale).coerceAtLeast(0.0001F)
|
||||
|
||||
@@ -318,7 +318,7 @@ class OmniPathNodeMaker : NodeEvaluator() {
|
||||
|
||||
// Hitbox thing looks confusing but if the hitbox volume is more than like, 5, it starts getting pretty
|
||||
// fucking slow to use the findAcceptedNodeWalk function
|
||||
val strictlyWalkPathing = !canFly() && !mob.isInWater && mob.boundingBox.size < MAX_HITBOX_SIZE_FOR_WALKING
|
||||
val strictlyWalkPathing = !canFly() && !mob.isInWater
|
||||
val doVerticalNeighbourChecks = (canFly() || mob.isInWater) && mob.boundingBox.size < MAX_HITBOX_FOR_VERTICAL_NEIGHBOURS
|
||||
|
||||
// Non-diagonal surroundings in 3d space
|
||||
@@ -623,9 +623,11 @@ class OmniPathNodeMaker : NodeEvaluator() {
|
||||
|
||||
override fun getPathTypeOfMob(pfContext: PathfindingContext, x: Int, y: Int, z: Int, mob: Mob): PathType {
|
||||
val set = EnumSet.noneOf(PathType::class.java)
|
||||
val sizeX = (mob.boundingBox.maxX - mob.boundingBox.minX).toInt() + 1
|
||||
val sizeY = (mob.boundingBox.maxY - mob.boundingBox.minY).toInt() + 1
|
||||
val sizeZ = (mob.boundingBox.maxZ - mob.boundingBox.minZ).toInt() + 1
|
||||
// Capping the observed size of hitboxes here to put an upper limit on the cost of larger hitbox mobs
|
||||
// Mobs larger than these caps will inevitably become stuck on obstacles as their pathing will be flawed
|
||||
val sizeX = ((mob.boundingBox.maxX - mob.boundingBox.minX).toInt() + 1).coerceAtMost(2)
|
||||
val sizeY = ((mob.boundingBox.maxY - mob.boundingBox.minY).toInt() + 1).coerceAtMost(3)
|
||||
val sizeZ = ((mob.boundingBox.maxZ - mob.boundingBox.minZ).toInt() + 1).coerceAtMost(2)
|
||||
|
||||
// TODO -- This is experimental code to see if this is meaningful. We should clean this up later when time permits.
|
||||
val returnedEarlyPathType = mutableListOf<PathType>()
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.pokemon.properties
|
||||
|
||||
import com.cobblemon.mod.common.api.properties.CustomPokemonPropertyType
|
||||
|
||||
object HeldItemVisibleProperty : CustomPokemonPropertyType<BooleanProperty> {
|
||||
override val keys = setOf("held_item_visible")
|
||||
override val needsKey = true
|
||||
|
||||
override fun fromString(value: String?) =
|
||||
when {
|
||||
value == null || value.lowercase() in listOf("true", "yes") -> heldItemVisible(true)
|
||||
value.lowercase() in listOf("false", "no") -> heldItemVisible(false)
|
||||
else -> null
|
||||
}
|
||||
|
||||
fun heldItemVisible(value: Boolean) = BooleanProperty(
|
||||
key = keys.first(),
|
||||
value = value,
|
||||
pokemonApplicator = { pokemon, _ -> pokemon.heldItemVisible = value },
|
||||
entityApplicator = { pokemonEntity, _ -> pokemonEntity.pokemon.heldItemVisible = value },
|
||||
pokemonMatcher = { pokemon, _ -> pokemon.heldItemVisible == value },
|
||||
entityMatcher = { pokemonEntity, _ -> pokemonEntity.pokemon.heldItemVisible == value }
|
||||
)
|
||||
|
||||
override fun examples() = setOf("yes", "no")
|
||||
}
|
||||
@@ -274,11 +274,9 @@ object DataKeys {
|
||||
// Habitat Blocks
|
||||
const val HABITAT_SPAWNING_STYLE = "SpawningStyle"
|
||||
const val HABITAT_MIMIC = "MimicId"
|
||||
const val HABITAT_PHASE_COUNT = "PhaseCount"
|
||||
const val HABITAT_PHASE_ORDER = "PhaseOrder"
|
||||
const val HABITAT_LEVEL_RANGE = "LevelRange"
|
||||
const val HABITAT_MODIFIERS = "Modifiers"
|
||||
const val HABITAT_POOL = "Pool"
|
||||
|
||||
// --- Pools
|
||||
const val HABITAT_POOL_ID = "PoolId"
|
||||
|
||||
+36
-5
@@ -13,7 +13,10 @@ import com.mojang.serialization.MapCodec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.world.level.LevelReader
|
||||
import net.minecraft.world.level.LevelHeightAccessor
|
||||
import net.minecraft.world.level.chunk.ChunkGenerator
|
||||
import net.minecraft.world.level.levelgen.Heightmap
|
||||
import net.minecraft.world.level.levelgen.RandomState
|
||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings
|
||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor
|
||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate
|
||||
@@ -24,6 +27,25 @@ class HeightRangeStructureProcessor(
|
||||
val reference: HeightReference = HeightReference.SEA_LEVEL
|
||||
) : StructureProcessor() {
|
||||
|
||||
fun isValidPlacement(world: LevelReader, pos: BlockPos): Boolean {
|
||||
val referenceY = reference.getY(world, pos)
|
||||
val minY = referenceY + minOffset
|
||||
val maxY = referenceY + maxOffset
|
||||
return pos.y in minY..maxY
|
||||
}
|
||||
|
||||
fun isValidPlacement(
|
||||
chunkGenerator: ChunkGenerator,
|
||||
heightAccessor: LevelHeightAccessor,
|
||||
randomState: RandomState,
|
||||
pos: BlockPos
|
||||
): Boolean {
|
||||
val referenceY = reference.getY(chunkGenerator, heightAccessor, randomState, pos)
|
||||
val minY = referenceY + minOffset
|
||||
val maxY = referenceY + maxOffset
|
||||
return pos.y in minY..maxY
|
||||
}
|
||||
|
||||
override fun processBlock(
|
||||
world: LevelReader,
|
||||
pos: BlockPos,
|
||||
@@ -32,11 +54,7 @@ class HeightRangeStructureProcessor(
|
||||
currentBlockInfo: StructureTemplate.StructureBlockInfo,
|
||||
data: StructurePlaceSettings
|
||||
): StructureTemplate.StructureBlockInfo? {
|
||||
val referenceY = reference.getY(world, pos)
|
||||
val minY = referenceY + minOffset
|
||||
val maxY = referenceY + maxOffset
|
||||
|
||||
return if (pos.y in minY..maxY) {
|
||||
return if (isValidPlacement(world, pos)) {
|
||||
currentBlockInfo
|
||||
} else {
|
||||
null
|
||||
@@ -65,6 +83,19 @@ class HeightRangeStructureProcessor(
|
||||
}
|
||||
}
|
||||
|
||||
fun getY(
|
||||
chunkGenerator: ChunkGenerator,
|
||||
heightAccessor: LevelHeightAccessor,
|
||||
randomState: RandomState,
|
||||
pos: BlockPos
|
||||
): Int {
|
||||
return if (this == SEA_LEVEL) {
|
||||
chunkGenerator.seaLevel
|
||||
} else {
|
||||
chunkGenerator.getBaseHeight(pos.x, pos.z, type ?: Heightmap.Types.WORLD_SURFACE_WG, heightAccessor, randomState)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
val CODEC: Codec<HeightReference> = Codec.STRING.xmap(
|
||||
{ serialized -> entries.firstOrNull { it.id == serialized } ?: SEA_LEVEL },
|
||||
|
||||
+257
-199
@@ -41,59 +41,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.summary_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body_upper": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*2+90)*0.25", 20, "math.sin(q.anim_time*90*2+90)*4"],
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"hood": {
|
||||
"rotation": ["-10-math.sin(q.anim_time*90*4+90)*1", "-15+math.sin(q.anim_time*90*2+90)*6", -17.5]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4)*0.75", 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [0, "40-math.sin(q.anim_time*90*2+90)*0.5", 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [0, "-55-math.sin(q.anim_time*90*2-90)*0.5", 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [0, "-55-math.sin(q.anim_time*90*2)*0.5", 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [0, "55-math.sin(q.anim_time*90*2+90)*0.5", 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": [0, "60-math.sin(q.anim_time*90*2)*0.5", 0]
|
||||
},
|
||||
"body": {
|
||||
"position": ["math.sin(q.anim_time*90*2+30*2)*0.06", 0, "-math.sin(q.anim_time*90*2+30*3)*0.04"]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4+90)*0.5", 0, "-math.sin(q.anim_time*90*2+90)*2"]
|
||||
},
|
||||
"head_correction": {
|
||||
"rotation": [12.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.tongue_flick": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"tongue": {
|
||||
"rotation": ["7.5+math.sin(q.anim_time*90*8*3)*0.25", 0, 0],
|
||||
"position": [0, -2, 0]
|
||||
"rotation": ["-2.5+math.sin(q.anim_time*90*8*3)*0.25", 0, 0],
|
||||
"position": [0, 0, -5]
|
||||
},
|
||||
"tongue2": {
|
||||
"rotation": ["math.sin(q.anim_time*90*8*3)*8", 0, 0],
|
||||
"position": [0, -4, -0.01]
|
||||
"rotation": ["math.sin(q.anim_time*90*8*3)*8", 0, 0]
|
||||
},
|
||||
"tongue3": {
|
||||
"rotation": ["math.sin(q.anim_time*90*8*3-30*2)*16", 0, 0],
|
||||
"position": [0, -4, -0.01]
|
||||
"rotation": ["math.sin(q.anim_time*90*8*3-30*2)*16", 0, 0]
|
||||
},
|
||||
"tongue4": {
|
||||
"rotation": ["math.sin(q.anim_time*90*8*3-30*3)*24", 0, 0]
|
||||
@@ -109,6 +68,47 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.sleep": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body_upper": {
|
||||
"rotation": [46.00798, 4.21261, 8.68723]
|
||||
},
|
||||
"hood": {
|
||||
"rotation": [-17.79674, 5.06499, 5.86553]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [-7.5, 7.5, 12.5]
|
||||
},
|
||||
"head_angle": {
|
||||
"rotation": [14.60967, -3.73171, 11.93845]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [0, 22.5, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [0, -37.5, 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [0, -45, 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": [0, -55, 0]
|
||||
},
|
||||
"tail6": {
|
||||
"rotation": [0, -47.5, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.faint": {
|
||||
"animation_length": 3,
|
||||
"bones": {
|
||||
@@ -190,19 +190,15 @@
|
||||
"1.15": ["-30+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"1.45": ["-40+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"1.8": ["-40+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"1.95": ["-122.5+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"2.1": ["-130.0586+math.sin(q.anim_time*90*4)*0.75", 0.27122, 1.21042],
|
||||
"2.2": ["-60.1318+math.sin(q.anim_time*90*4)*0.75", -0.59839, 2.25911],
|
||||
"2.3": ["-90+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"2.4": [-87.5, 0, 0]
|
||||
"1.95": ["-40+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"2.1": ["-40+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"2.2": ["-40+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"2.3": ["-40+math.sin(q.anim_time*90*4)*0.75", 0, 0],
|
||||
"2.4": [-40, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"1.8": [0, 0, 0],
|
||||
"1.85": [0, -0.5, 0],
|
||||
"1.9": [0, -0.5, 0],
|
||||
"1.95": [0, -1, 0],
|
||||
"2.0": [0, -1, 0],
|
||||
"2.15": [0, -0.5, 0]
|
||||
"1.95": [0, 0, 0],
|
||||
"2.1": [0, 0, 2]
|
||||
}
|
||||
},
|
||||
"head": {
|
||||
@@ -228,18 +224,20 @@
|
||||
"0.35": [-13, 0, 0],
|
||||
"0.7": [42.5, 0, 0],
|
||||
"1.25": [22.5, 0, 0],
|
||||
"1.95": [25, 0, 0],
|
||||
"1.75": [24.29, 0, 0],
|
||||
"1.95": [-30, 0, 0],
|
||||
"2.05": [-60, 0, 0],
|
||||
"2.1": [-67.5, 0, 0],
|
||||
"2.2": [-27.5, 0, 0],
|
||||
"2.1": [-42.5, 0, 0],
|
||||
"2.2": [-2.5, 0, 0],
|
||||
"2.25": [-47.5, 0, 0],
|
||||
"2.3": [-12.5, 0, 0]
|
||||
"2.3": [-40, 0, 0],
|
||||
"2.55": [-42.5, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"2.0": [0, 0, 0],
|
||||
"2.05": [0, 2, 0.8],
|
||||
"2.1": [0, 2.25, 1.25],
|
||||
"2.1": [0, 1.25, 1.25],
|
||||
"2.2": [0, 0, 0],
|
||||
"2.25": [0, 1.3, 0],
|
||||
"2.3": [0, 0, 0]
|
||||
@@ -247,28 +245,44 @@
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0],
|
||||
"0.1": [-0.1, 0, 0],
|
||||
"0.15": [0, 0, 0],
|
||||
"0.5": [0, 0, 0],
|
||||
"0.55": [-0.1, 0, 0],
|
||||
"0.85": [-0.1, 0, 0],
|
||||
"0.9": [0, 0, 0],
|
||||
"1.95": [0, 0, 0],
|
||||
"2.0": [-0.1, 0, 0]
|
||||
"0.0": [-0.1, 0, -0.1],
|
||||
"0.15": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.55": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"0.9": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0],
|
||||
"0.1": [0.1, 0, 0],
|
||||
"0.15": [0, 0, 0],
|
||||
"0.5": [0, 0, 0],
|
||||
"0.55": [0.1, 0, 0],
|
||||
"0.85": [0.1, 0, 0],
|
||||
"0.9": [0, 0, 0],
|
||||
"1.95": [0, 0, 0],
|
||||
"2.0": [0.1, 0, 0]
|
||||
"0.0": [0.1, 0, -0.1],
|
||||
"0.15": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.55": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"0.9": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
@@ -283,8 +297,8 @@
|
||||
"1.75": [32.5, 0, 0],
|
||||
"1.8": [32.5, 0, 0],
|
||||
"1.85": [65, 0, 0],
|
||||
"2.15": [65, 0, 0],
|
||||
"2.2": [-2.5, 0, 0]
|
||||
"2.05": [65, 0, 0],
|
||||
"2.1": [-2.5, 0, 0]
|
||||
}
|
||||
},
|
||||
"tongue_opening": {
|
||||
@@ -297,87 +311,59 @@
|
||||
"tongue": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": [0, 0, 0],
|
||||
"0.3": [-7.5, 0, 0],
|
||||
"0.25": [-7.5, 0, 0],
|
||||
"0.3": [-15, 0, 0],
|
||||
"0.35": [-7.5, 0, 0],
|
||||
"0.4": [0, 0, 0],
|
||||
"0.4": [-5, 0, 0],
|
||||
"1.35": [0, 0, 0],
|
||||
"1.85": [0, 0, 0],
|
||||
"1.9": [-7.5, 0, 0],
|
||||
"1.75": [0, 0, 0],
|
||||
"1.85": [-35, 0, 0],
|
||||
"2.0": [-32.5, 0, 0],
|
||||
"2.1": [-37.5, 0, 0],
|
||||
"2.15": [-10, 0, 0],
|
||||
"2.2": [0, 0, 0]
|
||||
"2.05": [-35, 0, 0],
|
||||
"2.1": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.85": [0, 0, 0],
|
||||
"1.9": [0, 0, 0.3],
|
||||
"2.0": [0, 0, 1.4],
|
||||
"2.1": [0, 0, 1.7],
|
||||
"2.15": [0, 0, 0.4]
|
||||
"0.15": [0, 0, 0.75],
|
||||
"0.25": [0, 0, -3.25],
|
||||
"0.35": [0, 0, -3.25],
|
||||
"0.45": [0, 0, 0.75],
|
||||
"1.75": [0, 0, 0.75],
|
||||
"1.85": [0, 0, -3.25]
|
||||
}
|
||||
},
|
||||
"tongue2": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.3": [2.14, 0, 0],
|
||||
"0.15": [-1.43, 0, 0],
|
||||
"0.25": [3.45, 0, 0],
|
||||
"0.3": [9.64, 0, 0],
|
||||
"0.35": [2.5, 0, 0],
|
||||
"0.4": [0, 0, 0],
|
||||
"0.75": [0, 0, 0],
|
||||
"1.35": [0, 0, 0],
|
||||
"1.75": [0, 0, 0],
|
||||
"1.95": [0, 0, 0],
|
||||
"2.0": [-12.5, 0, 0],
|
||||
"2.1": [-12.5, 0, 0],
|
||||
"2.15": [-37.5, 0, 0],
|
||||
"2.2": [17.5, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1": [0, 0, 0],
|
||||
"0.15": [0, -4, 0],
|
||||
"0.3": [0, -4, 0],
|
||||
"0.35": [0, 0, 0],
|
||||
"0.4": [0, 0, 0],
|
||||
"1.35": [0, 0, 0],
|
||||
"1.4": [0, -4, 0],
|
||||
"1.95": [0, -4, 0],
|
||||
"2.1": [0, -4, 0]
|
||||
"2.05": [-12.5, 0, 0],
|
||||
"2.1": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"tongue3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.15": [0, 0, 0],
|
||||
"0.2": [52.5, 0, 0],
|
||||
"0.3": [52.5, 0, 0],
|
||||
"0.2": [7.5, 0, 0],
|
||||
"0.25": [22.5, 0, 0],
|
||||
"0.3": [22.5, 0, 0],
|
||||
"0.35": [7.5, 0, 0],
|
||||
"0.4": [0, 0, 0],
|
||||
"1.35": [0, 0, 0],
|
||||
"1.4": [0, 0, 0],
|
||||
"1.45": [0, 0, 0],
|
||||
"1.5": [30, 0, 0],
|
||||
"1.75": [47.5, 0, 0],
|
||||
"1.75": [0, 0, 0],
|
||||
"1.85": [47.5, 0, 0],
|
||||
"1.95": [47.5, 0, 0],
|
||||
"2.0": [-20, 0, 0],
|
||||
"2.1": [-20, 0, 0],
|
||||
"2.15": [-45, 0, 0],
|
||||
"2.2": [-45, 0, 0],
|
||||
"2.25": [47.5, 0, 0],
|
||||
"2.3": [-17.5, 0, 0],
|
||||
"2.35": [-10.5, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.15": [0, 0, 0],
|
||||
"0.2": [0, -4, 0],
|
||||
"0.35": [0, -4, 0],
|
||||
"0.4": [0, 0, 0],
|
||||
"1.35": [0, 0, 0],
|
||||
"1.4": [0, 0, 0],
|
||||
"1.45": [0, -2, 0],
|
||||
"1.5": [0, -4, 0],
|
||||
"1.95": [0, -4, 0],
|
||||
"2.1": [0, -4, 0]
|
||||
"2.05": [-20, 0, 0],
|
||||
"2.1": [10, 0, 0]
|
||||
}
|
||||
},
|
||||
"tongue4": {
|
||||
@@ -386,15 +372,17 @@
|
||||
"0.2": [0, 0, 0],
|
||||
"0.25": [35, 0, 0],
|
||||
"0.3": [35, 0, 0],
|
||||
"0.35": [-15, 0, 0],
|
||||
"0.35": [-40, 0, 0],
|
||||
"0.4": [0, 0, 0],
|
||||
"1.35": [0, 0, 0],
|
||||
"1.45": [0, 0, 0],
|
||||
"1.7": [27.5, 0, 0],
|
||||
"1.75": [0, 0, 0],
|
||||
"1.95": [27.5, 0, 0],
|
||||
"2.0": [-27.5, 0, 0],
|
||||
"2.25": [-27.5, 0, 0],
|
||||
"2.3": [-5, 0, 0]
|
||||
"2.1": [-27.5, 0, 0],
|
||||
"2.2": [-5, 0, 0],
|
||||
"2.25": [30, 0, 0],
|
||||
"2.3": [-35, 0, 0],
|
||||
"2.7": [25, 0, 0]
|
||||
}
|
||||
},
|
||||
"tail": {
|
||||
@@ -428,7 +416,7 @@
|
||||
"1.95": [0.6, 0, -1]
|
||||
}
|
||||
},
|
||||
"tail3": {
|
||||
"tail4": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2": [0, 37.5, 0],
|
||||
@@ -453,7 +441,7 @@
|
||||
"1.9": [-0.6, 0, -1.2]
|
||||
}
|
||||
},
|
||||
"tail4": {
|
||||
"tail5": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2": [0, -35, 0],
|
||||
@@ -474,7 +462,7 @@
|
||||
"0.35": [0.34, 0, -0.7]
|
||||
}
|
||||
},
|
||||
"tail5": {
|
||||
"tail6": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2": [0, 12.5, 0],
|
||||
@@ -489,71 +477,41 @@
|
||||
"2.1": [17.68298, 22.5065, 0.4769],
|
||||
"2.15": [2.42242, 22.53562, -0.24157]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.sleep": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body_upper": {
|
||||
"rotation": [46.00798, 4.21261, 8.68723]
|
||||
},
|
||||
"hood": {
|
||||
"rotation": [-17.79674, 5.06499, 5.86553]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [-7.5, 7.5, 12.5]
|
||||
},
|
||||
"head_angle": {
|
||||
"rotation": [14.60967, -3.73171, 11.93845]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [0, 22.5, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [0, -37.5, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [0, -45, 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [0, -55, 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": [0, -47.5, 0]
|
||||
"hood4": {
|
||||
"rotation": {
|
||||
"1.95": [0, 0, 0],
|
||||
"2.05": [-44.17, 0, 0],
|
||||
"2.1": [-40, 0, 0],
|
||||
"2.15": [-30, 0, 0],
|
||||
"2.2": [-32.5, 0, 0],
|
||||
"2.35": [-32.5, 0, 0],
|
||||
"2.55": [-30.5, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.blink": {
|
||||
"animation_length": 0.16667,
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0],
|
||||
"0.125": [-0.1, 0, 0],
|
||||
"0.0": [-0.1, 0, -0.1],
|
||||
"0.125": [-0.1, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0],
|
||||
"0.125": [0.1, 0, 0],
|
||||
"0.0": [0.1, 0, -0.1],
|
||||
"0.125": [0.1, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.cry": {
|
||||
"animation_length": 0.91667,
|
||||
"animation_length": 0.9167,
|
||||
"bones": {
|
||||
"head_angle": {
|
||||
"rotation": {
|
||||
@@ -606,20 +564,16 @@
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"post": [0, 0, -3],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [0, -5, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.6667": {
|
||||
"post": [0, -5, 0],
|
||||
"0.5417": {
|
||||
"post": [0, 0, -4],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": {
|
||||
"post": [0, -5, 0],
|
||||
"post": [0, 0, -4],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.9167": {
|
||||
@@ -627,6 +581,14 @@
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"teeth_top": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, -1, 0],
|
||||
"0.8333": [0, -1, 0],
|
||||
"0.875": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
@@ -634,6 +596,102 @@
|
||||
"effect": "pokemon.arbok.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.summary_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body_upper": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*2+90)*0.25", 20, "math.sin(q.anim_time*90*2+90)*4"],
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"hood": {
|
||||
"rotation": ["-10-math.sin(q.anim_time*90*4+90)*1", "-15+math.sin(q.anim_time*90*2+90)*6", -17.5]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4)*0.75", 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [0, "40-math.sin(q.anim_time*90*2+90)*0.5", 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [0, "-55-math.sin(q.anim_time*90*2-90)*0.5", 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [0, "-55-math.sin(q.anim_time*90*2)*0.5", 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": [0, "55-math.sin(q.anim_time*90*2+90)*0.5", 0]
|
||||
},
|
||||
"tail6": {
|
||||
"rotation": [0, "60-math.sin(q.anim_time*90*2)*0.5", 0]
|
||||
},
|
||||
"body": {
|
||||
"position": ["math.sin(q.anim_time*90*2+30*2)*0.06", 0, "-math.sin(q.anim_time*90*2+30*3)*0.04"]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4+90)*0.5", 0, "-math.sin(q.anim_time*90*2+90)*2"]
|
||||
},
|
||||
"head_correction": {
|
||||
"rotation": [12.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.arbok.pose": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body_upper": {
|
||||
"rotation": [-0.66945, 8.76874, -5.49831]
|
||||
},
|
||||
"body_upper2": {
|
||||
"rotation": [-8.75338, -7.00448, 3.56469]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": [11.28182, 1.819, -0.0901]
|
||||
},
|
||||
"head_angle": {
|
||||
"rotation": [14.0797, -13.71152, -15.07578]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": [30, 0, 0]
|
||||
},
|
||||
"tongue": {
|
||||
"rotation": [-7.5, 0, 0],
|
||||
"position": [0, 0, -5]
|
||||
},
|
||||
"tongue2": {
|
||||
"rotation": [12.5, 0, 0]
|
||||
},
|
||||
"tongue3": {
|
||||
"rotation": [-32.5, 0, 0]
|
||||
},
|
||||
"tongue4": {
|
||||
"rotation": [-37.5, 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [-12.75141, 51.3798, -16.15359]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [0, -62.5, 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [8.82223, -40.10027, 1.69801]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": [15, -32.5, 0]
|
||||
},
|
||||
"tail6": {
|
||||
"rotation": [27.94001, -7.59871, -28.85378]
|
||||
},
|
||||
"body_upper_rotation": {
|
||||
"rotation": [0, 25, 0]
|
||||
},
|
||||
"tail7": {
|
||||
"rotation": [36.76926, -13.35981, -15.02126]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [0, -62.5, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+202
-8
@@ -4,17 +4,211 @@
|
||||
"animation.smoochum.ground_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"leftarm": {
|
||||
"rotation": [0, 5, 45]
|
||||
"foot_left": {
|
||||
"rotation": [0, -15, 0]
|
||||
},
|
||||
"rightarm": {
|
||||
"rotation": [0, -5, -45]
|
||||
"foot_right": {
|
||||
"rotation": [0, 15, 0]
|
||||
},
|
||||
"leftleg": {
|
||||
"rotation": [0, -7.5, 0]
|
||||
"arm_left": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"rightleg": {
|
||||
"rotation": [0, 5, 0]
|
||||
"head_angle": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"hair_left": {
|
||||
"rotation": [0, 0, -15]
|
||||
},
|
||||
"hair_front_right": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"hair_front_left": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"hair_right": {
|
||||
"rotation": [0, 0, 15]
|
||||
},
|
||||
"smoochum": {
|
||||
"scale": 1
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, 15, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, -15, 0]
|
||||
},
|
||||
"hair_top_right": {
|
||||
"rotation": [0, 0, -57.5]
|
||||
},
|
||||
"hair_top_outer_right": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"hair_top_outer_left": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"hair_top_inner_right": {
|
||||
"rotation": [0, 0, -5]
|
||||
},
|
||||
"hair_top_inner_left": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": [0, 0, -1]
|
||||
},
|
||||
"mouth_open": {
|
||||
"position": [0, 0, 0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.smoochum.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eye_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyes_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyes_blink_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.smoochum.pose": {
|
||||
"animation_length": 0.6667,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [0, -10, 0],
|
||||
"position": [0, 1, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"head_angle": {
|
||||
"rotation": [-5, 12.5, -5]
|
||||
},
|
||||
"lips": {
|
||||
"position": [0, 0, 1.1]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [56.98496, 0.95667, 21.58693],
|
||||
"position": [0, 1, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [57.5, -15, 0]
|
||||
},
|
||||
"foot_left2": {
|
||||
"rotation": [-42.5, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"lips2": {
|
||||
"position": [0, 0, -1]
|
||||
},
|
||||
"hair_front_right": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"eyeshine_left": {
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"hair_left": {
|
||||
"rotation": [0, 0, -20]
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": [-0.95, 0.25, 0]
|
||||
},
|
||||
"eyeshine_right": {
|
||||
"position": [-0.25, 0, 0]
|
||||
},
|
||||
"shine_right": {
|
||||
"position": [-0.5, 0, 0]
|
||||
},
|
||||
"feet": {
|
||||
"position": [0, 0, -1]
|
||||
},
|
||||
"hair_front_left": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"hair_right": {
|
||||
"rotation": [0, 0, 20]
|
||||
},
|
||||
"pupil_left": {
|
||||
"position": [-0.25, 0, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, 0, 55]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 0, -25]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, 0, -55]
|
||||
},
|
||||
"torso2": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"undefined": {
|
||||
"rotation": [0, 0, -60]
|
||||
},
|
||||
"hair_top_outer_right": {
|
||||
"rotation": [0, 0, 32.5]
|
||||
},
|
||||
"hair_top_outer_left": {
|
||||
"rotation": [0, 0, -32.5]
|
||||
},
|
||||
"hair_top_inner_right": {
|
||||
"rotation": [0, 0, -5]
|
||||
},
|
||||
"hair_top_inner_left": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"mouth_small": {
|
||||
"position": [0, 0, -1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.smoochum.ditto_face": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"face": {
|
||||
"scale": 0
|
||||
},
|
||||
"face_ditto": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -281,7 +281,7 @@
|
||||
},
|
||||
"animation.luvdisc.ground_faint": {
|
||||
"loop": true,
|
||||
"animation_length": 2.5,
|
||||
"animation_length": 3,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": {
|
||||
|
||||
+3
-3
@@ -398,7 +398,7 @@
|
||||
"1.0": [3.5, 0, 0]
|
||||
}
|
||||
},
|
||||
"Head": {
|
||||
"head": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
}
|
||||
}
|
||||
@@ -442,7 +442,7 @@
|
||||
"neck": {
|
||||
"rotation": ["0+Math.cos((query.anim_time) * 90 * 4 - 160) * 2", 37.5, 0]
|
||||
},
|
||||
"Head": {
|
||||
"head": {
|
||||
"rotation": [0, 2.5, -7.5]
|
||||
},
|
||||
"arm_right": {
|
||||
@@ -2121,7 +2121,7 @@
|
||||
"2.0833": [0, 12.5, 0]
|
||||
}
|
||||
},
|
||||
"Head": {
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": [2.5, 30, -7.5],
|
||||
"0.4583": [2.5, 30, -7.5],
|
||||
|
||||
+60
@@ -61,6 +61,66 @@
|
||||
},
|
||||
"cloud2": {
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"locator_target": {
|
||||
"position": [10, 12, 10]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.musharna.sleep": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [-17.5, 0, "0+math.sin(q.anim_time*90/2)"],
|
||||
"position": ["-0-math.cos(q.anim_time*90/2)*0.5", "9-math.sin(q.anim_time*90-60)*0.3", 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [65, 15, "25+math.sin(q.anim_time*90/2-50)*3"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [65, -15, "-25+math.sin(q.anim_time*90/2-50)*3"]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [0, 0, "0-math.sin(q.anim_time*90/2-60)*0.2"]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [0, "-0+math.sin(q.anim_time*90/2-60)*0.3", 0]
|
||||
},
|
||||
"head2": {
|
||||
"rotation": [0, "-0+math.sin(q.anim_time*90/2-70)*0.5", 0]
|
||||
},
|
||||
"eye_closed_left": {
|
||||
"position": [-0.1, 0, 0.1]
|
||||
},
|
||||
"eye_open_left": {
|
||||
"position": [0.1, 0, -0.1]
|
||||
},
|
||||
"eyelash_left": {
|
||||
"position": [0, 3.5, -0.25]
|
||||
},
|
||||
"eye_closed_right": {
|
||||
"position": [0.1, 0, 0.1]
|
||||
},
|
||||
"eye_open_right": {
|
||||
"position": [-0.1, 0, -0.1]
|
||||
},
|
||||
"eyelash_right": {
|
||||
"position": [0, 3.5, -0.25]
|
||||
},
|
||||
"muzzle": {
|
||||
"rotation": [0, "-0+math.sin(q.anim_time*90/2-120)*1", 0]
|
||||
},
|
||||
"muzzle2": {
|
||||
"rotation": [0, "-0+math.sin(q.anim_time*90/2-180)*2", 0]
|
||||
},
|
||||
"cloud": {
|
||||
"scale": 0
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [62.5, "-0+math.sin(q.anim_time*90/2-40)*2", 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [62.5, "-0+math.sin(q.anim_time*90/2-40)*2", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
+6710
-78
File diff suppressed because it is too large
Load Diff
+364
-78
@@ -5,8 +5,8 @@
|
||||
"description": {
|
||||
"identifier": "geometry.arbok",
|
||||
"texture_width": 128,
|
||||
"texture_height": 64,
|
||||
"visible_bounds_width": 8,
|
||||
"texture_height": 128,
|
||||
"visible_bounds_width": 10,
|
||||
"visible_bounds_height": 4,
|
||||
"visible_bounds_offset": [0, 1, 0]
|
||||
},
|
||||
@@ -15,218 +15,504 @@
|
||||
"name": "arbok",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_root",
|
||||
"parent": "arbok",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"root": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_top",
|
||||
"parent": "arbok",
|
||||
"pivot": [0, 31, 0],
|
||||
"locators": {
|
||||
"top": [0, 31, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "arbok",
|
||||
"pivot": [0, 3, 0]
|
||||
},
|
||||
{
|
||||
"name": "body_upper",
|
||||
"name": "locator_target",
|
||||
"parent": "body",
|
||||
"pivot": [0, 0.5, -5.5],
|
||||
"rotation": [-50, 0, 0],
|
||||
"pivot": [0, 17.75, -16.5],
|
||||
"locators": {
|
||||
"target": [0, 17.75, -16.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_middle",
|
||||
"parent": "body",
|
||||
"pivot": [0, 5, -5.75],
|
||||
"locators": {
|
||||
"middle": [0, 5, -5.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "body_upper_rotation",
|
||||
"parent": "body",
|
||||
"pivot": [0, -0.5, 4.5]
|
||||
},
|
||||
{
|
||||
"name": "body_upper",
|
||||
"parent": "body_upper_rotation",
|
||||
"pivot": [0, -0.5, 4.5],
|
||||
"rotation": [-27.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 0.5, -13.5], "size": [7, 5, 8], "inflate": 0.1, "uv": [0, 15]}
|
||||
{"origin": [-4, -0.5, -6.5], "size": [8, 8, 11], "uv": [50, 52]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "body_upper_rotation2",
|
||||
"parent": "body_upper",
|
||||
"pivot": [0, -0.5, -6.5],
|
||||
"rotation": [-20, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "body_upper2",
|
||||
"parent": "body_upper_rotation2",
|
||||
"pivot": [0, -0.5, -6.5],
|
||||
"rotation": [-35, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, -0.5, -14.5], "size": [9, 8, 8], "uv": [74, 17]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hood",
|
||||
"parent": "body_upper",
|
||||
"pivot": [0, 1, -13.5],
|
||||
"parent": "body_upper2",
|
||||
"pivot": [0, -0.5, -14.5],
|
||||
"rotation": [-35, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-7.5, 1, -34.5], "size": [15, 4, 3], "uv": [36, 0]},
|
||||
{"origin": [-11, 2, -31.5], "size": [22, 4, 12], "uv": [60, 0]},
|
||||
{"origin": [-9.5, 2, -31.5], "size": [19, 0, 12], "inflate": 0.01, "uv": [77, 52]},
|
||||
{"origin": [-8.5, 1.5, -19.5], "size": [17, 4, 3], "uv": [88, 16]},
|
||||
{"origin": [-7.5, 1.5, -19.5], "size": [15, 1, 3], "inflate": 0.01, "uv": [92, 48]},
|
||||
{"origin": [-6, 1, -16.5], "size": [12, 4, 3], "uv": [98, 23]},
|
||||
{"origin": [-5.5, 1, -16.5], "size": [11, 1, 3], "inflate": 0.01, "uv": [98, 44]}
|
||||
{"origin": [-6, -0.5, -19.5], "size": [12, 7, 5], "uv": [94, 70]},
|
||||
{"origin": [-6, -0.5, -19.5], "size": [12, 1, 5], "inflate": 0.01, "uv": [86, 33]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hood2",
|
||||
"parent": "hood",
|
||||
"pivot": [6, 6.5, -19.5],
|
||||
"rotation": [16, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-11, -0.5, -25.5], "size": [22, 7, 6], "uv": [0, 32]},
|
||||
{"origin": [-10, -0.5, -25.5], "size": [20, 1, 6], "inflate": 0.01, "uv": [50, 45]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hood3",
|
||||
"parent": "hood2",
|
||||
"pivot": [0, 6.5, -25.5],
|
||||
"rotation": [16, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-13, -0.5, -37.5], "size": [26, 7, 12], "uv": [52, 109]},
|
||||
{"origin": [-12, -0.5, -37.5], "size": [24, 1, 12], "inflate": 0.01, "uv": [0, 19]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hood4",
|
||||
"parent": "hood3",
|
||||
"pivot": [0, 6.5, -37.5],
|
||||
"rotation": [44.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-9, 1.5, -44.5], "size": [18, 5, 7], "uv": [0, 45]},
|
||||
{"origin": [-9, 1.5, -44.5], "size": [18, 1, 7], "inflate": 0.01, "uv": [0, 99]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck",
|
||||
"parent": "hood",
|
||||
"pivot": [0, 3.5, -32.75],
|
||||
"parent": "hood4",
|
||||
"pivot": [0, 3.5, -44],
|
||||
"rotation": [43.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, -2.43412, -34.7309], "size": [5, 6, 4], "pivot": [0, 3.5, -32.75], "rotation": [-10, 0, 0], "uv": [18, 0]}
|
||||
{"origin": [-3.5, 1, -49.5], "size": [7, 5, 7], "uv": [0, 76]},
|
||||
{"origin": [-3, 1, -49.5], "size": [6, 1, 7], "inflate": 0.01, "uv": [50, 90]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head",
|
||||
"parent": "neck",
|
||||
"pivot": [0, -2, -35.75],
|
||||
"rotation": [175, 0, 0]
|
||||
"pivot": [0, 3.5, -49.25]
|
||||
},
|
||||
{
|
||||
"name": "head_correction",
|
||||
"parent": "head",
|
||||
"pivot": [0, -2, -35.75],
|
||||
"rotation": [-90, 0, 0]
|
||||
"pivot": [0, 3.5, -49.25]
|
||||
},
|
||||
{
|
||||
"name": "head_ai",
|
||||
"parent": "head_correction",
|
||||
"pivot": [0, -2, -35.75]
|
||||
"pivot": [0, 3.5, -49.25]
|
||||
},
|
||||
{
|
||||
"name": "head_angle",
|
||||
"parent": "head_ai",
|
||||
"pivot": [0, -2, -35.75],
|
||||
"rotation": [-80, 0, 0],
|
||||
"pivot": [0, 3.5, -49.25],
|
||||
"rotation": [12.5, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, -4, -36], "size": [5, 2, 5], "inflate": 0.02, "uv": [40, 7]},
|
||||
{"origin": [-3, -9, -36], "size": [6, 5, 3], "uv": [0, 0]},
|
||||
{"origin": [-2, -11, -36], "size": [4, 2, 3], "uv": [12, 10]},
|
||||
{"origin": [-1.24, -10.65, -33.5], "size": [0, 1, 1], "pivot": [-1.24, -10.15, -33], "rotation": [45, 0, -20], "uv": [117, 6]},
|
||||
{"origin": [1.24, -10.65, -33.5], "size": [0, 1, 1], "pivot": [1.24, -10.15, -33], "rotation": [45, 0, 20], "uv": [120, 6]}
|
||||
{"origin": [-4, 2, -54.75], "size": [8, 4, 6], "uv": [74, 87]},
|
||||
{"origin": [-4, 0, -51.75], "size": [8, 2, 3], "uv": [86, 39]},
|
||||
{"origin": [-4, 0, -51.75], "size": [8, 1, 3], "inflate": 0.01, "uv": [105, 53]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_head",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 4.5, -52.25],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"head": [0, 4.5, -52.25]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_hat",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 6, -52.25],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"item_hat": [0, 6, -52.25]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 3.5, -58.25],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"face": [0, 3.5, -58.25]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 3.5, -58.25],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"item_face": [0, 3.5, -58.25]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_mouth",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 1.25, -54.75],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"mouth": [0, 1.25, -54.75],
|
||||
"physical": [0, 1.25, -54.75],
|
||||
"special": [0, 1.25, -54.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_jaw_upper",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, -1.6, -54.25],
|
||||
"rotation": [-90, 0, 0],
|
||||
"locators": {
|
||||
"jaw1": [0, -1.6, -54.25]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyes",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, -6.75, -34.25]
|
||||
"pivot": [0, 4.75, -50.5],
|
||||
"cubes": [
|
||||
{"origin": [-4, 4.5, -54.75], "size": [1, 1, 1], "inflate": 0.03, "uv": [44, 67]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_right",
|
||||
"parent": "eyes",
|
||||
"pivot": [-3.01, -6.75, -34.25],
|
||||
"rotation": [5, 0, 0],
|
||||
"pivot": [-3.01, 4.75, -50.5],
|
||||
"cubes": [
|
||||
{"origin": [-3.01, -8.25, -34.75], "size": [0, 3, 1], "uv": [126, -1]},
|
||||
{"origin": [-3.02, -7.75, -34.75], "size": [0, 1, 1], "uv": [121, 35]}
|
||||
{"origin": [-4, 3, -54.75], "size": [1, 2, 2], "inflate": 0.01, "uv": [38, 57]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-4, 4, -55],
|
||||
"rotation": [-95, 0, 0],
|
||||
"locators": {
|
||||
"eye1": [-4, 4, -55]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyelid_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-2.51, -6.75, -34.25],
|
||||
"pivot": [-3.4, 4, -53.65],
|
||||
"cubes": [
|
||||
{"origin": [-2.92, -8.25, -34.75], "size": [1, 3, 1], "inflate": 0.01, "uv": [124, 3]}
|
||||
{"origin": [-3.9, 3, -54.65], "size": [1, 2, 2], "inflate": 0.02, "uv": [44, 57]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_left",
|
||||
"parent": "eyes",
|
||||
"pivot": [3.01, -6.75, -34.25],
|
||||
"rotation": [5, 0, 0],
|
||||
"pivot": [3.01, 4.75, -50.5],
|
||||
"cubes": [
|
||||
{"origin": [3.01, -8.25, -34.75], "size": [0, 3, 1], "uv": [124, -1], "mirror": true},
|
||||
{"origin": [3.02, -7.75, -34.75], "size": [0, 1, 1], "uv": [121, 35], "mirror": true}
|
||||
{"origin": [3, 3, -54.75], "size": [1, 2, 2], "inflate": 0.01, "uv": [38, 61]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [4, 4, -55],
|
||||
"rotation": [-95, 0, 0],
|
||||
"locators": {
|
||||
"eye2": [4, 4, -55]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyelid_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [2.41, -6.75, -34.25],
|
||||
"pivot": [3.4, 4, -53.65],
|
||||
"cubes": [
|
||||
{"origin": [1.92, -8.25, -34.75], "size": [1, 3, 1], "inflate": 0.01, "uv": [124, 7]}
|
||||
{"origin": [2.9, 3, -54.65], "size": [1, 2, 2], "inflate": 0.02, "uv": [44, 61]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "snout",
|
||||
"parent": "head_angle",
|
||||
"pivot": [1, 16, -43],
|
||||
"cubes": [
|
||||
{"origin": [-3, 2, -57.75], "size": [6, 4, 3], "uv": [22, 89]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "teeth_top",
|
||||
"parent": "snout",
|
||||
"pivot": [0, 3, -56.75]
|
||||
},
|
||||
{
|
||||
"name": "tooth_top_left",
|
||||
"parent": "teeth_top",
|
||||
"pivot": [1.5, 3, -57],
|
||||
"rotation": [0, -42.5, 0],
|
||||
"cubes": [
|
||||
{"origin": [1, 2.5, -57], "size": [1, 1, 0], "pivot": [1.5, 3, -57], "rotation": [0, 0, 45], "uv": [66, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tooth_top_right",
|
||||
"parent": "teeth_top",
|
||||
"pivot": [-1.5, 3, -57],
|
||||
"rotation": [0, 42.5, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2, 2.5, -57], "size": [1, 1, 0], "pivot": [-1.5, 3, -57], "rotation": [0, 0, -45], "uv": [48, 67]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jaw",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, -4, -33],
|
||||
"rotation": [-7.5, 0, 0],
|
||||
"pivot": [0, 2, -51.75],
|
||||
"cubes": [
|
||||
{"origin": [-2, -8.75, -33], "size": [4, 5, 2], "uv": [0, 8]},
|
||||
{"origin": [-1.5, -10.75, -33], "size": [3, 2, 2], "uv": [26, 10]},
|
||||
{"origin": [-1.5, -10.25, -33.5], "size": [1, 0, 1], "pivot": [-1, -10.25, -33], "rotation": [0, 45, 45], "uv": [116, 8], "mirror": true},
|
||||
{"origin": [0.5, -10.25, -33.5], "size": [1, 0, 1], "pivot": [1, -10.25, -33], "rotation": [0, -45, -45], "uv": [119, 8]},
|
||||
{"origin": [-1.25, -9.75, -33.25], "size": [0, 1, 1], "pivot": [-1.25, -9.25, -32.75], "rotation": [-45, 0, -25], "uv": [117, 8]},
|
||||
{"origin": [1.25, -9.75, -33.25], "size": [0, 1, 1], "pivot": [1.25, -9.25, -32.75], "rotation": [-45, 0, 25], "uv": [120, 8]},
|
||||
{"origin": [-1.5, -8.75, -33.25], "size": [0, 1, 1], "pivot": [-1.5, -8.25, -32.75], "rotation": [-45, 0, -20], "uv": [117, 9]},
|
||||
{"origin": [1.5, -8.75, -33.25], "size": [0, 1, 1], "pivot": [1.5, -8.25, -32.75], "rotation": [-45, 0, 20], "uv": [120, 9]}
|
||||
{"origin": [-3, 0, -56.75], "size": [6, 2, 5], "uv": [88, 52]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue_opening",
|
||||
"name": "locator_jaw_lower",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, -10.655, -32.49],
|
||||
"pivot": [0, 0.75, -52.5],
|
||||
"locators": {
|
||||
"jaw2": [0, 0.75, -52.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, 3.20526, -54.41444],
|
||||
"rotation": [62.5, 0, 0],
|
||||
"locators": {
|
||||
"item": [0, 3.20526, -54.41444]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "teeth_bottom",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, 2, -55.75]
|
||||
},
|
||||
{
|
||||
"name": "teeth_bottom_left",
|
||||
"parent": "teeth_bottom",
|
||||
"pivot": [1.25, 2, -55.75]
|
||||
},
|
||||
{
|
||||
"name": "tooth_bottom_left",
|
||||
"parent": "teeth_bottom_left",
|
||||
"pivot": [1.25, 2, -55.75],
|
||||
"cubes": [
|
||||
{"origin": [-0.5, -10.655, -32.99], "size": [1, 0, 1], "uv": [120, 4]}
|
||||
{"origin": [0.75, 1.5, -55.75], "size": [1, 1, 0], "pivot": [1.25, 2, -55.75], "rotation": [0, 0, -45], "uv": [48, 68]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tooth_bottom_left2",
|
||||
"parent": "teeth_bottom_left",
|
||||
"pivot": [2, 2, -55],
|
||||
"rotation": [0, -90, 0],
|
||||
"cubes": [
|
||||
{"origin": [1.5, 1.5, -55], "size": [1, 1, 0], "pivot": [2, 2, -55], "rotation": [0, 0, -45], "uv": [68, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tooth_bottom_left3",
|
||||
"parent": "teeth_bottom_left",
|
||||
"pivot": [2, 2, -53.5],
|
||||
"rotation": [0, -90, 0],
|
||||
"cubes": [
|
||||
{"origin": [1.5, 1.5, -53.5], "size": [1, 1, 0], "pivot": [2, 2, -53.5], "rotation": [0, 0, -45], "uv": [38, 69]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "teeth_bottom_right",
|
||||
"parent": "teeth_bottom",
|
||||
"pivot": [-1.25, 2, -55.75]
|
||||
},
|
||||
{
|
||||
"name": "tooth_bottom_right",
|
||||
"parent": "teeth_bottom_right",
|
||||
"pivot": [-1.25, 2, -55.75],
|
||||
"cubes": [
|
||||
{"origin": [-1.75, 1.5, -55.75], "size": [1, 1, 0], "pivot": [-1.25, 2, -55.75], "rotation": [0, 0, 45], "uv": [40, 69]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tooth_bottom_right2",
|
||||
"parent": "teeth_bottom_right",
|
||||
"pivot": [-2, 2, -55],
|
||||
"rotation": [0, 90, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, 1.5, -55], "size": [1, 1, 0], "pivot": [-2, 2, -55], "rotation": [0, 0, 45], "uv": [42, 69]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tooth_bottom_right3",
|
||||
"parent": "teeth_bottom_right",
|
||||
"pivot": [-2, 2, -53.5],
|
||||
"rotation": [0, 90, 0],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, 1.5, -53.5], "size": [1, 1, 0], "pivot": [-2, 2, -53.5], "rotation": [0, 0, 45], "uv": [44, 69]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue",
|
||||
"parent": "jaw",
|
||||
"pivot": [0, -2, -33],
|
||||
"rotation": [-2.5, 0, 0],
|
||||
"pivot": [0, 2, -48.25],
|
||||
"cubes": [
|
||||
{"origin": [-0.5, -7, -33], "size": [1, 5, 0], "uv": [117, 0]}
|
||||
{"origin": [-0.5, 2, -50.25], "size": [1, 0, 2], "uv": [38, 65]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue2",
|
||||
"parent": "tongue",
|
||||
"pivot": [0, -3, -32.99],
|
||||
"pivot": [0, 2, -50.25],
|
||||
"cubes": [
|
||||
{"origin": [-0.5, -7, -32.99], "size": [1, 4, 0], "uv": [119, 0]}
|
||||
{"origin": [-0.5, 2, -52.25], "size": [1, 0, 2], "uv": [44, 65]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue3",
|
||||
"parent": "tongue2",
|
||||
"pivot": [0, -3, -32.98],
|
||||
"pivot": [0, 2, -52.25],
|
||||
"cubes": [
|
||||
{"origin": [-0.5, -6, -32.98], "size": [1, 3, 0], "uv": [121, 0]}
|
||||
{"origin": [-0.5, 2, -54.25], "size": [1, 0, 2], "uv": [38, 67]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue4",
|
||||
"parent": "tongue3",
|
||||
"pivot": [0, -6, -33],
|
||||
"pivot": [0, 2, -54.25],
|
||||
"cubes": [
|
||||
{"origin": [-1, -7, -32.98], "size": [2, 1, 0], "uv": [117, 5]}
|
||||
{"origin": [-1, 2, -55.25], "size": [2, 0, 1], "uv": [52, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tongue5",
|
||||
"parent": "tongue4",
|
||||
"pivot": [0, -7, -33],
|
||||
"pivot": [0, 2, -55.25],
|
||||
"cubes": [
|
||||
{"origin": [-1.5, -8, -32.98], "size": [3, 1, 0], "uv": [117, 6]}
|
||||
{"origin": [0.5, 2, -56.25], "size": [1, 0, 1], "uv": [58, 32]},
|
||||
{"origin": [-1.5, 2, -56.25], "size": [1, 0, 1], "uv": [62, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail",
|
||||
"name": "tail_base",
|
||||
"parent": "body",
|
||||
"pivot": [0, 3, -5.5],
|
||||
"pivot": [0, 3, 5.5]
|
||||
},
|
||||
{
|
||||
"name": "tail",
|
||||
"parent": "tail_base",
|
||||
"pivot": [0, 3, 5.5],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 0, -5.5], "size": [7, 6, 11], "inflate": 0.05, "uv": [30, 14]}
|
||||
{"origin": [-3.5, -0.5, 4.5], "size": [7, 7, 12], "uv": [0, 57]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail2",
|
||||
"parent": "tail",
|
||||
"pivot": [0, 3, 5.5],
|
||||
"pivot": [0, 3, 16.5],
|
||||
"cubes": [
|
||||
{"origin": [-3, 0, 4.5], "size": [6, 6, 12], "uv": [0, 28]}
|
||||
{"origin": [-3, 0, 15.5], "size": [6, 6, 12], "uv": [38, 71]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail3",
|
||||
"parent": "tail2",
|
||||
"pivot": [0, 2.5, 16.5],
|
||||
"pivot": [0.5, 2.75, 27.5],
|
||||
"cubes": [
|
||||
{"origin": [-2.5, 0, 15.5], "size": [5, 5, 12], "uv": [0, 46]}
|
||||
{"origin": [-2.5, 0.5, 26.5], "size": [5, 5, 12], "uv": [74, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail4",
|
||||
"parent": "tail3",
|
||||
"pivot": [0, 2, 27.5],
|
||||
"pivot": [0, 3, 38.5],
|
||||
"cubes": [
|
||||
{"origin": [-2, 0, 26.5], "size": [4, 4, 12], "uv": [36, 31]}
|
||||
{"origin": [-2, 1, 37.5], "size": [4, 4, 12], "uv": [74, 71]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_tail",
|
||||
"parent": "tail4",
|
||||
"pivot": [0, 3, 43],
|
||||
"rotation": [180, 0, -180],
|
||||
"locators": {
|
||||
"tail": [0, 3, 43]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "tail5",
|
||||
"parent": "tail4",
|
||||
"pivot": [0, 1.5, 38.5],
|
||||
"pivot": [0, 2.5, 49.5],
|
||||
"cubes": [
|
||||
{"origin": [-1.5, 0, 37.5], "size": [3, 3, 12], "uv": [34, 47]}
|
||||
{"origin": [-1.5, 1.5, 48.5], "size": [3, 3, 8], "uv": [0, 88]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail6",
|
||||
"parent": "tail5",
|
||||
"pivot": [0, 2.5, 56.5],
|
||||
"cubes": [
|
||||
{"origin": [-1, 2, 55.5], "size": [2, 2, 7], "uv": [88, 59]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tail7",
|
||||
"parent": "tail6",
|
||||
"pivot": [0, 3, 62.5],
|
||||
"cubes": [
|
||||
{"origin": [-0.5, 2.5, 62], "size": [1, 1, 7], "inflate": 0.1, "uv": [40, 89]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_tail_tip",
|
||||
"parent": "tail7",
|
||||
"pivot": [0, 3, 69],
|
||||
"rotation": [180, 0, -180],
|
||||
"locators": {
|
||||
"tail_tip": [0, 3, 69]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+2
-2
@@ -39,11 +39,11 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat1",
|
||||
"name": "locator_seat_1",
|
||||
"parent": "thorax",
|
||||
"pivot": [0, 11, 0],
|
||||
"locators": {
|
||||
"seat1": [0, 11, 1]
|
||||
"seat_1": [0, 11, 1]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -79,7 +79,7 @@
|
||||
"parent": "torso",
|
||||
"pivot": [0, 21, 3.75],
|
||||
"locators": {
|
||||
"seat_2": [0, 21, 3.75]
|
||||
"seat_1": [0, 21, 3.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -78,7 +78,7 @@
|
||||
"parent": "torso",
|
||||
"pivot": [0, 21, 3.75],
|
||||
"locators": {
|
||||
"seat_2": [0, 21, 3.75]
|
||||
"seat_1": [0, 21, 3.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
+569
-41
@@ -4,9 +4,9 @@
|
||||
{
|
||||
"description": {
|
||||
"identifier": "geometry.smoochum",
|
||||
"texture_width": 64,
|
||||
"texture_width": 128,
|
||||
"texture_height": 64,
|
||||
"visible_bounds_width": 2,
|
||||
"visible_bounds_width": 3,
|
||||
"visible_bounds_height": 2.5,
|
||||
"visible_bounds_offset": [0, 0.75, 0]
|
||||
},
|
||||
@@ -15,78 +15,606 @@
|
||||
"name": "smoochum",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_root",
|
||||
"parent": "smoochum",
|
||||
"pivot": [0, 0, 0],
|
||||
"locators": {
|
||||
"root": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_top",
|
||||
"parent": "smoochum",
|
||||
"pivot": [0, 19, 0],
|
||||
"locators": {
|
||||
"top": [0, 19, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "smoochum",
|
||||
"pivot": [0, 4, 0],
|
||||
"pivot": [0, 7, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_middle",
|
||||
"parent": "body",
|
||||
"pivot": [0, 10, 0],
|
||||
"locators": {
|
||||
"middle": [0, 10, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_target",
|
||||
"parent": "body",
|
||||
"pivot": [0, 10, -7],
|
||||
"locators": {
|
||||
"target": [0, 10, -7]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "torso",
|
||||
"parent": "body",
|
||||
"pivot": [0, 1, 0],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 1, -2.5], "size": [7, 6, 5], "uv": [0, 15]}
|
||||
{"origin": [-4.5, 1, -4], "size": [9, 4, 8], "uv": [0, 19]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "torso2",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 5, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4, 4.5, -3.5], "size": [8, 4, 7], "uv": [41, 0]},
|
||||
{"origin": [-3, 7.5, -3], "size": [6, 2, 6], "uv": [41, 11]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "arms",
|
||||
"parent": "torso2",
|
||||
"pivot": [0, 7.25, 0]
|
||||
},
|
||||
{
|
||||
"name": "arm_left",
|
||||
"parent": "arms",
|
||||
"pivot": [3.5, 7.25, 0],
|
||||
"cubes": [
|
||||
{"origin": [3, 6.25, -1.5], "size": [3, 2, 3], "uv": [53, 19]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_left",
|
||||
"parent": "arm_left",
|
||||
"pivot": [6, 8.25, 1.5],
|
||||
"cubes": [
|
||||
{"origin": [6, 6.25, -1.5], "size": [3, 2, 3], "inflate": 0.02, "uv": [53, 24]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_secondary",
|
||||
"parent": "hand_left",
|
||||
"pivot": [8, 6.2, 0],
|
||||
"rotation": [0, -90, 0],
|
||||
"locators": {
|
||||
"hand_secondary": [8, 6.2, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "arm_right",
|
||||
"parent": "arms",
|
||||
"pivot": [-3.5, 7.25, 0],
|
||||
"cubes": [
|
||||
{"origin": [-6, 6.25, -1.5], "size": [3, 2, 3], "uv": [41, 19]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hand_right",
|
||||
"parent": "arm_right",
|
||||
"pivot": [-6, 8.25, 1.5],
|
||||
"cubes": [
|
||||
{"origin": [-9, 6.25, -1.5], "size": [3, 2, 3], "inflate": 0.02, "uv": [41, 24]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_hand_primary",
|
||||
"parent": "hand_right",
|
||||
"pivot": [-8, 6.2, 0],
|
||||
"rotation": [0, 90, 0],
|
||||
"locators": {
|
||||
"hand_primary": [-8, 6.2, 0],
|
||||
"physical": [-8, 6.2, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item",
|
||||
"parent": "hand_right",
|
||||
"pivot": [-8, 6.2, 0],
|
||||
"locators": {
|
||||
"item": [-8, 6.2, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "head",
|
||||
"parent": "body",
|
||||
"pivot": [0, 7, 0],
|
||||
"parent": "torso2",
|
||||
"pivot": [0, 9.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "head_ai",
|
||||
"parent": "head",
|
||||
"pivot": [0, 9.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "head_angle",
|
||||
"parent": "head_ai",
|
||||
"pivot": [0, 9.5, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, 7, -3.5], "size": [9, 8, 7], "uv": [0, 0]},
|
||||
{"origin": [-1.5, 7.25, -4.25], "size": [3, 2, 1], "uv": [25, 3]},
|
||||
{"origin": [-0.5, 7.75, -4.275], "size": [1, 1, 0], "uv": [15, 46]},
|
||||
{"origin": [-5, 12.03038, -3.8473], "size": [10, 3, 0], "pivot": [0.5, 13.03038, -3.8473], "rotation": [-10, 0, 0], "uv": [25, 0]},
|
||||
{"origin": [-4.76047, 8.02279, -3.5], "size": [0, 7, 7], "pivot": [-4.76047, 13.52279, -1.5], "rotation": [0, 0, 10], "uv": [14, 20]},
|
||||
{"origin": [-5, 7.0606, 4.19361], "size": [10, 8, 0], "pivot": [0, 11.0606, 4.19361], "rotation": [10, 0, 0], "uv": [24, 19]},
|
||||
{"origin": [4.76047, 8.02279, -3.5], "size": [0, 7, 7], "pivot": [4.76047, 13.52279, -1.5], "rotation": [0, 0, -10], "uv": [0, 19]},
|
||||
{"origin": [1.25, 9.25, -3.525], "size": [3, 3, 0], "pivot": [2.75, 10.75, -3.525], "rotation": [0, 0, 2.5], "uv": [0, 40], "mirror": true},
|
||||
{"origin": [-4.25, 9.25, -3.525], "size": [3, 3, 0], "pivot": [-2.75, 10.75, -3.525], "rotation": [0, 0, -2.5], "uv": [0, 40]}
|
||||
{"origin": [-5, 8.5, -5], "size": [10, 9, 10], "uv": [0, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelids",
|
||||
"parent": "head",
|
||||
"pivot": [0, 10.75, -3.525],
|
||||
"cubes": [
|
||||
{"origin": [1.25, 9.25, -3.45], "size": [3, 3, 1], "pivot": [2.75, 10.75, -3.45], "rotation": [0, 0, 2.5], "uv": [0, 47], "mirror": true},
|
||||
{"origin": [-4.25, 9.25, -3.45], "size": [3, 3, 1], "pivot": [-2.75, 10.75, -3.45], "rotation": [0, 0, -2.5], "uv": [0, 47]}
|
||||
]
|
||||
"name": "locator_head",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 18.75, -5],
|
||||
"locators": {
|
||||
"head": [0, 18.75, -5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_hat",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 18.75, 0],
|
||||
"locators": {
|
||||
"item_hat": [0, 18.75, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 12, -5],
|
||||
"locators": {
|
||||
"face": [0, 12, -5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_item_face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 12, -5],
|
||||
"locators": {
|
||||
"item_face": [0, 12.8, -5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_mouth",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 10.5, -6],
|
||||
"locators": {
|
||||
"mouth": [0, 10.5, -6],
|
||||
"special": [0, 10.5, -6]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "hair",
|
||||
"parent": "head",
|
||||
"pivot": [0, 15, -0.25],
|
||||
"parent": "head_angle",
|
||||
"pivot": [-1.5, 18.75, -2],
|
||||
"cubes": [
|
||||
{"origin": [-6, 15, -0.25], "size": [12, 4, 0], "uv": [19, 15]}
|
||||
{"origin": [-6, 16.75, 0], "size": [12, 2, 6], "inflate": 0.02, "uv": [0, 39]},
|
||||
{"origin": [-6, 16.75, -5], "size": [12, 2, 5], "uv": [36, 40]},
|
||||
{"origin": [-5.5, 16.75, -6], "size": [11, 2, 1], "uv": [73, 51]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leftarm",
|
||||
"parent": "body",
|
||||
"pivot": [3.5, 7, -0.25],
|
||||
"name": "hair_top",
|
||||
"parent": "hair",
|
||||
"pivot": [0, 18.75, 0]
|
||||
},
|
||||
{
|
||||
"name": "hair_top_outer_right",
|
||||
"parent": "hair_top",
|
||||
"pivot": [0, 18.75, 0],
|
||||
"cubes": [
|
||||
{"origin": [3.5, 5, -1.75], "size": [4, 2, 3], "uv": [0, 33]}
|
||||
{"origin": [-6, 17.75, 0], "size": [6, 2, 0], "uv": [66, 39]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rightarm",
|
||||
"parent": "body",
|
||||
"pivot": [-3.5, 7, -0.25],
|
||||
"name": "hair_top_outer_left",
|
||||
"parent": "hair_top",
|
||||
"pivot": [0, 18.75, 0],
|
||||
"cubes": [
|
||||
{"origin": [-7.5, 5, -1.75], "size": [4, 2, 3], "uv": [32, 9]}
|
||||
{"origin": [0, 17.75, 0], "size": [6, 2, 0], "uv": [66, 42]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leftleg",
|
||||
"parent": "body",
|
||||
"pivot": [1.75, 1, 0.75],
|
||||
"name": "hair_top_inner_right",
|
||||
"parent": "hair_top",
|
||||
"pivot": [-1, 18.75, 0],
|
||||
"cubes": [
|
||||
{"origin": [0.25, 0, -3.25], "size": [3, 1, 5], "uv": [32, 3]}
|
||||
{"origin": [-1, 18.25, 0], "size": [1, 4, 0], "inflate": 0.01, "uv": [79, 40]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rightleg",
|
||||
"parent": "body",
|
||||
"pivot": [-1.75, 1, 0.75],
|
||||
"name": "hair_top_inner_left",
|
||||
"parent": "hair_top",
|
||||
"pivot": [1, 18.75, 0],
|
||||
"cubes": [
|
||||
{"origin": [-3.25, 0, -3.25], "size": [3, 1, 5], "uv": [28, 27]}
|
||||
{"origin": [0, 18.25, 0], "size": [1, 4, 0], "inflate": 0.01, "uv": [82, 40]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hair_left",
|
||||
"parent": "hair",
|
||||
"pivot": [6, 18.75, -2.5],
|
||||
"cubes": [
|
||||
{"origin": [4, 13.75, -5], "size": [2, 5, 5], "inflate": -0.02, "uv": [94, 54]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hair_right",
|
||||
"parent": "hair",
|
||||
"pivot": [-6, 18.75, -2.5],
|
||||
"cubes": [
|
||||
{"origin": [-6, 13.75, -5], "size": [2, 5, 5], "inflate": -0.02, "uv": [80, 54]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hair_front",
|
||||
"parent": "hair",
|
||||
"pivot": [0, 18.75, -6]
|
||||
},
|
||||
{
|
||||
"name": "hair_front_right",
|
||||
"parent": "hair_front",
|
||||
"pivot": [-2, 18.75, -6],
|
||||
"cubes": [
|
||||
{"origin": [-5.5, 14.75, -6], "size": [5, 4, 2], "inflate": -0.02, "uv": [73, 45]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hair_front_left",
|
||||
"parent": "hair_front",
|
||||
"pivot": [2, 18.75, -6],
|
||||
"cubes": [
|
||||
{"origin": [0.5, 14.75, -6], "size": [5, 4, 2], "inflate": -0.02, "uv": [87, 45]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hair_back",
|
||||
"parent": "hair",
|
||||
"pivot": [0, 18.75, 6],
|
||||
"cubes": [
|
||||
{"origin": [-5, 7.75, 0], "size": [10, 11, 6], "inflate": 0.01, "uv": [0, 47]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hair_back_right",
|
||||
"parent": "hair_back",
|
||||
"pivot": [-6, 18.75, 6],
|
||||
"rotation": [0, 0, 10.8],
|
||||
"cubes": [
|
||||
{"origin": [-6, 8.75, -1], "size": [5, 10, 7], "uv": [32, 47]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hair_back_left",
|
||||
"parent": "hair_back",
|
||||
"pivot": [6, 18.75, 6],
|
||||
"rotation": [0, 0, -10.8],
|
||||
"cubes": [
|
||||
{"origin": [1, 8.75, -1], "size": [5, 10, 7], "uv": [56, 47]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "face",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 11.45, -5.02]
|
||||
},
|
||||
{
|
||||
"name": "mouth",
|
||||
"parent": "face",
|
||||
"pivot": [0, 10.45, -5.92]
|
||||
},
|
||||
{
|
||||
"name": "mouth_smile",
|
||||
"parent": "mouth",
|
||||
"pivot": [0, 10.45, -4.82],
|
||||
"cubes": [
|
||||
{"origin": [-1.5, 10.2, -4.82], "size": [3, 1, 1], "uv": [92, 4]},
|
||||
{"origin": [-1, 9.7, -4.82], "size": [2, 1, 1], "uv": [85, 4]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mouth_frown",
|
||||
"parent": "mouth",
|
||||
"pivot": [0, 10.45, -5.82],
|
||||
"cubes": [
|
||||
{"origin": [-1.5, 9.75, -5.82], "size": [3, 1, 1], "uv": [92, 1]},
|
||||
{"origin": [-1, 10.25, -5.82], "size": [2, 1, 1], "uv": [85, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mouth_small",
|
||||
"parent": "mouth",
|
||||
"pivot": [0, 10.45, -5],
|
||||
"cubes": [
|
||||
{"origin": [-0.5, 9.95, -5.02], "size": [1, 1, 1], "uv": [108, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "lips2",
|
||||
"parent": "mouth",
|
||||
"pivot": [0, 10.575, -4.05],
|
||||
"cubes": [
|
||||
{"origin": [-1.5, 8.95, -5], "size": [3, 3, 1], "uv": [76, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "lips",
|
||||
"parent": "mouth",
|
||||
"pivot": [0, 10.45, -5],
|
||||
"cubes": [
|
||||
{"origin": [-2, 8.95, -5.9], "size": [4, 3, 1], "uv": [65, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mouth_open",
|
||||
"parent": "lips",
|
||||
"pivot": [0, 10.45, -4.92],
|
||||
"cubes": [
|
||||
{"origin": [-1, 9.95, -4.92], "size": [2, 1, 1], "uv": [101, 4]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mouth_open2",
|
||||
"parent": "lips",
|
||||
"pivot": [0, 10.45, -5.92],
|
||||
"cubes": [
|
||||
{"origin": [-1, 9.94, -5.89], "size": [2, 1, 1], "inflate": 0.02, "uv": [101, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyes",
|
||||
"parent": "face",
|
||||
"pivot": [3, 13, -5.02]
|
||||
},
|
||||
{
|
||||
"name": "eye_left",
|
||||
"parent": "eyes",
|
||||
"pivot": [3, 13, -5.02],
|
||||
"cubes": [
|
||||
{"origin": [1.5, 11.5, -5.02], "size": [3, 3, 1], "uv": [66, 27]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [2.7, 13, -5.1],
|
||||
"locators": {
|
||||
"eye_left": [2.7, 13, -5.1]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "pupil_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [2.85, 13.05, -5.04],
|
||||
"cubes": [
|
||||
{"origin": [1.85, 12.05, -4.94], "size": [2, 2, 1], "inflate": 0.1, "uv": [66, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyeshine_left",
|
||||
"parent": "pupil_left",
|
||||
"pivot": [2.5, 13.4, -5.08],
|
||||
"cubes": [
|
||||
{"origin": [2, 12.9, -5.06], "size": [1, 1, 1], "uv": [82, 33]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_happy_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [3, 13, -4.94],
|
||||
"cubes": [
|
||||
{"origin": [1.5, 12, -4.94], "size": [3, 2, 1], "uv": [73, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_shocked_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [3, 13, -4.94],
|
||||
"cubes": [
|
||||
{"origin": [2.5, 12.5, -4.94], "size": [1, 1, 1], "uv": [87, 33]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyebrow_angry_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [2.75, 14.375, -4.96],
|
||||
"cubes": [
|
||||
{"origin": [2, 14, -4.98], "size": [2, 1, 1], "uv": [84, 27]},
|
||||
{"origin": [1, 13.5, -4.98], "size": [1, 1, 1], "uv": [91, 27]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyebrow_sad_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [3.25, 14.625, -4.98],
|
||||
"cubes": [
|
||||
{"origin": [2.75, 14.25, -4.98], "size": [1, 1, 1], "uv": [84, 30]},
|
||||
{"origin": [3.75, 13.75, -4.98], "size": [1, 1, 1], "uv": [89, 30]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eye_right",
|
||||
"parent": "eyes",
|
||||
"pivot": [-3, 13, -5.02],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, 11.5, -5.02], "size": [3, 3, 1], "uv": [66, 18]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-2.7, 13, -5.1],
|
||||
"locators": {
|
||||
"eye_right": [-2.7, 13, -5.1]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "pupil_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-2.85, 13.05, -5.04],
|
||||
"cubes": [
|
||||
{"origin": [-3.85, 12.05, -4.94], "size": [2, 2, 1], "inflate": 0.1, "uv": [66, 23]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyeshine_right",
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-2.75, 13.4, -5.08],
|
||||
"cubes": [
|
||||
{"origin": [-3, 12.9, -5.06], "size": [1, 1, 1], "uv": [82, 24]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_happy_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-3, 13, -4.94],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, 12, -4.94], "size": [3, 2, 1], "uv": [73, 23]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pupil_shocked_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-3, 13, -4.94],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 12.5, -4.94], "size": [1, 1, 1], "uv": [87, 24], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyebrow_sad_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-3.25, 14.625, -4.98],
|
||||
"cubes": [
|
||||
{"origin": [-3.75, 14.25, -4.98], "size": [1, 1, 1], "uv": [84, 21]},
|
||||
{"origin": [-4.75, 13.75, -4.98], "size": [1, 1, 1], "uv": [89, 21]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyebrow_angry_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-2.5, 14.375, -4.96],
|
||||
"cubes": [
|
||||
{"origin": [-4, 14, -4.98], "size": [2, 1, 1], "uv": [84, 18]},
|
||||
{"origin": [-2, 13.5, -4.98], "size": [1, 1, 1], "uv": [91, 18]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_right",
|
||||
"parent": "eyes",
|
||||
"pivot": [-3, 13, -4.92],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, 11.5, -4.92], "size": [3, 3, 1], "uv": [75, 18]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyelid_left",
|
||||
"parent": "eyes",
|
||||
"pivot": [3, 13, -4.92],
|
||||
"cubes": [
|
||||
{"origin": [1.5, 11.5, -4.92], "size": [3, 3, 1], "uv": [75, 27]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "face_ditto",
|
||||
"parent": "head_angle",
|
||||
"pivot": [0, 11.25, -4.9]
|
||||
},
|
||||
{
|
||||
"name": "eyes_ditto",
|
||||
"parent": "face_ditto",
|
||||
"pivot": [0, 12, -4.92],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 11.5, -4.92], "size": [7, 1, 1], "uv": [109, 45]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eyes_blink_ditto",
|
||||
"parent": "face_ditto",
|
||||
"pivot": [0, 12, -4.82],
|
||||
"cubes": [
|
||||
{"origin": [-4, 11.5, -4.82], "size": [8, 1, 1], "uv": [109, 48]},
|
||||
{"origin": [-3.5, 12, -4.83], "size": [7, 1, 1], "uv": [109, 51]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mouth_ditto",
|
||||
"parent": "face_ditto",
|
||||
"pivot": [0, 10.25, -4.9],
|
||||
"cubes": [
|
||||
{"origin": [-3, 9.5, -4.91], "size": [6, 1, 1], "uv": [109, 57]},
|
||||
{"origin": [3, 10, -4.91], "size": [1, 1, 1], "uv": [114, 54]},
|
||||
{"origin": [-4, 10, -4.91], "size": [1, 1, 1], "uv": [109, 54], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mouth_open_ditto",
|
||||
"parent": "face_ditto",
|
||||
"pivot": [0, 10, -4.81],
|
||||
"cubes": [
|
||||
{"origin": [-4, 9, -4.81], "size": [8, 2, 1], "uv": [109, 60]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "feet",
|
||||
"parent": "body",
|
||||
"pivot": [0, 1, 1]
|
||||
},
|
||||
{
|
||||
"name": "foot_left",
|
||||
"parent": "feet",
|
||||
"pivot": [2.5, 0.5, 1],
|
||||
"cubes": [
|
||||
{"origin": [1, 0, 0], "size": [3, 1, 2], "uv": [69, 11]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "foot_left2",
|
||||
"parent": "foot_left",
|
||||
"pivot": [3, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [1, 0, -2], "size": [3, 1, 2], "uv": [69, 14]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_foot_secondary",
|
||||
"parent": "foot_left2",
|
||||
"pivot": [2.5, 0, -0.5],
|
||||
"locators": {
|
||||
"foot_secondary": [2.5, 0, -0.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "foot_right",
|
||||
"parent": "feet",
|
||||
"pivot": [-2.5, 0.5, 1],
|
||||
"cubes": [
|
||||
{"origin": [-4, 0, 0], "size": [3, 1, 2], "uv": [59, 11]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "toes_right",
|
||||
"parent": "foot_right",
|
||||
"pivot": [-2, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4, 0, -2], "size": [3, 1, 2], "uv": [59, 14]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_foot_primary",
|
||||
"parent": "toes_right",
|
||||
"pivot": [-2.5, 0, -0.5],
|
||||
"locators": {
|
||||
"foot_primary": [-2.5, 0, -0.5]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+2
-2
@@ -377,11 +377,11 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat1",
|
||||
"name": "locator_seat_1",
|
||||
"parent": "saddle",
|
||||
"pivot": [0, 23.525, 0],
|
||||
"locators": {
|
||||
"seat1": [0, 23.525, 0]
|
||||
"seat_1": [0, 23.525, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
+8
@@ -30,6 +30,14 @@
|
||||
"parent": "body_rotation",
|
||||
"pivot": [0, 8.5, 0]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "waist_rotation",
|
||||
"pivot": [0, 36, 0],
|
||||
"locators": {
|
||||
"seat_1": [0, 35.75, 8.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "waist_scale",
|
||||
"parent": "waist_rotation",
|
||||
|
||||
+7
-7
@@ -192,7 +192,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Head",
|
||||
"name": "head",
|
||||
"parent": "neck",
|
||||
"pivot": [0, 28.5, 0],
|
||||
"cubes": [
|
||||
@@ -201,7 +201,7 @@
|
||||
},
|
||||
{
|
||||
"name": "mouth_open",
|
||||
"parent": "Head",
|
||||
"parent": "head",
|
||||
"pivot": [0, 28.6, 1.6],
|
||||
"cubes": [
|
||||
{"origin": [3.2, 28.6, -2.6], "size": [1, 1, 1], "inflate": 0.01, "pivot": [0, 28.6, 1.6], "rotation": [0, 45, 0], "uv": [44, 28]}
|
||||
@@ -209,7 +209,7 @@
|
||||
},
|
||||
{
|
||||
"name": "hair",
|
||||
"parent": "Head",
|
||||
"parent": "head",
|
||||
"pivot": [0, 32.25, -0.7],
|
||||
"rotation": [7.5, 0, 0],
|
||||
"cubes": [
|
||||
@@ -218,7 +218,7 @@
|
||||
},
|
||||
{
|
||||
"name": "eyes",
|
||||
"parent": "Head",
|
||||
"parent": "head",
|
||||
"pivot": [0, 31.5, 3.5]
|
||||
},
|
||||
{
|
||||
@@ -319,7 +319,7 @@
|
||||
},
|
||||
{
|
||||
"name": "hair_blade",
|
||||
"parent": "Head",
|
||||
"parent": "head",
|
||||
"pivot": [0, 35.15, -1.15],
|
||||
"cubes": [
|
||||
{"origin": [0, 29.65, -1.15], "size": [0, 12, 7], "uv": [0, 8]},
|
||||
@@ -328,7 +328,7 @@
|
||||
},
|
||||
{
|
||||
"name": "head_side_left",
|
||||
"parent": "Head",
|
||||
"parent": "head",
|
||||
"pivot": [3.5, 29.2, -1],
|
||||
"rotation": [7.5, 47.5, 0],
|
||||
"cubes": [
|
||||
@@ -338,7 +338,7 @@
|
||||
},
|
||||
{
|
||||
"name": "head_side_right",
|
||||
"parent": "Head",
|
||||
"parent": "head",
|
||||
"pivot": [-3.5, 29.2, -1],
|
||||
"rotation": [7.5, -47.5, 0],
|
||||
"cubes": [
|
||||
|
||||
+18
-22
@@ -188,12 +188,10 @@
|
||||
"parent": "eyes",
|
||||
"pivot": [-1.51, 13.3, -1],
|
||||
"cubes": [
|
||||
{"origin": [-1.51, 12.8, -2], "size": [0, 1, 2], "uv": [60, 14]},
|
||||
{"origin": [-1.51, 12.8, -0.5], "size": [0, 1, 2], "uv": [56, 14]},
|
||||
{"origin": [-1.51, 11.3, -2], "size": [0, 1, 2], "uv": [60, 16]},
|
||||
{"origin": [-1.51, 11.3, -0.5], "size": [0, 1, 2], "uv": [56, 16]},
|
||||
{"origin": [-1.51, 11.8, -2], "size": [0, 1, 2], "uv": [60, 15]},
|
||||
{"origin": [-1.51, 11.8, -0.5], "size": [0, 1, 2], "uv": [56, 15]}
|
||||
{"origin": [-1.52, 12.8, -2], "size": [0, 1, 1], "uv": [62, 15]},
|
||||
{"origin": [-1.53, 12.8, -1.5], "size": [0, 1, 3], "uv": [56, 13]},
|
||||
{"origin": [-1.51, 11.3, -2], "size": [0, 2, 3], "uv": [56, 14]},
|
||||
{"origin": [-1.52, 11.3, 0.5], "size": [0, 2, 1], "uv": [62, 16]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -201,8 +199,8 @@
|
||||
"parent": "eye_right",
|
||||
"pivot": [-1.51, 13.8, -0.25],
|
||||
"cubes": [
|
||||
{"origin": [-1.51, 13.8, -0.5], "size": [0, 1, 2], "uv": [56, 13]},
|
||||
{"origin": [-1.51, 13.8, -2], "size": [0, 1, 2], "uv": [60, 13]}
|
||||
{"origin": [-1.53, 13.8, -1.5], "size": [0, 1, 3], "uv": [56, 12]},
|
||||
{"origin": [-1.52, 13.8, -2], "size": [0, 1, 1], "uv": [62, 14]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -223,7 +221,7 @@
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-1.52, 13, -0.25],
|
||||
"cubes": [
|
||||
{"origin": [-1.52, 12.5, -0.75], "size": [0, 1, 1], "uv": [1, 0]}
|
||||
{"origin": [-1.54, 12.5, -0.75], "size": [0, 1, 1], "uv": [1, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -240,7 +238,7 @@
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-1.42, 13, -1.25],
|
||||
"cubes": [
|
||||
{"origin": [-1.42, 12.5, -1.75], "size": [0, 1, 1], "uv": [1, 1]}
|
||||
{"origin": [-1.44, 12.5, -1.75], "size": [0, 1, 1], "uv": [1, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -248,7 +246,7 @@
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-1.42, 13, 0.75],
|
||||
"cubes": [
|
||||
{"origin": [-1.42, 12.5, 0.25], "size": [0, 1, 1], "uv": [1, 2]}
|
||||
{"origin": [-1.44, 12.5, 0.25], "size": [0, 1, 1], "uv": [1, 2]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -272,12 +270,10 @@
|
||||
"parent": "eyes",
|
||||
"pivot": [1.51, 13.3, -1],
|
||||
"cubes": [
|
||||
{"origin": [1.51, 12.8, -2], "size": [0, 1, 2], "uv": [52, 14], "mirror": true},
|
||||
{"origin": [1.51, 12.8, -0.5], "size": [0, 1, 2], "uv": [48, 14], "mirror": true},
|
||||
{"origin": [1.51, 11.3, -2], "size": [0, 1, 2], "uv": [52, 16], "mirror": true},
|
||||
{"origin": [1.51, 11.3, -0.5], "size": [0, 1, 2], "uv": [48, 16], "mirror": true},
|
||||
{"origin": [1.51, 11.8, -2], "size": [0, 1, 2], "uv": [52, 15], "mirror": true},
|
||||
{"origin": [1.51, 11.8, -0.5], "size": [0, 1, 2], "uv": [48, 15], "mirror": true}
|
||||
{"origin": [1.52, 12.8, -2], "size": [0, 1, 1], "uv": [54, 15], "mirror": true},
|
||||
{"origin": [1.53, 12.8, -1.5], "size": [0, 1, 3], "uv": [48, 13], "mirror": true},
|
||||
{"origin": [1.51, 11.3, -2], "size": [0, 2, 3], "uv": [48, 14], "mirror": true},
|
||||
{"origin": [1.52, 11.3, 0.5], "size": [0, 2, 1], "uv": [54, 16], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -285,8 +281,8 @@
|
||||
"parent": "eye_left",
|
||||
"pivot": [1.51, 13.8, -0.25],
|
||||
"cubes": [
|
||||
{"origin": [1.51, 13.8, -0.5], "size": [0, 1, 2], "uv": [48, 13], "mirror": true},
|
||||
{"origin": [1.51, 13.8, -2], "size": [0, 1, 2], "uv": [52, 13], "mirror": true}
|
||||
{"origin": [1.53, 13.8, -1.5], "size": [0, 1, 3], "uv": [48, 12], "mirror": true},
|
||||
{"origin": [1.52, 13.8, -2], "size": [0, 1, 1], "uv": [54, 14], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -307,7 +303,7 @@
|
||||
"parent": "pupil_left",
|
||||
"pivot": [1.52, 13, -0.25],
|
||||
"cubes": [
|
||||
{"origin": [1.52, 12.5, -0.75], "size": [0, 1, 1], "uv": [3, 0], "mirror": true}
|
||||
{"origin": [1.54, 12.5, -0.75], "size": [0, 1, 1], "uv": [3, 0], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -324,7 +320,7 @@
|
||||
"parent": "pupil_left",
|
||||
"pivot": [1.42, 13, -1.25],
|
||||
"cubes": [
|
||||
{"origin": [1.42, 12.5, -1.75], "size": [0, 1, 1], "uv": [3, 1], "mirror": true}
|
||||
{"origin": [1.44, 12.5, -1.75], "size": [0, 1, 1], "uv": [3, 1], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -332,7 +328,7 @@
|
||||
"parent": "pupil_left",
|
||||
"pivot": [1.42, 13, 0.75],
|
||||
"cubes": [
|
||||
{"origin": [1.42, 12.5, 0.25], "size": [0, 1, 1], "uv": [3, 2], "mirror": true}
|
||||
{"origin": [1.44, 12.5, 0.25], "size": [0, 1, 1], "uv": [3, 2], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
+16
-20
@@ -188,12 +188,10 @@
|
||||
"parent": "eyes",
|
||||
"pivot": [-1.51, 13.3, -1],
|
||||
"cubes": [
|
||||
{"origin": [-1.51, 12.8, -2], "size": [0, 1, 2], "uv": [60, 12]},
|
||||
{"origin": [-1.51, 12.8, -0.5], "size": [0, 1, 2], "uv": [56, 12]},
|
||||
{"origin": [-1.51, 11.3, -2], "size": [0, 1, 2], "uv": [60, 14]},
|
||||
{"origin": [-1.51, 11.3, -0.5], "size": [0, 1, 2], "uv": [56, 14]},
|
||||
{"origin": [-1.51, 11.8, -2], "size": [0, 1, 2], "uv": [60, 13]},
|
||||
{"origin": [-1.51, 11.8, -0.5], "size": [0, 1, 2], "uv": [56, 13]}
|
||||
{"origin": [-1.52, 12.8, -2], "size": [0, 1, 1], "uv": [62, 13]},
|
||||
{"origin": [-1.53, 12.8, -1.5], "size": [0, 1, 3], "uv": [56, 11]},
|
||||
{"origin": [-1.51, 11.3, -2], "size": [0, 2, 3], "uv": [56, 12]},
|
||||
{"origin": [-1.52, 11.3, 0.5], "size": [0, 2, 1], "uv": [62, 14]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -201,8 +199,8 @@
|
||||
"parent": "eye_right",
|
||||
"pivot": [-1.51, 13.8, -0.25],
|
||||
"cubes": [
|
||||
{"origin": [-1.51, 13.8, -0.5], "size": [0, 1, 2], "uv": [56, 11]},
|
||||
{"origin": [-1.51, 13.8, -2], "size": [0, 1, 2], "uv": [60, 11]}
|
||||
{"origin": [-1.53, 13.8, -1.5], "size": [0, 1, 3], "uv": [56, 10]},
|
||||
{"origin": [-1.52, 13.8, -2], "size": [0, 1, 1], "uv": [62, 12]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -211,7 +209,7 @@
|
||||
"pivot": [-1.31, 11.6, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [-1.81, 10.6, 0.3], "size": [1, 2, 2], "inflate": -0.3, "uv": [58, 17]},
|
||||
{"origin": [-1.61, 10.4, 1.5], "size": [1, 1, 1], "inflate": -0.1, "uv": [48, 19]}
|
||||
{"origin": [-1.62, 10.4, 1.5], "size": [1, 1, 1], "inflate": -0.1, "uv": [48, 19]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -224,7 +222,7 @@
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-1.52, 13, -0.25],
|
||||
"cubes": [
|
||||
{"origin": [-1.52, 12.5, -0.75], "size": [0, 1, 1], "uv": [1, 0]}
|
||||
{"origin": [-1.54, 12.5, -0.75], "size": [0, 1, 1], "uv": [1, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -257,12 +255,10 @@
|
||||
"parent": "eyes",
|
||||
"pivot": [1.51, 13.3, -1],
|
||||
"cubes": [
|
||||
{"origin": [1.51, 12.8, -2], "size": [0, 1, 2], "uv": [52, 12], "mirror": true},
|
||||
{"origin": [1.51, 12.8, -0.5], "size": [0, 1, 2], "uv": [48, 12], "mirror": true},
|
||||
{"origin": [1.51, 11.3, -2], "size": [0, 1, 2], "uv": [52, 14], "mirror": true},
|
||||
{"origin": [1.51, 11.3, -0.5], "size": [0, 1, 2], "uv": [48, 14], "mirror": true},
|
||||
{"origin": [1.51, 11.8, -2], "size": [0, 1, 2], "uv": [52, 13], "mirror": true},
|
||||
{"origin": [1.51, 11.8, -0.5], "size": [0, 1, 2], "uv": [48, 13], "mirror": true}
|
||||
{"origin": [1.52, 12.8, -2], "size": [0, 1, 1], "uv": [54, 13], "mirror": true},
|
||||
{"origin": [1.53, 12.8, -1.5], "size": [0, 1, 3], "uv": [48, 11], "mirror": true},
|
||||
{"origin": [1.51, 11.3, -2], "size": [0, 2, 3], "uv": [48, 12], "mirror": true},
|
||||
{"origin": [1.52, 11.3, 0.5], "size": [0, 2, 1], "uv": [54, 14], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -270,8 +266,8 @@
|
||||
"parent": "eye_left",
|
||||
"pivot": [1.51, 13.8, -0.25],
|
||||
"cubes": [
|
||||
{"origin": [1.51, 13.8, -0.5], "size": [0, 1, 2], "uv": [48, 11], "mirror": true},
|
||||
{"origin": [1.51, 13.8, -2], "size": [0, 1, 2], "uv": [52, 11], "mirror": true}
|
||||
{"origin": [1.53, 13.8, -1.5], "size": [0, 1, 3], "uv": [48, 10], "mirror": true},
|
||||
{"origin": [1.52, 13.8, -2], "size": [0, 1, 1], "uv": [54, 12], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -280,7 +276,7 @@
|
||||
"pivot": [1.31, 11.6, 1.3],
|
||||
"cubes": [
|
||||
{"origin": [0.81, 10.6, 0.3], "size": [1, 2, 2], "inflate": -0.3, "uv": [52, 17], "mirror": true},
|
||||
{"origin": [0.61, 10.4, 1.5], "size": [1, 1, 1], "inflate": -0.1, "uv": [48, 17], "mirror": true}
|
||||
{"origin": [0.62, 10.4, 1.5], "size": [1, 1, 1], "inflate": -0.1, "uv": [48, 17], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -293,7 +289,7 @@
|
||||
"parent": "pupil_left",
|
||||
"pivot": [1.52, 13, -0.25],
|
||||
"cubes": [
|
||||
{"origin": [1.52, 12.5, -0.75], "size": [0, 1, 1], "uv": [3, 0], "mirror": true}
|
||||
{"origin": [1.54, 12.5, -0.75], "size": [0, 1, 1], "uv": [3, 0], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
+8
@@ -274,6 +274,14 @@
|
||||
"parent": "lower_gear_rotation",
|
||||
"pivot": [0, 9, -6]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "lower_gear_rotation",
|
||||
"pivot": [0, 10.5, -4.5],
|
||||
"locators": {
|
||||
"seat_1": [0, 10.5, -4.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "gear4",
|
||||
"parent": "lower_gear",
|
||||
|
||||
+8
@@ -447,6 +447,14 @@
|
||||
"cubes": [
|
||||
{"origin": [0, -24.5, -8], "size": [0, 12, 7], "uv": [98, 109]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "body",
|
||||
"pivot": [0, 54, -10],
|
||||
"locators": {
|
||||
"seat_1": [0, 54, -10]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+16
@@ -80,6 +80,14 @@
|
||||
{"origin": [4.51, 15, -8.515], "size": [1, 2, 2], "uv": [23, 35]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "pupil_left",
|
||||
"pivot": [5, 16, -8.5],
|
||||
"locators": {
|
||||
"eye2": [5, 16, -8.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyelid_left",
|
||||
"parent": "eye_left",
|
||||
@@ -104,6 +112,14 @@
|
||||
{"origin": [-5.51, 15, -8.515], "size": [1, 2, 2], "uv": [0, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-5, 16, -8.5],
|
||||
"locators": {
|
||||
"eye1": [-5, 16, -8.5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyelid_right",
|
||||
"parent": "eye_right",
|
||||
|
||||
+16
@@ -163,6 +163,14 @@
|
||||
{"origin": [11.01, 48, -27.02], "size": [1, 1, 0], "uv": [163, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "shine_left",
|
||||
"pivot": [11.5, 48.5, -27],
|
||||
"locators": {
|
||||
"eye2": [11.5, 48.5, -27]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyelid_left",
|
||||
"parent": "eye_left",
|
||||
@@ -195,6 +203,14 @@
|
||||
{"origin": [-12.01, 48, -27.02], "size": [1, 1, 0], "uv": [163, 2]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "shine_right",
|
||||
"pivot": [-11.5, 48.5, -27],
|
||||
"locators": {
|
||||
"eye1": [-11.5, 48.5, -27]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eyelid_right",
|
||||
"parent": "eye_right",
|
||||
|
||||
+21
-3
@@ -6,9 +6,9 @@
|
||||
"identifier": "geometry.dracozolt",
|
||||
"texture_width": 256,
|
||||
"texture_height": 128,
|
||||
"visible_bounds_width": 11,
|
||||
"visible_bounds_height": 4.5,
|
||||
"visible_bounds_offset": [0, 1.75, 0]
|
||||
"visible_bounds_width": 12,
|
||||
"visible_bounds_height": 5,
|
||||
"visible_bounds_offset": [0, 1.5, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
@@ -388,6 +388,15 @@
|
||||
{"origin": [1.42, 45.52, -6], "size": [1, 2, 2], "inflate": 0.02, "uv": [72, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [2.5, 47, -5],
|
||||
"rotation": [-35, -90, 0],
|
||||
"locators": {
|
||||
"eye2": [2.5, 47, -5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eye_right",
|
||||
"parent": "eyes",
|
||||
@@ -417,6 +426,15 @@
|
||||
{"origin": [-2.42, 45.52, -6], "size": [1, 2, 2], "inflate": 0.02, "uv": [78, 0], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-2.5, 47, -5],
|
||||
"rotation": [-35, 90, 0],
|
||||
"locators": {
|
||||
"eye1": [-2.5, 47, -5]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "head_fur",
|
||||
"parent": "head_rotation",
|
||||
|
||||
+18
@@ -346,6 +346,15 @@
|
||||
{"origin": [1.42, 58.52, -5], "size": [1, 2, 2], "inflate": 0.02, "uv": [32, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "eye_left",
|
||||
"pivot": [2.5, 60, -4],
|
||||
"rotation": [-35, -90, 0],
|
||||
"locators": {
|
||||
"eye2": [2.5, 60, -4]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "eye_right",
|
||||
"parent": "eyes",
|
||||
@@ -375,6 +384,15 @@
|
||||
{"origin": [-2.42, 58.52, -5], "size": [1, 2, 2], "inflate": 0.02, "uv": [38, 0], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "eye_right",
|
||||
"pivot": [-2.5, 60, -4],
|
||||
"rotation": [-35, 90, 0],
|
||||
"locators": {
|
||||
"eye1": [-2.5, 60, -4]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "head_fur",
|
||||
"parent": "head_rotation",
|
||||
|
||||
+20
-2
@@ -7,8 +7,8 @@
|
||||
"texture_width": 256,
|
||||
"texture_height": 256,
|
||||
"visible_bounds_width": 8,
|
||||
"visible_bounds_height": 8,
|
||||
"visible_bounds_offset": [0, 3, 0]
|
||||
"visible_bounds_height": 9,
|
||||
"visible_bounds_offset": [0, 3.5, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
@@ -177,6 +177,15 @@
|
||||
{"origin": [13.51, 24.75, 92.25], "size": [0, 3, 1], "uv": [67, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "pupil_left",
|
||||
"pivot": [13.5, 26.2, 92.75],
|
||||
"rotation": [0, -90, 0],
|
||||
"locators": {
|
||||
"eye1": [13.5, 26.2, 92.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "inner_eyelid_left",
|
||||
"parent": "eye_left",
|
||||
@@ -210,6 +219,15 @@
|
||||
{"origin": [-13.51, 24.75, 92.25], "size": [0, 3, 1], "uv": [67, 21]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-13.5, 26.2, 92.75],
|
||||
"rotation": [0, 90, 0],
|
||||
"locators": {
|
||||
"eye2": [-13.5, 26.2, 92.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "inner_eyelid_right",
|
||||
"parent": "eye_right",
|
||||
|
||||
+18
@@ -89,6 +89,15 @@
|
||||
{"origin": [13.51, 48.75, -6.25], "size": [0, 3, 1], "uv": [67, 1]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_right",
|
||||
"parent": "pupil_left",
|
||||
"pivot": [13.5, 50.25, -5.75],
|
||||
"rotation": [0, -90, 0],
|
||||
"locators": {
|
||||
"eye1": [13.5, 50.25, -5.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "inner_eyelid_left",
|
||||
"parent": "eye_left",
|
||||
@@ -122,6 +131,15 @@
|
||||
{"origin": [-13.51, 48.75, -6.25], "size": [0, 3, 1], "uv": [67, 21]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_eye_left",
|
||||
"parent": "pupil_right",
|
||||
"pivot": [-13.5, 50.25, -5.75],
|
||||
"rotation": [0, 90, 0],
|
||||
"locators": {
|
||||
"eye2": [-13.5, 50.25, -5.75]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "inner_eyelid_right",
|
||||
"parent": "eye_right",
|
||||
|
||||
+61
@@ -474,6 +474,67 @@
|
||||
"cubes": [
|
||||
{"origin": [27, 10.5, 5], "size": [15, 19, 0], "uv": [223, 39]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_1",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 30, -19],
|
||||
"locators": {
|
||||
"seat_1": [0, 30, -19]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_2",
|
||||
"parent": "torso",
|
||||
"pivot": [13, 30, -14],
|
||||
"rotation": [0, -90, 0],
|
||||
"locators": {
|
||||
"seat_2": [13, 30, -14]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_3",
|
||||
"parent": "torso",
|
||||
"pivot": [-13, 30, -14],
|
||||
"rotation": [0, 90, 0],
|
||||
"locators": {
|
||||
"seat_3": [-13, 30, -14]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_4",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 34, -3],
|
||||
"locators": {
|
||||
"seat_4": [0, 34, -3]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_5",
|
||||
"parent": "torso",
|
||||
"pivot": [13, 30, 2],
|
||||
"rotation": [0, -90, 0],
|
||||
"locators": {
|
||||
"seat_5": [13, 30, 2]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_6",
|
||||
"parent": "torso",
|
||||
"pivot": [-13, 30, 2],
|
||||
"rotation": [0, 90, 0],
|
||||
"locators": {
|
||||
"seat_6": [-13, 30, 2]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "locator_seat_7",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 33, 7],
|
||||
"rotation": [0, 180, 0],
|
||||
"locators": {
|
||||
"seat_7": [0, 33, 7]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+2
-1
@@ -2,7 +2,8 @@
|
||||
"portraitScale": 1.03,
|
||||
"portraitTranslation": [-0.31, 0.12, 0],
|
||||
"profileScale": 0.47,
|
||||
"profileTranslation": [0, 0.98, 0.0],
|
||||
"profileTranslation": [0.07, 0.98, 0.0],
|
||||
"profilePokedexTranslation": [0, 0.98, 0],
|
||||
"rootBone": "venusaur",
|
||||
"firstPersonCameraOffset": {
|
||||
"seat_1": [0, 0.25, 0]
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"portraitScale": 1.89,
|
||||
"portraitTranslation": [-0.13, 0.91, 0],
|
||||
"profileScale": 0.63,
|
||||
"profileTranslation": [0, 0.81, 0],
|
||||
"profileScale": 0.77,
|
||||
"profileTranslation": [0, 0.65, 0],
|
||||
"rootBone": "charmeleon",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('charmeleon', 'cry')"
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"portraitScale": 2.1,
|
||||
"portraitTranslation": [-1.11, 2.43, 0],
|
||||
"profileScale": 0.54,
|
||||
"profileTranslation": [0, 0.96, -10],
|
||||
"profileTranslation": [0, 0.92, -10],
|
||||
"rootBone": "charizard",
|
||||
"firstPersonCameraOffset": {
|
||||
"seat_1": [0, 0.45, 0]
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"portraitScale": 1.83,
|
||||
"portraitTranslation": [-0.67, 1.92, 0],
|
||||
"profileScale": 0.67,
|
||||
"profileTranslation": [0, 0.81, 0],
|
||||
"rootBone": "arbok",
|
||||
"animations": {
|
||||
"faint": "q.bedrock_primary('arbok', 'faint', q.curve('one'))",
|
||||
"cry": "q.bedrock_stateful('arbok', 'cry')"
|
||||
},
|
||||
"poses": {
|
||||
"profile": {
|
||||
"poseTypes": ["PROFILE"],
|
||||
"animations": [
|
||||
"q.look('head_ai')",
|
||||
"q.bedrock('arbok', 'summary_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('arbok', 'blink')"
|
||||
]
|
||||
},
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "PORTRAIT", "FLOAT", "NONE"],
|
||||
"animations": [
|
||||
"q.look('head_ai')",
|
||||
"q.bedrock('arbok', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('arbok', 'blink')"
|
||||
]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": ["WALK", "SWIM"],
|
||||
"animations": [
|
||||
"q.look('head_ai')",
|
||||
"q.bedrock('arbok', 'ground_walk')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('arbok', 'blink')"
|
||||
]
|
||||
},
|
||||
"sleep": {
|
||||
"poseTypes": ["SLEEP"],
|
||||
"namedAnimations": {"cry": "q.bedrock_stateful('dummy', 'cry')"},
|
||||
"animations": [
|
||||
"q.bedrock('arbok', 'sleep')"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"portraitScale": 1.89,
|
||||
"portraitTranslation": [-0.8, 1.36, 0.0],
|
||||
"profileScale": 0.59,
|
||||
"profileTranslation": [0, 0.84, 0.0],
|
||||
"profileScale": 0.57,
|
||||
"profileTranslation": [0, 0.81, 0.0],
|
||||
"rootBone": "nidoking",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('nidoking', 'cry')",
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"portraitScale": 1.8,
|
||||
"portraitTranslation": [-0.35, -0.8, 0],
|
||||
"profileScale": 0.8,
|
||||
"profileTranslation": [0, 0.45, 0.0],
|
||||
"profileTranslation": [0, 0.52, 0.0],
|
||||
"rootBone": "parasect",
|
||||
"firstPersonCameraOffset": {
|
||||
"seat_1": [0, 0.45, 0]
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"portraitScale": 1.96,
|
||||
"portraitTranslation": [ -0.48, 1.61, 0],
|
||||
"portraitTranslation": [ -0.3, 1.86, 0],
|
||||
"profileScale": 0.53,
|
||||
"profileTranslation": [0, 0.92, 0],
|
||||
"rootBone": "mr_rime",
|
||||
|
||||
+24
-1
@@ -8,16 +8,39 @@
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "FLOAT", "NONE", "PORTRAIT", "PROFILE"],
|
||||
"animations": ["q.bedrock('jynx', 'ground_idle')"],
|
||||
"animations": [
|
||||
"q.look('head_ai', 1, 1, 10, -15, 3, -3)",
|
||||
"q.look('torso', 1, 1, 5, -5, 15, -15)",
|
||||
"q.look('hair_front_left2', -1, 1, 5, 0, 0, 0)",
|
||||
"q.look('hair_front_right2', -1, 1, 5, 0, 0, 0)",
|
||||
"q.look('hair_front_left3', -1, 1, 5, -10, 0, 0)",
|
||||
"q.look('hair_front_right3', -1, 1, 5, -10, 0, 0)",
|
||||
"q.look('hair_back2', -1, 1, 5, -15, 0, 0)",
|
||||
"q.bedrock('jynx', 'ground_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('jynx', 'blink')"]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": ["WALK", "SWIM"],
|
||||
"animations": [
|
||||
"q.look('head_ai', 1, 1, 10, -15, 3, -3)",
|
||||
"q.look('torso', 1, 1, 5, -5, 15, -15)",
|
||||
"q.look('hair_front_left2', -1, 1, 5, 0, 0, 0)",
|
||||
"q.look('hair_front_right2', -1, 1, 5, 0, 0, 0)",
|
||||
"q.look('hair_front_left3', -1, 1, 5, -10, 0, 0)",
|
||||
"q.look('hair_front_right3', -1, 1, 5, -10, 0, 0)",
|
||||
"q.look('hair_back2', -1, 1, 5, -15, 0, 0)",
|
||||
"q.bimanual_swing(0.66, 0.6, 'arm_left', 'arm_right')",
|
||||
"q.bedrock('jynx', 'ground_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('jynx', 'blink')"]
|
||||
},
|
||||
"sleep": {
|
||||
"poseTypes": ["SLEEP"],
|
||||
"namedAnimations": {"cry": "q.bedrock_stateful('dummy', 'cry')"},
|
||||
"animations": [
|
||||
"q.bedrock('jynx', 'sleep')"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-5
@@ -18,7 +18,7 @@
|
||||
"PROFILE"
|
||||
],
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 10, -20, 10, -10)",
|
||||
"q.look('head', 1, 1, 10, -7, 10, -10)",
|
||||
"q.look('torso2', 1, 1, 20, -15, 2, -2)",
|
||||
"q.bedrock('ditto', 'ground_idle')"
|
||||
],
|
||||
@@ -32,7 +32,7 @@
|
||||
"SWIM"
|
||||
],
|
||||
"animations": [
|
||||
"q.look('head', 1, 1, 10, -20, 10, -10)",
|
||||
"q.look('head', 1, 1, 10, -7, 10, -10)",
|
||||
"q.look('torso2', 1, 1, 20, -15, 2, -2)",
|
||||
"q.bedrock('ditto', 'ground_walk')"
|
||||
],
|
||||
@@ -41,9 +41,8 @@
|
||||
]
|
||||
},
|
||||
"sleep": {
|
||||
"poseTypes": [
|
||||
"SLEEP"
|
||||
],
|
||||
"poseTypes": ["SLEEP"],
|
||||
"namedAnimations": {"cry": "q.bedrock_stateful('dummy', 'cry')"},
|
||||
"animations": [
|
||||
"q.bedrock('ditto', 'sleep')"
|
||||
]
|
||||
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"portraitScale": 3.15,
|
||||
"portraitTranslation": [-0.06, -3.18, 0],
|
||||
"profileScale": 1.13,
|
||||
"profileTranslation": [0, -0.02, 0],
|
||||
"rootBone": "omanyte",
|
||||
"animations": {
|
||||
"faint": "q.bedrock_primary('omanyte', 'faint', q.curve('one'))",
|
||||
"cry": "q.bedrock_stateful('omanyte', 'cry')"
|
||||
},
|
||||
"poses": {
|
||||
"battle-standing": {
|
||||
"poseTypes": ["STAND"],
|
||||
"isBattle": true,
|
||||
"isTouchingWater": false,
|
||||
"animations": [
|
||||
"q.bedrock('omanyte', 'battle_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omanyte', 'blink')"]
|
||||
},
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "PORTRAIT", "PROFILE", "NONE"],
|
||||
"isBattle": false,
|
||||
"isTouchingWater": false,
|
||||
"animations": [
|
||||
"q.bedrock('omanyte', 'ground_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omanyte', 'blink')"]
|
||||
},
|
||||
"walking": {
|
||||
"poseName": "walking",
|
||||
"poseTypes": ["WALK"],
|
||||
"isTouchingWater": false,
|
||||
"animations": [
|
||||
"q.bedrock('omanyte', 'ground_walk')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omanyte', 'blink')"]
|
||||
},
|
||||
"float": {
|
||||
"poseTypes": ["FLOAT"],
|
||||
"isTouchingWater": true,
|
||||
"animations": [
|
||||
"q.pitch_tilt('body')",
|
||||
"q.bedrock('omanyte', 'water_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omanyte', 'blink')"]
|
||||
},
|
||||
"swim": {
|
||||
"poseTypes": ["SWIM"],
|
||||
"isTouchingWater": true,
|
||||
"animations": [
|
||||
"q.pitch_tilt('body')",
|
||||
"q.bedrock('omanyte', 'water_swim')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omanyte', 'blink')"]
|
||||
},
|
||||
"sleep": {
|
||||
"poseTypes": ["SLEEP"],
|
||||
"namedAnimations": {
|
||||
"cry": "q.bedrock_stateful('dummy', 'cry')"
|
||||
},
|
||||
"animations": ["q.bedrock('omanyte', 'sleep')"]
|
||||
}
|
||||
}
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"portraitScale": 2.4,
|
||||
"portraitTranslation": [0.02, -2, 0],
|
||||
"profileScale": 1.1,
|
||||
"profileTranslation": [0, 0.066, 0],
|
||||
"rootBone": "omastar",
|
||||
"animations": {
|
||||
"faint": "q.bedrock_primary('omastar', 'faint', q.curve('one'))",
|
||||
"cry": "q.bedrock_stateful('omastar', 'cry')"
|
||||
},
|
||||
"poses": {
|
||||
"battle-standing": {
|
||||
"poseTypes": ["STAND"],
|
||||
"isBattle": true,
|
||||
"isTouchingWater": false,
|
||||
"animations": [
|
||||
"q.bedrock('omastar', 'battle_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omastar', 'blink')"]
|
||||
},
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "PORTRAIT", "PROFILE", "NONE"],
|
||||
"isBattle": false,
|
||||
"isTouchingWater": false,
|
||||
"animations": [
|
||||
"q.bedrock('omastar', 'ground_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omastar', 'blink')"]
|
||||
},
|
||||
"walking": {
|
||||
"poseName": "walking",
|
||||
"poseTypes": ["WALK"],
|
||||
"isTouchingWater": false,
|
||||
"animations": [
|
||||
"q.bedrock('omastar', 'ground_walk')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omastar', 'blink')"]
|
||||
},
|
||||
"float": {
|
||||
"poseTypes": ["FLOAT"],
|
||||
"isTouchingWater": true,
|
||||
"animations": [
|
||||
"q.pitch_tilt('body')",
|
||||
"q.bedrock('omastar', 'water_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omastar', 'blink')"]
|
||||
},
|
||||
"swim": {
|
||||
"poseTypes": ["SWIM"],
|
||||
"isTouchingWater": true,
|
||||
"animations": [
|
||||
"q.pitch_tilt('body')",
|
||||
"q.bedrock('omastar', 'water_swim')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('omastar', 'blink')"]
|
||||
},
|
||||
"sleep": {
|
||||
"poseTypes": ["SLEEP"],
|
||||
"namedAnimations": {
|
||||
"cry": "q.bedrock_stateful('dummy', 'cry')"
|
||||
},
|
||||
"animations": ["q.bedrock('omastar', 'sleep')"]
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"portraitScale": 1.73,
|
||||
"portraitTranslation": [-0.45, -1.17, 0],
|
||||
"profileScale": 0.7,
|
||||
"profileTranslation": [-0.06, 0.59, 0],
|
||||
"profileTranslation": [0, 0.59, 0],
|
||||
"rootBone": "dunsparce",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('dunsparce', 'cry')",
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"portraitScale": 1.9,
|
||||
"portraitTranslation": [-0.26, -0.29, 0],
|
||||
"profileScale": 0.67,
|
||||
"profileTranslation": [0, 0.76, 0],
|
||||
"rootBone": "smoochum",
|
||||
"animations": {},
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "FLOAT", "NONE", "PORTRAIT", "PROFILE"],
|
||||
"animations": [
|
||||
"q.look('head')",
|
||||
"q.bedrock('smoochum', 'ground_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('smoochum', 'blink')"]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": ["WALK", "SWIM"],
|
||||
"animations": [
|
||||
"q.look('head')",
|
||||
"q.bimanual_swing(0.66, 1.4, 'arm_left', 'arm_right')",
|
||||
"q.biped_walk(0.66, 1.4, 'foot_left', 'foot_right')",
|
||||
"q.bedrock('smoochum', 'ground_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('smoochum', 'blink')"]
|
||||
},
|
||||
"shoulder_left": {
|
||||
"poseTypes": ["SHOULDER_LEFT"],
|
||||
"animations": ["q.look('head')", "q.bedrock('smoochum', 'ground_idle')"],
|
||||
"quirks": ["q.bedrock_quirk('smoochum', 'blink')"],
|
||||
"transformedParts": [
|
||||
{
|
||||
"part": "body",
|
||||
"position": [7, 0, 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
"shoulder_right": {
|
||||
"poseTypes": ["SHOULDER_RIGHT"],
|
||||
"animations": ["q.look('head')", "q.bedrock('smoochum', 'ground_idle')"],
|
||||
"quirks": ["q.bedrock_quirk('smoochum', 'blink')"],
|
||||
"transformedParts": [
|
||||
{
|
||||
"part": "body",
|
||||
"position": [-7, 0, 0]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"portraitScale": 1.73,
|
||||
"portraitTranslation": [-0.09, 0.26, 0],
|
||||
"profileScale": 0.60,
|
||||
"profileTranslation": [0.16, 0.90, 0],
|
||||
"profileTranslation": [0, 0.90, 0],
|
||||
"rootBone": "beautifly",
|
||||
"poses": {
|
||||
"battle-standing": {
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"portraitScale": 1.65,
|
||||
"portraitTranslation": [-0.10, 0.16, 0],
|
||||
"profileScale": 0.63,
|
||||
"profileTranslation": [0.13, 0.64, 0],
|
||||
"profileTranslation": [0, 0.64, 0],
|
||||
"rootBone": "dustox",
|
||||
"poses": {
|
||||
"battle-standing": {
|
||||
|
||||
+3
-1
@@ -2,7 +2,9 @@
|
||||
"portraitScale": 1.63,
|
||||
"portraitTranslation": [-1.76, 1.25, 0],
|
||||
"profileScale": 0.53,
|
||||
"profileTranslation": [-0.09, 0.92, 0],
|
||||
"profileTranslation": [0.49, 0.96, 0],
|
||||
"profilePokedexTranslation": [0, 0.96, 0],
|
||||
"profileSummaryTranslation": [-0.30, 0.87, 0],
|
||||
"rootBone": "drapion",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('drapion', 'cry')"
|
||||
|
||||
+6
@@ -31,6 +31,12 @@
|
||||
"animations": [
|
||||
"q.bedrock('musharna', 'ground_idle')"
|
||||
]
|
||||
},
|
||||
"sleep": {
|
||||
"poseTypes": ["SLEEP"],
|
||||
"animations": [
|
||||
"q.bedrock('musharna', 'sleep')"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"portraitScale": 1.98,
|
||||
"portraitTranslation": [-0.96, 1.39, 0],
|
||||
"profileScale": 0.59,
|
||||
"profileTranslation": [0.13, 0.82, 0],
|
||||
"profileTranslation": [0, 0.84, 0],
|
||||
"rootBone": "pyroar_female",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('pyroar_female', 'cry')"
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"portraitScale": 1.89,
|
||||
"portraitTranslation": [-1.12, 1.78, 0],
|
||||
"profileScale": 0.51,
|
||||
"profileTranslation": [0.12, 0.94, 0],
|
||||
"profileTranslation": [0, 0.97, 0],
|
||||
"rootBone": "pyroar_male",
|
||||
"animations": {
|
||||
"cry": "q.bedrock_stateful('pyroar_male', 'cry')"
|
||||
|
||||
+2
-2
@@ -47,7 +47,7 @@
|
||||
"poseTypes": ["SHOULDER_LEFT"],
|
||||
"animations": [
|
||||
"q.look('head')",
|
||||
"q.bedrock('popplio', 'shoulder_left')"
|
||||
"q.bedrock('popplio', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('popplio', 'blink')"
|
||||
@@ -63,7 +63,7 @@
|
||||
"poseTypes": ["SHOULDER_RIGHT"],
|
||||
"animations": [
|
||||
"q.look('head')",
|
||||
"q.bedrock('popplio', 'shoulder_right')"
|
||||
"q.bedrock('popplio', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('popplio', 'blink')"
|
||||
|
||||
+20
-2
@@ -13,7 +13,6 @@
|
||||
"PORTRAIT",
|
||||
"PROFILE",
|
||||
"FLOAT",
|
||||
"HOVER",
|
||||
"SLEEP"
|
||||
],
|
||||
"animations": ["q.look('head')", "q.bedrock('cramorant', 'ground_idle')"],
|
||||
@@ -21,13 +20,32 @@
|
||||
},
|
||||
"walking": {
|
||||
"poseName": "walking",
|
||||
"poseTypes": ["WALK", "SWIM", "FLY"],
|
||||
"poseTypes": ["WALK", "SWIM"],
|
||||
"animations": [
|
||||
"q.look('head')",
|
||||
"q.bedrock('cramorant', 'ground_idle')",
|
||||
"q.biped_walk(1, 1, 'leg_left', 'leg_right')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('cramorant', 'blink', 5, 30, 1)"]
|
||||
},
|
||||
"hover": {
|
||||
"poseTypes": ["HOVER"],
|
||||
"animations": [
|
||||
"q.pitch_tilt('body')",
|
||||
"q.look('head')",
|
||||
"q.bedrock('cramorant', 'ground_idle')",
|
||||
"q.sine_wing_flap(0.9, 0.9, 25, 'z', 'wing_left', 'wing_right')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('cramorant', 'blink', 5, 30, 1)"]
|
||||
},
|
||||
"flying": {
|
||||
"poseTypes": ["FLY"],
|
||||
"animations": [
|
||||
"q.pitch_tilt('body')",
|
||||
"q.bedrock('cramorant', 'ground_idle')",
|
||||
"q.sine_wing_flap(0.9, 0.9, 25, 'z', 'wing_left', 'wing_right')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('cramorant', 'blink', 5, 30, 1)"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+23
-3
@@ -10,21 +10,41 @@
|
||||
"poses": {
|
||||
"standing": {
|
||||
"poseTypes": ["STAND", "FLOAT", "NONE", "PORTRAIT", "PROFILE"],
|
||||
"isBattle": false,
|
||||
"animations": [
|
||||
"q.look('head')",
|
||||
"q.bedrock('grafaiai', 'ground_idle')"
|
||||
],
|
||||
"quirks": [
|
||||
"q.bedrock_quirk('grafaiai', 'blink')",
|
||||
"q.bedrock_primary_quirk('grafaiai', q.array('idle_quirk_left', 'idle_quirk_right'), 20, 40, 1, q.curve('symmetrical'))"
|
||||
]
|
||||
},
|
||||
"battle-standing": {
|
||||
"poseTypes": ["STAND", "FLOAT", "NONE", "PORTRAIT", "PROFILE"],
|
||||
"isBattle": true,
|
||||
"animations": [
|
||||
"q.look('head')",
|
||||
"q.bedrock('grafaiai', 'battle_idle')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('grafaiai', 'blink')"]
|
||||
},
|
||||
"walking": {
|
||||
"poseTypes": ["WALK", "SWIM"],
|
||||
"animations": [
|
||||
"q.look('head')",
|
||||
"q.biped_walk(0.66, 0.6, 'leg_left', 'leg_right')",
|
||||
"q.bimanual_swing(0.22, 0.2, 'arm_left', 'arm_right')",
|
||||
"q.bedrock('grafaiai', 'ground_idle')"
|
||||
"q.bedrock('grafaiai', 'ground_walk')"
|
||||
],
|
||||
"quirks": ["q.bedrock_quirk('grafaiai', 'blink')"]
|
||||
},
|
||||
"sleep": {
|
||||
"poseTypes": ["SLEEP"],
|
||||
"namedAnimations": {
|
||||
"cry": "q.bedrock_stateful('dummy', 'cry')"
|
||||
},
|
||||
"animations": [
|
||||
"q.bedrock('grafaiai', 'sleep')"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -2,7 +2,8 @@
|
||||
"portraitScale": 1.1,
|
||||
"portraitTranslation": [-1.2, -0.009, 0],
|
||||
"profileScale": 0.5,
|
||||
"profileTranslation": [-0.18, 0.96, 0],
|
||||
"profileTranslation": [0, 0.96, 0],
|
||||
"profileSummaryTranslation": [-0.20, 0.87, 0],
|
||||
"rootBone": "dudunsparce",
|
||||
"firstPersonCameraOffset": {
|
||||
"seat_1": [0, 0.45, 0],
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"portraitScale": 1.1,
|
||||
"portraitTranslation": [-0.8, -0.009, 0],
|
||||
"profileScale": 0.5,
|
||||
"profileTranslation": [-0.18, 0.96, 0],
|
||||
"profileTranslation": [0, 0.96, 0],
|
||||
"rootBone": "dudunsparce",
|
||||
"firstPersonCameraOffset": {
|
||||
"seat_1": [0, 0.45, 0],
|
||||
|
||||
+350
@@ -216,6 +216,356 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-angry"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_angry.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-cartoon"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_cartoon.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-clown"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_clown.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-comedic"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_comedic.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-crow"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_crow.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-grin"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_grin.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-ink"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_ink.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-modern"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_modern.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-rain"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_rain.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-scribble"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_scribble.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-silence"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_silence.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-sloth"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_sloth.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-suspicious"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_suspicious.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"snake-pattern-will"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_will.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-angry"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_angry_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-cartoon"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_cartoon_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-clown"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_clown_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-comedic"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_comedic_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-crow"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_crow_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-grin"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_grin_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-ink"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_ink_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-modern"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_modern_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-rain"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_rain_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-scribble"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_scribble_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-silence"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_silence_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-sloth"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_sloth_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-suspicious"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_suspicious_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"shiny",
|
||||
"snake-pattern-will"
|
||||
],
|
||||
"layers": [
|
||||
{
|
||||
"name": "pattern",
|
||||
"texture": "cobblemon:textures/pokemon/0024_arbok/arbok_pattern_will_shiny.png",
|
||||
"emissive": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"aspects": [
|
||||
"alpha_eyes"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user