Compare commits

...
Author SHA1 Message Date
Polymeta 7ccd0bbe11 Merge branch 'multiplayer_mount_sync' into 'main'
Multiplayer mount sync

Closes #2023

See merge request cable-mc/cobblemon!2315
2026-06-22 12:23:42 +00:00
Polymeta d289880cc8 Merge branch 'tmm-fixes-n-changes' into 'main'
TMM Fixes and Changes

See merge request cable-mc/cobblemon!2316
2026-06-20 19:43:21 +00:00
Paul 6609c7d038 Added held_item_visible pokemonproperty 2026-06-20 22:29:14 +10:00
Paul 88afe05c16 Fixed NPE's when block entities aren't attached to berry blocks at time of ticking, closes #2020 2026-06-20 18:01:52 +10:00
Gertimoshka 99aa25e1bf I forgor 2026-06-19 17:50:52 +03:00
Gertimoshka 76faa50035 Fixes, tmm multiplayer syncing and cleanup 2026-06-19 17:42:50 +03:00
aeroeng15 8ce989cb6b Changelog 2026-06-18 19:03:45 -07:00
aeroeng15 02030950aa Force passenger updates 2026-06-18 18:53:36 -07:00
Polymeta 6148b58fdc Merge branch 'qa-fixes-84' into 'main'
Qa fixes 84

See merge request cable-mc/cobblemon!2314
2026-06-17 11:17:33 +00:00
Faintful 1e4936aeac Add changelog 2026-06-16 20:40:08 +02:00
Faintful 15ea72e777 Fixed Smoked Tail Curry returning a wooden bowl when consumed 2026-06-16 20:38:56 +02:00
Polymeta 3c3d4e4552 [skip-ci] changelogging 2026-06-16 17:43:50 +00:00
Polymeta 796e416578 Merge branch 'fix-auto-third-person-mod-compat' into 'main'
Add check for remember ride camera config when dismounting

Closes #2012

See merge request cable-mc/cobblemon!2308
2026-06-16 17:37:08 +00:00
lionandPolymeta 7608dfde94 Add check for remember ride camera config when dismounting 2026-06-16 17:37:07 +00:00
Polymeta b2b871617a Merge branch 'qa-fixes-85' into 'main'
Qa fixes 85

See merge request cable-mc/cobblemon!2313
2026-06-16 17:19:16 +00:00
Faintful bc4c8d13b7 Fix Panpour consuming a held item when evolving with a Water Stone 2026-06-16 17:07:36 +02:00
Faintful 0f9c51f7dd Fixed full heal stackable block not dropping full heals 2026-06-16 16:05:06 +02:00
Polymeta 2c2623e0f9 Merge branch 'summary-and-pokedex-profile-translations' into 'main'
Add profile translation and scale properties specific to the Pokédex and summary

See merge request cable-mc/cobblemon!2309
2026-06-16 13:44:41 +00:00
lionandPolymeta 8ec85e7d2f Add profile translation and scale properties specific to the Pokédex and summary 2026-06-16 13:44:41 +00:00
Paul d5a08314eb Merge remote-tracking branch 'origin/lang-updates' 2026-06-16 20:36:49 +10:00
Paul 062c32be2a Correct the parsing of phases in habitat GUI (they aren't moon phases) 2026-06-16 20:33:54 +10:00
阿鱼andWeblate 09590b49cd Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.9% (8988 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 10:14:47 +00:00
Polymeta 420cbd2c99 Merge branch 'fix-pvn-fainted-party-battle' into 'main'
Fix PvN battle start with fainted parties

See merge request cable-mc/cobblemon!2311
2026-06-16 09:45:36 +00:00
Jongho Hong 0380013f37 Add changelog entry 2026-06-16 18:41:43 +09:00
阿鱼andWeblate 6c1fcc103a Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.7% (8973 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 09:14:38 +00:00
阿鱼andWeblate 59b01c3988 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.7% (8971 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 08:58:39 +00:00
阿鱼andWeblate 678fa2d0ce Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.6% (8961 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 08:28:14 +00:00
Jongho Hong 94abd79923 Fix PvN battle start with fainted parties 2026-06-16 17:22:50 +09:00
阿鱼andWeblate 0a1931aaae Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.6% (8958 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 08:21:26 +00:00
阿鱼andWeblate 85d76dcc29 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.5% (8952 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 08:07:26 +00:00
阿鱼andWeblate bd0a9ef654 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.4% (8944 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 07:27:07 +00:00
阿鱼andWeblate 7a702e276c Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.2% (8926 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 05:41:55 +00:00
阿鱼andWeblate 3f9a2825cb Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 94.2% (8921 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 05:30:18 +00:00
阿鱼andWeblate d1462bc27b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.9% (8892 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 05:05:07 +00:00
阿鱼andWeblate 211b14dbd0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.5% (8852 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 04:59:55 +00:00
阿鱼andWeblate 47e83003c3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.4% (8850 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 04:59:34 +00:00
阿鱼andWeblate 59134c4212 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.4% (8849 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-16 04:32:46 +00:00
阿鱼andWeblate 44b434562c Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.4% (8847 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-15 20:32:05 +00:00
Faintful 7af9b0854a Fixed Status Cure items not returning a bottle after use 2026-06-15 17:55:22 +02:00
Hiroku 344b0750f9 Merge branch 'implement_pokemon' into 'main'
more QA fixes

See merge request cable-mc/cobblemon!2310
2026-06-15 04:26:30 +00:00
ewwww 10d9d97c11 restored broken or missing seat locators for Ariados, Bastiodon, Dhelmise, Dondozo, Drifblim, Girafarig, and Klinklang 2026-06-15 00:06:56 -04:00
Paul 94bcfba076 Phase count should be derived, not set 2026-06-14 22:10:46 +10:00
RedGenesectNinja 69a75ffcd4 Fixed broken Alola bias Exeggcute textures 2026-06-13 13:25:57 -05:00
阿鱼andWeblate cc1317dd06 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.4% (8845 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-13 07:46:03 +00:00
Polymeta e15ac73b1b Merge branch 'fix-enchanted-fossil-items' into 'main'
Fix crash when using enchanted items in the ressurection machine

Closes #1973

See merge request cable-mc/cobblemon!2307
2026-06-11 21:48:56 +00:00
lionandPolymeta 6c6576c117 Fix crash when using enchanted items in the ressurection machine 2026-06-11 21:48:55 +00:00
Polymeta ebdfa7edc0 Merge branch 'fix-pokemon-properties-nickname-parsing-to-json' into 'main'
Add pokémon nickname when serializing and deserializing to json on pokémon properties

Closes #1981

See merge request cable-mc/cobblemon!2306
2026-06-11 13:48:21 +00:00
lionandPolymeta 297e8eae77 Add pokémon nickname when serializing and deserializing to json on pokémon properties 2026-06-11 13:48:21 +00:00
Polymeta ea8179018d Merge branch 'modded-discs-compat' into 'main'
Add modded discs compatibility with disc shelves

See merge request cable-mc/cobblemon!2305
2026-06-11 08:20:18 +00:00
lionandPolymeta 14fccfae1d Add modded discs compatibility with disc shelves 2026-06-11 08:20:18 +00:00
Polymeta 26386638ad Merge branch 'PathingThresholds' into 'main'
Fixed wider pokemon being completely unable to hop up ledges

See merge request cable-mc/cobblemon!2304
2026-06-10 08:21:01 +00:00
JazzMcNade 5d1d99b64a Rolled back jump height change 2026-06-09 23:58:44 -05:00
RedGenesectNinja a3c5a6c377 Implemented Yamask fixes 2026-06-09 21:58:33 -05:00
Polymeta eb2a5837eb Merge branch 'oops-unsynced-tms' into 'main'
Sync TM Data

See merge request cable-mc/cobblemon!2303
2026-06-09 18:35:59 +00:00
Gertimoshka 93298d9a87 Sync TM Data 2026-06-09 20:48:35 +03:00
Watuneni iteiteandWeblate abb5346305 Translated using Weblate (Japanese)
Currently translated at 96.5% (9139 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-09 15:19:33 +00:00
Watuneni iteiteandWeblate 9466f66721 Translated using Weblate (Japanese)
Currently translated at 96.4% (9129 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-09 14:13:54 +00:00
Watuneni iteiteandWeblate 716ea55bc7 Translated using Weblate (Japanese)
Currently translated at 96.2% (9115 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-09 14:01:57 +00:00
Polymeta 4d1f46c37c remove unused config values
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-06-08 14:55:41 +01:00
ManriqueandWeblate 15f0ad1821 Translated using Weblate (Spanish)
Currently translated at 97.2% (9211 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-06-08 08:42:34 +00:00
Polymeta a2101b5759 whoops
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-06-08 09:29:49 +01:00
Polymeta 187a190ec6 fix size categories not working properly on servers with non-default scales
Closes #2022

Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-06-08 09:16:57 +01:00
JazzMcNade 0d433ff394 Fixed wider pokemon being completely unable to hop up ledges
Fixed pokemon not being able to hop up snow
2026-06-07 23:26:31 -05:00
Watuneni iteiteandWeblate a16975c750 Translated using Weblate (Japanese)
Currently translated at 96.1% (9105 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-07 15:19:10 +00:00
Watuneni iteiteandWeblate c0e6d87c40 Translated using Weblate (Japanese)
Currently translated at 96.1% (9105 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-07 12:39:38 +00:00
Watuneni iteiteandWeblate 91078b917e Translated using Weblate (Japanese)
Currently translated at 96.0% (9090 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-07 12:02:11 +00:00
ewwww b7e27fa52a Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-06-05 21:10:08 -04:00
ewwww dc87ffd2a8 luvdisc faint fix 2026-06-05 21:09:49 -04:00
Polymeta d873399d05 Merge branch 'implement_pokemon' into 'main'
for merging when the last of the QA fixes are finished

See merge request cable-mc/cobblemon!2302
2026-06-05 08:28:27 +00:00
Jerzykv a7aab51e0d These didn't get in for some reason 2026-06-05 08:24:37 +02:00
ewwww e8e2057558 popplio t-pose fix 2026-06-04 23:51:06 -04:00
Polymeta 56b5dba911 Merge branch 'stoobid-aram' into 'main'
Stoobid Aram, Actually Fixed the Processor this time

See merge request cable-mc/cobblemon!2301
2026-06-04 22:51:01 +00:00
Aram f0a66458e5 Stoobid Aram, Actually Fixed the Processor this time 2026-06-05 00:31:55 +02:00
ewwww dba6a38f9e Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-06-04 13:07:42 -04:00
ewwww 342c0041e9 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUGH 2026-06-04 13:07:27 -04:00
阿鱼andWeblate cbeda361d4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.3% (8835 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-04 15:12:59 +00:00
Hiroku a811b3347c Merge branch 'implement_pokemon' into 'main'
Implement pokemon

See merge request cable-mc/cobblemon!2300
2026-06-04 10:53:32 +00:00
Polymeta 80e593f5c6 Merge branch 'fix-/locate-lie' into 'main'
Fixed the HeightRangeProcessor

See merge request cable-mc/cobblemon!2297
2026-06-04 10:43:12 +00:00
ewwww ff617348fe implemented arbok remodel 2026-06-04 06:00:31 -04:00
ewwww 1adecbf5f6 fixed incorrect "Head" naming for gallade 2026-06-04 04:37:32 -04:00
ewwww 29dbb13a0e cramorant poser tweaks 2026-06-04 04:11:06 -04:00
ewwww 67e03ecebd ditto poser tweaks 2026-06-04 04:10:57 -04:00
ewwww 215f48bdc7 musharna placeholder sleep 2026-06-04 04:03:05 -04:00
ewwww d4beab1bfb jynx poser tweaks 2026-06-04 04:02:56 -04:00
ewwww f2c21ec902 smoochum remodel 2026-06-04 04:02:46 -04:00
ewwww c9f3912677 updated omanyte and omastar's posers 2026-06-03 22:39:36 -04:00
ewwww c21b7d1a7d marked cherubi line as implemented + tweaked changelog 2026-06-03 19:59:45 -04:00
ewwww 26068694ad grafaiai animations 2026-06-03 07:15:38 -04:00
阿鱼andWeblate 079a2fb50d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.3% (8835 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-03 06:11:14 +00:00
MeAlam1 5b5dcddb25 Fixed the HeightRangeProcessor 2026-06-01 20:16:27 +02:00
176 changed files with 10085 additions and 1307 deletions
+37 -10
View File
@@ -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();
}
}
@@ -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
)
}
@@ -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)
@@ -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()
@@ -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) }
}
@@ -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() {
@@ -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)
}
@@ -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()
@@ -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()
}
}
@@ -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(
@@ -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
}
}
@@ -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()
}
}
}
}
}
@@ -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)
}
}
@@ -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
}
}
@@ -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
}
}
@@ -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
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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)
@@ -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 } }" } ?: "" }"
}
@@ -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())
}
}
@@ -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
)
}
@@ -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>()
@@ -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"
@@ -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 },
@@ -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]
}
}
}
}
}
@@ -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]
}
}
}
@@ -281,7 +281,7 @@
},
"animation.luvdisc.ground_faint": {
"loop": true,
"animation_length": 2.5,
"animation_length": 3,
"bones": {
"body": {
"rotation": {
@@ -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],
@@ -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]
}
}
},
@@ -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]
}
}
]
}
@@ -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]
}
},
{
@@ -79,7 +79,7 @@
"parent": "torso",
"pivot": [0, 21, 3.75],
"locators": {
"seat_2": [0, 21, 3.75]
"seat_1": [0, 21, 3.75]
}
},
{
@@ -78,7 +78,7 @@
"parent": "torso",
"pivot": [0, 21, 3.75],
"locators": {
"seat_2": [0, 21, 3.75]
"seat_1": [0, 21, 3.75]
}
},
{
@@ -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]
}
}
]
}
@@ -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]
}
},
{
@@ -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",
@@ -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": [
@@ -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}
]
},
{
@@ -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}
]
},
{
@@ -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",
@@ -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]
}
}
]
}
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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,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]
@@ -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')"
@@ -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]
@@ -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')"
]
}
}
}
@@ -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')",
@@ -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,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",
@@ -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')"
]
}
}
}
@@ -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')"
]
@@ -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')"]
}
}
}
@@ -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')"]
}
}
}
@@ -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')",
@@ -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]
}
]
}
}
}
@@ -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": {
@@ -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": {
@@ -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')"
@@ -31,6 +31,12 @@
"animations": [
"q.bedrock('musharna', 'ground_idle')"
]
},
"sleep": {
"poseTypes": ["SLEEP"],
"animations": [
"q.bedrock('musharna', 'sleep')"
]
}
}
}
@@ -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')"
@@ -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')"
@@ -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')"
@@ -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)"]
}
}
}
@@ -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,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],
@@ -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],
@@ -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