mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-22 23:26:25 -04:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b85132e0b | ||
|
|
9b06f6a31f | ||
|
|
b3696dd45c | ||
|
|
aeda9d94a6 |
+11
-63
@@ -3,50 +3,19 @@
|
||||
|
||||
### Changes
|
||||
- Slightly lowered the volume of all cries
|
||||
- Updated Pokeball animations and model.
|
||||
- Turtwig can now be put on shoulder.
|
||||
- Updated Zubat line model, texture, and animations.
|
||||
- Added animations for Hitmontop, Tyrogue, and Mightyena.
|
||||
- Tweaked animations for Dusknoir, Ratatta, Bewear, Exeggutor, and Alolan Exeggutor.
|
||||
- Sized Kantonian Exeggutor down. Still big but not TOO BIG.
|
||||
- Tweaked cries for Pikachu, Raichu and Alolan Raichu.
|
||||
- Pasture blocks will now also connect their bottom left and right sides to walls, iron bars, glass panes and any other modded block that follows the same connection rules.
|
||||
- The config option `consumeHeldItems` has been removed, please see the Datapack & Resourcepack Creators for instructions on the updated method.
|
||||
- Using Potions, Status Heals, Ethers, and Antidotes will now return a glass bottle
|
||||
- Using a Remedy, Fine Remedy, or Superb Remedy will no longer lower friendship with a Pokémon
|
||||
- The Healing Machine now has a more difficult recipe, placing it later game.
|
||||
- Heal Powder can now be composted with a 75% chance of adding a layer
|
||||
- Mental, Power, White, and Mirror Herbs can now be composted with a 100% chance of adding a layer.
|
||||
- Added emissive to Hoothoot.
|
||||
- Mining Evolution Stone Ores with a Fortune pickaxe will now increase the amount of items recieved
|
||||
- Black Augurite can now be used to craft stone axes and obsidian.
|
||||
- Using Experience Candies brings up the Party Pokémon Select screen when not targeting a Pokémon.
|
||||
- Added tab completion for statuses to commands
|
||||
|
||||
### Additions
|
||||
- Added battle spectating, can disable in config
|
||||
- Cobblemon now has compatibility with [Adorn](https://modrinth.com/mod/adorn) allowing you to craft Apricorn wood furniture.
|
||||
- Berries can now be used in recipes from [Farmer's Delight](https://modrinth.com/mod/farmers-delight) and [Farmer's Delight (Fabric)](https://modrinth.com/mod/farmers-delight-fabric), as well as any other mods using the same berry tags.
|
||||
- The nature of cobblemon will now be displayed italicized when a mint has been applied. Hovering over the nature will display the mint that was applied. This is the intended behaviour, because the original nature and taste of the Cobblemon does not change when a mint is applied.
|
||||
- Giving Pokémon items now plays a sound
|
||||
- A boat, sign and hanging sign is now craftable with Apricorn wood. The recipes are the same shape as Minecraft's equivalent with Apricorn planks as replacements.
|
||||
- Added the [Cleanse Tag](https://wiki.cobblemon.com/index.php/Cleanse_Tag) and [Fairy Feather](https://wiki.cobblemon.com/index.php/Fairy_Feather)
|
||||
- Added Fairy Feather drops to some pokemon
|
||||
- Added the Inferno, Void, and Forsaken patterns for Vivillon. These can be obtained by evolving a Spewpa in the Nether, End, or Deep Dark respectively.
|
||||
- Added the Litwick line.
|
||||
- Bees can now be fed using Pep-Up Flowers.
|
||||
- Mooshtank can now be milked with a bowl for Mushroom Stew.
|
||||
- Added cries to Beldum, Metang and Metagross.
|
||||
|
||||
### Fixes
|
||||
- Fixed various stone related blocks not being valid for Big Roots to spread on the Fabric version.
|
||||
- Updated the registration of compostable items to improve compatibility with Fabric forks such as Quilt. Please note this does not mean we officially support Quilt, this change was only done since it was possible by correcting the registration to use the new intended way in the Fabric API.
|
||||
- Fixed Dispensers being unable to shear grown Apricorns.
|
||||
- Fixed Bowl not being given back to player after using Berry Juice
|
||||
- Added context for -fail and -block handlers for battle text and added 16 related battle texts for them
|
||||
- Fixed Battle text for Disable, Laser Focus, Foresight, Fire Spin, Telekinesis, Curse, Recharge and Encore
|
||||
- Fixed missing text for snowy weather in battles
|
||||
- Fixed missing text for attempting to catch an uncatchable Pokémon
|
||||
- Fixed Moonphases for Clefairy line
|
||||
- Fixed issue where Potions, Super Potions, and Hyper Potions did not work during battle
|
||||
- Fixed the compatibility patch with the Forge version of [Carry On](https://modrinth.com/mod/carry-on) due to a bug on the mod, the Fabric version was unchanged and is still compatible.
|
||||
@@ -60,31 +29,10 @@
|
||||
- Fixed cursed battle message
|
||||
- Fixed mistakes in pokemon spawning JSONs
|
||||
- Fixed advancement crash from bad datapack evolution data.
|
||||
- Fixed global influences being applied to TickingSpawners twice.
|
||||
- Reverted the default SpawningSelector back to FlatContextWeightedSelector. This fixes multiple weight related issues, including weights with SpawningInfluences.
|
||||
- Apricorn Planting advancement should work again.
|
||||
- Advancement "Patterned Wings" should now allow High Plains and Icy Snow Vivillon to register.
|
||||
- Fixed the last battle critical hits evolution requirement not working.
|
||||
- Fixed the damage taken evolution requirement not saving progress.
|
||||
- Fixed the defeated Pokémon evolution requirement not saving progress.
|
||||
- Fixed potion brewing recipes not showing up JEI and similar mods on the Forge version.
|
||||
- Fixed an exploit that could convert a single piece of Blaze Powder into an extra Medicinal Brew on the Forge version.
|
||||
- Fixed an issue where health percentages would show incorrectly after healing
|
||||
- Fixed the move Revival Blessing not allowing you to select from fainted party members.
|
||||
- Fixed Exeggcute faint.
|
||||
- Fixed Raticate, Onix, Unfezant, Bergmite, Avalugg, Boltund and Revavroom cries not playing.
|
||||
- Fixed Alolan Ratticate animations causing a crash.
|
||||
- Fixed Quaxwell not doing its cry.
|
||||
- Fixed Shroomish not using its idle.
|
||||
- Fixed a possible visual duplication of sent out Pokémon.
|
||||
|
||||
### Developer
|
||||
- Fixed the `SpawnEvent` not respecting usage of `Cancelable#cancel`.
|
||||
- Added the `EvolutionTestedEvent`, this allows listening and overriding the final result of evolution requirement tests.
|
||||
- The `HeldItemManager` has a new method `shouldConsumeItem`, this will return false by default to prevent breaking changes, see the documentation and update your implementations as needed.
|
||||
|
||||
### Datapack & Resourcepack Creators
|
||||
- Added 3 new item tags: `cobblemon:held/consumed_in_npc_battle`, `cobblemon:held/consumed_in_pvp_battle` & `cobblemon:held/consumed_in_wild_battle` these will determine which items get consumed in the implied battle types by Cobblemon, keep in mind the controller for this behaviour can be overriden by 3rd party.
|
||||
|
||||
## [1.4.0 - The Friends and Farms Update (October 13th, 2023)](#1-4-0)
|
||||
### Additions
|
||||
@@ -493,7 +441,7 @@
|
||||
- Species and FormData have had their evolutions, pre-evolution and labels properties exposed. It is still recommended to work using a Pokémon instance when possible.
|
||||
- Added capture check to BattleVictoryEvent.
|
||||
- The various hardcoded potion shoulder effects have been removed, make use of PotionBaseEffect.
|
||||
- Added ContextManager for tracking causes and contexts of conditions created during a battle. See BattleContext for types of conditions that are tracked.
|
||||
- Added ContextManager for tracking causes and contexts of conditions created during a battle. See BattleContext for types of conditions that are tracked.
|
||||
- Added MongoDB support for storing Pokémon and Player data. Must be enabled in config, requires MongoDB core and sync drivers (4.10.0+).
|
||||
- CobblemonShowdown updated to version 10.
|
||||
- Generation of a battle can be set in BattleFormat.
|
||||
@@ -873,17 +821,17 @@
|
||||
- Fixed spawning in several biome tag categories.
|
||||
- Fixed resource pack support for Pokémon models and textures.
|
||||
- **Model Fixes**
|
||||
- Fixed Paras and Nidoqueen looking very weird.
|
||||
- Fixed Hitmonchan asserting dominance with a T-pose as well as Grimer and Muk pointing their hands to the sky.
|
||||
- Fixed specific Pokémon suddenly pausing their animation after staying still for a long time.
|
||||
- Fixed Mankey's feet being buried in the ground.
|
||||
- Updated the Substitute model and updated its shiny texture to be better for the red-green colorblind.
|
||||
- Improved Horsea, Seadra, and Kingdra animations, especially on land.
|
||||
- Fixed Paras and Nidoqueen looking very weird.
|
||||
- Fixed Hitmonchan asserting dominance with a T-pose as well as Grimer and Muk pointing their hands to the sky.
|
||||
- Fixed specific Pokémon suddenly pausing their animation after staying still for a long time.
|
||||
- Fixed Mankey's feet being buried in the ground.
|
||||
- Updated the Substitute model and updated its shiny texture to be better for the red-green colorblind.
|
||||
- Improved Horsea, Seadra, and Kingdra animations, especially on land.
|
||||
- **Battle Fixes**
|
||||
- Fixed an issue with battles where Pokémon had a different max HP causing some desync issues with the health bars.
|
||||
- Fixed Magnitude battle messages.
|
||||
- Moves that are disabled or out of PP now show transparently in the battle GUI instead of being hidden completely.
|
||||
- Statuses like sleep and frozen no longer last forever if it was carried over from a previous battle.
|
||||
- Fixed an issue with battles where Pokémon had a different max HP causing some desync issues with the health bars.
|
||||
- Fixed Magnitude battle messages.
|
||||
- Moves that are disabled or out of PP now show transparently in the battle GUI instead of being hidden completely.
|
||||
- Statuses like sleep and frozen no longer last forever if it was carried over from a previous battle.
|
||||
|
||||
### Localization
|
||||
- Added species, ability, and move translations for `ko_ko`, `jp_jp`, `fr_fr`, `es_es`, `it_it`, and `zh_cn`.
|
||||
|
||||
+10
-10
@@ -6,9 +6,9 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.fabric.mixin;
|
||||
package com.cobblemon.mod.common.mixin;
|
||||
|
||||
import com.cobblemon.mod.fabric.brewing.CobblemonFabricBreweryRegistry;
|
||||
import com.cobblemon.mod.common.brewing.BrewingRecipes;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.screen.BrewingStandScreenHandler;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
@@ -18,14 +18,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(BrewingStandScreenHandler.PotionSlot.class)
|
||||
public class PotionSlotMixin {
|
||||
|
||||
@Inject(method = "matches", at = @At("RETURN"), cancellable = true)
|
||||
private static void cobblemon$matches(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
|
||||
if (cir.getReturnValue()) {
|
||||
return;
|
||||
@Inject(
|
||||
method = "matches",
|
||||
at = @At(value = "HEAD"),
|
||||
cancellable = true
|
||||
)
|
||||
private static void matchesBrewable(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
|
||||
if (BrewingRecipes.brewableItems.contains(stack.getItem())) {
|
||||
cir.setReturnValue(true);
|
||||
}
|
||||
cir.setReturnValue(CobblemonFabricBreweryRegistry.INSTANCE.isValidPotionSlot(stack));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+7
-7
@@ -6,9 +6,9 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.fabric.mixin;
|
||||
package com.cobblemon.mod.common.mixin.entity;
|
||||
|
||||
import com.cobblemon.mod.fabric.brewing.CobblemonFabricBreweryRegistry;
|
||||
import com.cobblemon.mod.common.brewing.BrewingRecipes;
|
||||
import net.minecraft.block.entity.BrewingStandBlockEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
@@ -20,15 +20,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
public abstract class BrewingStandBlockEntityMixin
|
||||
{
|
||||
@Inject(
|
||||
method = "isValid",
|
||||
at = @At(value = "RETURN"),
|
||||
cancellable = true
|
||||
method = "isValid",
|
||||
at = @At(value = "HEAD"),
|
||||
cancellable = true
|
||||
)
|
||||
private void cobblemon$isValid(int slot, ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
|
||||
final BrewingStandBlockEntity entity = (BrewingStandBlockEntity) (Object) this;
|
||||
if (slot < 3 && !cir.getReturnValue())
|
||||
if (slot < 3)
|
||||
{
|
||||
if (entity.getStack(slot).isEmpty() && CobblemonFabricBreweryRegistry.INSTANCE.isValidPotionSlot(stack))
|
||||
if (entity.getStack(slot).isEmpty() && BrewingRecipes.brewableItems.contains(stack.getItem()))
|
||||
cir.setReturnValue(true);
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,10 @@
|
||||
|
||||
package com.cobblemon.mod.common
|
||||
|
||||
import com.cobblemon.mod.common.block.entity.*
|
||||
import com.cobblemon.mod.common.block.entity.BerryBlockEntity
|
||||
import com.cobblemon.mod.common.block.entity.HealingMachineBlockEntity
|
||||
import com.cobblemon.mod.common.block.entity.PCBlockEntity
|
||||
import com.cobblemon.mod.common.block.entity.PokemonPastureBlockEntity
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import net.minecraft.block.entity.BlockEntityType
|
||||
import net.minecraft.registry.Registries
|
||||
@@ -28,9 +31,5 @@ object CobblemonBlockEntities : PlatformRegistry<Registry<BlockEntityType<*>>, R
|
||||
val BERRY = this.create("berry", BlockEntityType.Builder.create(::BerryBlockEntity, *CobblemonBlocks.berries().values.toTypedArray()).build(null))
|
||||
@JvmField
|
||||
val PASTURE: BlockEntityType<PokemonPastureBlockEntity> = this.create("pasture", BlockEntityType.Builder.create(::PokemonPastureBlockEntity, CobblemonBlocks.PASTURE).build(null))
|
||||
@JvmField
|
||||
val SIGN: BlockEntityType<CobblemonSignBlockEntity> = this.create("sign", BlockEntityType.Builder.create(::CobblemonSignBlockEntity, CobblemonBlocks.APRICORN_SIGN, CobblemonBlocks.APRICORN_WALL_SIGN).build(null))
|
||||
@JvmField
|
||||
val HANGING_SIGN: BlockEntityType<CobblemonHangingSignBlockEntity> = this.create("hanging_sign", BlockEntityType.Builder.create(::CobblemonHangingSignBlockEntity, CobblemonBlocks.APRICORN_HANGING_SIGN, CobblemonBlocks.APRICORN_WALL_HANGING_SIGN).build(null))
|
||||
|
||||
}
|
||||
@@ -19,10 +19,6 @@ import com.cobblemon.mod.common.mixin.invoker.*
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.block.sign.CobblemonHangingSignBlock
|
||||
import com.cobblemon.mod.common.block.sign.CobblemonSignBlock
|
||||
import com.cobblemon.mod.common.block.sign.CobblemonWallHangingSignBlock
|
||||
import com.cobblemon.mod.common.block.sign.CobblemonWallSignBlock
|
||||
import net.minecraft.block.*
|
||||
import net.minecraft.block.piston.PistonBehavior
|
||||
import net.minecraft.entity.effect.StatusEffects
|
||||
@@ -111,14 +107,9 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
||||
val APRICORN_BUTTON = this.create("apricorn_button", BlocksInvoker.createWoodenButtonBlock(BlockSetType.OAK))
|
||||
@JvmField
|
||||
val APRICORN_PRESSURE_PLATE = this.create("apricorn_pressure_plate", PressurePlateBlockInvoker.`cobblemon$create`(PressurePlateBlock.ActivationRule.EVERYTHING, AbstractBlock.Settings.create().mapColor(APRICORN_PLANKS.defaultMapColor).noCollision().strength(0.5f).sounds(BlockSoundGroup.WOOD), APRICORN_BLOCK_SET_TYPE))
|
||||
@JvmField
|
||||
val APRICORN_SIGN = this.create("apricorn_sign", CobblemonSignBlock(AbstractBlock.Settings.copy(Blocks.OAK_SIGN), APRICORN_WOOD_TYPE))
|
||||
@JvmField
|
||||
val APRICORN_WALL_SIGN = this.create("apricorn_wall_sign", CobblemonWallSignBlock(AbstractBlock.Settings.copy(Blocks.OAK_WALL_SIGN), APRICORN_WOOD_TYPE))
|
||||
@JvmField
|
||||
val APRICORN_HANGING_SIGN = this.create("apricorn_hanging_sign", CobblemonHangingSignBlock(AbstractBlock.Settings.copy(Blocks.OAK_WALL_HANGING_SIGN), APRICORN_WOOD_TYPE))
|
||||
@JvmField
|
||||
val APRICORN_WALL_HANGING_SIGN = this.create("apricorn_wall_hanging_sign", CobblemonWallHangingSignBlock(AbstractBlock.Settings.copy(Blocks.OAK_HANGING_SIGN), APRICORN_WOOD_TYPE))
|
||||
// Tag was removed be sure to add it back when implemented
|
||||
//val APRICORN_SIGN = queue("apricorn_sign") { StandingSignBlock(AbstractBlock.Settings.of(Material.WOOD).noCollission().strength(1.0f).sounds(BlockSoundGroup.WOOD), APRICORN_WOOD_TYPE) }
|
||||
//val APRICORN_WALL_SIGN = queue("apricorn_wall_sign") { WallSignBlock(AbstractBlock.Settings.of(Material.WOOD).noCollission().strength(1.0f).sounds(BlockSoundGroup.WOOD).dropsLike(APRICORN_SIGN), APRICORN_WOOD_TYPE) }
|
||||
@JvmField
|
||||
val APRICORN_SLAB = this.create("apricorn_slab", SlabBlock(AbstractBlock.Settings.create().mapColor(MapColor.OAK_TAN).strength(2.0f, 3.0f).sounds(BlockSoundGroup.WOOD)))
|
||||
@JvmField
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common
|
||||
|
||||
import java.util.function.Supplier
|
||||
import net.minecraft.block.Block
|
||||
import net.minecraft.block.entity.BlockEntity
|
||||
import net.minecraft.block.entity.BlockEntityType
|
||||
@@ -18,14 +19,11 @@ import net.minecraft.client.particle.ParticleFactory
|
||||
import net.minecraft.client.particle.SpriteProvider
|
||||
import net.minecraft.client.render.RenderLayer
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory
|
||||
import net.minecraft.client.render.entity.EntityRendererFactory
|
||||
import net.minecraft.client.render.entity.model.EntityModelLayer
|
||||
import net.minecraft.entity.Entity
|
||||
import net.minecraft.entity.EntityType
|
||||
import net.minecraft.item.Item
|
||||
import net.minecraft.particle.ParticleEffect
|
||||
import net.minecraft.particle.ParticleType
|
||||
import java.util.function.Supplier
|
||||
import net.minecraft.resource.SynchronousResourceReloader
|
||||
|
||||
interface CobblemonClientImplementation {
|
||||
fun registerLayer(modelLayer: EntityModelLayer, supplier: Supplier<TexturedModelData>)
|
||||
@@ -40,7 +38,5 @@ interface CobblemonClientImplementation {
|
||||
|
||||
fun registerBlockColors(provider: BlockColorProvider, vararg blocks: Block)
|
||||
|
||||
fun <T : BlockEntity> registerBlockEntityRenderer(type: BlockEntityType<out T>, factory: BlockEntityRendererFactory<T>)
|
||||
|
||||
fun <T : Entity> registerEntityRenderer(type: EntityType<out T>, factory: EntityRendererFactory<T>)
|
||||
fun <T : BlockEntity> registerBlockEntityRenderer(type: BlockEntityType<T>, factory: BlockEntityRendererFactory<T>)
|
||||
}
|
||||
@@ -9,8 +9,6 @@
|
||||
package com.cobblemon.mod.common
|
||||
|
||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatEntity
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonChestBoatEntity
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
@@ -47,24 +45,6 @@ object CobblemonEntities : PlatformRegistry<Registry<EntityType<*>>, RegistryKey
|
||||
.build(EMPTY_POKEBALL_KEY.toString())
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val BOAT_KEY = cobblemonResource("boat")
|
||||
@JvmField
|
||||
val BOAT: EntityType<CobblemonBoatEntity> = this.create(
|
||||
BOAT_KEY.path,
|
||||
EntityType.Builder.create(::CobblemonBoatEntity, SpawnGroup.MISC).setDimensions(1.375F, 0.5625F).maxTrackingRange(10)
|
||||
.build(BOAT_KEY.toString())
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val CHEST_BOAT_KEY = cobblemonResource("chest_boat")
|
||||
@JvmField
|
||||
val CHEST_BOAT: EntityType<CobblemonChestBoatEntity> = this.create(
|
||||
CHEST_BOAT_KEY.path,
|
||||
EntityType.Builder.create(::CobblemonChestBoatEntity, SpawnGroup.MISC).setDimensions(1.375F, 0.5625F).maxTrackingRange(10)
|
||||
.build(CHEST_BOAT_KEY.toString())
|
||||
)
|
||||
|
||||
fun registerAttributes(consumer: (EntityType<out LivingEntity>, DefaultAttributeContainer.Builder) -> Unit) {
|
||||
consumer(POKEMON, PokemonEntity.createAttributes())
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ import com.cobblemon.mod.common.api.pokemon.status.Statuses
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.block.MintBlock
|
||||
import com.cobblemon.mod.common.block.MintBlock.MintType
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatType
|
||||
import com.cobblemon.mod.common.item.*
|
||||
import com.cobblemon.mod.common.item.battle.DireHitItem
|
||||
import com.cobblemon.mod.common.item.battle.GuardSpecItem
|
||||
@@ -124,34 +123,34 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
val VIVICHOKE_SEEDS = compostableItem("vivichoke_seeds", VivichokeItem(CobblemonBlocks.VIVICHOKE_SEEDS))
|
||||
|
||||
@JvmField
|
||||
val RED_APRICORN = apricornItem("red", ApricornItem(CobblemonBlocks.RED_APRICORN))
|
||||
val RED_APRICORN = apricronItem("red", ApricornItem(CobblemonBlocks.RED_APRICORN))
|
||||
@JvmField
|
||||
val YELLOW_APRICORN = apricornItem("yellow", ApricornItem(CobblemonBlocks.YELLOW_APRICORN))
|
||||
val YELLOW_APRICORN = apricronItem("yellow", ApricornItem(CobblemonBlocks.YELLOW_APRICORN))
|
||||
@JvmField
|
||||
val GREEN_APRICORN = apricornItem("green", ApricornItem(CobblemonBlocks.GREEN_APRICORN))
|
||||
val GREEN_APRICORN = apricronItem("green", ApricornItem(CobblemonBlocks.GREEN_APRICORN))
|
||||
@JvmField
|
||||
val BLUE_APRICORN = apricornItem("blue", ApricornItem(CobblemonBlocks.BLUE_APRICORN))
|
||||
val BLUE_APRICORN = apricronItem("blue", ApricornItem(CobblemonBlocks.BLUE_APRICORN))
|
||||
@JvmField
|
||||
val PINK_APRICORN = apricornItem("pink", ApricornItem(CobblemonBlocks.PINK_APRICORN))
|
||||
val PINK_APRICORN = apricronItem("pink", ApricornItem(CobblemonBlocks.PINK_APRICORN))
|
||||
@JvmField
|
||||
val BLACK_APRICORN = apricornItem("black", ApricornItem(CobblemonBlocks.BLACK_APRICORN))
|
||||
val BLACK_APRICORN = apricronItem("black", ApricornItem(CobblemonBlocks.BLACK_APRICORN))
|
||||
@JvmField
|
||||
val WHITE_APRICORN = apricornItem("white", ApricornItem(CobblemonBlocks.WHITE_APRICORN))
|
||||
val WHITE_APRICORN = apricronItem("white", ApricornItem(CobblemonBlocks.WHITE_APRICORN))
|
||||
|
||||
@JvmField
|
||||
val RED_APRICORN_SEED = apricornSeedItem("red", ApricornSeedItem(CobblemonBlocks.RED_APRICORN_SAPLING))
|
||||
val RED_APRICORN_SEED = apricronSeedItem("red", ApricornSeedItem(CobblemonBlocks.RED_APRICORN_SAPLING))
|
||||
@JvmField
|
||||
val YELLOW_APRICORN_SEED = apricornSeedItem("yellow", ApricornSeedItem(CobblemonBlocks.YELLOW_APRICORN_SAPLING))
|
||||
val YELLOW_APRICORN_SEED = apricronSeedItem("yellow", ApricornSeedItem(CobblemonBlocks.YELLOW_APRICORN_SAPLING))
|
||||
@JvmField
|
||||
val GREEN_APRICORN_SEED = apricornSeedItem("green", ApricornSeedItem(CobblemonBlocks.GREEN_APRICORN_SAPLING))
|
||||
val GREEN_APRICORN_SEED = apricronSeedItem("green", ApricornSeedItem(CobblemonBlocks.GREEN_APRICORN_SAPLING))
|
||||
@JvmField
|
||||
val BLUE_APRICORN_SEED = apricornSeedItem("blue", ApricornSeedItem(CobblemonBlocks.BLUE_APRICORN_SAPLING))
|
||||
val BLUE_APRICORN_SEED = apricronSeedItem("blue", ApricornSeedItem(CobblemonBlocks.BLUE_APRICORN_SAPLING))
|
||||
@JvmField
|
||||
val PINK_APRICORN_SEED = apricornSeedItem("pink", ApricornSeedItem(CobblemonBlocks.PINK_APRICORN_SAPLING))
|
||||
val PINK_APRICORN_SEED = apricronSeedItem("pink", ApricornSeedItem(CobblemonBlocks.PINK_APRICORN_SAPLING))
|
||||
@JvmField
|
||||
val BLACK_APRICORN_SEED = apricornSeedItem("black", ApricornSeedItem(CobblemonBlocks.BLACK_APRICORN_SAPLING))
|
||||
val BLACK_APRICORN_SEED = apricronSeedItem("black", ApricornSeedItem(CobblemonBlocks.BLACK_APRICORN_SAPLING))
|
||||
@JvmField
|
||||
val WHITE_APRICORN_SEED = apricornSeedItem("white", ApricornSeedItem(CobblemonBlocks.WHITE_APRICORN_SAPLING))
|
||||
val WHITE_APRICORN_SEED = apricronSeedItem("white", ApricornSeedItem(CobblemonBlocks.WHITE_APRICORN_SAPLING))
|
||||
|
||||
@JvmField
|
||||
val APRICORN_LOG = blockItem("apricorn_log", CobblemonBlocks.APRICORN_LOG)
|
||||
@@ -165,10 +164,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
val APRICORN_PLANKS = blockItem("apricorn_planks", CobblemonBlocks.APRICORN_PLANKS)
|
||||
@JvmField
|
||||
val APRICORN_LEAVES = compostableBlockItem("apricorn_leaves", CobblemonBlocks.APRICORN_LEAVES)
|
||||
@JvmField
|
||||
val APRICORN_BOAT = create("apricorn_boat", CobblemonBoatItem(CobblemonBoatType.APRICORN, false, Item.Settings().maxCount(1)))
|
||||
@JvmField
|
||||
val APRICORN_CHEST_BOAT = create("apricorn_chest_boat", CobblemonBoatItem(CobblemonBoatType.APRICORN, true, Item.Settings().maxCount(1)))
|
||||
|
||||
@JvmField
|
||||
val APRICORN_DOOR = blockItem("apricorn_door", CobblemonBlocks.APRICORN_DOOR)
|
||||
@@ -182,14 +177,12 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
val APRICORN_BUTTON = blockItem("apricorn_button", CobblemonBlocks.APRICORN_BUTTON)
|
||||
@JvmField
|
||||
val APRICORN_PRESSURE_PLATE = blockItem("apricorn_pressure_plate", CobblemonBlocks.APRICORN_PRESSURE_PLATE)
|
||||
//@JvmField
|
||||
// val APRICORN_SIGN = create("apricorn_sign", SignItem(Item.Properties().stacksTo(16).tab(CreativeModeTab.TAB_DECORATIONS), CobblemonBlocks.APRICORN_SIGN, CobblemonBlocks.APRICORN_WALL_SIGN))
|
||||
@JvmField
|
||||
val APRICORN_SLAB = blockItem("apricorn_slab", CobblemonBlocks.APRICORN_SLAB)
|
||||
@JvmField
|
||||
val APRICORN_STAIRS = blockItem("apricorn_stairs", CobblemonBlocks.APRICORN_STAIRS)
|
||||
@JvmField
|
||||
val APRICORN_SIGN = this.create("apricorn_sign", SignItem(Item.Settings().maxCount(16), CobblemonBlocks.APRICORN_SIGN, CobblemonBlocks.APRICORN_WALL_SIGN))
|
||||
@JvmField
|
||||
val APRICORN_HANGING_SIGN = this.create("apricorn_hanging_sign", HangingSignItem(CobblemonBlocks.APRICORN_HANGING_SIGN, CobblemonBlocks.APRICORN_WALL_HANGING_SIGN, Item.Settings().maxCount(16)))
|
||||
|
||||
@JvmField
|
||||
val HEALING_MACHINE = blockItem("healing_machine", CobblemonBlocks.HEALING_MACHINE)
|
||||
@@ -571,14 +564,10 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
@JvmField
|
||||
val CHOICE_SPECS = heldItem("choice_specs")
|
||||
@JvmField
|
||||
val CLEANSE_TAG = heldItem("cleanse_tag")
|
||||
@JvmField
|
||||
val DRAGON_FANG = heldItem("dragon_fang")
|
||||
@JvmField
|
||||
val EXP_SHARE = heldItem("exp_share")
|
||||
@JvmField
|
||||
val FAIRY_FEATHER = heldItem("fairy_feather")
|
||||
@JvmField
|
||||
val FOCUS_BAND = heldItem("focus_band")
|
||||
@JvmField
|
||||
val HARD_STONE = heldItem("hard_stone")
|
||||
@@ -623,20 +612,18 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
@JvmField
|
||||
val WISE_GLASSES = heldItem("wise_glasses")
|
||||
@JvmField
|
||||
val MENTAL_HERB = compostableHeldItem("mental_herb", null, 1F)
|
||||
val MENTAL_HERB = compostableHeldItem("mental_herb")
|
||||
@JvmField
|
||||
val MIRROR_HERB = compostableHeldItem("mirror_herb", null, 1F)
|
||||
val MIRROR_HERB = compostableHeldItem("mirror_herb")
|
||||
@JvmField
|
||||
val POWER_HERB = compostableHeldItem("power_herb", null, 1F)
|
||||
val POWER_HERB = compostableHeldItem("power_herb")
|
||||
@JvmField
|
||||
val WHITE_HERB = compostableHeldItem("white_herb", null, 1F)
|
||||
val WHITE_HERB = heldItem("white_herb")
|
||||
@JvmField
|
||||
val BRIGHT_POWDER = heldItem("bright_powder")
|
||||
@JvmField
|
||||
val METAL_POWDER = heldItem("metal_powder")
|
||||
@JvmField
|
||||
val LIGHT_POWDER = heldItem("light_powder")
|
||||
@JvmField
|
||||
val QUICK_POWDER = heldItem("quick_powder")
|
||||
@JvmField
|
||||
val DESTINY_KNOT = heldItem("destiny_knot")
|
||||
@@ -654,104 +641,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
val POWER_LENS = heldItem("power_lens")
|
||||
@JvmField
|
||||
val POWER_WEIGHT = heldItem("power_weight")
|
||||
@JvmField
|
||||
val ABSORB_BULB = heldItem("absorb_bulb")
|
||||
@JvmField
|
||||
val ELECTRIC_SEED = heldItem("electric_seed")
|
||||
@JvmField
|
||||
val GRASSY_SEED = heldItem("grassy_seed")
|
||||
@JvmField
|
||||
val MISTY_SEED = heldItem("misty_seed")
|
||||
@JvmField
|
||||
val PSYCHIC_SEED = heldItem("psychic_seed")
|
||||
@JvmField
|
||||
val FLOAT_STONE = heldItem("float_stone")
|
||||
@JvmField
|
||||
val GRIP_CLAW = heldItem("grip_claw")
|
||||
@JvmField
|
||||
val LIGHT_BALL = heldItem("light_ball")
|
||||
@JvmField
|
||||
val SHED_SHELL = heldItem("shed_shell")
|
||||
@JvmField
|
||||
val STICKY_BARB = heldItem("sticky_barb")
|
||||
@JvmField
|
||||
val ABILITY_SHIELD = heldItem("ability_shield")
|
||||
@JvmField
|
||||
val AIR_BALLOON = heldItem("air_balloon")
|
||||
@JvmField
|
||||
val AMULET_COIN = heldItem("amulet_coin")
|
||||
@JvmField
|
||||
val BINDING_BAND = heldItem("binding_band")
|
||||
@JvmField
|
||||
val BLUNDER_POLICY = heldItem("blunder_policy")
|
||||
@JvmField
|
||||
val CELL_BATTERY = heldItem("cell_battery")
|
||||
@JvmField
|
||||
val CLEAR_AMULET = heldItem("clear_amulet")
|
||||
@JvmField
|
||||
val COVERT_CLOAK = heldItem("covert_cloak")
|
||||
@JvmField
|
||||
val EJECT_BUTTON = heldItem("eject_button")
|
||||
@JvmField
|
||||
val EJECT_PACK = heldItem("eject_pack")
|
||||
@JvmField
|
||||
val EXPERT_BELT = heldItem("expert_belt")
|
||||
@JvmField
|
||||
val FLAME_ORB = heldItem("flame_orb")
|
||||
@JvmField
|
||||
val FOCUS_SASH = heldItem("focus_sash")
|
||||
@JvmField
|
||||
val LAGGING_TAIL = heldItem("lagging_tail")
|
||||
@JvmField
|
||||
val LIFE_ORB = heldItem("life_orb")
|
||||
@JvmField
|
||||
val LOADED_DICE = heldItem("loaded_dice")
|
||||
@JvmField
|
||||
val LUMINOUS_MOSS = heldItem("luminous_moss")
|
||||
@JvmField
|
||||
val METRONOME = heldItem("metronome")
|
||||
@JvmField
|
||||
val PROTECTIVE_PADS = heldItem("protective_pads")
|
||||
@JvmField
|
||||
val PUNCHING_GLOVE = heldItem("punching_glove")
|
||||
@JvmField
|
||||
val RED_CARD = heldItem("red_card")
|
||||
@JvmField
|
||||
val RING_TARGET = heldItem("ring_target")
|
||||
@JvmField
|
||||
val ROOM_SERVICE = heldItem("room_service")
|
||||
@JvmField
|
||||
val SCOPE_LENS = heldItem("scope_lens")
|
||||
@JvmField
|
||||
val SHELL_BELL = heldItem("shell_bell")
|
||||
@JvmField
|
||||
val SOOTHE_BELL = heldItem("soothe_bell")
|
||||
@JvmField
|
||||
val TERRAIN_EXTRUDER = heldItem("terrain_extruder")
|
||||
@JvmField
|
||||
val THROAT_SPRAY = heldItem("throat_spray")
|
||||
@JvmField
|
||||
val TOXIC_ORB = heldItem("toxic_orb")
|
||||
@JvmField
|
||||
val UTILITY_UMBRELLA = heldItem("utility_umbrella")
|
||||
@JvmField
|
||||
val WEAKNESS_POLICY = heldItem("weakness_policy")
|
||||
@JvmField
|
||||
val WIDE_LENS = heldItem("wide_lens")
|
||||
@JvmField
|
||||
val ZOOM_LENS = heldItem("zoom_lens")
|
||||
@JvmField
|
||||
val IRON_BALL = heldItem("iron_ball")
|
||||
@JvmField
|
||||
val SMOKE_BALL = heldItem("smoke_ball")
|
||||
@JvmField
|
||||
val HEAT_ROCK = heldItem("heat_rock")
|
||||
@JvmField
|
||||
val DAMP_ROCK = heldItem("damp_rock")
|
||||
@JvmField
|
||||
val SMOOTH_ROCK = heldItem("smooth_rock")
|
||||
@JvmField
|
||||
val ICY_ROCK = heldItem("icy_rock")
|
||||
|
||||
// Mulch
|
||||
@JvmField
|
||||
@@ -777,10 +666,17 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
@JvmField
|
||||
val POKEMON_MODEL = this.create("pokemon_model", PokemonItem())
|
||||
|
||||
//Keyitems
|
||||
@JvmField
|
||||
val PHOTODEX = photodexItem("photodex")
|
||||
|
||||
|
||||
private fun blockItem(name: String, block: Block): BlockItem = this.create(name, BlockItem(block, Item.Settings()))
|
||||
|
||||
private fun noSettingsItem(name: String): CobblemonItem = this.create(name, CobblemonItem(Item.Settings()))
|
||||
|
||||
private fun photodexItem(name: String): PhotodexItem = this.create(name, PhotodexItem())
|
||||
|
||||
fun berries() = this.berries.toMap()
|
||||
|
||||
private fun mulchItem(name: String, mulchVariant: MulchVariant): MulchItem = this.create(name, MulchItem(mulchVariant))
|
||||
@@ -828,16 +724,16 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
return item
|
||||
}
|
||||
|
||||
private fun apricornItem(name: String, apricornItem: ApricornItem): ApricornItem {
|
||||
private fun apricronItem(name: String, apricornItem: ApricornItem): ApricornItem {
|
||||
val finalName = "${name}_apricorn"
|
||||
val item = this.create(finalName, apricornItem)
|
||||
compostable(item, .65f)
|
||||
return item
|
||||
}
|
||||
|
||||
private fun apricornSeedItem(name: String, apricornSeedItem: ApricornSeedItem): ApricornSeedItem {
|
||||
private fun apricronSeedItem(name: String, apricronSeedItem: ApricornSeedItem): ApricornSeedItem {
|
||||
val finalName = "${name}_apricorn_seed"
|
||||
val item = this.create(finalName, apricornSeedItem)
|
||||
val item = this.create(finalName, apricronSeedItem)
|
||||
compostable(item, .65f)
|
||||
return item
|
||||
}
|
||||
|
||||
@@ -11,27 +11,8 @@ package com.cobblemon.mod.common
|
||||
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.PlayerInteractOptionsHandler
|
||||
import com.cobblemon.mod.common.client.net.SetClientPlayerDataHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleApplyPassResponseHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleCaptureEndHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleCaptureShakeHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleCaptureStartHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleChallengeExpiredHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleChallengeNotificationHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleEndHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleFaintHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleHealthChangeHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleInitializeHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleMadeInvalidChoiceHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleMakeChoiceHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleMessageHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleMusicHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattlePersistentStatusHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleQueueRequestHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleSetTeamPokemonHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleSwitchPokemonHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.BattleUpdateTeamPokemonHandler
|
||||
import com.cobblemon.mod.common.client.net.battle.*
|
||||
import com.cobblemon.mod.common.client.net.callback.move.OpenMoveCallbackHandler
|
||||
import com.cobblemon.mod.common.client.net.callback.party.OpenPartyCallbackHandler
|
||||
import com.cobblemon.mod.common.client.net.callback.partymove.OpenPartyMoveCallbackHandler
|
||||
@@ -70,7 +51,6 @@ import com.cobblemon.mod.common.client.net.trade.TradeOfferExpiredHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeOfferNotificationHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeStartedHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeUpdatedHandler
|
||||
import com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.battle.*
|
||||
import com.cobblemon.mod.common.net.messages.client.callback.OpenMoveCallbackPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyCallbackPacket
|
||||
@@ -119,10 +99,12 @@ import com.cobblemon.mod.common.net.messages.client.trade.TradeStartedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeUpdatedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.*
|
||||
import com.cobblemon.mod.common.net.messages.server.BattleChallengePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.BenchMovePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.RequestMoveSwapPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.SelectStarterPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.SendOutPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.BattleSelectActionsPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.RemoveSpectatorPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.SpectateBattlePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectCancelledPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectedPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.callback.party.PartyPokemonSelectedPacket
|
||||
@@ -152,10 +134,7 @@ import com.cobblemon.mod.common.net.messages.server.trade.ChangeTradeAcceptanceP
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.UpdateTradeOfferPacket
|
||||
import com.cobblemon.mod.common.net.serverhandling.ChallengeHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.RequestInteractionsHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.BattleSelectActionsHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.RemoveSpectatorHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.SpectateBattleHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectCancelledHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectedHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.callback.party.PartyPokemonSelectedHandler
|
||||
@@ -189,12 +168,12 @@ import com.cobblemon.mod.common.net.serverhandling.trade.ChangeTradeAcceptanceHa
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.OfferTradeHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.UpdateTradeOfferHandler
|
||||
import com.cobblemon.mod.common.util.server
|
||||
import kotlin.reflect.KClass
|
||||
import net.minecraft.network.PacketByteBuf
|
||||
import net.minecraft.network.listener.ClientPlayPacketListener
|
||||
import net.minecraft.network.packet.Packet
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import net.minecraft.util.Identifier
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
/**
|
||||
* Registers Cobblemon network packets.
|
||||
@@ -259,7 +238,6 @@ object CobblemonNetwork : NetworkManager {
|
||||
// UI Packets
|
||||
this.createClientBound(SummaryUIPacket.ID, SummaryUIPacket::decode, SummaryUIPacketHandler)
|
||||
this.createClientBound(InteractPokemonUIPacket.ID, InteractPokemonUIPacket::decode, InteractPokemonUIPacketHandler)
|
||||
this.createClientBound(PlayerInteractOptionsPacket.ID, PlayerInteractOptionsPacket::decode, PlayerInteractOptionsHandler)
|
||||
|
||||
// Starter packets
|
||||
this.createClientBound(OpenStarterUIPacket.ID, OpenStarterUIPacket::decode, StarterUIPacketHandler)
|
||||
@@ -345,7 +323,6 @@ object CobblemonNetwork : NetworkManager {
|
||||
|
||||
// Interaction Packets
|
||||
this.createServerBound(InteractPokemonPacket.ID, InteractPokemonPacket::decode, InteractPokemonHandler)
|
||||
this.createServerBound(RequestPlayerInteractionsPacket.ID, RequestPlayerInteractionsPacket::decode, RequestInteractionsHandler)
|
||||
|
||||
// Storage Packets
|
||||
this.createServerBound(SendOutPokemonPacket.ID, SendOutPokemonPacket::decode, SendOutPokemonHandler)
|
||||
@@ -373,8 +350,6 @@ object CobblemonNetwork : NetworkManager {
|
||||
|
||||
// Battle packets
|
||||
this.createServerBound(BattleSelectActionsPacket.ID, BattleSelectActionsPacket::decode, BattleSelectActionsHandler)
|
||||
this.createServerBound(SpectateBattlePacket.ID, SpectateBattlePacket::decode, SpectateBattleHandler)
|
||||
this.createServerBound(RemoveSpectatorPacket.ID, RemoveSpectatorPacket::decode, RemoveSpectatorHandler)
|
||||
|
||||
// Trade
|
||||
this.createServerBound(AcceptTradeRequestPacket.ID, AcceptTradeRequestPacket::decode, AcceptTradeRequestHandler)
|
||||
|
||||
@@ -40,7 +40,6 @@ import com.cobblemon.mod.common.net.messages.client.battle.BattleEndPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMusicPacket
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.DefeatEvolutionProgress
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.LastBattleCriticalHitsEvolutionProgress
|
||||
import com.cobblemon.mod.common.pokemon.evolution.requirements.DefeatRequirement
|
||||
import com.cobblemon.mod.common.util.battleLang
|
||||
import com.cobblemon.mod.common.util.getPlayer
|
||||
@@ -56,7 +55,6 @@ import net.minecraft.text.Text
|
||||
* @since January 16th, 2022
|
||||
* @author Deltric, Hiroku
|
||||
*/
|
||||
@Suppress("unused", "MemberVisibilityCanBePrivate")
|
||||
open class PokemonBattle(
|
||||
val format: BattleFormat,
|
||||
val side1: BattleSide,
|
||||
@@ -70,9 +68,7 @@ open class PokemonBattle(
|
||||
side2.battle = this
|
||||
this.actors.forEach { actor ->
|
||||
actor.pokemonList.forEach { battlePokemon ->
|
||||
battlePokemon.effectedPokemon.evolutionProxy.current().progress()
|
||||
.filterIsInstance<LastBattleCriticalHitsEvolutionProgress>()
|
||||
.forEach { it.reset() }
|
||||
battlePokemon.criticalHits = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -86,13 +82,12 @@ open class PokemonBattle(
|
||||
val playerUUIDs: Iterable<UUID>
|
||||
get() = actors.flatMap { it.getPlayerUUIDs() }
|
||||
val players = playerUUIDs.mapNotNull { it.getPlayer() }
|
||||
val spectators = mutableSetOf<UUID>()
|
||||
val spectators = mutableListOf<UUID>()
|
||||
|
||||
val battleId = UUID.randomUUID()
|
||||
|
||||
val showdownMessages = mutableListOf<String>()
|
||||
val battleLog = mutableListOf<String>()
|
||||
val chatLog = mutableListOf<Text>()
|
||||
var started = false
|
||||
var ended = false
|
||||
// TEMP battle showcase stuff
|
||||
@@ -180,8 +175,11 @@ open class PokemonBattle(
|
||||
}
|
||||
|
||||
fun broadcastChatMessage(component: Text) {
|
||||
chatLog.add(component)
|
||||
sendSpectatorUpdate(BattleMessagePacket(component))
|
||||
spectators.forEach { spectatorId ->
|
||||
spectatorId.getPlayer()?.let {
|
||||
CobblemonNetwork.sendPacketToPlayer(it, BattleMessagePacket(component))
|
||||
}
|
||||
}
|
||||
return actors.forEach { it.sendMessage(component) }
|
||||
}
|
||||
|
||||
|
||||
@@ -66,15 +66,7 @@ interface PokemonSelectingItem {
|
||||
return if (entity != null) {
|
||||
val pokemon = entity.pokemon
|
||||
if (entity.ownerUuid == player.uuid) {
|
||||
val typedActionResult = applyToPokemon(player, stack, pokemon)
|
||||
if (typedActionResult != null)
|
||||
{
|
||||
CobblemonCriteria.POKEMON_INTERACT.trigger(player, PokemonInteractContext(pokemon.species.resourceIdentifier, Registries.ITEM.getId(stack.item)))
|
||||
typedActionResult
|
||||
}
|
||||
else {
|
||||
TypedActionResult.pass(stack)
|
||||
}
|
||||
applyToPokemon(player, stack, pokemon) ?: TypedActionResult.pass(stack)
|
||||
} else {
|
||||
TypedActionResult.fail(stack)
|
||||
}
|
||||
|
||||
+2
-4
@@ -8,16 +8,14 @@
|
||||
|
||||
package com.cobblemon.mod.common.api.pokemon.evolution.progress
|
||||
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.*
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.RecoilEvolutionProgress
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.UseMoveEvolutionProgress
|
||||
|
||||
object EvolutionProgressFactory {
|
||||
|
||||
private val variants = hashMapOf<String, () -> EvolutionProgress<*>>()
|
||||
|
||||
init {
|
||||
registerVariant(DamageTakenEvolutionProgress.ID.toString()) { DamageTakenEvolutionProgress() }
|
||||
registerVariant(DefeatEvolutionProgress.ID.toString()) { DefeatEvolutionProgress() }
|
||||
registerVariant(LastBattleCriticalHitsEvolutionProgress.ID.toString()) { LastBattleCriticalHitsEvolutionProgress() }
|
||||
registerVariant(RecoilEvolutionProgress.ID.toString()) { RecoilEvolutionProgress() }
|
||||
registerVariant(UseMoveEvolutionProgress.ID.toString()) { UseMoveEvolutionProgress() }
|
||||
}
|
||||
|
||||
-10
@@ -79,16 +79,6 @@ interface HeldItemManager {
|
||||
*/
|
||||
fun take(pokemon: BattlePokemon, showdownId: String)
|
||||
|
||||
/**
|
||||
* Tests if the given [BattlePokemon] should have their item consumed.
|
||||
* This method is expected to be used in each implementation when needed.
|
||||
*
|
||||
* @param pokemon The [BattlePokemon] being tested.
|
||||
* @param battle The [PokemonBattle] the [pokemon] is participating in.
|
||||
* @param showdownId The literal ID of the held item on Showdown.
|
||||
*/
|
||||
fun shouldConsumeItem(pokemon: BattlePokemon, battle: PokemonBattle, showdownId: String): Boolean = false
|
||||
|
||||
companion object {
|
||||
|
||||
/**
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.api.pokemon.status
|
||||
|
||||
import com.cobblemon.mod.common.pokemon.status.PersistentStatus
|
||||
import com.cobblemon.mod.common.pokemon.status.statuses.BurnStatus
|
||||
import com.cobblemon.mod.common.pokemon.status.statuses.FrozenStatus
|
||||
import com.cobblemon.mod.common.pokemon.status.statuses.ParalysisStatus
|
||||
@@ -40,5 +39,4 @@ object Statuses {
|
||||
|
||||
fun getStatus(name: Identifier) = allStatuses.find { status -> status.name == name }
|
||||
fun getStatus(showdownName: String) = allStatuses.find { it.showdownName == showdownName }
|
||||
fun getPersistentStatuses() = allStatuses.filterIsInstance<PersistentStatus>()
|
||||
}
|
||||
@@ -31,16 +31,12 @@ open class SpawnerManager {
|
||||
|
||||
open fun registerSpawner(spawner: Spawner) {
|
||||
spawners.add(spawner)
|
||||
if (spawner !is TickingSpawner) {
|
||||
spawner.influences.addAll(influences)
|
||||
}
|
||||
spawner.influences.addAll(influences)
|
||||
}
|
||||
|
||||
open fun unregisterSpawner(spawner: Spawner) {
|
||||
spawners.remove(spawner)
|
||||
if (spawner !is TickingSpawner) {
|
||||
spawner.influences.removeAll(influences)
|
||||
}
|
||||
spawner.influences.removeAll(influences)
|
||||
}
|
||||
|
||||
open fun onServerStarted() {
|
||||
|
||||
+2
-2
@@ -15,7 +15,7 @@ import com.cobblemon.mod.common.api.spawning.detail.SpawnAction
|
||||
import com.cobblemon.mod.common.api.spawning.detail.SpawnDetail
|
||||
import com.cobblemon.mod.common.api.spawning.detail.SpawnPool
|
||||
import com.cobblemon.mod.common.api.spawning.influence.SpawningInfluence
|
||||
import com.cobblemon.mod.common.api.spawning.selection.FlatContextWeightedSelector
|
||||
import com.cobblemon.mod.common.api.spawning.selection.FlatSelector
|
||||
import com.cobblemon.mod.common.api.spawning.selection.SpawningSelector
|
||||
import net.minecraft.entity.Entity
|
||||
|
||||
@@ -32,7 +32,7 @@ abstract class TickingSpawner(
|
||||
var spawns: SpawnPool,
|
||||
val manager: SpawnerManager
|
||||
) : Spawner {
|
||||
private var selector: SpawningSelector = FlatContextWeightedSelector()
|
||||
private var selector: SpawningSelector = FlatSelector()
|
||||
override val influences = mutableListOf<SpawningInfluence>()
|
||||
|
||||
override fun canSpawn() = active
|
||||
|
||||
@@ -22,8 +22,6 @@ import net.minecraft.registry.tag.TagKey
|
||||
@Suppress("HasPlatformType", "unused")
|
||||
object CobblemonBlockTags {
|
||||
|
||||
@JvmField val ALL_HANGING_SIGNS = createTag("all_hanging_signs")
|
||||
@JvmField val ALL_SIGNS = createTag("all_signs")
|
||||
@JvmField val APRICORN_LEAVES = createTag("apricorn_leaves")
|
||||
@JvmField val APRICORN_LOGS = createTag("apricorn_logs")
|
||||
@JvmField val APRICORN_SAPLINGS = createTag("apricorn_saplings")
|
||||
@@ -31,7 +29,6 @@ object CobblemonBlockTags {
|
||||
@JvmField val BERRY_WILD_SOIL = createTag("berry_wild_soil")
|
||||
@JvmField val BERRY_SOIL = createTag("berry_soil")
|
||||
@JvmField val BERRY_REPLACEABLE = createTag("berry_replaceable")
|
||||
@JvmField val CEILING_HANGING_SIGNS = createTag("ceiling_hanging_signs")
|
||||
@JvmField val CROPS = createTag("crops")
|
||||
@JvmField val DRIPSTONE_GROWABLE = createTag("dripstone_growable")
|
||||
@JvmField val DRIPSTONE_REPLACEABLES = createTag("dripstone_replaceables")
|
||||
@@ -39,15 +36,10 @@ object CobblemonBlockTags {
|
||||
@JvmField val MEDICINAL_LEEK_PLANTABLE = createTag("medicinal_leek_plantable")
|
||||
@JvmField val MINTS = createTag("mints")
|
||||
@JvmField val ROOTS_SPREADABLE = createTag("roots_spreadable")
|
||||
@JvmField val SIGNS = createTag("signs")
|
||||
@JvmField val SMALL_FLOWERS = createTag("small_flowers")
|
||||
@JvmField val SEES_SKY = createTag("sees_sky")
|
||||
@JvmField val SNOW_BLOCK = createTag("snow_block")
|
||||
@JvmField val ROOTS = createTag("roots")
|
||||
@JvmField val STANDING_SIGNS = createTag("standing_signs")
|
||||
@JvmField val WALL_HANGING_SIGNS = createTag("wall_hanging_signs")
|
||||
@JvmField val WALL_SIGNS = createTag("wall_signs")
|
||||
|
||||
private fun createTag(name: String) = TagKey.of(RegistryKeys.BLOCK, cobblemonResource(name))
|
||||
|
||||
}
|
||||
|
||||
@@ -9,17 +9,15 @@
|
||||
package com.cobblemon.mod.common.api.tags
|
||||
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.registry.Registries
|
||||
import net.minecraft.registry.RegistryKeys
|
||||
import net.minecraft.registry.tag.TagKey
|
||||
|
||||
/**
|
||||
* A collection of the Cobblemon [TagKey]s related to the [Registries.ENTITY_TYPE].
|
||||
* A collection of the Cobblemon [TagKey]s related to the [Registry.ENTITY_TYPE].
|
||||
*
|
||||
* @author Licious
|
||||
* @since March 6th, 2023
|
||||
*/
|
||||
@Suppress("HasPlatformType", "unused")
|
||||
object CobblemonEntityTypeTags {
|
||||
|
||||
|
||||
@@ -29,9 +27,6 @@ object CobblemonEntityTypeTags {
|
||||
@JvmField
|
||||
val CANNOT_HAVE_NAME_TAG = create("cannot_have_name_tag")
|
||||
|
||||
@JvmField
|
||||
val BOATS = create("boats")
|
||||
|
||||
private fun create(path: String) = TagKey.of(RegistryKeys.ENTITY_TYPE, cobblemonResource(path))
|
||||
|
||||
}
|
||||
@@ -9,17 +9,16 @@
|
||||
package com.cobblemon.mod.common.api.tags
|
||||
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.registry.Registries
|
||||
import net.minecraft.registry.Registry
|
||||
import net.minecraft.registry.RegistryKeys
|
||||
import net.minecraft.registry.tag.TagKey
|
||||
|
||||
/**
|
||||
* A collection of the Cobblemon [TagKey]s related to the [Registries.ITEM].
|
||||
* A collection of the Cobblemon [TagKey]s related to the [Registry.ITEM].
|
||||
*
|
||||
* @author Licious
|
||||
* @since January 8th, 2023
|
||||
*/
|
||||
@Suppress("unused", "HasPlatformType")
|
||||
object CobblemonItemTags {
|
||||
|
||||
@JvmField
|
||||
@@ -28,47 +27,11 @@ object CobblemonItemTags {
|
||||
val APRICORN_SEEDS = create("apricorn_seeds")
|
||||
@JvmField
|
||||
val APRICORNS = create("apricorns")
|
||||
/**
|
||||
* This tag is only used for a Torterra aspect based easter egg evolution at the moment.
|
||||
* It simply includes the 'minecraft:azalea' and 'minecraft:flowering_azalea' items by default.
|
||||
*/
|
||||
@JvmField
|
||||
val AZALEA_TREE = create("azalea_tree")
|
||||
@JvmField
|
||||
val BERRIES = create("berries")
|
||||
@JvmField
|
||||
val BOATS = create("boats")
|
||||
@JvmField
|
||||
val COBBLEMON_SEEDS = create("cobblemon_seeds")
|
||||
@JvmField
|
||||
val EVOLUTION_ITEMS = create("evolution_items")
|
||||
@JvmField
|
||||
val EVOLUTION_STONES = create("evolution_stones")
|
||||
@JvmField
|
||||
val EXPERIENCE_CANDIES = create("experience_candies")
|
||||
@JvmField
|
||||
val HANGING_SIGNS = create("hanging_signs")
|
||||
@JvmField
|
||||
val HERBS = create("herbs")
|
||||
@JvmField
|
||||
val MINT_LEAF = create("mint_leaf")
|
||||
@JvmField
|
||||
val MINTS = create("mints")
|
||||
@JvmField
|
||||
val MUTATED_BERRIES = create("mutated_berries")
|
||||
@JvmField
|
||||
val PLANTS = create("plants")
|
||||
@JvmField
|
||||
val POKEBALLS = create("poke_balls")
|
||||
@JvmField
|
||||
val PROTEIN_INGREDIENTS = create("protein_ingredients")
|
||||
@JvmField
|
||||
val SEEDS = create("seeds")
|
||||
@JvmField
|
||||
val SIGNS = create("signs")
|
||||
@JvmField
|
||||
val ZINC_INGREDIENTS = create("zinc_ingredients")
|
||||
@JvmField
|
||||
val ANY_HELD_ITEM = create("held/is_held_item")
|
||||
@JvmField
|
||||
val EXPERIENCE_SHARE = create("held/experience_share")
|
||||
@@ -91,11 +54,19 @@ object CobblemonItemTags {
|
||||
@JvmField
|
||||
val POWER_WEIGHT = create("held/power_weight")
|
||||
@JvmField
|
||||
val CONSUMED_IN_NPC_BATTLE = create("held/consumed_in_npc_battle")
|
||||
val EVOLUTION_STONES = create("evolution_stones")
|
||||
@JvmField
|
||||
val CONSUMED_IN_PVP_BATTLE = create("held/consumed_in_pvp_battle")
|
||||
val EVOLUTION_ITEMS = create("evolution_items")
|
||||
@JvmField
|
||||
val CONSUMED_IN_WILD_BATTLE = create("held/consumed_in_wild_battle")
|
||||
val MINTS = create("mints")
|
||||
@JvmField
|
||||
val MINT_LEAVES = create("mint_leaves")
|
||||
|
||||
/**
|
||||
* This tag is only used for a Torterra aspect based easter egg evolution at the moment.
|
||||
* It simply includes the 'minecraft:azalea' and 'minecraft:flowering_azalea' items by default.
|
||||
*/
|
||||
val AZALEA_TREE = create("azalea_tree")
|
||||
|
||||
private fun create(path: String) = TagKey.of(RegistryKeys.ITEM, cobblemonResource(path))
|
||||
|
||||
|
||||
@@ -221,10 +221,6 @@ object BattleRegistry {
|
||||
return battleMap.values.find { it.getActor(serverPlayerEntity) != null }
|
||||
}
|
||||
|
||||
fun getBattleByParticipatingPlayerId(playerId: UUID): PokemonBattle? {
|
||||
return battleMap.values.find { playerId in it.playerUUIDs }
|
||||
}
|
||||
|
||||
fun tick() {
|
||||
battleMap.forEachValue(Long.MAX_VALUE) { it.tick() }
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ data class SwitchActionResponse(var newPokemonId: UUID) : ShowdownActionResponse
|
||||
val pokemon = activeBattlePokemon.actor.pokemonList.find { it.uuid == newPokemonId }
|
||||
return when {
|
||||
pokemon == null -> false // No such Pokémon
|
||||
(!activeBattlePokemon.actor.request?.side?.pokemon?.get(0)?.reviving!! && pokemon.health <= 0) -> false // Checks if the active Pokémon is reviving, if so ignore this check. If not, return false if dead
|
||||
pokemon.health <= 0 -> false // Pokémon is dead
|
||||
showdownMoveSet != null && showdownMoveSet.trapped -> false // You're not allowed to switch
|
||||
activeBattlePokemon.actor.getSide().activePokemon.any { it.battlePokemon?.uuid == newPokemonId } -> false // Pokémon is already sent out
|
||||
else -> true
|
||||
|
||||
@@ -35,7 +35,6 @@ import com.cobblemon.mod.common.battles.interpreter.ContextManager
|
||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.net.messages.client.battle.*
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.DamageTakenEvolutionProgress
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.LastBattleCriticalHitsEvolutionProgress
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.RecoilEvolutionProgress
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.UseMoveEvolutionProgress
|
||||
import com.cobblemon.mod.common.pokemon.status.PersistentStatus
|
||||
@@ -48,7 +47,6 @@ import net.minecraft.server.world.ServerWorld
|
||||
import net.minecraft.text.MutableText
|
||||
import net.minecraft.text.Text
|
||||
|
||||
@Suppress("KotlinPlaceholderCountMatchesArgumentCount", "UNUSED_PARAMETER")
|
||||
object ShowdownInterpreter {
|
||||
private val updateInstructions = mutableMapOf<String, (PokemonBattle, BattleMessage, MutableList<String>) -> Unit>()
|
||||
private val sideUpdateInstructions = mutableMapOf<String, (PokemonBattle, BattleActor, BattleMessage) -> Unit>()
|
||||
@@ -83,7 +81,6 @@ object ShowdownInterpreter {
|
||||
updateInstructions["|-mustrecharge|"] = this::handleRechargeInstructions
|
||||
updateInstructions["|-fail|"] = this::handleFailInstruction
|
||||
updateInstructions["|-start|"] = this::handleStartInstructions
|
||||
updateInstructions["|-block|"] = this::handleBlockInstructions
|
||||
updateInstructions["|-activate|"] = this::handleActivateInstructions
|
||||
updateInstructions["|-curestatus|"] = this::handleCureStatusInstruction
|
||||
updateInstructions["|-fieldstart|"] = this::handleFieldStartInstructions
|
||||
@@ -782,10 +779,7 @@ object ShowdownInterpreter {
|
||||
battle.broadcastChatMessage(battleLang("crit").yellow())
|
||||
this.lastCauser[battle.battleId]?.let { message ->
|
||||
val battlePokemon = message.getBattlePokemon(0, battle) ?: return@let
|
||||
if (LastBattleCriticalHitsEvolutionProgress.supports(battlePokemon.effectedPokemon)) {
|
||||
val progress = battlePokemon.effectedPokemon.evolutionProxy.current().progressFirstOrCreate({ it is LastBattleCriticalHitsEvolutionProgress }) { LastBattleCriticalHitsEvolutionProgress() }
|
||||
progress.updateProgress(LastBattleCriticalHitsEvolutionProgress.Progress(progress.currentProgress().amount + 1))
|
||||
}
|
||||
battlePokemon.criticalHits++
|
||||
}
|
||||
battle.minorBattleActions[pokemon.uuid] = message
|
||||
}
|
||||
@@ -828,19 +822,10 @@ object ShowdownInterpreter {
|
||||
*
|
||||
* The specified ACTION has failed against the POKEMON targetted.
|
||||
*/
|
||||
private fun handleFailInstruction(battle: PokemonBattle, message: BattleMessage, remainingLines: MutableList<String>) {
|
||||
private fun handleFailInstruction(battle: PokemonBattle, message: BattleMessage, remainingLines: MutableList<String>){
|
||||
battle.dispatchWaiting(1.5F){
|
||||
val pokemon = message.getBattlePokemon(0, battle) ?: return@dispatchWaiting
|
||||
val pokemonName = pokemon.getName()
|
||||
val effectID = message.effectAt(1)?.id ?: return@dispatchWaiting
|
||||
|
||||
val lang = when (effectID) {
|
||||
"shedtail" -> battleLang("fail.substitute", pokemonName)
|
||||
"hyperspacefury" -> battleLang("fail.darkvoid", pokemonName)
|
||||
"corrosivegas" -> battleLang("fail.healblock", pokemonName)
|
||||
else -> battleLang("fail.$effectID", pokemonName)
|
||||
}
|
||||
battle.broadcastChatMessage(lang.red())
|
||||
battle.broadcastChatMessage(battleLang("fail").red())
|
||||
battle.minorBattleActions[pokemon.uuid] = message
|
||||
}
|
||||
}
|
||||
@@ -916,8 +901,8 @@ object ShowdownInterpreter {
|
||||
"confusion", "perish3" -> return@dispatch GO // Skip
|
||||
"perish2", "perish1", "perish0" -> battleLang("start.perish", pokemon.getName(), effectID.last().digitToInt())
|
||||
"dynamax" -> battleLang("start.${message.effectAt(2)?.id ?: effectID}", pokemon.getName()).yellow()
|
||||
"curse" -> battleLang("start.curse", message.getSourceBattlePokemon(battle)!!.getName(), pokemon.getName())
|
||||
"disable" -> battleLang("start.disable", pokemon.getName(), message.effectAt(2)!!.rawData)
|
||||
"curse" -> battleLang("start.curse", message.getSourceBattlePokemon(battle)!!.getName(), pokemon.getName())
|
||||
else -> battleLang("start.$effectID", pokemon.getName())
|
||||
}
|
||||
battle.broadcastChatMessage(lang)
|
||||
@@ -961,27 +946,6 @@ object ShowdownInterpreter {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format:
|
||||
* |-block|POKEMON|EFFECT|MOVE|ATTACKER
|
||||
*
|
||||
* An effect targeted at POKEMON was blocked by EFFECT. This may optionally specify that the effect was a MOVE from ATTACKER. [of]SOURCE will note the owner of the EFFECT, in the case that it's not EFFECT (for instance, an ally with Aroma Veil.)
|
||||
*/
|
||||
private fun handleBlockInstructions(battle: PokemonBattle, message: BattleMessage, remainingLines: MutableList<String>) {
|
||||
battle.dispatchWaiting(1.5F) {
|
||||
val pokemon = message.getBattlePokemon(0, battle) ?: return@dispatchWaiting
|
||||
val pokemonName = pokemon.getName()
|
||||
val effectID = message.effectAt(1)?.id ?: return@dispatchWaiting
|
||||
val lang = when (effectID) {
|
||||
"matblock" -> battleLang("block.matblock", message.effectAt(2)!!.rawData)
|
||||
else -> battleLang("block.$effectID", pokemonName)
|
||||
}
|
||||
|
||||
battle.broadcastChatMessage(lang)
|
||||
battle.minorBattleActions[pokemon.uuid] = message
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format:
|
||||
* |-activate|POKEMON|EFFECT
|
||||
@@ -1006,7 +970,6 @@ object ShowdownInterpreter {
|
||||
"spite" -> battleLang("activate.spite", pokemonName, message.argumentAt(2)!!, message.argumentAt(3)!!)
|
||||
// Don't need additional lang, announced elsewhere
|
||||
"toxicdebris", "shedskin" -> return@dispatch GO
|
||||
"matblock" -> battleLang("activate.matblock", message.effectAt(2)!!.rawData)
|
||||
// Add activation to each Pokemon's history
|
||||
"destinybond" -> {
|
||||
battle.activePokemon.mapNotNull { it.battlePokemon?.uuid }.forEach { battle.minorBattleActions[it] = message }
|
||||
@@ -1019,7 +982,6 @@ object ShowdownInterpreter {
|
||||
}
|
||||
"focussash", "focusband" -> battleLang("activate.focusband", pokemonName, message.effectAt(1)!!.typelessData)
|
||||
"maxguard", "protect" -> battleLang("activate.protect", pokemonName)
|
||||
"shadowforce", "hyperspacefury", "hyperspacehole" -> battleLang("activate.phantomforce", pokemonName)
|
||||
else -> battleLang("activate.${effect.id}", pokemonName, sourceName)
|
||||
}
|
||||
battle.broadcastChatMessage(lang)
|
||||
@@ -1086,7 +1048,7 @@ object ShowdownInterpreter {
|
||||
|
||||
/**
|
||||
* Format:
|
||||
* |-ability|POKEMON|ABILITY|[from]EFFECT
|
||||
* |-ability|POKEMON|ABILITY|[from]EFFECT
|
||||
*
|
||||
* The ABILITY of the POKEMON has been changed due to a move/ability EFFECT.
|
||||
*
|
||||
@@ -1154,8 +1116,6 @@ object ShowdownInterpreter {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Format:
|
||||
* |-swapboost|SOURCE|TARGET|STATS
|
||||
@@ -1453,8 +1413,6 @@ object ShowdownInterpreter {
|
||||
lang("status.$status.hurt", pokemonName)
|
||||
}
|
||||
"aftermath" -> battleLang("damage.generic", pokemonName)
|
||||
"chloroblast", "steelbeam" -> battleLang("damage.mindblown", pokemonName)
|
||||
"jumpkick" -> battleLang("damage.highjumpkick", pokemonName)
|
||||
else -> battleLang("damage.${effect.id}", pokemonName, sourceName)
|
||||
}
|
||||
battle.broadcastChatMessage(lang.red())
|
||||
@@ -1485,9 +1443,7 @@ object ShowdownInterpreter {
|
||||
GO
|
||||
}
|
||||
}
|
||||
privateMessage.pnxAndUuid(0)?.let { (pnx, _) -> {
|
||||
battle.sendSidedUpdate(actor, BattleHealthChangePacket(pnx, remainingHealth.toFloat()), BattleHealthChangePacket(pnx, newHealthRatio))
|
||||
}}
|
||||
privateMessage.pnxAndUuid(0)?.let { (pnx, _) -> battle.sendSidedUpdate(actor, BattleHealthChangePacket(pnx, remainingHealth.toFloat()), BattleHealthChangePacket(pnx, newHealthRatio)) }
|
||||
|
||||
battle.minorBattleActions[battlePokemon.uuid] = privateMessage
|
||||
WaitDispatch(1F)
|
||||
@@ -1547,7 +1503,7 @@ object ShowdownInterpreter {
|
||||
|
||||
/**
|
||||
* Format:
|
||||
* |-item|POKEMON|ITEM|[from]EFFECT
|
||||
* |-item|POKEMON|ITEM|[from]EFFECT
|
||||
*
|
||||
* The ITEM held by the POKEMON has been changed or revealed due to a move or ability EFFECT.
|
||||
*
|
||||
@@ -1570,7 +1526,7 @@ object ShowdownInterpreter {
|
||||
|
||||
/**
|
||||
* Format:
|
||||
* |-enditem|POKEMON|ITEM|[from]EFFECT
|
||||
* |-enditem|POKEMON|ITEM|[from]EFFECT
|
||||
*
|
||||
* The ITEM held by POKEMON has been destroyed by a move or ability, and it now holds no item.
|
||||
*
|
||||
@@ -1604,7 +1560,7 @@ object ShowdownInterpreter {
|
||||
val rawHpAndStatus = privateMessage.argumentAt(1)?.split(" ") ?: return
|
||||
val rawHpRatio = rawHpAndStatus.getOrNull(0) ?: return
|
||||
val newHealth = rawHpRatio.split("/").map { it.toFloatOrNull() ?: return }
|
||||
val newHealthRatio = rawHpRatio.split("/").map { it.toFloatOrNull()?.div(newHealth[1]) ?: return }
|
||||
val newHealthRatio = rawHpRatio.split("/").map { it.toFloatOrNull()?.div(100) ?: return }
|
||||
val effect = privateMessage.effect()
|
||||
val pokemonName = battlePokemon.getName()
|
||||
broadcastOptionalAbility(battle, effect, pokemonName)
|
||||
|
||||
@@ -64,6 +64,11 @@ open class BattlePokemon(
|
||||
/** A set of all the BattlePokemon that they faced during the battle (for exp purposes) */
|
||||
val facedOpponents = mutableSetOf<BattlePokemon>()
|
||||
|
||||
/**
|
||||
* A counter of critical hits during this battle, this is used for an evolution requirement.
|
||||
*/
|
||||
var criticalHits: Int = 0
|
||||
|
||||
/**
|
||||
* The [HeldItemManager] backing this [BattlePokemon].
|
||||
*/
|
||||
@@ -84,12 +89,7 @@ open class BattlePokemon(
|
||||
}
|
||||
|
||||
fun isSentOut() = actor.battle.activePokemon.any { it.battlePokemon == this }
|
||||
fun canBeSentOut() =
|
||||
if (actor.request?.side?.pokemon?.get(0)?.reviving == true) {
|
||||
!isSentOut() && !willBeSwitchedIn && health <= 0
|
||||
} else {
|
||||
!isSentOut() && !willBeSwitchedIn && health > 0
|
||||
}
|
||||
fun canBeSentOut() = !isSentOut() && !willBeSwitchedIn && health > 0
|
||||
|
||||
fun writeVariables(struct: VariableStruct) {
|
||||
effectedPokemon.writeVariables(struct)
|
||||
|
||||
-21
@@ -1,21 +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.block.entity
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.block.entity.BlockEntityType
|
||||
import net.minecraft.block.entity.HangingSignBlockEntity
|
||||
import net.minecraft.util.math.BlockPos
|
||||
|
||||
class CobblemonHangingSignBlockEntity(pos: BlockPos, state: BlockState) : HangingSignBlockEntity(pos, state) {
|
||||
|
||||
override fun getType(): BlockEntityType<*> = CobblemonBlockEntities.HANGING_SIGN
|
||||
|
||||
}
|
||||
-21
@@ -1,21 +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.block.entity
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.block.entity.BlockEntityType
|
||||
import net.minecraft.block.entity.SignBlockEntity
|
||||
import net.minecraft.util.math.BlockPos
|
||||
|
||||
class CobblemonSignBlockEntity(pos: BlockPos, state: BlockState) : SignBlockEntity(pos, state) {
|
||||
|
||||
override fun getType(): BlockEntityType<*> = CobblemonBlockEntities.SIGN
|
||||
|
||||
}
|
||||
-22
@@ -1,22 +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.block.sign
|
||||
|
||||
import com.cobblemon.mod.common.block.entity.CobblemonHangingSignBlockEntity
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.block.HangingSignBlock
|
||||
import net.minecraft.block.WoodType
|
||||
import net.minecraft.block.entity.BlockEntity
|
||||
import net.minecraft.util.math.BlockPos
|
||||
|
||||
class CobblemonHangingSignBlock(settings: Settings, woodType: WoodType) : HangingSignBlock(settings, woodType) {
|
||||
|
||||
override fun createBlockEntity(pos: BlockPos, state: BlockState): BlockEntity = CobblemonHangingSignBlockEntity(pos, state)
|
||||
|
||||
}
|
||||
@@ -1,22 +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.block.sign
|
||||
|
||||
import com.cobblemon.mod.common.block.entity.CobblemonSignBlockEntity
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.block.SignBlock
|
||||
import net.minecraft.block.WoodType
|
||||
import net.minecraft.block.entity.BlockEntity
|
||||
import net.minecraft.util.math.BlockPos
|
||||
|
||||
class CobblemonSignBlock(settings: Settings, woodType: WoodType) : SignBlock(settings, woodType) {
|
||||
|
||||
override fun createBlockEntity(pos: BlockPos, state: BlockState): BlockEntity = CobblemonSignBlockEntity(pos, state)
|
||||
|
||||
}
|
||||
-22
@@ -1,22 +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.block.sign
|
||||
|
||||
import com.cobblemon.mod.common.block.entity.CobblemonHangingSignBlockEntity
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.block.WallHangingSignBlock
|
||||
import net.minecraft.block.WoodType
|
||||
import net.minecraft.block.entity.BlockEntity
|
||||
import net.minecraft.util.math.BlockPos
|
||||
|
||||
class CobblemonWallHangingSignBlock(settings: Settings, woodType: WoodType) : WallHangingSignBlock(settings, woodType) {
|
||||
|
||||
override fun createBlockEntity(pos: BlockPos, state: BlockState): BlockEntity = CobblemonHangingSignBlockEntity(pos, state)
|
||||
|
||||
}
|
||||
@@ -1,22 +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.block.sign
|
||||
|
||||
import com.cobblemon.mod.common.block.entity.CobblemonSignBlockEntity
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.block.WallSignBlock
|
||||
import net.minecraft.block.WoodType
|
||||
import net.minecraft.block.entity.BlockEntity
|
||||
import net.minecraft.util.math.BlockPos
|
||||
|
||||
class CobblemonWallSignBlock(settings: Settings, woodType: WoodType) : WallSignBlock(settings, woodType) {
|
||||
|
||||
override fun createBlockEntity(pos: BlockPos, state: BlockState): BlockEntity = CobblemonSignBlockEntity(pos, state)
|
||||
|
||||
}
|
||||
@@ -9,47 +9,74 @@
|
||||
package com.cobblemon.mod.common.brewing
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.brewing.ingredient.CobblemonIngredient
|
||||
import com.cobblemon.mod.common.brewing.ingredient.CobblemonItemIngredient
|
||||
import com.cobblemon.mod.common.brewing.ingredient.CobblemonPotionIngredient
|
||||
import net.minecraft.item.Item
|
||||
import net.minecraft.potion.Potion
|
||||
import net.minecraft.potion.Potions
|
||||
import net.minecraft.recipe.BrewingRecipeRegistry
|
||||
import net.minecraft.recipe.Ingredient
|
||||
|
||||
object BrewingRecipes {
|
||||
// Put things here if you want them to be add-able to the bottom of the brewing stand (like where potions go)
|
||||
@JvmField
|
||||
val brewableItems = mutableListOf(
|
||||
CobblemonItems.MEDICINAL_BREW,
|
||||
CobblemonItems.POTION,
|
||||
CobblemonItems.SUPER_POTION,
|
||||
CobblemonItems.HYPER_POTION,
|
||||
CobblemonItems.MAX_POTION,
|
||||
CobblemonItems.FULL_RESTORE,
|
||||
CobblemonItems.FULL_HEAL,
|
||||
CobblemonItems.ANTIDOTE,
|
||||
CobblemonItems.AWAKENING,
|
||||
CobblemonItems.BURN_HEAL,
|
||||
CobblemonItems.ICE_HEAL,
|
||||
CobblemonItems.PARALYZE_HEAL,
|
||||
CobblemonItems.ETHER,
|
||||
CobblemonItems.MAX_ETHER,
|
||||
CobblemonItems.ELIXIR,
|
||||
CobblemonItems.MAX_ELIXIR
|
||||
)
|
||||
|
||||
val recipes: List<Triple<CobblemonIngredient, CobblemonIngredient, Item>> by lazy {
|
||||
listOf(
|
||||
Triple(CobblemonPotionIngredient(Potions.WATER), CobblemonItemIngredient(CobblemonItems.MEDICINAL_LEEK), CobblemonItems.MEDICINAL_BREW),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.LEPPA_BERRY, CobblemonItems.ETHER),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.HOPO_BERRY, CobblemonItems.ELIXIR),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.ORAN_BERRY, CobblemonItems.POTION),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.SITRUS_BERRY, CobblemonItems.HYPER_POTION),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.LUM_BERRY, CobblemonItems.FULL_HEAL),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.PECHA_BERRY, CobblemonItems.ANTIDOTE),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.CHESTO_BERRY, CobblemonItems.AWAKENING),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.RAWST_BERRY, CobblemonItems.BURN_HEAL),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.ASPEAR_BERRY, CobblemonItems.ICE_HEAL),
|
||||
convert(CobblemonItems.MEDICINAL_BREW, CobblemonItems.CHERI_BERRY, CobblemonItems.PARALYZE_HEAL),
|
||||
convert(CobblemonItems.BURN_HEAL, CobblemonItems.LUM_BERRY, CobblemonItems.FULL_HEAL),
|
||||
convert(CobblemonItems.ANTIDOTE, CobblemonItems.LUM_BERRY, CobblemonItems.FULL_HEAL),
|
||||
convert(CobblemonItems.AWAKENING, CobblemonItems.LUM_BERRY, CobblemonItems.FULL_HEAL),
|
||||
convert(CobblemonItems.ICE_HEAL, CobblemonItems.LUM_BERRY, CobblemonItems.FULL_HEAL),
|
||||
convert(CobblemonItems.PARALYZE_HEAL, CobblemonItems.LUM_BERRY, CobblemonItems.FULL_HEAL),
|
||||
convert(CobblemonItems.ETHER, CobblemonItems.PEP_UP_FLOWER, CobblemonItems.MAX_ETHER),
|
||||
convert(CobblemonItems.ELIXIR, CobblemonItems.PEP_UP_FLOWER, CobblemonItems.MAX_ELIXIR),
|
||||
convert(CobblemonItems.POTION, CobblemonItems.ENERGY_ROOT, CobblemonItems.SUPER_POTION),
|
||||
convert(CobblemonItems.SUPER_POTION, CobblemonItems.FIGY_BERRY, CobblemonItems.HYPER_POTION),
|
||||
convert(CobblemonItems.SUPER_POTION, CobblemonItems.WIKI_BERRY, CobblemonItems.HYPER_POTION),
|
||||
convert(CobblemonItems.SUPER_POTION, CobblemonItems.MAGO_BERRY, CobblemonItems.HYPER_POTION),
|
||||
convert(CobblemonItems.SUPER_POTION, CobblemonItems.AGUAV_BERRY, CobblemonItems.HYPER_POTION),
|
||||
convert(CobblemonItems.SUPER_POTION, CobblemonItems.IAPAPA_BERRY, CobblemonItems.HYPER_POTION),
|
||||
convert(CobblemonItems.HYPER_POTION, CobblemonItems.VIVICHOKE, CobblemonItems.MAX_POTION),
|
||||
convert(CobblemonItems.MAX_POTION, CobblemonItems.LUM_BERRY, CobblemonItems.FULL_RESTORE)
|
||||
fun registerPotionTypes() {
|
||||
brewableItems.forEach { item ->
|
||||
BrewingRecipeRegistry.POTION_TYPES.add(Ingredient.ofItems(item))
|
||||
}
|
||||
}
|
||||
|
||||
fun getPotionRecipes(): List<Triple<Potion, Ingredient, Potion>> {
|
||||
return listOf(
|
||||
Triple(Potions.WATER, Ingredient.ofItems(CobblemonItems.MEDICINAL_LEEK), Potions.WATER), // This one is Mixin'd to result in brew rather than water
|
||||
)
|
||||
}
|
||||
|
||||
private fun convert(input: Item, ingredient: Item, output: Item): Triple<CobblemonIngredient, CobblemonIngredient, Item> {
|
||||
return Triple(CobblemonItemIngredient(input), CobblemonItemIngredient(ingredient), output)
|
||||
}
|
||||
|
||||
fun getItemRecipes(): List<Triple<Item, Ingredient, Item>> {
|
||||
// This is where the majority of our recipes go. First arg is thing down the bottom, second is thing up the top, third is results.
|
||||
return listOf(
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.LEPPA_BERRY), CobblemonItems.ETHER),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.HOPO_BERRY), CobblemonItems.ELIXIR),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.ORAN_BERRY), CobblemonItems.POTION),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.SITRUS_BERRY), CobblemonItems.HYPER_POTION),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.LUM_BERRY), CobblemonItems.FULL_HEAL),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.PECHA_BERRY), CobblemonItems.ANTIDOTE),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.CHESTO_BERRY), CobblemonItems.AWAKENING),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.RAWST_BERRY), CobblemonItems.BURN_HEAL),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.ASPEAR_BERRY), CobblemonItems.ICE_HEAL),
|
||||
Triple(CobblemonItems.MEDICINAL_BREW, Ingredient.ofItems(CobblemonItems.CHERI_BERRY), CobblemonItems.PARALYZE_HEAL),
|
||||
Triple(CobblemonItems.BURN_HEAL, Ingredient.ofItems(CobblemonItems.LUM_BERRY), CobblemonItems.FULL_HEAL),
|
||||
Triple(CobblemonItems.ANTIDOTE, Ingredient.ofItems(CobblemonItems.LUM_BERRY), CobblemonItems.FULL_HEAL),
|
||||
Triple(CobblemonItems.AWAKENING, Ingredient.ofItems(CobblemonItems.LUM_BERRY), CobblemonItems.FULL_HEAL),
|
||||
Triple(CobblemonItems.ICE_HEAL, Ingredient.ofItems(CobblemonItems.LUM_BERRY), CobblemonItems.FULL_HEAL),
|
||||
Triple(CobblemonItems.PARALYZE_HEAL, Ingredient.ofItems(CobblemonItems.LUM_BERRY), CobblemonItems.FULL_HEAL),
|
||||
Triple(CobblemonItems.ETHER, Ingredient.ofItems(CobblemonItems.PEP_UP_FLOWER), CobblemonItems.MAX_ETHER),
|
||||
Triple(CobblemonItems.ELIXIR, Ingredient.ofItems(CobblemonItems.PEP_UP_FLOWER), CobblemonItems.MAX_ELIXIR),
|
||||
Triple(CobblemonItems.POTION, Ingredient.ofItems(CobblemonItems.ENERGY_ROOT), CobblemonItems.SUPER_POTION),
|
||||
Triple(CobblemonItems.SUPER_POTION, Ingredient.ofItems(CobblemonItems.FIGY_BERRY), CobblemonItems.HYPER_POTION),
|
||||
Triple(CobblemonItems.SUPER_POTION, Ingredient.ofItems(CobblemonItems.WIKI_BERRY), CobblemonItems.HYPER_POTION),
|
||||
Triple(CobblemonItems.SUPER_POTION, Ingredient.ofItems(CobblemonItems.MAGO_BERRY), CobblemonItems.HYPER_POTION),
|
||||
Triple(CobblemonItems.SUPER_POTION, Ingredient.ofItems(CobblemonItems.AGUAV_BERRY), CobblemonItems.HYPER_POTION),
|
||||
Triple(CobblemonItems.SUPER_POTION, Ingredient.ofItems(CobblemonItems.IAPAPA_BERRY), CobblemonItems.HYPER_POTION),
|
||||
Triple(CobblemonItems.HYPER_POTION, Ingredient.ofItems(CobblemonItems.VIVICHOKE), CobblemonItems.MAX_POTION),
|
||||
Triple(CobblemonItems.MAX_POTION, Ingredient.ofItems(CobblemonItems.LUM_BERRY), CobblemonItems.FULL_RESTORE)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
-36
@@ -1,36 +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.brewing.ingredient
|
||||
|
||||
import net.minecraft.item.ItemStack
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
|
||||
/**
|
||||
* The Cobblemon representation of a brewing ingredient.
|
||||
* This is done to abstract platform specific requirements for a more custom solution to brewing.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
sealed interface CobblemonIngredient {
|
||||
|
||||
/**
|
||||
* Tests if a given [stack] is valid for this ingredient.
|
||||
*
|
||||
* @param stack The [ItemStack] being tested.
|
||||
* @return If the given [stack] is valid for this ingredient.
|
||||
*/
|
||||
fun matches(stack: ItemStack): Boolean
|
||||
|
||||
/**
|
||||
* Resolves list of [ItemStack]s that is used by the vanilla Ingredient implementation when a platform requires wrapping.
|
||||
*
|
||||
* @return A list of [ItemStack]s
|
||||
*/
|
||||
fun matchingStacks(): List<ItemStack>
|
||||
|
||||
}
|
||||
-22
@@ -1,22 +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.brewing.ingredient
|
||||
|
||||
import net.minecraft.item.Item
|
||||
import net.minecraft.item.ItemStack
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
|
||||
@ApiStatus.Internal
|
||||
class CobblemonItemIngredient(val item: Item) : CobblemonIngredient {
|
||||
|
||||
override fun matches(stack: ItemStack): Boolean = stack.isOf(this.item)
|
||||
|
||||
override fun matchingStacks(): List<ItemStack> = listOf(this.item.defaultStack)
|
||||
|
||||
}
|
||||
-33
@@ -1,33 +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.brewing.ingredient
|
||||
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.item.Items
|
||||
import net.minecraft.potion.Potion
|
||||
import net.minecraft.potion.PotionUtil
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
|
||||
@ApiStatus.Internal
|
||||
class CobblemonPotionIngredient(val potion: Potion) : CobblemonIngredient {
|
||||
|
||||
override fun matches(stack: ItemStack): Boolean {
|
||||
val potion = PotionUtil.getPotion(stack)
|
||||
return potion == this.potion
|
||||
}
|
||||
|
||||
override fun matchingStacks(): List<ItemStack> {
|
||||
val list = arrayListOf<ItemStack>()
|
||||
list += PotionUtil.setPotion(Items.POTION.defaultStack, this.potion)
|
||||
list += PotionUtil.setPotion(Items.SPLASH_POTION.defaultStack, this.potion)
|
||||
list += PotionUtil.setPotion(Items.LINGERING_POTION.defaultStack, this.potion)
|
||||
return list
|
||||
}
|
||||
|
||||
}
|
||||
@@ -18,12 +18,10 @@ import com.cobblemon.mod.common.client.gui.battle.BattleOverlay
|
||||
import com.cobblemon.mod.common.client.particle.BedrockParticleEffectRepository
|
||||
import com.cobblemon.mod.common.client.render.block.BerryBlockRenderer
|
||||
import com.cobblemon.mod.common.client.render.block.HealingMachineRenderer
|
||||
import com.cobblemon.mod.common.client.render.boat.CobblemonBoatRenderer
|
||||
import com.cobblemon.mod.common.client.render.item.CobblemonBuiltinItemRendererRegistry
|
||||
import com.cobblemon.mod.common.client.render.item.PokemonItemRenderer
|
||||
import com.cobblemon.mod.common.client.render.layer.PokemonOnShoulderRenderer
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.bedrock.animation.BedrockAnimationRepository
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.BerryModelRepository
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.PokeBallModelRepository
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.PokemonModelRepository
|
||||
import com.cobblemon.mod.common.client.render.pokeball.PokeBallRenderer
|
||||
@@ -32,19 +30,16 @@ import com.cobblemon.mod.common.client.starter.ClientPlayerData
|
||||
import com.cobblemon.mod.common.client.storage.ClientStorageManager
|
||||
import com.cobblemon.mod.common.client.trade.ClientTrade
|
||||
import com.cobblemon.mod.common.data.CobblemonDataProvider
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatType
|
||||
import com.cobblemon.mod.common.item.PokeBallItem
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.BerryModelRepository
|
||||
import com.cobblemon.mod.common.platform.events.PlatformEvents
|
||||
import com.cobblemon.mod.common.util.DataKeys
|
||||
import com.cobblemon.mod.common.util.asTranslated
|
||||
import net.minecraft.client.gui.DrawContext
|
||||
import net.minecraft.client.render.RenderLayer
|
||||
import net.minecraft.client.render.block.entity.HangingSignBlockEntityRenderer
|
||||
import net.minecraft.client.render.block.entity.SignBlockEntityRenderer
|
||||
import net.minecraft.client.render.entity.EntityRenderer
|
||||
import net.minecraft.client.render.entity.EntityRendererFactory
|
||||
import net.minecraft.client.render.entity.LivingEntityRenderer
|
||||
import net.minecraft.client.render.entity.model.BoatEntityModel
|
||||
import net.minecraft.client.render.entity.model.ChestBoatEntityModel
|
||||
import net.minecraft.client.render.entity.model.PlayerEntityModel
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.item.ItemStack
|
||||
@@ -88,11 +83,12 @@ object CobblemonClient {
|
||||
PlatformEvents.CLIENT_PLAYER_LOGIN.subscribe { onLogin() }
|
||||
PlatformEvents.CLIENT_PLAYER_LOGOUT.subscribe { onLogout() }
|
||||
|
||||
this.registerBlockEntityRenderers()
|
||||
this.implementation.registerBlockEntityRenderer(CobblemonBlockEntities.HEALING_MACHINE, ::HealingMachineRenderer)
|
||||
this.implementation.registerBlockEntityRenderer(CobblemonBlockEntities.BERRY, ::BerryBlockRenderer)
|
||||
|
||||
registerBlockRenderTypes()
|
||||
//registerColors()
|
||||
registerFlywheelRenderers()
|
||||
this.registerEntityRenderers()
|
||||
|
||||
LOGGER.info("Registering custom BuiltinItemRenderers")
|
||||
CobblemonBuiltinItemRendererRegistry.register(CobblemonItems.POKEMON_MODEL, PokemonItemRenderer())
|
||||
@@ -147,10 +143,6 @@ object CobblemonClient {
|
||||
RenderLayer.getCutout(),
|
||||
CobblemonBlocks.APRICORN_DOOR,
|
||||
CobblemonBlocks.APRICORN_TRAPDOOR,
|
||||
CobblemonBlocks.APRICORN_SIGN,
|
||||
CobblemonBlocks.APRICORN_WALL_SIGN,
|
||||
CobblemonBlocks.APRICORN_HANGING_SIGN,
|
||||
CobblemonBlocks.APRICORN_WALL_HANGING_SIGN,
|
||||
CobblemonBlocks.BLACK_APRICORN_SAPLING,
|
||||
CobblemonBlocks.BLUE_APRICORN_SAPLING,
|
||||
CobblemonBlocks.GREEN_APRICORN_SAPLING,
|
||||
@@ -184,8 +176,6 @@ object CobblemonClient {
|
||||
CobblemonBlocks.REVIVAL_HERB,
|
||||
*CobblemonBlocks.berries().values.toTypedArray()
|
||||
)
|
||||
|
||||
this.createBoatModelLayers()
|
||||
}
|
||||
|
||||
fun beforeChatRender(context: DrawContext, partialDeltaTicks: Float) {
|
||||
@@ -204,22 +194,14 @@ object CobblemonClient {
|
||||
renderer?.addFeature(PokemonOnShoulderRenderer(renderer))
|
||||
}
|
||||
|
||||
private fun registerBlockEntityRenderers() {
|
||||
this.implementation.registerBlockEntityRenderer(CobblemonBlockEntities.HEALING_MACHINE, ::HealingMachineRenderer)
|
||||
this.implementation.registerBlockEntityRenderer(CobblemonBlockEntities.BERRY, ::BerryBlockRenderer)
|
||||
this.implementation.registerBlockEntityRenderer(CobblemonBlockEntities.SIGN, ::SignBlockEntityRenderer)
|
||||
this.implementation.registerBlockEntityRenderer(CobblemonBlockEntities.HANGING_SIGN, ::HangingSignBlockEntityRenderer)
|
||||
fun registerPokemonRenderer(context: EntityRendererFactory.Context): PokemonRenderer {
|
||||
LOGGER.info("Registering Pokémon renderer")
|
||||
return PokemonRenderer(context)
|
||||
}
|
||||
|
||||
private fun registerEntityRenderers() {
|
||||
LOGGER.info("Registering Pokémon renderer")
|
||||
this.implementation.registerEntityRenderer(CobblemonEntities.POKEMON, ::PokemonRenderer)
|
||||
fun registerPokeBallRenderer(context: EntityRendererFactory.Context): PokeBallRenderer {
|
||||
LOGGER.info("Registering PokéBall renderer")
|
||||
this.implementation.registerEntityRenderer(CobblemonEntities.EMPTY_POKEBALL, ::PokeBallRenderer)
|
||||
LOGGER.info("Registering Boat renderer")
|
||||
this.implementation.registerEntityRenderer(CobblemonEntities.BOAT) { ctx -> CobblemonBoatRenderer(ctx, false) }
|
||||
LOGGER.info("Registering Boat with Chest renderer")
|
||||
this.implementation.registerEntityRenderer(CobblemonEntities.CHEST_BOAT) { ctx -> CobblemonBoatRenderer(ctx, true) }
|
||||
return PokeBallRenderer(context)
|
||||
}
|
||||
|
||||
fun reloadCodedAssets(resourceManager: ResourceManager) {
|
||||
@@ -233,6 +215,7 @@ object CobblemonClient {
|
||||
PokeBallModelRepository.reload(resourceManager)
|
||||
BerryModelRepository.reload(resourceManager)
|
||||
LOGGER.info("Loaded assets")
|
||||
// PokeBallModelRepository.reload(resourceManager)
|
||||
}
|
||||
|
||||
fun endBattle() {
|
||||
@@ -247,11 +230,4 @@ object CobblemonClient {
|
||||
return "${stack.translationKey}.tooltip"
|
||||
}
|
||||
|
||||
private fun createBoatModelLayers() {
|
||||
CobblemonBoatType.values().forEach { type ->
|
||||
this.implementation.registerLayer(CobblemonBoatRenderer.createBoatModelLayer(type, false), BoatEntityModel::getTexturedModelData)
|
||||
this.implementation.registerLayer(CobblemonBoatRenderer.createBoatModelLayer(type, true), ChestBoatEntityModel::getTexturedModelData)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -13,14 +13,12 @@ import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.battle.ClientBattleActor
|
||||
import com.cobblemon.mod.common.client.battle.SingleActionRequest
|
||||
import com.cobblemon.mod.common.client.gui.battle.subscreen.BattleActionSelection
|
||||
import com.cobblemon.mod.common.client.gui.battle.subscreen.BattleBackButton
|
||||
import com.cobblemon.mod.common.client.gui.battle.subscreen.BattleGeneralActionSelection
|
||||
import com.cobblemon.mod.common.client.gui.battle.subscreen.BattleSwitchPokemonSelection
|
||||
import com.cobblemon.mod.common.client.gui.battle.widgets.BattleMessagePane
|
||||
import com.cobblemon.mod.common.client.keybind.boundKey
|
||||
import com.cobblemon.mod.common.client.keybind.keybinds.PartySendBinding
|
||||
import com.cobblemon.mod.common.client.render.drawScaledText
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.RemoveSpectatorPacket
|
||||
import com.cobblemon.mod.common.util.battleLang
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.client.MinecraftClient
|
||||
@@ -43,7 +41,6 @@ class BattleGUI : Screen(battleLang("gui.title")) {
|
||||
private lateinit var messagePane: BattleMessagePane
|
||||
var opacity = 0F
|
||||
val actor = CobblemonClient.battle?.side1?.actors?.find { it.uuid == MinecraftClient.getInstance().player?.uuid }
|
||||
val specBackButton = BattleBackButton(12f, MinecraftClient.getInstance().window.scaledHeight - 32f)
|
||||
|
||||
var queuedActions = mutableListOf<() -> Unit>()
|
||||
|
||||
@@ -109,10 +106,6 @@ class BattleGUI : Screen(battleLang("gui.title")) {
|
||||
}
|
||||
}
|
||||
|
||||
if (battle.spectating) {
|
||||
specBackButton.render(context.matrices, mouseX, mouseY, delta)
|
||||
}
|
||||
|
||||
val currentSelection = getCurrentActionSelection()
|
||||
if (currentSelection == null || currentSelection is BattleGeneralActionSelection ) {
|
||||
drawScaledText(
|
||||
@@ -160,13 +153,4 @@ class BattleGUI : Screen(battleLang("gui.title")) {
|
||||
}
|
||||
return super.charTyped(chr, modifiers)
|
||||
}
|
||||
|
||||
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
||||
val battle = CobblemonClient.battle
|
||||
if (battle?.spectating == true && specBackButton.isHovered(mouseX, mouseY)) {
|
||||
RemoveSpectatorPacket(battle.battleId).sendToServer()
|
||||
CobblemonClient.endBattle()
|
||||
}
|
||||
return super.mouseClicked(mouseX, mouseY, button)
|
||||
}
|
||||
}
|
||||
+4
-9
@@ -9,7 +9,8 @@
|
||||
package com.cobblemon.mod.common.client.gui.battle.subscreen
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.battles.*
|
||||
import com.cobblemon.mod.common.battles.ShowdownPokemon
|
||||
import com.cobblemon.mod.common.battles.SwitchActionResponse
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.battle.SingleActionRequest
|
||||
import com.cobblemon.mod.common.client.gui.battle.BattleGUI
|
||||
@@ -23,7 +24,6 @@ import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder
|
||||
import net.minecraft.client.sound.PositionedSoundInstance
|
||||
import net.minecraft.client.sound.SoundManager
|
||||
import net.minecraft.client.util.math.MatrixStack
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import net.minecraft.util.math.MathHelper.ceil
|
||||
class BattleSwitchPokemonSelection(
|
||||
battleGUI: BattleGUI,
|
||||
@@ -83,6 +83,7 @@ class BattleSwitchPokemonSelection(
|
||||
partialTicks = deltaTicks
|
||||
)
|
||||
} catch (exception: Exception) {
|
||||
println(showdownPokemon.condition)
|
||||
throw exception
|
||||
}
|
||||
}
|
||||
@@ -97,15 +98,9 @@ class BattleSwitchPokemonSelection(
|
||||
.find { it.uuid == showdownPokemon.uuid }
|
||||
?.let { showdownPokemon to it }
|
||||
}
|
||||
.filter {
|
||||
if (request.side.pokemon[0].reviving) {
|
||||
"fnt" in it.first.condition
|
||||
} else {
|
||||
"fnt" !in it.first.condition
|
||||
}
|
||||
}
|
||||
.filter { it.second.uuid !in battleGUI.actor!!.activePokemon.map { it.battlePokemon?.uuid } }
|
||||
.filter { it.second.uuid !in switchingInPokemon }
|
||||
.filter { "fnt" !in it.first.condition || it.first.reviving }
|
||||
|
||||
showdownPokemonToPokemon.forEachIndexed { index, (showdownPokemon, pokemon) ->
|
||||
val row = index / 2
|
||||
|
||||
+10
-29
@@ -10,9 +10,7 @@ package com.cobblemon.mod.common.client.gui.interact.wheel
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonNetwork
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.BattleChallengePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.SpectateBattlePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.interact.InteractPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.AcceptTradeRequestPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
|
||||
@@ -50,14 +48,14 @@ fun createPokemonInteractGui(pokemonID: UUID, canMountShoulder: Boolean): Intera
|
||||
return InteractWheelGUI(options, Text.translatable("cobblemon.ui.interact.pokemon"))
|
||||
}
|
||||
|
||||
fun createPlayerInteractGui(optionsPacket: PlayerInteractOptionsPacket): InteractWheelGUI {
|
||||
fun createPlayerInteractGui(targetPlayer: PlayerEntity, pokemon: Pokemon): InteractWheelGUI {
|
||||
val trade = InteractWheelOption(
|
||||
iconResource = cobblemonResource("textures/gui/interact/icon_trade.png"),
|
||||
colour = { if (CobblemonClient.requests.tradeOffers.any { it.traderId == optionsPacket.targetId }) Vector3f(0F, 0.6F, 0F) else null },
|
||||
colour = { if (CobblemonClient.requests.tradeOffers.any { it.traderId == targetPlayer.uuid }) Vector3f(0F, 0.6F, 0F) else null },
|
||||
onPress = {
|
||||
val tradeOffer = CobblemonClient.requests.tradeOffers.find { it.traderId == optionsPacket.targetId }
|
||||
val tradeOffer = CobblemonClient.requests.tradeOffers.find { it.traderId == targetPlayer.uuid }
|
||||
if (tradeOffer == null) {
|
||||
CobblemonNetwork.sendToServer(OfferTradePacket(optionsPacket.targetId))
|
||||
CobblemonNetwork.sendToServer(OfferTradePacket(targetPlayer.uuid))
|
||||
} else {
|
||||
CobblemonClient.requests.tradeOffers -= tradeOffer
|
||||
CobblemonNetwork.sendToServer(AcceptTradeRequestPacket(tradeOffer.tradeOfferId))
|
||||
@@ -67,35 +65,18 @@ fun createPlayerInteractGui(optionsPacket: PlayerInteractOptionsPacket): Interac
|
||||
)
|
||||
val battle = InteractWheelOption(
|
||||
iconResource = cobblemonResource("textures/gui/interact/icon_battle.png"),
|
||||
colour = { if (CobblemonClient.requests.battleChallenges.any { it.challengerId == optionsPacket.targetId }) Vector3f(0F, 0.6F, 0F) else null },
|
||||
colour = { if (CobblemonClient.requests.battleChallenges.any { it.challengerId == targetPlayer.uuid }) Vector3f(0F, 0.6F, 0F) else null },
|
||||
onPress = {
|
||||
val battleRequest = CobblemonClient.requests.battleChallenges.find { it.challengerId == optionsPacket.targetId }
|
||||
val battleRequest = CobblemonClient.requests.battleChallenges.find { it.challengerId == targetPlayer.uuid }
|
||||
// This can be improved in future with more detailed battle challenge data.
|
||||
BattleChallengePacket(optionsPacket.numericTargetId, optionsPacket.selectedPokemonId).sendToServer()
|
||||
BattleChallengePacket(targetPlayer.id, pokemon.uuid).sendToServer()
|
||||
closeGUI()
|
||||
}
|
||||
)
|
||||
val spectate = InteractWheelOption(
|
||||
iconResource = cobblemonResource("textures/gui/interact/icon_spectate_battle.png"),
|
||||
colour = { if (CobblemonClient.requests.battleChallenges.any { it.challengerId == optionsPacket.targetId }) Vector3f(0F, 0.6F, 0F) else null },
|
||||
onPress = {
|
||||
SpectateBattlePacket(optionsPacket.targetId).sendToServer()
|
||||
closeGUI()
|
||||
}
|
||||
val options = mutableMapOf(
|
||||
Orientation.TOP_LEFT to trade,
|
||||
Orientation.TOP_RIGHT to battle
|
||||
)
|
||||
val options = mutableMapOf<Orientation, InteractWheelOption>()
|
||||
//The way things are positioned should probably be more thought out if more options are added
|
||||
optionsPacket.options.map {
|
||||
if (it.equals(PlayerInteractOptionsPacket.Options.TRADE)) {
|
||||
options[Orientation.TOP_LEFT] = trade
|
||||
}
|
||||
if (it.equals(PlayerInteractOptionsPacket.Options.BATTLE)) {
|
||||
options[Orientation.TOP_RIGHT] = battle
|
||||
}
|
||||
if (it.equals(PlayerInteractOptionsPacket.Options.SPECTATE_BATTLE)) {
|
||||
options[Orientation.TOP_RIGHT] = spectate
|
||||
}
|
||||
}
|
||||
return InteractWheelGUI(options, Text.translatable("cobblemon.ui.interact.player"))
|
||||
}
|
||||
|
||||
|
||||
+3
-4
@@ -11,14 +11,15 @@ package com.cobblemon.mod.common.client.keybind.keybinds
|
||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacketToServer
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.gui.battle.BattleGUI
|
||||
import com.cobblemon.mod.common.client.gui.interact.wheel.createPlayerInteractGui
|
||||
import com.cobblemon.mod.common.client.keybind.CobblemonBlockingKeyBinding
|
||||
import com.cobblemon.mod.common.client.keybind.KeybindCategories
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.net.messages.server.BattleChallengePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.RequestPlayerInteractionsPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.SendOutPokemonPacket
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.traceFirstEntityCollision
|
||||
import javax.swing.plaf.basic.BasicSliderUI.ScrollListener
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.network.ClientPlayerEntity
|
||||
import net.minecraft.client.util.InputUtil
|
||||
@@ -89,9 +90,7 @@ object PartySendBinding : CobblemonBlockingKeyBinding(
|
||||
private fun processEntityTarget(player: ClientPlayerEntity, pokemon: Pokemon, entity: LivingEntity) {
|
||||
when (entity) {
|
||||
is PlayerEntity -> {
|
||||
//This sends a packet to the server with the id of the player
|
||||
//The server sends a packet back that opens the player interaction menu with the proper options
|
||||
sendPacketToServer(RequestPlayerInteractionsPacket(entity.uuid, entity.id, pokemon.uuid))
|
||||
MinecraftClient.getInstance().setScreen(createPlayerInteractGui(entity, pokemon))
|
||||
}
|
||||
is PokemonEntity -> {
|
||||
if (!entity.canBattle(player)) return
|
||||
|
||||
-21
@@ -1,21 +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.net
|
||||
|
||||
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.client.gui.interact.wheel.createPlayerInteractGui
|
||||
import com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket
|
||||
import net.minecraft.client.MinecraftClient
|
||||
|
||||
object PlayerInteractOptionsHandler : ClientNetworkPacketHandler<PlayerInteractOptionsPacket> {
|
||||
override fun handle(packet: PlayerInteractOptionsPacket, client: MinecraftClient) {
|
||||
MinecraftClient.getInstance().setScreen(createPlayerInteractGui(packet))
|
||||
}
|
||||
|
||||
}
|
||||
+3
-3
@@ -32,10 +32,10 @@ object BattleInitializeHandler : ClientNetworkPacketHandler<BattleInitializePack
|
||||
}
|
||||
|
||||
val otherSide = if (mySide == packet.side1) packet.side2 else packet.side1
|
||||
val sides = listOf(packet.side1, packet.side2)
|
||||
spectating = !sides.any { it.actors.any { it.uuid == MinecraftClient.getInstance().player?.uuid } }
|
||||
side1.actors.addAll(mySide.actors.map{ actorFromDTO(it, !spectating) })
|
||||
|
||||
side1.actors.addAll(mySide.actors.map{ actorFromDTO(it, true) })
|
||||
side2.actors.addAll(otherSide.actors.map{ actorFromDTO(it, false) })
|
||||
spectating = sides.any { it.actors.any { it.uuid == MinecraftClient.getInstance().player?.uuid } }
|
||||
for (side in listOf(side1, side2)) {
|
||||
side.battle = this
|
||||
for (actor in side.actors) {
|
||||
|
||||
-90
@@ -1,90 +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.boat
|
||||
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatEntity
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatType
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.client.render.OverlayTexture
|
||||
import net.minecraft.client.render.RenderLayer
|
||||
import net.minecraft.client.render.VertexConsumerProvider
|
||||
import net.minecraft.client.render.entity.EntityRenderer
|
||||
import net.minecraft.client.render.entity.EntityRendererFactory
|
||||
import net.minecraft.client.render.entity.model.BoatEntityModel
|
||||
import net.minecraft.client.render.entity.model.ChestBoatEntityModel
|
||||
import net.minecraft.client.render.entity.model.EntityModelLayer
|
||||
import net.minecraft.client.util.math.MatrixStack
|
||||
import net.minecraft.util.Identifier
|
||||
import net.minecraft.util.math.MathHelper
|
||||
import net.minecraft.util.math.RotationAxis
|
||||
import org.joml.Quaternionf
|
||||
|
||||
class CobblemonBoatRenderer(ctx: EntityRendererFactory.Context, private val hasChest: Boolean) : EntityRenderer<CobblemonBoatEntity>(ctx) {
|
||||
|
||||
private val boatModels = hashMapOf<CobblemonBoatType, Pair<Identifier, BoatEntityModel>>()
|
||||
|
||||
init {
|
||||
this.shadowRadius = 0.8F
|
||||
CobblemonBoatType.values().forEach { type ->
|
||||
this.boatModels[type] = generateTextureIdentifier(type, this.hasChest) to generateBoatModel(ctx, type, this.hasChest)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getTexture(entity: CobblemonBoatEntity): Identifier = this.boatModels[entity.boatType]!!.first
|
||||
|
||||
override fun render(entity: CobblemonBoatEntity, yaw: Float, tickDelta: Float, matrices: MatrixStack, vertexConsumers: VertexConsumerProvider, light: Int) {
|
||||
matrices.push()
|
||||
matrices.translate(0F, 0.375F, 0F)
|
||||
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180F - yaw))
|
||||
val h = entity.damageWobbleTicks - tickDelta
|
||||
val j = (entity.damageWobbleStrength - tickDelta).coerceAtLeast(0F)
|
||||
if (h > 0F) {
|
||||
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(MathHelper.sin(h) * h * j / 10F * entity.damageWobbleSide))
|
||||
}
|
||||
val k = entity.interpolateBubbleWobble(tickDelta)
|
||||
if (!MathHelper.approximatelyEquals(k, 0F)) {
|
||||
matrices.multiply(Quaternionf().setAngleAxis(entity.interpolateBubbleWobble(tickDelta) * 0.017453292F, 1F, 0F, 1F))
|
||||
}
|
||||
val (identifier, entityModel) = this.boatModels[entity.boatType]!!
|
||||
matrices.scale(-1F, -1F, 1F)
|
||||
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(90F))
|
||||
entityModel.setAngles(entity, tickDelta, 0F, -0.1F, 0F, 0F)
|
||||
val vertexConsumer = vertexConsumers.getBuffer(entityModel.getLayer(identifier))
|
||||
entityModel.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, 1F, 1F, 1F, 1F)
|
||||
if (!entity.isSubmergedInWater) {
|
||||
val vertexConsumer2 = vertexConsumers.getBuffer(RenderLayer.getWaterMask())
|
||||
entityModel.waterPatch.render(matrices, vertexConsumer2, light, OverlayTexture.DEFAULT_UV)
|
||||
}
|
||||
matrices.pop()
|
||||
super.render(entity, yaw, tickDelta, matrices, vertexConsumers, light)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private fun generateTextureIdentifier(type: CobblemonBoatType, hasChest: Boolean): Identifier {
|
||||
val boatSubPath = if (hasChest) "chest_boat" else "boat"
|
||||
val path = "textures/entity/$boatSubPath/${type.name.lowercase()}.png"
|
||||
return cobblemonResource(path)
|
||||
}
|
||||
|
||||
private fun generateBoatModel(ctx: EntityRendererFactory.Context, type: CobblemonBoatType, hasChest: Boolean): BoatEntityModel {
|
||||
val modelLayer = this.createBoatModelLayer(type, hasChest)
|
||||
val modelPart = ctx.getPart(modelLayer)
|
||||
return if (hasChest) ChestBoatEntityModel(modelPart) else BoatEntityModel(modelPart)
|
||||
}
|
||||
|
||||
internal fun createBoatModelLayer(type: CobblemonBoatType, hasChest: Boolean): EntityModelLayer {
|
||||
val boatSubPath = if (hasChest) "chest_boat" else "boat"
|
||||
val path = "$boatSubPath/${type.name.lowercase()}"
|
||||
return EntityModelLayer(cobblemonResource(path), "main")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -19,7 +19,7 @@ import net.minecraft.client.model.ModelPart
|
||||
|
||||
class PokeBallModel(root: ModelPart) : PoseableEntityModel<EmptyPokeBallEntity>(), PokeBallFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("poke_ball")
|
||||
override val base = getPart("bottom")
|
||||
override val base = getPart("base")
|
||||
override val lid = getPart("lid")
|
||||
override val isForLivingEntityRenderer = false
|
||||
|
||||
|
||||
+25
-37
@@ -11,7 +11,6 @@ package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WingFlapIdleAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.asTransformed
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BiWingedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart
|
||||
@@ -24,50 +23,44 @@ import com.cobblemon.mod.common.util.math.geometry.toRadians
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class GolbatModel(root: ModelPart) : PokemonPoseableModel() {
|
||||
class GolbatModel(root: ModelPart) : PokemonPoseableModel(), BiWingedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("golbat")
|
||||
override val leftWing = getPart("leftwing")
|
||||
override val rightWing = getPart("rightwing")
|
||||
|
||||
override val portraitScale = 1.55F
|
||||
override val portraitTranslation = Vec3d(-0.1, -0.1, 0.0)
|
||||
override val portraitTranslation = Vec3d(0.0, -0.55, 0.0)
|
||||
|
||||
override val profileScale = 0.7F
|
||||
override val profileTranslation = Vec3d(0.0, 0.7, 0.0)
|
||||
override val profileScale = 0.9F
|
||||
override val profileTranslation = Vec3d(0.0, 0.4, 0.0)
|
||||
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
lateinit var hover: PokemonPose
|
||||
lateinit var fly: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
// override val cryAnimation = CryProvider { _, _ -> bedrockStateful("golbat", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("golbat", "blink").setPreventsIdle(false) }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES + UI_POSES - PoseType.HOVER,
|
||||
transformTicks = 10,
|
||||
idleAnimations = arrayOf(
|
||||
//bedrock("golbat", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
idleAnimations = arrayOf(bedrock("golbat", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES + UI_POSES - PoseType.HOVER,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { !it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("golbat", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = MOVING_POSES - PoseType.FLY,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("golbat", "ground_walk")
|
||||
//bedrock("golbat", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
@@ -75,9 +68,12 @@ class GolbatModel(root: ModelPart) : PokemonPoseableModel() {
|
||||
poseName = "hover",
|
||||
poseType = PoseType.HOVER,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("golbat", "air_idle")
|
||||
WingFlapIdleAnimation(this,
|
||||
flapFunction = sineFunction(verticalShift = -10F.toRadians(), period = 0.9F, amplitude = 0.6F),
|
||||
timeVariable = { state, _, _ -> state?.animationSeconds ?: 0F },
|
||||
axis = TransformedModelPart.Y_AXIS
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -85,20 +81,12 @@ class GolbatModel(root: ModelPart) : PokemonPoseableModel() {
|
||||
poseName = "fly",
|
||||
poseType = PoseType.FLY,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("golbat", "air_fly")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("golbat", "battle_idle")
|
||||
WingFlapIdleAnimation(this,
|
||||
flapFunction = sineFunction(verticalShift = -14F.toRadians(), period = 0.9F, amplitude = 0.9F),
|
||||
timeVariable = { state, _, _ -> state?.animationSeconds ?: 0F },
|
||||
axis = TransformedModelPart.Y_AXIS
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
+1
@@ -37,6 +37,7 @@ class KadabraModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Biped
|
||||
override val profileScale = 0.75F
|
||||
override val profileTranslation = Vec3d(0.0, 0.6, 0.0)
|
||||
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
+41
-84
@@ -10,14 +10,11 @@ package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.EarJoint
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.RangeOfMotion
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WingFlapIdleAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.asTransformed
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BiWingedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.EaredFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart.Companion.X_AXIS
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart.Companion.Y_AXIS
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart.Companion.Z_AXIS
|
||||
@@ -30,121 +27,81 @@ import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.MathConstants.PI
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class ZubatModel(root: ModelPart) : PokemonPoseableModel() {
|
||||
class ZubatModel(root: ModelPart) : PokemonPoseableModel(), BiWingedFrame, EaredFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("zubat")
|
||||
|
||||
val wings_folded = getPart("wings_folded")
|
||||
val wings_open = getPart("wings_open")
|
||||
override val leftWing = getPart("leftwing")
|
||||
override val rightWing = getPart("rightwing")
|
||||
|
||||
override val portraitScale = 1.7F
|
||||
override val portraitTranslation = Vec3d(0.0, 0.0, 0.0)
|
||||
private val leftEar = getPart("leftear")
|
||||
private val rightEar = getPart("rightear")
|
||||
override val leftEarJoint = EarJoint(leftEar, Z_AXIS, RangeOfMotion(70F.toRadians(), 40F.toRadians()))
|
||||
override val rightEarJoint = EarJoint(rightEar, Z_AXIS, RangeOfMotion((-70F).toRadians(), (-40F).toRadians()))
|
||||
|
||||
override val profileScale = 0.7F
|
||||
override val profileTranslation = Vec3d(0.0, 0.7, 0.0)
|
||||
override val portraitScale = 2.3F
|
||||
override val portraitTranslation = Vec3d(0.0, -0.5, 0.0)
|
||||
override val profileScale = 1.0F
|
||||
override val profileTranslation = Vec3d(0.0, 0.36, 0.0)
|
||||
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
lateinit var hover: PokemonPose
|
||||
lateinit var fly: PokemonPose
|
||||
lateinit var shoulderLeft: PokemonPose
|
||||
lateinit var shoulderRight: PokemonPose
|
||||
|
||||
val shoulderOffset = 0
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("zubat", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val twitch = quirk("twitch") { bedrockStateful("zubat", "eartwitch").setPreventsIdle(false) }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
transformedParts = arrayOf(
|
||||
wings_folded.asTransformed().withVisibility(visibility = false),
|
||||
wings_open.asTransformed().withVisibility(visibility = true),
|
||||
),
|
||||
quirks = arrayOf(twitch),
|
||||
idleAnimations = arrayOf(bedrock("zubat", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES - PoseType.HOVER,
|
||||
transformedParts = arrayOf(
|
||||
wings_folded.asTransformed().withVisibility(visibility = false),
|
||||
wings_open.asTransformed().withVisibility(visibility = true),
|
||||
),
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(twitch),
|
||||
registerPose(
|
||||
poseName = "hover",
|
||||
poseTypes = ALL_POSES - SHOULDER_POSES - PoseType.FLY - PoseType.SLEEP,
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("zubat", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES - PoseType.FLY,
|
||||
transformedParts = arrayOf(
|
||||
wings_folded.asTransformed().withVisibility(visibility = false),
|
||||
wings_open.asTransformed().withVisibility(visibility = true),
|
||||
),
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(twitch),
|
||||
registerPose(
|
||||
poseName = "fly",
|
||||
poseType = PoseType.FLY,
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("zubat", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
hover = registerPose(
|
||||
poseName = "hover",
|
||||
poseType = PoseType.HOVER,
|
||||
transformedParts = arrayOf(
|
||||
wings_folded.asTransformed().withVisibility(visibility = false),
|
||||
wings_open.asTransformed().withVisibility(visibility = true),
|
||||
),
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(twitch),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("zubat", "air_idle")
|
||||
)
|
||||
)
|
||||
|
||||
fly = registerPose(
|
||||
poseName = "fly",
|
||||
poseType = PoseType.FLY,
|
||||
transformedParts = arrayOf(
|
||||
wings_folded.asTransformed().withVisibility(visibility = false),
|
||||
wings_open.asTransformed().withVisibility(visibility = true),
|
||||
),
|
||||
quirks = arrayOf(twitch),
|
||||
transformTicks = 10,
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("zubat", "air_fly")
|
||||
)
|
||||
)
|
||||
|
||||
shoulderLeft = registerPose(
|
||||
registerPose(
|
||||
poseType = PoseType.SHOULDER_LEFT,
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("zubat", "shoulder_left")
|
||||
leftWing.rotation(
|
||||
function = sineFunction(
|
||||
amplitude = PI / 3,
|
||||
period = 1F
|
||||
),
|
||||
axis = Z_AXIS,
|
||||
timeVariable = { _, _, ageInTicks -> ageInTicks / 20 },
|
||||
)
|
||||
),
|
||||
transformedParts = arrayOf(
|
||||
rootPart.asTransformed().addPosition(TransformedModelPart.X_AXIS, shoulderOffset)
|
||||
rootPart.asTransformed().addRotation(X_AXIS, PI / 9).addPosition(Y_AXIS, 4F).addPosition(Z_AXIS, 3F),
|
||||
leftWing.asTransformed().addRotation(X_AXIS, PI / 3),
|
||||
rightWing.asTransformed().addRotation(X_AXIS, PI / 3).addRotation(Z_AXIS, -PI / 2)
|
||||
)
|
||||
)
|
||||
|
||||
shoulderRight = registerPose(
|
||||
registerPose(
|
||||
poseType = PoseType.SHOULDER_RIGHT,
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("zubat", "shoulder_right")
|
||||
rightWing.rotation(
|
||||
function = sineFunction(
|
||||
amplitude = PI / 3,
|
||||
period = 1F
|
||||
),
|
||||
axis = Z_AXIS,
|
||||
timeVariable = { _, _, ageInTicks -> ageInTicks / 20 },
|
||||
)
|
||||
),
|
||||
transformedParts = arrayOf(
|
||||
rootPart.asTransformed().addPosition(TransformedModelPart.X_AXIS, -shoulderOffset)
|
||||
rootPart.asTransformed().addRotation(X_AXIS, PI / 9).addPosition(Y_AXIS, 4F).addPosition(Z_AXIS, 3F),
|
||||
leftWing.asTransformed().addRotation(X_AXIS, PI / 3).addRotation(Z_AXIS, PI / 2),
|
||||
rightWing.asTransformed().addRotation(X_AXIS, PI / 3)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PoseableEntityState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("zubat", "faint") else null
|
||||
}
|
||||
+21
-36
@@ -10,7 +10,6 @@ package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WingFlapIdleAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BiWingedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart
|
||||
@@ -20,37 +19,26 @@ import com.cobblemon.mod.common.util.math.geometry.toRadians
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class CrobatModel(root: ModelPart) : PokemonPoseableModel() {
|
||||
class CrobatModel(root: ModelPart) : PokemonPoseableModel(), BiWingedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("crobat")
|
||||
override val leftWing = getPart("leftwings")
|
||||
override val rightWing = getPart("rightwings")
|
||||
|
||||
override val portraitScale = 1.2F
|
||||
override val portraitTranslation = Vec3d(-0.1, 1.8, 0.0)
|
||||
override val portraitScale = 1.8F
|
||||
override val portraitTranslation = Vec3d(-0.11, -0.77, 0.0)
|
||||
|
||||
override val profileScale = 0.5F
|
||||
override val profileTranslation = Vec3d(0.0, 1.2, 0.0)
|
||||
override val profileScale = 0.9F
|
||||
override val profileTranslation = Vec3d(0.0, 0.35, 0.0)
|
||||
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
lateinit var hover: PokemonPose
|
||||
lateinit var fly: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("crobat", "cry").setPreventsIdle(false) }
|
||||
lateinit var walk: PokemonPose
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("crobat", "blink").setPreventsIdle(false) }
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
idleAnimations = arrayOf(bedrock("crobat", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES - PoseType.HOVER,
|
||||
condition = { !it.isBattling },
|
||||
transformTicks = 10,
|
||||
poseType = PoseType.STAND,
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("crobat", "ground_idle")
|
||||
)
|
||||
@@ -69,9 +57,13 @@ class CrobatModel(root: ModelPart) : PokemonPoseableModel() {
|
||||
poseName = "hover",
|
||||
poseType = PoseType.HOVER,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("crobat", "air_idle")
|
||||
bedrock("crobat", "ground_idle"),
|
||||
WingFlapIdleAnimation(this,
|
||||
flapFunction = sineFunction(verticalShift = -10F.toRadians(), period = 0.9F, amplitude = 0.6F),
|
||||
timeVariable = { state, _, _ -> state?.animationSeconds ?: 0F },
|
||||
axis = TransformedModelPart.Y_AXIS
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -79,20 +71,13 @@ class CrobatModel(root: ModelPart) : PokemonPoseableModel() {
|
||||
poseName = "fly",
|
||||
poseType = PoseType.FLY,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("crobat", "air_fly")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("crobat", "battle_idle")
|
||||
bedrock("crobat", "ground_walk"),
|
||||
WingFlapIdleAnimation(this,
|
||||
flapFunction = sineFunction(verticalShift = -14F.toRadians(), period = 0.9F, amplitude = 0.9F),
|
||||
timeVariable = { state, _, _ -> state?.animationSeconds ?: 0F },
|
||||
axis = TransformedModelPart.Y_AXIS
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
+17
-38
@@ -8,53 +8,42 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PoseableEntityState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BimanualSwingAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.asTransformed
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart
|
||||
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 com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class HitmontopModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
class HitmontopModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, BipedFrame, BimanualFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("hitmontop")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val leftArm = getPart("arm_left")
|
||||
override val rightArm = getPart("arm_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
|
||||
override val portraitScale = 2.6F
|
||||
override val portraitTranslation = Vec3d(-0.26, -0.5, 0.0)
|
||||
|
||||
override val profileScale = 0.91F
|
||||
override val profileTranslation = Vec3d(0.0, 0.4, 0.0)
|
||||
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
// override val cryAnimation = CryProvider { _, _ -> bedrockStateful("hitmontop", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("hitmontop", "blink").setPreventsIdle(false) }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
idleAnimations = arrayOf(bedrock("hitmontop", "sleep"))
|
||||
)
|
||||
|
||||
val blink = quirk("blink") { bedrockStateful("hitmontop", "blink").setPreventsIdle(false)}
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
transformTicks = 10,
|
||||
condition = { !it.isBattling },
|
||||
poseTypes = STATIONARY_POSES + UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
@@ -64,29 +53,19 @@ class HitmontopModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
poseTypes = MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("hitmontop", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("hitmontop", "battle_idle")
|
||||
bedrock("hitmontop", "ground_idle"),
|
||||
BipedWalkAnimation(this, periodMultiplier = 0.6F, amplitudeMultiplier = 0.9F),
|
||||
BimanualSwingAnimation(this, swingPeriodMultiplier = 0.6F, amplitudeMultiplier = 0.9F)
|
||||
)
|
||||
)
|
||||
}
|
||||
override fun getFaintAnimation(
|
||||
pokemonEntity: PokemonEntity,
|
||||
state: PoseableEntityState<PokemonEntity>
|
||||
) = bedrockStateful("hitmontop", "faint")
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PoseableEntityState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("hitmontop", "faint") else null
|
||||
}
|
||||
+17
-70
@@ -8,59 +8,42 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PoseableEntityState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BimanualSwingAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.asTransformed
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart
|
||||
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 com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class TyrogueModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
class TyrogueModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, BipedFrame, BimanualFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("tyrogue")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val leftArm = getPart("arm_left")
|
||||
override val rightArm = getPart("arm_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
|
||||
override val portraitScale = 2.56F
|
||||
override val portraitTranslation = Vec3d(-0.24, 0.1, 0.0)
|
||||
|
||||
override val profileScale = 0.73F
|
||||
override val profileTranslation = Vec3d(-0.03, 0.7, 0.0)
|
||||
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
lateinit var shoulderLeft: PokemonPose
|
||||
lateinit var shoulderRight: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
val shoulderOffset = 3
|
||||
|
||||
// override val cryAnimation = CryProvider { _, _ -> bedrockStateful("tyrogue", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("tyrogue", "blink").setPreventsIdle(false) }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
idleAnimations = arrayOf(bedrock("tyrogue", "sleep"))
|
||||
)
|
||||
|
||||
val blink = quirk("blink") { bedrockStateful("tyrogue", "blink").setPreventsIdle(false)}
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
transformTicks = 10,
|
||||
condition = { !it.isBattling },
|
||||
poseTypes = STATIONARY_POSES + UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
@@ -70,55 +53,19 @@ class TyrogueModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
poseTypes = MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("tyrogue", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("tyrogue", "battle_idle")
|
||||
)
|
||||
)
|
||||
|
||||
shoulderLeft = registerPose(
|
||||
poseType = PoseType.SHOULDER_LEFT,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { !it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("tyrogue", "shoulder_left")
|
||||
),
|
||||
transformedParts = arrayOf(
|
||||
rootPart.asTransformed().addPosition(TransformedModelPart.X_AXIS, shoulderOffset)
|
||||
)
|
||||
)
|
||||
|
||||
shoulderRight = registerPose(
|
||||
poseType = PoseType.SHOULDER_RIGHT,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { !it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("tyrogue", "shoulder_right")
|
||||
),
|
||||
transformedParts = arrayOf(
|
||||
rootPart.asTransformed().addPosition(TransformedModelPart.X_AXIS, -shoulderOffset)
|
||||
bedrock("tyrogue", "ground_idle"),
|
||||
BipedWalkAnimation(this, periodMultiplier = 0.6F, amplitudeMultiplier = 0.9F),
|
||||
BimanualSwingAnimation(this, swingPeriodMultiplier = 0.6F, amplitudeMultiplier = 0.9F)
|
||||
)
|
||||
)
|
||||
}
|
||||
override fun getFaintAnimation(
|
||||
pokemonEntity: PokemonEntity,
|
||||
state: PoseableEntityState<PokemonEntity>
|
||||
) = if (state.isPosedIn(standing, walk, battleidle, sleep)) bedrockStateful("tyrogue", "faint") else null
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PoseableEntityState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("tyrogue", "faint") else null
|
||||
}
|
||||
-3
@@ -13,7 +13,6 @@ import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedW
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
@@ -36,8 +35,6 @@ class BeldumModel (root: ModelPart) : PokemonPoseableModel() {
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("beldum", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("beldum", "blink").setPreventsIdle(false)}
|
||||
val quirk = quirk("quirk") { bedrockStateful("beldum", "quirk_spin").setPreventsIdle(false)}
|
||||
|
||||
-3
@@ -8,7 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen3
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
@@ -31,8 +30,6 @@ class MetagrossModel (root: ModelPart) : PokemonPoseableModel() {
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("metagross", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("metagross", "blink").setPreventsIdle(false)}
|
||||
|
||||
|
||||
-3
@@ -8,7 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen3
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
@@ -31,8 +30,6 @@ class MetangModel (root: ModelPart) : PokemonPoseableModel() {
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("metang", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("metang", "blink").setPreventsIdle(false)}
|
||||
|
||||
|
||||
+17
-40
@@ -8,87 +8,64 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen3
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PoseableEntityState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
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 com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class MightyenaModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
class MightyenaModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, QuadrupedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("mightyena")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val hindLeftLeg = getPart("leg_left")
|
||||
override val hindRightLeg = getPart("leg_right")
|
||||
override val foreLeftLeg = getPart("arm_left")
|
||||
override val foreRightLeg = getPart("arm_right")
|
||||
|
||||
override val portraitScale = 2.2F
|
||||
override val portraitTranslation = Vec3d(-0.8, 0.6, 0.0)
|
||||
|
||||
override val profileScale = 0.6F
|
||||
override val profileTranslation = Vec3d(0.0, 0.8, 0.0)
|
||||
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("mightyena", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("mightyena", "blink").setPreventsIdle(false) }
|
||||
val laugh_out_battle = quirk("laugh_out_battle", secondsBetweenOccurrences = 120F to 240F) { bedrockStateful("mightyena", "quirk").setPreventsIdle(false) }
|
||||
val laugh_in_battle = quirk("laugh_in_battle", secondsBetweenOccurrences = 30F to 60F) { bedrockStateful("mightyena", "quirk").setPreventsIdle(false) }
|
||||
val sleep_quirk = quirk("sleep_quirk", secondsBetweenOccurrences = 30F to 60F) { bedrockStateful("mightyena", "sleep_quirk").setPreventsIdle(false) }
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
quirks = arrayOf(sleep_quirk),
|
||||
idleAnimations = arrayOf(bedrock("mightyena", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
transformTicks = 10,
|
||||
condition = { !it.isBattling },
|
||||
quirks = arrayOf(blink,laugh_out_battle),
|
||||
poseTypes = UI_POSES + STATIONARY_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("mightyena", "ground_idle")
|
||||
bedrock("mightyena","ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
poseTypes = MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("mightyena", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink,laugh_in_battle),
|
||||
condition = { it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("mightyena", "battle_idle")
|
||||
QuadrupedWalkAnimation(this, periodMultiplier = 0.8F, amplitudeMultiplier = 0.8F),
|
||||
bedrock("mightyena","ground_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
override fun getFaintAnimation(
|
||||
pokemonEntity: PokemonEntity,
|
||||
state: PoseableEntityState<PokemonEntity>
|
||||
) = bedrockStateful("mightyena", "faint")
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PoseableEntityState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("mightyena", "faint") else null
|
||||
}
|
||||
+1
-1
@@ -49,7 +49,7 @@ class ShroomishModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bip
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES + UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { !it.isBattling },
|
||||
condition = { it.isBattling },
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("shroomish", "ground_idle")
|
||||
|
||||
+2
@@ -68,6 +68,7 @@ class VolbeatModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bipe
|
||||
poseTypes = setOf(PoseType.HOVER, PoseType.FLOAT),
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isTouchingWater },
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("volbeat", "air_idle")
|
||||
@@ -79,6 +80,7 @@ class VolbeatModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bipe
|
||||
poseTypes = setOf(PoseType.FLY, PoseType.SWIM),
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isTouchingWater },
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("volbeat", "air_fly")
|
||||
|
||||
-36
@@ -8,16 +8,12 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen4
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PoseableEntityState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.asTransformed
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.TransformedModelPart
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
@@ -38,10 +34,6 @@ class TurtwigModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Quad
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
lateinit var shoulderLeft: PokemonPose
|
||||
lateinit var shoulderRight: PokemonPose
|
||||
|
||||
val shoulderOffset = 3
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("turtwig", "cry").setPreventsIdle(false) }
|
||||
|
||||
@@ -73,33 +65,5 @@ class TurtwigModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Quad
|
||||
bedrock("turtwig", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
shoulderLeft = registerPose(
|
||||
poseType = PoseType.SHOULDER_LEFT,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("turtwig", "shoulder_left")
|
||||
),
|
||||
transformedParts = arrayOf(
|
||||
rootPart.asTransformed().addPosition(TransformedModelPart.X_AXIS, shoulderOffset)
|
||||
)
|
||||
)
|
||||
|
||||
shoulderRight = registerPose(
|
||||
poseType = PoseType.SHOULDER_RIGHT,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("turtwig", "shoulder_right")
|
||||
),
|
||||
transformedParts = arrayOf(
|
||||
rootPart.asTransformed().addPosition(TransformedModelPart.X_AXIS, -shoulderOffset)
|
||||
)
|
||||
)
|
||||
}
|
||||
override fun getFaintAnimation(
|
||||
pokemonEntity: PokemonEntity,
|
||||
state: PoseableEntityState<PokemonEntity>
|
||||
) = bedrockStateful("turtwig", "faint")
|
||||
}
|
||||
-57
@@ -1,57 +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.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class ChandelureModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("chandelure")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val portraitScale = 2.0F
|
||||
override val portraitTranslation = Vec3d(-0.3, -1.2, 0.0)
|
||||
|
||||
override val profileScale = 0.8F
|
||||
override val profileTranslation = Vec3d(0.0, 0.5, 0.0)
|
||||
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
|
||||
override fun registerPoses() {
|
||||
// val blink = quirk("blink") { bedrockStateful("chandelure", "blink").setPreventsIdle(false) }
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
// quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("chandelure", "idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
// quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("chandelure", "idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PoseableEntityState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("chandelure", "faint") else null
|
||||
}
|
||||
-57
@@ -1,57 +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.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class LampentModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("lampent")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val portraitScale = 2.0F
|
||||
override val portraitTranslation = Vec3d(-0.3, -1.2, 0.0)
|
||||
|
||||
override val profileScale = 0.8F
|
||||
override val profileTranslation = Vec3d(0.0, 0.5, 0.0)
|
||||
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("lampent", "blink").setPreventsIdle(false) }
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("lampent", "idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("lampent", "idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PoseableEntityState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("lampent", "faint") else null
|
||||
}
|
||||
-57
@@ -1,57 +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.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.util.math.Vec3d
|
||||
|
||||
class LitwickModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("litwick")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val portraitScale = 2.0F
|
||||
override val portraitTranslation = Vec3d(-0.3, -1.2, 0.0)
|
||||
|
||||
override val profileScale = 0.8F
|
||||
override val profileTranslation = Vec3d(0.0, 0.5, 0.0)
|
||||
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("litwick", "blink").setPreventsIdle(false) }
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("litwick", "idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("litwick", "idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PoseableEntityState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("litwick", "faint") else null
|
||||
}
|
||||
+2
-3
@@ -41,10 +41,9 @@ class TrevenantModel (root: ModelPart) : PokemonPoseableModel() {
|
||||
poseType = PoseType.SLEEP,
|
||||
idleAnimations = arrayOf(bedrock("trevenant", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "stand",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
poseTypes = PoseType.STATIONARY_POSES - PoseType.HOVER - PoseType.FLOAT + PoseType.UI_POSES,
|
||||
condition = { !it.isBattling },
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
@@ -54,7 +53,7 @@ class TrevenantModel (root: ModelPart) : PokemonPoseableModel() {
|
||||
)
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
poseTypes = PoseType.MOVING_POSES - PoseType.FLY - PoseType.SWIM,
|
||||
transformTicks = 5,
|
||||
quirks = arrayOf(blink),
|
||||
idleAnimations = arrayOf(
|
||||
|
||||
+1
@@ -25,6 +25,7 @@ class KomalaModel (root: ModelPart) : PokemonPoseableModel() {
|
||||
override val profileScale = 0.8F
|
||||
override val profileTranslation = Vec3d(0.0, 0.5, 0.0)
|
||||
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var standing: PokemonPose
|
||||
|
||||
// override val cryAnimation = CryProvider { _, _ -> bedrockStateful("komala", "cry").setPreventsIdle(false) }
|
||||
|
||||
+1
-1
@@ -62,5 +62,5 @@ class EiscueModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
override fun getFaintAnimation(
|
||||
pokemonEntity: PokemonEntity,
|
||||
state: PoseableEntityState<PokemonEntity>
|
||||
) = bedrockStateful("eiscue_ice", "faint")
|
||||
) = if (state.isPosedIn(standing, walk, sleep)) bedrockStateful("eiscue_ice", "faint") else null
|
||||
}
|
||||
-3
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedW
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
@@ -38,8 +37,6 @@ class QuaxwellModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
lateinit var sleep: PokemonPose
|
||||
lateinit var battleidle: PokemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("quaxwell", "cry").setPreventsIdle(false) }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk("blink") { bedrockStateful("quaxwell", "blink").setPreventsIdle(false) }
|
||||
sleep = registerPose(
|
||||
|
||||
+1
@@ -47,6 +47,7 @@ class SquawkabillyModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame,
|
||||
lateinit var flying: PokemonPose
|
||||
lateinit var shoulderLeft: PokemonPose
|
||||
lateinit var shoulderRight: PokemonPose
|
||||
lateinit var sleep: PokemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("squawkabilly", "cry").setPreventsIdle(false) }
|
||||
|
||||
|
||||
+12
-11
@@ -31,7 +31,7 @@ class TandemausModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
|
||||
lateinit var standing: PokemonPose
|
||||
lateinit var walk: PokemonPose
|
||||
// lateinit var sleep: PokemonPose
|
||||
lateinit var sleep: PokemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { _, _ -> bedrockStateful("tandemaus", "cry").setPreventsIdle(false) }
|
||||
|
||||
@@ -69,18 +69,19 @@ class TandemausModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
|
||||
)
|
||||
)
|
||||
|
||||
// sleep = registerPose(
|
||||
// poseName = "sleep",
|
||||
// poseType = PoseType.SLEEP,
|
||||
// transformTicks = 10,
|
||||
// quirks = arrayOf(blink1, blink2),
|
||||
// idleAnimations = arrayOf(
|
||||
// bedrock("tandemaus", "sleep")
|
||||
// )
|
||||
// )
|
||||
sleep = registerPose(
|
||||
poseName = "sleep",
|
||||
poseType = PoseType.SLEEP,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink1, blink2),
|
||||
idleAnimations = arrayOf(
|
||||
bedrock("tandemaus", "ground_idle")
|
||||
//bedrock("tandemaus", "sleep")
|
||||
)
|
||||
)
|
||||
}
|
||||
override fun getFaintAnimation(
|
||||
pokemonEntity: PokemonEntity,
|
||||
state: PoseableEntityState<PokemonEntity>
|
||||
) = bedrockStateful("tandemaus", "faint")
|
||||
) = if (state.isNotPosedIn(sleep)) bedrockStateful("tandemaus", "faint") else null
|
||||
}
|
||||
-3
@@ -586,9 +586,6 @@ object PokemonModelRepository : VaryingModelRepository<PokemonEntity, PokemonPos
|
||||
inbuilt("clodsire", ::ClodsireModel)
|
||||
inbuilt("teddiursa", ::TeddiursaModel)
|
||||
inbuilt("ursaring", ::UrsaringModel)
|
||||
inbuilt("litwick", ::LitwickModel)
|
||||
inbuilt("lampent", ::LampentModel)
|
||||
inbuilt("chandelure", ::ChandelureModel)
|
||||
}
|
||||
|
||||
override fun loadJsonPoser(json: String): (Bone) -> PokemonPoseableModel {
|
||||
|
||||
@@ -131,9 +131,6 @@ class CobblemonConfig {
|
||||
@NodeCategory(category = Category.Battles)
|
||||
var luckyEggMultiplier = 1.5
|
||||
|
||||
@NodeCategory(category = Category.Battles)
|
||||
var allowSpectating = true
|
||||
|
||||
@NodeCategory(category = Category.Pokemon)
|
||||
var experienceMultiplier = 2F
|
||||
|
||||
@@ -208,6 +205,10 @@ class CobblemonConfig {
|
||||
@NodeCategory(Category.Spawning)
|
||||
var teraTypeRate = 20F
|
||||
|
||||
@NodeCategory(Category.Pokemon)
|
||||
@LastChangedVersion("1.4.0")
|
||||
var consumeHeldItems = true
|
||||
|
||||
@NodeCategory(Category.World)
|
||||
var defaultPasturedPokemonLimit = 16
|
||||
|
||||
|
||||
@@ -1,137 +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.entity.boat
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonEntities
|
||||
import com.cobblemon.mod.common.mixin.accessor.BoatEntityAccessor
|
||||
import net.minecraft.block.Block
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.block.WoodType
|
||||
import net.minecraft.entity.EntityType
|
||||
import net.minecraft.entity.data.DataTracker
|
||||
import net.minecraft.entity.data.TrackedDataHandlerRegistry
|
||||
import net.minecraft.entity.vehicle.BoatEntity
|
||||
import net.minecraft.item.Item
|
||||
import net.minecraft.item.Items
|
||||
import net.minecraft.nbt.NbtCompound
|
||||
import net.minecraft.nbt.NbtElement
|
||||
import net.minecraft.nbt.NbtString
|
||||
import net.minecraft.network.listener.ClientPlayPacketListener
|
||||
import net.minecraft.network.packet.Packet
|
||||
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket
|
||||
import net.minecraft.registry.tag.FluidTags
|
||||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.math.BlockPos
|
||||
import net.minecraft.world.GameRules
|
||||
import net.minecraft.world.World
|
||||
|
||||
@Suppress("unused")
|
||||
open class CobblemonBoatEntity(entityType: EntityType<out BoatEntity>, world: World) : BoatEntity(entityType, world) {
|
||||
|
||||
constructor(world: World) : this(CobblemonEntities.BOAT, world)
|
||||
|
||||
// This exists cause super passes in vanilla boat entity type
|
||||
constructor(world: World, x: Double, y: Double, z: Double) : this(CobblemonEntities.BOAT, world) {
|
||||
this.setPosition(x, y, z)
|
||||
this.prevX = x
|
||||
this.prevY = y
|
||||
this.prevZ = z
|
||||
}
|
||||
|
||||
/**
|
||||
* The [CobblemonBoatType] of this boat.
|
||||
*/
|
||||
var boatType: CobblemonBoatType
|
||||
get() = CobblemonBoatType.ofOrdinal(this.dataTracker.get(TYPE_TRACKED_DATA))
|
||||
set(value) {
|
||||
this.dataTracker.set(TYPE_TRACKED_DATA, value.ordinal)
|
||||
}
|
||||
|
||||
/**
|
||||
* The [WoodType] that represents this boat.
|
||||
*/
|
||||
val woodType: WoodType get() = this.boatType.woodType
|
||||
|
||||
/**
|
||||
* The [Block] that represents the base material for this boat.
|
||||
*/
|
||||
val baseBlock: Block get() = this.boatType.baseBlock
|
||||
|
||||
override fun asItem(): Item = this.boatType.boatItem
|
||||
|
||||
override fun createSpawnPacket(): Packet<ClientPlayPacketListener> = EntitySpawnS2CPacket(this)
|
||||
|
||||
override fun initDataTracker() {
|
||||
super.initDataTracker()
|
||||
this.dataTracker.startTracking(TYPE_TRACKED_DATA, CobblemonBoatType.APRICORN.ordinal)
|
||||
}
|
||||
|
||||
override fun getDefaultName(): Text = EntityType.BOAT.name
|
||||
|
||||
override fun readCustomDataFromNbt(nbt: NbtCompound) {
|
||||
if (nbt.contains(TYPE_KEY, NbtElement.STRING_TYPE.toInt())) {
|
||||
this.boatType = CobblemonBoatType.valueOf(nbt.getString(TYPE_KEY))
|
||||
}
|
||||
}
|
||||
|
||||
override fun writeCustomDataToNbt(nbt: NbtCompound) {
|
||||
nbt.put(TYPE_KEY, NbtString.of(this.boatType.name))
|
||||
}
|
||||
|
||||
override fun setVariant(type: Type) {
|
||||
throw UnsupportedOperationException("The vanilla boat type is not present in the Cobblemon implementation use the type property")
|
||||
}
|
||||
|
||||
override fun getVariant(): Type {
|
||||
throw UnsupportedOperationException("The vanilla boat type is not present in the Cobblemon implementation use the type property")
|
||||
}
|
||||
|
||||
override fun getMountedHeightOffset(): Double = this.boatType.mountedOffset
|
||||
|
||||
override fun fall(heightDifference: Double, onGround: Boolean, state: BlockState, landedPosition: BlockPos) {
|
||||
val accessor = this.accessor()
|
||||
accessor.setFallVelocity(this.velocity.y)
|
||||
if (!this.hasVehicle()) {
|
||||
return
|
||||
}
|
||||
if (!this.world.getFluidState(this.blockPos.down()).isIn(FluidTags.WATER) && heightDifference < 0.0) {
|
||||
this.fallDistance -= heightDifference.toFloat()
|
||||
}
|
||||
if (!onGround) {
|
||||
return
|
||||
}
|
||||
if (this.fallDistance < 3F || accessor.location != Location.ON_LAND) {
|
||||
this.onLanding()
|
||||
return
|
||||
}
|
||||
this.handleFallDamage(this.fallDistance, 1F, this.damageSources.fall())
|
||||
if (this.world.isClient || this.isRemoved) {
|
||||
return
|
||||
}
|
||||
this.kill()
|
||||
if (this.world.gameRules.getBoolean(GameRules.DO_ENTITY_DROPS)) {
|
||||
repeat(3) {
|
||||
this.dropItem(this.boatType.baseBlock)
|
||||
}
|
||||
repeat(2) {
|
||||
this.dropItem(Items.STICK)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected fun accessor(): BoatEntityAccessor = this as BoatEntityAccessor
|
||||
|
||||
companion object {
|
||||
|
||||
private const val TYPE_KEY = "type"
|
||||
private val TYPE_TRACKED_DATA = DataTracker.registerData(CobblemonBoatEntity::class.java, TrackedDataHandlerRegistry.INTEGER)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,62 +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.entity.boat
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlocks
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import net.minecraft.block.Block
|
||||
import net.minecraft.block.WoodType
|
||||
import net.minecraft.item.Item
|
||||
import net.minecraft.util.StringIdentifiable
|
||||
|
||||
/**
|
||||
* Represents the various wooden boats in Cobblemon.
|
||||
*
|
||||
*/
|
||||
enum class CobblemonBoatType(val mountedOffset: Double) : StringIdentifiable {
|
||||
|
||||
APRICORN(-0.1);
|
||||
|
||||
/**
|
||||
* The base [Item] form of this [CobblemonBoatType].
|
||||
*/
|
||||
val boatItem: Item get() = when (this) {
|
||||
APRICORN -> CobblemonItems.APRICORN_BOAT
|
||||
}
|
||||
|
||||
/**
|
||||
* The base [Item] form of this [CobblemonBoatType] with a chest.
|
||||
*/
|
||||
val chestBoatItem: Item get() = when (this) {
|
||||
APRICORN -> CobblemonItems.APRICORN_CHEST_BOAT
|
||||
}
|
||||
|
||||
/**
|
||||
* The base [Block] form of this [CobblemonBoatType].
|
||||
*/
|
||||
val baseBlock: Block get() = when (this) {
|
||||
APRICORN -> CobblemonBlocks.APRICORN_PLANKS
|
||||
}
|
||||
|
||||
/**
|
||||
* The [WoodType] form of this [CobblemonBoatType].
|
||||
*/
|
||||
val woodType: WoodType get() = when (this) {
|
||||
APRICORN -> CobblemonBlocks.APRICORN_WOOD_TYPE
|
||||
}
|
||||
|
||||
override fun asString(): String = this.name.lowercase()
|
||||
|
||||
companion object {
|
||||
|
||||
internal fun ofOrdinal(ordinal: Int) = CobblemonBoatType.values()[ordinal]
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
-104
@@ -1,104 +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.entity.boat
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonEntities
|
||||
import net.minecraft.entity.EntityType
|
||||
import net.minecraft.entity.RideableInventory
|
||||
import net.minecraft.entity.mob.PiglinBrain
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.entity.player.PlayerInventory
|
||||
import net.minecraft.entity.vehicle.VehicleInventory
|
||||
import net.minecraft.item.Item
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.screen.GenericContainerScreenHandler
|
||||
import net.minecraft.screen.ScreenHandler
|
||||
import net.minecraft.util.Identifier
|
||||
import net.minecraft.util.collection.DefaultedList
|
||||
import net.minecraft.world.World
|
||||
import net.minecraft.world.event.GameEvent
|
||||
|
||||
@Suppress("unused")
|
||||
class CobblemonChestBoatEntity(entityType: EntityType<CobblemonChestBoatEntity>, world: World) : CobblemonBoatEntity(entityType, world), RideableInventory, VehicleInventory {
|
||||
|
||||
constructor(world: World) : this(CobblemonEntities.CHEST_BOAT, world)
|
||||
|
||||
// This exists cause super passes in vanilla boat entity type
|
||||
constructor(world: World, x: Double, y: Double, z: Double) : this(CobblemonEntities.CHEST_BOAT, world) {
|
||||
this.setPosition(x, y, z)
|
||||
this.prevX = x
|
||||
this.prevY = y
|
||||
this.prevZ = z
|
||||
}
|
||||
|
||||
private var inventory = this.emptyInventory()
|
||||
private var lootTableId: Identifier? = null
|
||||
private var lootTableSeed = 0L
|
||||
|
||||
override fun openInventory(player: PlayerEntity) {
|
||||
player.openHandledScreen(this)
|
||||
if (!player.world.isClient) {
|
||||
this.emitGameEvent(GameEvent.CONTAINER_OPEN, player)
|
||||
PiglinBrain.onGuardedBlockInteracted(player, true)
|
||||
}
|
||||
}
|
||||
|
||||
override fun clear() = this.clearInventory()
|
||||
|
||||
override fun size(): Int = INVENTORY_SLOTS
|
||||
|
||||
override fun getStack(slot: Int): ItemStack = this.getInventoryStack(slot)
|
||||
|
||||
override fun removeStack(slot: Int, amount: Int): ItemStack = this.removeInventoryStack(slot, amount)
|
||||
|
||||
override fun removeStack(slot: Int): ItemStack = this.removeInventoryStack(slot)
|
||||
|
||||
override fun setStack(slot: Int, stack: ItemStack) = this.setInventoryStack(slot, stack)
|
||||
|
||||
override fun markDirty() {}
|
||||
|
||||
override fun canPlayerUse(player: PlayerEntity): Boolean = this.canPlayerAccess(player)
|
||||
|
||||
override fun createMenu(syncId: Int, playerInventory: PlayerInventory, player: PlayerEntity): ScreenHandler? {
|
||||
if (this.lootTableId != null && player.isSpectator) {
|
||||
return null
|
||||
}
|
||||
this.generateInventoryLoot(playerInventory.player)
|
||||
return GenericContainerScreenHandler.createGeneric9x3(syncId, playerInventory, this)
|
||||
}
|
||||
|
||||
override fun getLootTableId(): Identifier? = this.lootTableId
|
||||
|
||||
override fun setLootTableId(lootTableId: Identifier?) {
|
||||
this.lootTableId = lootTableId
|
||||
}
|
||||
|
||||
override fun getLootTableSeed(): Long = this.lootTableSeed
|
||||
|
||||
override fun setLootTableSeed(lootTableSeed: Long) {
|
||||
this.lootTableSeed = lootTableSeed
|
||||
}
|
||||
|
||||
override fun getInventory(): DefaultedList<ItemStack> = this.inventory
|
||||
|
||||
override fun resetInventory() {
|
||||
this.inventory = this.emptyInventory()
|
||||
}
|
||||
|
||||
override fun asItem(): Item = this.boatType.chestBoatItem
|
||||
|
||||
private fun emptyInventory(): DefaultedList<ItemStack> = DefaultedList.ofSize(INVENTORY_SLOTS, ItemStack.EMPTY)
|
||||
|
||||
companion object {
|
||||
|
||||
private const val INVENTORY_SLOTS = 27
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -342,12 +342,8 @@ class PokemonEntity(
|
||||
owner.getWorld().playSoundServer(pos, CobblemonSounds.POKE_BALL_RECALL, volume = 0.6F)
|
||||
phasingTargetId.set(owner.id)
|
||||
beamModeEmitter.set(2)
|
||||
val state = pokemon.state;
|
||||
afterOnMain(seconds = SEND_OUT_DURATION) {
|
||||
// only recall if the pokemon hasn't been recalled yet for this state
|
||||
if (state == pokemon.state) {
|
||||
pokemon.recall()
|
||||
}
|
||||
pokemon.recall()
|
||||
future.complete(pokemon)
|
||||
}
|
||||
} else {
|
||||
@@ -556,13 +552,6 @@ class PokemonEntity(
|
||||
player.setStackInHand(hand, milkBucket)
|
||||
return ActionResult.success(world.isClient)
|
||||
}
|
||||
} else if (itemStack.isOf(Items.BOWL)) {
|
||||
if (pokemon.getFeature<FlagSpeciesFeature>(DataKeys.IS_MOOSHTANK) != null) {
|
||||
player.playSound(SoundEvents.ENTITY_MOOSHROOM_MILK, 1.0f, 1.0f)
|
||||
val mushroomStew = ItemUsage.exchangeStack(itemStack, player, Items.MUSHROOM_STEW.defaultStack)
|
||||
player.setStackInHand(hand, mushroomStew)
|
||||
return ActionResult.success(world.isClient)
|
||||
}
|
||||
}
|
||||
|
||||
if (hand == Hand.MAIN_HAND && player is ServerPlayerEntity && pokemon.getOwnerPlayer() == player) {
|
||||
|
||||
@@ -1,75 +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.item
|
||||
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatEntity
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonBoatType
|
||||
import com.cobblemon.mod.common.entity.boat.CobblemonChestBoatEntity
|
||||
import net.minecraft.entity.Entity
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.predicate.entity.EntityPredicates
|
||||
import net.minecraft.stat.Stats
|
||||
import net.minecraft.util.Hand
|
||||
import net.minecraft.util.TypedActionResult
|
||||
import net.minecraft.util.hit.HitResult
|
||||
import net.minecraft.world.RaycastContext.FluidHandling
|
||||
import net.minecraft.world.World
|
||||
import net.minecraft.world.event.GameEvent
|
||||
|
||||
class CobblemonBoatItem(val boatType: CobblemonBoatType, val hasChest: Boolean, settings: Settings) : CobblemonItem(settings) {
|
||||
|
||||
override fun use(world: World, user: PlayerEntity, hand: Hand): TypedActionResult<ItemStack> {
|
||||
val stack = user.getStackInHand(hand)
|
||||
val hitResult = raycast(world, user, FluidHandling.ANY)
|
||||
if (hitResult.type == HitResult.Type.MISS) {
|
||||
return TypedActionResult.pass(stack)
|
||||
}
|
||||
val vec3d = user.getRotationVec(1F)
|
||||
val eyePos = user.eyePos
|
||||
world.getOtherEntities(user, user.boundingBox.stretch(vec3d.multiply(5.0)).expand(1.0), RIDERS).forEach { entity ->
|
||||
val box = entity.boundingBox.expand(entity.targetingMargin.toDouble())
|
||||
if (box.contains(eyePos)) {
|
||||
return TypedActionResult.pass(stack)
|
||||
}
|
||||
}
|
||||
if (hitResult.type != HitResult.Type.BLOCK) {
|
||||
return TypedActionResult.pass(stack)
|
||||
}
|
||||
val boatEntity = this.createBoat(world, hitResult)
|
||||
boatEntity.boatType = this.boatType
|
||||
boatEntity.yaw = user.yaw
|
||||
if (!world.isSpaceEmpty(boatEntity, boatEntity.boundingBox)) {
|
||||
return TypedActionResult.fail(stack)
|
||||
}
|
||||
if (!world.isClient) {
|
||||
world.spawnEntity(boatEntity)
|
||||
world.emitGameEvent(user, GameEvent.ENTITY_PLACE, hitResult.pos)
|
||||
if (!user.abilities.creativeMode) {
|
||||
stack.decrement(1)
|
||||
}
|
||||
}
|
||||
user.incrementStat(Stats.USED.getOrCreateStat(this))
|
||||
return TypedActionResult.success(stack, world.isClient)
|
||||
}
|
||||
|
||||
private fun createBoat(world: World, hitResult: HitResult): CobblemonBoatEntity {
|
||||
if (this.hasChest) {
|
||||
return CobblemonChestBoatEntity(world, hitResult.pos.x, hitResult.pos.y, hitResult.pos.z)
|
||||
}
|
||||
return CobblemonBoatEntity(world, hitResult.pos.x, hitResult.pos.y, hitResult.pos.z)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private val RIDERS = EntityPredicates.EXCEPT_SPECTATOR.and(Entity::canHit)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+30
-120
@@ -10,11 +10,10 @@ package com.cobblemon.mod.common.item.group
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.item.ItemConvertible
|
||||
import net.minecraft.item.Item
|
||||
import net.minecraft.item.ItemGroup
|
||||
import net.minecraft.item.ItemGroup.*
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.item.Items
|
||||
import net.minecraft.registry.Registries
|
||||
import net.minecraft.registry.RegistryKey
|
||||
import net.minecraft.text.Text
|
||||
@@ -26,7 +25,7 @@ object CobblemonItemGroups {
|
||||
// See https://docs.google.com/spreadsheets/d/1QgaIlW-S9A-Blqhc-5G7OO3igaQdEAiYQqVEPnEBFmc/edit#gid=978365418 for what goes what
|
||||
|
||||
private val ALL = arrayListOf<ItemGroupHolder>()
|
||||
private val INJECTORS = hashMapOf<RegistryKey<ItemGroup>, (injector: Injector) -> Unit>()
|
||||
private val INJECTORS = arrayListOf<ItemGroupInjector>()
|
||||
|
||||
@JvmStatic val BLOCKS_KEY = this.create("blocks", this::blockEntries) { ItemStack(CobblemonItems.PC) }
|
||||
@JvmStatic val POKEBALLS_KEY = this.create("pokeball", this::pokeballentries) { ItemStack(CobblemonItems.POKE_BALL) }
|
||||
@@ -43,18 +42,15 @@ object CobblemonItemGroups {
|
||||
@JvmStatic val EVOLUTION_ITEMS get() = Registries.ITEM_GROUP.get(EVOLUTION_ITEMS_KEY)
|
||||
|
||||
@JvmStatic val FOOD_INJECTIONS = this.inject(RegistryKey.of(Registries.ITEM_GROUP.key, Identifier("food_and_drinks")), this::foodInjections)
|
||||
@JvmStatic val TOOLS_AND_UTILITIES_INJECTIONS = this.inject(RegistryKey.of(Registries.ITEM_GROUP.key, Identifier("tools_and_utilities")), this::toolsAndUtilitiesInjections)
|
||||
|
||||
fun register(consumer: (holder: ItemGroupHolder) -> ItemGroup) {
|
||||
ALL.forEach(consumer::invoke)
|
||||
}
|
||||
|
||||
fun inject(tabKey: RegistryKey<ItemGroup>, injector: Injector) {
|
||||
INJECTORS[tabKey]?.invoke(injector)
|
||||
fun inject(consumer: (injector: ItemGroupInjector) -> Unit) {
|
||||
INJECTORS.forEach(consumer)
|
||||
}
|
||||
|
||||
fun injectorKeys(): Collection<RegistryKey<ItemGroup>> = this.INJECTORS.keys
|
||||
|
||||
data class ItemGroupHolder(
|
||||
val key: RegistryKey<ItemGroup>,
|
||||
val displayIconProvider: () -> ItemStack,
|
||||
@@ -62,17 +58,23 @@ object CobblemonItemGroups {
|
||||
val displayName: Text = Text.translatable("itemGroup.${key.value.namespace}.${key.value.path}")
|
||||
)
|
||||
|
||||
data class ItemGroupInjector(
|
||||
val key: RegistryKey<ItemGroup>,
|
||||
val entryInjector: (displayContext: DisplayContext) -> List<Item>,
|
||||
)
|
||||
|
||||
private fun create(name: String, entryCollector: EntryCollector, displayIconProvider: () -> ItemStack): RegistryKey<ItemGroup> {
|
||||
val key = RegistryKey.of(Registries.ITEM_GROUP.key, cobblemonResource(name))
|
||||
this.ALL += ItemGroupHolder(key, displayIconProvider, entryCollector)
|
||||
return key
|
||||
}
|
||||
|
||||
private fun inject(key: RegistryKey<ItemGroup>, consumer: (injector: Injector) -> Unit): (injector: Injector) -> Unit {
|
||||
this.INJECTORS[key] = consumer
|
||||
return consumer
|
||||
private fun inject(key: RegistryKey<ItemGroup>, entryInjector: (displayContext: DisplayContext) -> List<Item>): ItemGroupInjector {
|
||||
val injector = ItemGroupInjector(key, entryInjector)
|
||||
this.INJECTORS += injector
|
||||
return injector
|
||||
}
|
||||
|
||||
|
||||
private fun agricultureEntries(displayContext: DisplayContext, entries: Entries) {
|
||||
entries.add(CobblemonItems.MEDICINAL_LEEK)
|
||||
entries.add(CobblemonItems.BIG_ROOT)
|
||||
@@ -144,8 +146,6 @@ object CobblemonItemGroups {
|
||||
entries.add(CobblemonItems.APRICORN_TRAPDOOR)
|
||||
entries.add(CobblemonItems.APRICORN_BUTTON)
|
||||
entries.add(CobblemonItems.APRICORN_PRESSURE_PLATE)
|
||||
entries.add(CobblemonItems.APRICORN_SIGN)
|
||||
entries.add(CobblemonItems.APRICORN_HANGING_SIGN)
|
||||
entries.add(CobblemonItems.APRICORN_LEAVES)
|
||||
entries.add(CobblemonItems.DAWN_STONE_ORE)
|
||||
entries.add(CobblemonItems.DEEPSLATE_DAWN_STONE_ORE)
|
||||
@@ -169,7 +169,7 @@ object CobblemonItemGroups {
|
||||
entries.add(CobblemonItems.WATER_STONE_ORE)
|
||||
entries.add(CobblemonItems.DEEPSLATE_WATER_STONE_ORE)
|
||||
}
|
||||
|
||||
|
||||
private fun consumableEntries(displayContext: DisplayContext, entries: Entries) {
|
||||
entries.add(CobblemonItems.ROASTED_LEEK)
|
||||
entries.add(CobblemonItems.LEEK_AND_POTATO_STEW)
|
||||
@@ -301,166 +301,76 @@ object CobblemonItemGroups {
|
||||
}
|
||||
|
||||
private fun heldItemEntries(displayContext: DisplayContext, entries: Entries) {
|
||||
entries.add(CobblemonItems.ABILITY_SHIELD)
|
||||
entries.add(CobblemonItems.ABSORB_BULB)
|
||||
entries.add(CobblemonItems.AIR_BALLOON)
|
||||
entries.add(CobblemonItems.AMULET_COIN)
|
||||
entries.add(CobblemonItems.ASSAULT_VEST)
|
||||
entries.add(CobblemonItems.BIG_ROOT)
|
||||
entries.add(CobblemonItems.BINDING_BAND)
|
||||
entries.add(CobblemonItems.BLACK_BELT)
|
||||
entries.add(CobblemonItems.BLACK_GLASSES)
|
||||
entries.add(CobblemonItems.BLACK_SLUDGE)
|
||||
entries.add(CobblemonItems.BLUNDER_POLICY)
|
||||
entries.add(CobblemonItems.BRIGHT_POWDER)
|
||||
entries.add(CobblemonItems.CELL_BATTERY)
|
||||
entries.add(CobblemonItems.CHARCOAL)
|
||||
entries.add(CobblemonItems.CHOICE_BAND)
|
||||
entries.add(CobblemonItems.CHOICE_SCARF)
|
||||
entries.add(CobblemonItems.CHOICE_SPECS)
|
||||
entries.add(CobblemonItems.CLEANSE_TAG)
|
||||
entries.add(CobblemonItems.CLEAR_AMULET)
|
||||
entries.add(CobblemonItems.COVERT_CLOAK)
|
||||
entries.add(CobblemonItems.DAMP_ROCK)
|
||||
entries.add(CobblemonItems.DEEP_SEA_SCALE)
|
||||
entries.add(CobblemonItems.DEEP_SEA_TOOTH)
|
||||
entries.add(CobblemonItems.DESTINY_KNOT)
|
||||
entries.add(CobblemonItems.DRAGON_FANG)
|
||||
entries.add(CobblemonItems.EJECT_BUTTON)
|
||||
entries.add(CobblemonItems.EJECT_PACK)
|
||||
entries.add(CobblemonItems.ELECTRIC_SEED)
|
||||
entries.add(CobblemonItems.EVERSTONE)
|
||||
entries.add(CobblemonItems.EXPERT_BELT)
|
||||
entries.add(CobblemonItems.EXP_SHARE)
|
||||
entries.add(CobblemonItems.FAIRY_FEATHER)
|
||||
entries.add(CobblemonItems.FLAME_ORB)
|
||||
entries.add(CobblemonItems.FLOAT_STONE)
|
||||
entries.add(CobblemonItems.FOCUS_BAND)
|
||||
entries.add(CobblemonItems.FOCUS_SASH)
|
||||
entries.add(CobblemonItems.GRASSY_SEED)
|
||||
entries.add(CobblemonItems.GRIP_CLAW)
|
||||
entries.add(CobblemonItems.HARD_STONE)
|
||||
entries.add(CobblemonItems.HEAT_ROCK)
|
||||
entries.add(CobblemonItems.HEAVY_DUTY_BOOTS)
|
||||
entries.add(CobblemonItems.ICY_ROCK)
|
||||
entries.add(CobblemonItems.IRON_BALL)
|
||||
entries.add(CobblemonItems.KINGS_ROCK)
|
||||
entries.add(CobblemonItems.LAGGING_TAIL)
|
||||
entries.add(CobblemonItems.LEFTOVERS)
|
||||
entries.add(CobblemonItems.LIFE_ORB)
|
||||
entries.add(CobblemonItems.LIGHT_BALL)
|
||||
entries.add(CobblemonItems.LIGHT_CLAY)
|
||||
entries.add(CobblemonItems.LOADED_DICE)
|
||||
entries.add(CobblemonItems.LUCKY_EGG)
|
||||
entries.add(CobblemonItems.LUMINOUS_MOSS)
|
||||
entries.add(CobblemonItems.MAGNET)
|
||||
entries.add(CobblemonItems.MENTAL_HERB)
|
||||
entries.add(CobblemonItems.METAL_POWDER)
|
||||
entries.add(CobblemonItems.METRONOME)
|
||||
entries.add(CobblemonItems.MIRACLE_SEED)
|
||||
entries.add(CobblemonItems.MIRROR_HERB)
|
||||
entries.add(CobblemonItems.MISTY_SEED)
|
||||
entries.add(CobblemonItems.MUSCLE_BAND)
|
||||
entries.add(CobblemonItems.MYSTIC_WATER)
|
||||
entries.add(CobblemonItems.NEVER_MELT_ICE)
|
||||
entries.add(CobblemonItems.POISON_BARB)
|
||||
entries.add(CobblemonItems.POWER_ANKLET)
|
||||
entries.add(CobblemonItems.POWER_BAND)
|
||||
entries.add(CobblemonItems.POWER_BELT)
|
||||
entries.add(CobblemonItems.POWER_BRACER)
|
||||
entries.add(CobblemonItems.POWER_HERB)
|
||||
entries.add(CobblemonItems.POWER_LENS)
|
||||
entries.add(CobblemonItems.POWER_WEIGHT)
|
||||
entries.add(CobblemonItems.PROTECTIVE_PADS)
|
||||
entries.add(CobblemonItems.PSYCHIC_SEED)
|
||||
entries.add(CobblemonItems.PUNCHING_GLOVE)
|
||||
entries.add(CobblemonItems.QUICK_CLAW)
|
||||
entries.add(CobblemonItems.QUICK_POWDER)
|
||||
entries.add(CobblemonItems.RAZOR_CLAW)
|
||||
entries.add(CobblemonItems.RAZOR_FANG)
|
||||
entries.add(CobblemonItems.RED_CARD)
|
||||
entries.add(CobblemonItems.RING_TARGET)
|
||||
entries.add(CobblemonItems.ROCKY_HELMET)
|
||||
entries.add(CobblemonItems.ROOM_SERVICE)
|
||||
entries.add(CobblemonItems.SAFETY_GOGGLES)
|
||||
entries.add(CobblemonItems.SCOPE_LENS)
|
||||
entries.add(CobblemonItems.SHARP_BEAK)
|
||||
entries.add(CobblemonItems.SHED_SHELL)
|
||||
entries.add(CobblemonItems.SHELL_BELL)
|
||||
entries.add(CobblemonItems.SILK_SCARF)
|
||||
entries.add(CobblemonItems.SILVER_POWDER)
|
||||
entries.add(CobblemonItems.SMOKE_BALL)
|
||||
entries.add(CobblemonItems.SMOOTH_ROCK)
|
||||
entries.add(CobblemonItems.SOFT_SAND)
|
||||
entries.add(CobblemonItems.SOOTHE_BELL)
|
||||
entries.add(CobblemonItems.SPELL_TAG)
|
||||
entries.add(CobblemonItems.STICKY_BARB)
|
||||
entries.add(CobblemonItems.TERRAIN_EXTRUDER)
|
||||
entries.add(CobblemonItems.THROAT_SPRAY)
|
||||
entries.add(CobblemonItems.TOXIC_ORB)
|
||||
entries.add(CobblemonItems.TWISTED_SPOON)
|
||||
entries.add(CobblemonItems.UTILITY_UMBRELLA)
|
||||
entries.add(CobblemonItems.WEAKNESS_POLICY)
|
||||
entries.add(CobblemonItems.WHITE_HERB)
|
||||
entries.add(CobblemonItems.WIDE_LENS)
|
||||
entries.add(CobblemonItems.WISE_GLASSES)
|
||||
entries.add(CobblemonItems.ZOOM_LENS)
|
||||
entries.add(CobblemonItems.POWER_ANKLET)
|
||||
entries.add(CobblemonItems.POWER_BAND)
|
||||
entries.add(CobblemonItems.POWER_BELT)
|
||||
entries.add(CobblemonItems.POWER_BRACER)
|
||||
entries.add(CobblemonItems.POWER_LENS)
|
||||
entries.add(CobblemonItems.POWER_WEIGHT)
|
||||
}
|
||||
|
||||
private fun pokeballentries(displayContext: DisplayContext, entries: Entries) {
|
||||
CobblemonItems.pokeBalls.forEach(entries::add)
|
||||
}
|
||||
|
||||
private fun foodInjections(injector: Injector) {
|
||||
injector.putLast(CobblemonItems.ROASTED_LEEK)
|
||||
injector.putLast(CobblemonItems.LEEK_AND_POTATO_STEW)
|
||||
injector.putLast(CobblemonItems.BRAISED_VIVICHOKE)
|
||||
injector.putLast(CobblemonItems.VIVICHOKE_DIP)
|
||||
}
|
||||
private fun keyitemsentries(displayContext: DisplayContext): List<Item> = arrayListOf(
|
||||
CobblemonItems.PHOTODEX
|
||||
)
|
||||
|
||||
private fun toolsAndUtilitiesInjections(injector: Injector) {
|
||||
injector.putAfter(CobblemonItems.APRICORN_BOAT, Items.BAMBOO_CHEST_RAFT)
|
||||
injector.putAfter(CobblemonItems.APRICORN_CHEST_BOAT, CobblemonItems.APRICORN_BOAT)
|
||||
}
|
||||
|
||||
/**
|
||||
* The abstract behaviour of injecting into existing [ItemGroup]s in specific positions.
|
||||
* Each platform has to implement the behaviour.
|
||||
*/
|
||||
interface Injector {
|
||||
|
||||
/**
|
||||
* Places the given [item] at the start of a creative tab.
|
||||
*
|
||||
* @param item The [ItemConvertible] being added at the start of a tab.
|
||||
*/
|
||||
fun putFirst(item: ItemConvertible)
|
||||
|
||||
/**
|
||||
* Places the given [item] before the [target].
|
||||
* If the [target] is not present behaves as [putLast].
|
||||
*
|
||||
* @param item The [ItemConvertible] being added before [target].
|
||||
* @param target The [ItemConvertible] being targeted.
|
||||
*/
|
||||
fun putBefore(item: ItemConvertible, target: ItemConvertible)
|
||||
|
||||
/**
|
||||
* Places the given [item] after the [target].
|
||||
* If the [target] is not present behaves as [putLast].
|
||||
*
|
||||
* @param item The [ItemConvertible] being added after [target].
|
||||
* @param target The [ItemConvertible] being targeted.
|
||||
*/
|
||||
fun putAfter(item: ItemConvertible, target: ItemConvertible)
|
||||
|
||||
/**
|
||||
* Places the given [item] at the end of a creative tab.
|
||||
*
|
||||
* @param item The [ItemConvertible] being added at the end of a tab.
|
||||
*/
|
||||
fun putLast(item: ItemConvertible)
|
||||
|
||||
}
|
||||
private fun foodInjections(displayContext: DisplayContext): List<Item> = arrayListOf(
|
||||
CobblemonItems.ROASTED_LEEK,
|
||||
CobblemonItems.LEEK_AND_POTATO_STEW,
|
||||
CobblemonItems.BRAISED_VIVICHOKE,
|
||||
CobblemonItems.VIVICHOKE_DIP
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
@@ -10,17 +10,14 @@ package com.cobblemon.mod.common.item.interactive
|
||||
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
||||
import com.cobblemon.mod.common.api.events.pokemon.interaction.ExperienceCandyUseEvent
|
||||
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
|
||||
import com.cobblemon.mod.common.api.interaction.PokemonEntityInteraction
|
||||
import com.cobblemon.mod.common.api.pokemon.experience.CandyExperienceSource
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.item.CobblemonItem
|
||||
import com.cobblemon.mod.common.item.interactive.CandyItem.Calculator
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import net.minecraft.util.Hand
|
||||
import net.minecraft.util.TypedActionResult
|
||||
import net.minecraft.world.World
|
||||
|
||||
/**
|
||||
* An experience candy item.
|
||||
@@ -31,45 +28,29 @@ import net.minecraft.world.World
|
||||
* @author Licious
|
||||
* @since May 5th, 2022
|
||||
*/
|
||||
class CandyItem(val calculator: Calculator) : CobblemonItem(Settings()), PokemonSelectingItem {
|
||||
override val bagItem = null
|
||||
class CandyItem(val calculator: Calculator) : CobblemonItem(Settings()), PokemonEntityInteraction {
|
||||
override val accepted = setOf(PokemonEntityInteraction.Ownership.OWNER)
|
||||
|
||||
override fun use(world: World, user: PlayerEntity, hand: Hand): TypedActionResult<ItemStack> {
|
||||
if (user is ServerPlayerEntity) {
|
||||
return use(user, user.getStackInHand(hand))
|
||||
}
|
||||
return TypedActionResult.success(user.getStackInHand(hand))
|
||||
}
|
||||
|
||||
override fun applyToPokemon(player: ServerPlayerEntity, stack: ItemStack, pokemon: Pokemon): TypedActionResult<ItemStack>? {
|
||||
override fun processInteraction(player: ServerPlayerEntity, entity: PokemonEntity, stack: ItemStack): Boolean {
|
||||
val pokemon = entity.pokemon
|
||||
val experience = this.calculator.calculate(player, pokemon)
|
||||
CobblemonEvents.EXPERIENCE_CANDY_USE_PRE.postThen(
|
||||
event = ExperienceCandyUseEvent.Pre(player, pokemon, this, experience, experience),
|
||||
ifSucceeded = { preEvent ->
|
||||
val finalExperience = preEvent.experienceYield
|
||||
val source = CandyExperienceSource(player, stack)
|
||||
val result = pokemon.addExperienceWithPlayer(player, source, finalExperience)
|
||||
// We do this just so we can post the event once the item has been consumed if needed instead of repeating the even post
|
||||
var returnValue = false
|
||||
if (result.experienceAdded > 0) {
|
||||
if (!player.isCreative) {
|
||||
stack.decrement(1)
|
||||
}
|
||||
returnValue = true
|
||||
}
|
||||
CobblemonEvents.EXPERIENCE_CANDY_USE_POST.post(ExperienceCandyUseEvent.Post(player, pokemon, this, result))
|
||||
|
||||
return if (returnValue)
|
||||
TypedActionResult.success(stack)
|
||||
else
|
||||
TypedActionResult.fail(stack)
|
||||
event = ExperienceCandyUseEvent.Pre(player, pokemon, this, experience, experience),
|
||||
ifSucceeded = { preEvent ->
|
||||
val finalExperience = preEvent.experienceYield
|
||||
val source = CandyExperienceSource(player, stack)
|
||||
val result = pokemon.addExperienceWithPlayer(player, source, finalExperience)
|
||||
// We do this just so we can post the event once the item has been consumed if needed instead of repeating the even post
|
||||
var returnValue = false
|
||||
if (result.experienceAdded > 0) {
|
||||
this.consumeItem(player, stack)
|
||||
returnValue = true
|
||||
}
|
||||
CobblemonEvents.EXPERIENCE_CANDY_USE_POST.post(ExperienceCandyUseEvent.Post(player, pokemon, this, result))
|
||||
return returnValue
|
||||
}
|
||||
)
|
||||
return TypedActionResult.fail(stack)
|
||||
}
|
||||
|
||||
override fun canUseOnPokemon(pokemon: Pokemon): Boolean {
|
||||
return pokemon.isPlayerOwned()
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,11 +16,9 @@ import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.item.CobblemonItem
|
||||
import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.giveOrDropItemStack
|
||||
import kotlin.math.min
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.item.Items
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import net.minecraft.server.world.ServerWorld
|
||||
import net.minecraft.sound.SoundCategory
|
||||
@@ -61,7 +59,6 @@ class ElixirItem(val max: Boolean) : CobblemonItem(Settings()), PokemonSelecting
|
||||
pokemon.moveSet.update()
|
||||
if (!player.isCreative) {
|
||||
stack.decrement(1)
|
||||
player.giveOrDropItemStack(ItemStack(Items.GLASS_BOTTLE))
|
||||
}
|
||||
player.playSound(CobblemonSounds.MEDICINE_LIQUID_USE, SoundCategory.PLAYERS, 1F, 1F)
|
||||
TypedActionResult.success(stack)
|
||||
|
||||
@@ -17,11 +17,9 @@ import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.item.CobblemonItem
|
||||
import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.giveOrDropItemStack
|
||||
import kotlin.math.min
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.item.Items
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import net.minecraft.server.world.ServerWorld
|
||||
import net.minecraft.sound.SoundCategory
|
||||
@@ -51,7 +49,6 @@ class EtherItem(val max: Boolean): CobblemonItem(Settings()), PokemonAndMoveSele
|
||||
player.playSound(CobblemonSounds.MEDICINE_LIQUID_USE, SoundCategory.PLAYERS, 1F, 1F)
|
||||
if (!player.isCreative) {
|
||||
stack.decrement(1)
|
||||
player.giveOrDropItemStack(ItemStack(Items.GLASS_BOTTLE))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.item.interactive
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||
@@ -32,10 +31,6 @@ class HealPowderItem : CobblemonItem(Settings()), PokemonSelectingItem {
|
||||
override fun getShowdownInput(actor: BattleActor, battlePokemon: BattlePokemon, data: String?) = "cure_status"
|
||||
}
|
||||
|
||||
init {
|
||||
Cobblemon.implementation.registerCompostable(this, .75F)
|
||||
}
|
||||
|
||||
override fun canUseOnPokemon(pokemon: Pokemon) = pokemon.status != null && pokemon.currentHealth > 0
|
||||
override fun applyToPokemon(
|
||||
player: ServerPlayerEntity,
|
||||
|
||||
@@ -0,0 +1,265 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.item.interactive
|
||||
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import net.fabricmc.api.EnvType
|
||||
import net.fabricmc.api.Environment
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.render.*
|
||||
import net.minecraft.client.util.math.MatrixStack
|
||||
import net.minecraft.entity.Entity
|
||||
import net.minecraft.entity.LivingEntity
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.item.SpyglassItem
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.Hand
|
||||
import net.minecraft.util.Identifier
|
||||
import net.minecraft.util.TypedActionResult
|
||||
import net.minecraft.util.math.Box
|
||||
import net.minecraft.world.World
|
||||
import org.lwjgl.glfw.GLFW
|
||||
import org.lwjgl.glfw.GLFWMouseButtonCallback
|
||||
import org.lwjgl.glfw.GLFWScrollCallback
|
||||
import java.util.logging.LogManager
|
||||
|
||||
|
||||
class PhotodexItem : /*CobblemonItem(Settings()),*/ SpyglassItem(Settings()) {
|
||||
private var inUse = false
|
||||
private var isZooming = false
|
||||
private var zoomLevel = 1.0
|
||||
private var scrollCallback = -1L
|
||||
private var mouseCallback = -1L
|
||||
|
||||
private var isScrollCallbackRegistered = false
|
||||
private var isMouseButtonCallbackRegistered = false
|
||||
|
||||
private var leftMouseButtonPressedLastTick = false
|
||||
|
||||
fun changeFOV(double: Double) {
|
||||
val client = MinecraftClient.getInstance()
|
||||
val newFov = (70 / zoomLevel).coerceIn(30.0, 110.0).toInt() // Clamping the FOV value
|
||||
client.options.fov.setValue(newFov)
|
||||
}
|
||||
|
||||
// todo use method to toggle on functionality of camera
|
||||
/*override fun use(world: World, user: PlayerEntity, hand: Hand): TypedActionResult<ItemStack> {
|
||||
if (world.isClient) {
|
||||
inUse = !inUse // toggle inUse state
|
||||
|
||||
if (inUse) {
|
||||
//registerInputHandlers() // Activate input handling
|
||||
zoomLevel = 1.0 // Initialize zoom level
|
||||
} else {
|
||||
//unregisterInputHandlers() // Deactivate input handling
|
||||
zoomLevel = 1.0 // Reset zoom level
|
||||
changeFOV(70.0) // Reset FOV
|
||||
}
|
||||
return TypedActionResult.success(user.getStackInHand(hand))
|
||||
}
|
||||
return TypedActionResult.pass(user.getStackInHand(hand))
|
||||
}*/
|
||||
|
||||
// todo use method for holding down right click to enable camera like the spyglass
|
||||
override fun use(world: World, user: PlayerEntity, hand: Hand): TypedActionResult<ItemStack> {
|
||||
|
||||
if (world.isClient) {
|
||||
if (!inUse) {
|
||||
inUse = true // Activate only on initial click
|
||||
registerInputHandlers() // Activate input handling
|
||||
zoomLevel = 1.0 // Initialize zoom level
|
||||
changeFOV(70.0) // Set initial FOV
|
||||
}
|
||||
return TypedActionResult.success(user.getStackInHand(hand))
|
||||
}
|
||||
return TypedActionResult.pass(user.getStackInHand(hand))
|
||||
}
|
||||
|
||||
// todo onStoppedUsing for ending the camera use when letting go of the Right Click
|
||||
override fun onStoppedUsing(stack: ItemStack?, world: World, entity: LivingEntity, timeLeft: Int) {
|
||||
println("Triggered onStoppedUsing function")
|
||||
super.onStoppedUsing(stack, world, entity, timeLeft)
|
||||
if (world.isClient && entity is PlayerEntity) {
|
||||
inUse = false // Reset on release
|
||||
unregisterInputHandlers()
|
||||
zoomLevel = 1.0
|
||||
changeFOV(70.0) // Reset FOV
|
||||
}
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
private fun registerInputHandlers() {
|
||||
val windowHandle = MinecraftClient.getInstance().window.handle
|
||||
|
||||
if (!isScrollCallbackRegistered) {
|
||||
// Register scroll callback
|
||||
GLFW.glfwSetScrollCallback(windowHandle) { _, _, yOffset ->
|
||||
println("Scroll Callback Triggered: yOffset = $yOffset")
|
||||
|
||||
if (yOffset != 0.0) {
|
||||
zoomLevel += yOffset * 0.05 // Smaller increment
|
||||
zoomLevel = zoomLevel.coerceIn(1.0, 4.0) // More controlled zoom range
|
||||
changeFOV(70 / zoomLevel)
|
||||
}
|
||||
}
|
||||
isScrollCallbackRegistered = true
|
||||
}
|
||||
|
||||
if (!isMouseButtonCallbackRegistered) {
|
||||
// Register mouse button callback
|
||||
GLFW.glfwSetMouseButtonCallback(windowHandle) { _, button, action, _ ->
|
||||
//println("Mouse Button Callback Triggered")
|
||||
//println("inUse is " + inUse.toString())
|
||||
|
||||
// todo NOTE: BUTTON_1 is apparently LEFT BUTTON_2 is apparently RIGHT but we might need to check
|
||||
|
||||
|
||||
if (inUse && button == GLFW.GLFW_MOUSE_BUTTON_1 && action == GLFW.GLFW_PRESS) {
|
||||
println("Mouse Button 1 Left Pressed")
|
||||
MinecraftClient.getInstance().player?.let {
|
||||
if (it.world.isClient) {
|
||||
detectPokemon(it.world, it, Hand.MAIN_HAND)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (inUse && button == GLFW.GLFW_MOUSE_BUTTON_1 && action == GLFW.GLFW_RELEASE) {
|
||||
println("Mouse Button 1 Left Released")
|
||||
// Implement your logic for release here
|
||||
|
||||
}
|
||||
|
||||
if (inUse && button == GLFW.GLFW_MOUSE_BUTTON_2 && action == GLFW.GLFW_PRESS) {
|
||||
println("Mouse Button 2 Right Pressed")
|
||||
|
||||
}
|
||||
else if (inUse && button == GLFW.GLFW_MOUSE_BUTTON_2 && action == GLFW.GLFW_RELEASE) {
|
||||
println("Mouse Button 2 Right Released")
|
||||
inUse = false
|
||||
unregisterInputHandlers()
|
||||
zoomLevel = 1.0
|
||||
changeFOV(70.0) // Reset FOV
|
||||
}
|
||||
|
||||
/*if (inUse && button == GLFW.GLFW_MOUSE_BUTTON_1 && action == GLFW.GLFW_PRESS) {
|
||||
println("Mouse Button Callback Triggered")
|
||||
MinecraftClient.getInstance().player?.let {
|
||||
if (it.world.isClient) {
|
||||
detectPokemon(it.world, it, Hand.MAIN_HAND)
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
isMouseButtonCallbackRegistered = true
|
||||
}
|
||||
}
|
||||
|
||||
private fun unregisterInputHandlers() {
|
||||
val windowHandle = MinecraftClient.getInstance().window.handle
|
||||
|
||||
if (isScrollCallbackRegistered) {
|
||||
GLFW.glfwSetScrollCallback(windowHandle, null)?.free()
|
||||
isScrollCallbackRegistered = false
|
||||
}
|
||||
|
||||
if (isMouseButtonCallbackRegistered) {
|
||||
GLFW.glfwSetMouseButtonCallback(windowHandle, null)?.free()
|
||||
isMouseButtonCallbackRegistered = false
|
||||
}
|
||||
}
|
||||
|
||||
fun detectPokemon(world: World, user: PlayerEntity, hand: Hand) {
|
||||
if (user is ServerPlayerEntity && inUse) {
|
||||
val eyePos = user.getCameraPosVec(1.0F)
|
||||
val lookVec = user.getRotationVec(1.0F)
|
||||
val maxDistance = 100.0 // Set this to how far you want the ray to go
|
||||
var closestEntity: Entity? = null
|
||||
var closestDistance = maxDistance
|
||||
|
||||
// Send a chat message to the player
|
||||
//user.sendMessage(Text.of("Trying to Detect Entity"));
|
||||
|
||||
// Define a large bounding box around the player
|
||||
val boundingBox = Box(
|
||||
user.x - 200.0, user.y - 200.0, user.z - 200.0,
|
||||
user.x + 200.0, user.y + 200.0, user.z + 200.0
|
||||
)
|
||||
|
||||
// Get all entities within the bounding box
|
||||
val entities = user.world.getEntitiesByClass(Entity::class.java, boundingBox, { it != user })
|
||||
|
||||
for (entity in entities) {
|
||||
val entityBox: Box = entity.boundingBox
|
||||
val intersection = entityBox.raycast(eyePos, eyePos.add(lookVec.multiply(maxDistance)))
|
||||
|
||||
if (intersection.isPresent) {
|
||||
val distanceToEntity = eyePos.distanceTo(intersection.get())
|
||||
if (distanceToEntity < closestDistance) {
|
||||
closestEntity = entity
|
||||
closestDistance = distanceToEntity
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (closestEntity != null && closestEntity is PokemonEntity) {
|
||||
user.sendMessage(Text.of("You have scanned a: ${closestEntity.pokemon.species.name}"))
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*override fun onStoppedUsing(stack: ItemStack, world: World, entity: LivingEntity, timeLeft: Int) {
|
||||
inUse = false
|
||||
}*/
|
||||
|
||||
fun renderPhotodexOverlay(matrixStack: MatrixStack) {
|
||||
// Assuming your texture is meant to cover the full screen or a significant portion of it.
|
||||
// These dimensions will scale the texture to fit as desired.
|
||||
val screenWidth = MinecraftClient.getInstance().window.scaledWidth
|
||||
val screenHeight = MinecraftClient.getInstance().window.scaledHeight
|
||||
|
||||
// Your custom overlay texture
|
||||
val photodexOverlayTexture = Identifier("textures/item/keyitems/PhotodexLens.png")
|
||||
|
||||
// Binding the texture
|
||||
MinecraftClient.getInstance().textureManager.bindTexture(photodexOverlayTexture)
|
||||
|
||||
// Enable blending for transparency
|
||||
//RenderSystem.enableBlend()
|
||||
//RenderSystem.blendFuncSeparate(RenderSystem.SourceFactor.SRC_ALPHA, RenderSystem.DestFactor.ONE_MINUS_SRC_ALPHA, RenderSystem.SourceFactor.ONE, RenderSystem.DestFactor.ZERO)
|
||||
|
||||
// RenderSystem.enableBlend()
|
||||
// RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA)
|
||||
|
||||
// Drawing the overlay
|
||||
drawTexture(matrixStack, 0, 0, screenWidth, screenHeight, 0f, 0f, 256, 256, 256, 256)
|
||||
|
||||
// Disable blending if you enabled it earlier
|
||||
// RenderSystem.disableBlend()
|
||||
}
|
||||
|
||||
// Adjusted to accept float texture coordinates and dimensions
|
||||
private fun drawTexture(
|
||||
matrices: MatrixStack,
|
||||
x: Int, y: Int, width: Int, height: Int,
|
||||
u0: Float, v0: Float, regionWidth: Int, regionHeight: Int, textureWidth: Int, textureHeight: Int
|
||||
) {
|
||||
val drawMode = VertexFormat.DrawMode.QUADS // Quads
|
||||
val tessellator = Tessellator.getInstance()
|
||||
val bufferBuilder = tessellator.buffer
|
||||
bufferBuilder.begin(drawMode, VertexFormats.POSITION_TEXTURE)
|
||||
bufferBuilder.vertex(matrices.peek().positionMatrix, x.toFloat(), (y + height).toFloat(), 0f).texture(u0 / textureWidth, (v0 + regionHeight) / textureHeight).next()
|
||||
bufferBuilder.vertex(matrices.peek().positionMatrix, (x + width).toFloat(), (y + height).toFloat(), 0f).texture((u0 + regionWidth) / textureWidth, (v0 + regionHeight) / textureHeight).next()
|
||||
bufferBuilder.vertex(matrices.peek().positionMatrix, (x + width).toFloat(), y.toFloat(), 0f).texture((u0 + regionWidth) / textureWidth, v0 / textureHeight).next()
|
||||
bufferBuilder.vertex(matrices.peek().positionMatrix, x.toFloat(), y.toFloat(), 0f).texture(u0 / textureWidth, v0 / textureHeight).next()
|
||||
tessellator.draw()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,12 +19,10 @@ import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.asExpression
|
||||
import com.cobblemon.mod.common.util.genericRuntime
|
||||
import com.cobblemon.mod.common.util.giveOrDropItemStack
|
||||
import com.cobblemon.mod.common.util.resolveInt
|
||||
import java.lang.Integer.min
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.item.Items
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import net.minecraft.sound.SoundCategory
|
||||
import net.minecraft.util.Hand
|
||||
@@ -58,7 +56,6 @@ class PotionItem(val type: PotionType) : CobblemonItem(Settings()), PokemonSelec
|
||||
player.playSound(CobblemonSounds.MEDICINE_SPRAY_USE, SoundCategory.PLAYERS, 1F, 1F)
|
||||
if (!player.isCreative) {
|
||||
stack.decrement(1)
|
||||
player.giveOrDropItemStack(ItemStack(Items.GLASS_BOTTLE))
|
||||
}
|
||||
return TypedActionResult.success(stack)
|
||||
}
|
||||
|
||||
@@ -17,10 +17,8 @@ import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.item.CobblemonItem
|
||||
import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.giveOrDropItemStack
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.item.Items
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import net.minecraft.sound.SoundCategory
|
||||
import net.minecraft.util.Hand
|
||||
@@ -52,7 +50,6 @@ class StatusCureItem(val itemName: String, vararg val status: Status) : Cobblemo
|
||||
player.playSound(CobblemonSounds.MEDICINE_SPRAY_USE, SoundCategory.PLAYERS, 1F, 1F)
|
||||
if (!player.isCreative) {
|
||||
stack.decrement(1)
|
||||
player.giveOrDropItemStack(ItemStack(Items.GLASS_BOTTLE))
|
||||
}
|
||||
TypedActionResult.success(stack)
|
||||
} else {
|
||||
|
||||
@@ -10,8 +10,9 @@ package com.cobblemon.mod.common.loot
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.loot.LootManager
|
||||
import net.minecraft.loot.LootPool
|
||||
import net.minecraft.loot.LootTables
|
||||
import net.minecraft.loot.LootTable
|
||||
import net.minecraft.loot.entry.LootTableEntry
|
||||
import net.minecraft.loot.provider.number.UniformLootNumberProvider
|
||||
import net.minecraft.util.Identifier
|
||||
@@ -26,37 +27,9 @@ import org.jetbrains.annotations.ApiStatus
|
||||
@ApiStatus.Internal
|
||||
object LootInjector {
|
||||
|
||||
// cobblemon:injection/minecraft/chests/spawn_bonus_chest would target minecraft:chests/spawn_bonus_chest
|
||||
private const val PREFIX = "injection/"
|
||||
|
||||
private val VILLAGE_HOUSE = cobblemonResource("injection/chests/village_house")
|
||||
|
||||
private val villageHouseLootTables = hashSetOf(
|
||||
LootTables.VILLAGE_DESERT_HOUSE_CHEST,
|
||||
LootTables.VILLAGE_PLAINS_CHEST,
|
||||
LootTables.VILLAGE_SAVANNA_HOUSE_CHEST,
|
||||
LootTables.VILLAGE_SNOWY_HOUSE_CHEST,
|
||||
LootTables.VILLAGE_TAIGA_HOUSE_CHEST,
|
||||
)
|
||||
|
||||
private val injections = hashSetOf(
|
||||
LootTables.ABANDONED_MINESHAFT_CHEST,
|
||||
LootTables.ANCIENT_CITY_CHEST,
|
||||
LootTables.BASTION_BRIDGE_CHEST,
|
||||
LootTables.BASTION_HOGLIN_STABLE_CHEST,
|
||||
LootTables.BASTION_OTHER_CHEST,
|
||||
LootTables.BASTION_TREASURE_CHEST,
|
||||
LootTables.END_CITY_TREASURE_CHEST,
|
||||
LootTables.IGLOO_CHEST_CHEST,
|
||||
LootTables.JUNGLE_TEMPLE_CHEST,
|
||||
LootTables.NETHER_BRIDGE_CHEST,
|
||||
LootTables.PILLAGER_OUTPOST_CHEST,
|
||||
LootTables.SHIPWRECK_SUPPLY_CHEST,
|
||||
LootTables.SIMPLE_DUNGEON_CHEST,
|
||||
LootTables.SPAWN_BONUS_CHEST,
|
||||
LootTables.STRONGHOLD_CORRIDOR_CHEST,
|
||||
LootTables.WOODLAND_MANSION_CHEST
|
||||
).apply { addAll(villageHouseLootTables) }
|
||||
|
||||
/**
|
||||
* Attempts to inject a Cobblemon injection loot table to a loot table being loaded.
|
||||
* This will automatically query the existence of an injection.
|
||||
@@ -65,14 +38,18 @@ object LootInjector {
|
||||
* @param provider The job invoked if the injection is possible, this is what the platform needs to do to append the loot table.
|
||||
* @return If the injection was made.
|
||||
*/
|
||||
fun attemptInjection(id: Identifier, provider: (LootPool.Builder) -> Unit): Boolean {
|
||||
if (!this.injections.contains(id)) {
|
||||
fun attemptInjection(id: Identifier, lootManager: LootManager, provider: (LootPool.Builder) -> Unit): Boolean {
|
||||
// Don't attempt to do things with our own pools, don't remove the namespace check as other mods may use similar solutions
|
||||
if (id.namespace == Cobblemon.MODID && id.path.startsWith(PREFIX)) {
|
||||
return false
|
||||
}
|
||||
val resulting = this.convertToPotentialInjected(id)
|
||||
Cobblemon.LOGGER.debug("{}: Injected {} to {}", this::class.simpleName, resulting, id)
|
||||
provider(this.injectLootPool(resulting))
|
||||
return true
|
||||
// Defaults to LootTable.EMPTY instead of null
|
||||
if (lootManager.getLootTable(resulting) != LootTable.EMPTY) {
|
||||
provider(this.injectLootPool(resulting))
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -81,12 +58,7 @@ object LootInjector {
|
||||
* @param source The [Identifier] of the base loot table.
|
||||
* @return The [Identifier] for the expected Cobblemon injection.
|
||||
*/
|
||||
private fun convertToPotentialInjected(source: Identifier): Identifier {
|
||||
if (this.villageHouseLootTables.contains(source)) {
|
||||
return VILLAGE_HOUSE
|
||||
}
|
||||
return cobblemonResource("$PREFIX${source.path}")
|
||||
}
|
||||
private fun convertToPotentialInjected(source: Identifier): Identifier = cobblemonResource("$PREFIX${source.namespace}/${source.path}")
|
||||
|
||||
/**
|
||||
* Creates a loot pool builder with our injection.
|
||||
|
||||
-54
@@ -1,54 +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.net.messages.client
|
||||
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.PacketByteBuf
|
||||
import java.util.UUID
|
||||
import java.util.EnumSet
|
||||
|
||||
/**
|
||||
* Used to populate the player interaction menu
|
||||
*
|
||||
*
|
||||
* @author Apion
|
||||
* @since November 5th, 2023
|
||||
*/
|
||||
class PlayerInteractOptionsPacket(
|
||||
val options: EnumSet<Options>,
|
||||
val targetId: UUID,
|
||||
val numericTargetId: Int,
|
||||
val selectedPokemonId: UUID
|
||||
) : NetworkPacket<PlayerInteractOptionsPacket> {
|
||||
companion object {
|
||||
val ID = cobblemonResource("player_interactions")
|
||||
fun decode(buffer: PacketByteBuf) = PlayerInteractOptionsPacket(
|
||||
buffer.readEnumSet(Options::class.java),
|
||||
buffer.readUuid(),
|
||||
buffer.readInt(),
|
||||
buffer.readUuid()
|
||||
)
|
||||
}
|
||||
|
||||
override val id = ID
|
||||
override fun encode(buffer: PacketByteBuf) {
|
||||
buffer.writeEnumSet(options, Options::class.java)
|
||||
buffer.writeUuid(targetId)
|
||||
buffer.writeInt(numericTargetId)
|
||||
buffer.writeUuid(selectedPokemonId)
|
||||
}
|
||||
|
||||
enum class Options {
|
||||
BATTLE,
|
||||
SPECTATE_BATTLE,
|
||||
TRADE
|
||||
}
|
||||
|
||||
}
|
||||
+2
-8
@@ -49,11 +49,7 @@ class BattleInitializePacket() : NetworkPacket<BattleInitializePacket> {
|
||||
lateinit var side1: BattleSideDTO
|
||||
lateinit var side2: BattleSideDTO
|
||||
|
||||
/**
|
||||
* @param battle The battle to initialize on the client
|
||||
* @param allySide The [BattleSide] the client is on, null if the client is a spectator
|
||||
*/
|
||||
constructor(battle: PokemonBattle, allySide: BattleSide?): this() {
|
||||
constructor(battle: PokemonBattle, allySide: BattleSide): this() {
|
||||
battleId = battle.battleId
|
||||
battleFormat = battle.format
|
||||
val sides = arrayOf(battle.side1, battle.side2).map { side ->
|
||||
@@ -63,9 +59,7 @@ class BattleInitializePacket() : NetworkPacket<BattleInitializePacket> {
|
||||
uuid = actor.uuid,
|
||||
showdownId = actor.showdownId,
|
||||
displayName = actor.getName(),
|
||||
activePokemon = actor.activePokemon.map { it.battlePokemon?.let {
|
||||
pkm -> ActiveBattlePokemonDTO.fromPokemon(pkm, allySide == side)
|
||||
} },
|
||||
activePokemon = actor.activePokemon.map { it.battlePokemon?.let { pkm -> ActiveBattlePokemonDTO.fromPokemon(pkm, allySide == side) } },
|
||||
type = actor.type
|
||||
)
|
||||
}
|
||||
|
||||
-40
@@ -1,40 +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.net.messages.server
|
||||
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.PacketByteBuf
|
||||
import java.util.UUID
|
||||
|
||||
/**
|
||||
* Sent from client to request a [com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket]
|
||||
*
|
||||
* @author Apion
|
||||
* @since November 5th, 2023
|
||||
*/
|
||||
|
||||
class RequestPlayerInteractionsPacket(
|
||||
val targetId: UUID,
|
||||
val targetNumericId: Int,
|
||||
val pokemonId: UUID
|
||||
) : NetworkPacket<RequestPlayerInteractionsPacket> {
|
||||
companion object {
|
||||
val ID = cobblemonResource("request_interactions")
|
||||
fun decode(buffer: PacketByteBuf) = RequestPlayerInteractionsPacket(buffer.readUuid(), buffer.readInt(), buffer.readUuid())
|
||||
}
|
||||
|
||||
override val id = ID
|
||||
override fun encode(buffer: PacketByteBuf) {
|
||||
buffer.writeUuid(targetId)
|
||||
buffer.writeInt(targetNumericId)
|
||||
buffer.writeUuid(pokemonId)
|
||||
}
|
||||
|
||||
}
|
||||
-26
@@ -1,26 +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.net.messages.server.battle
|
||||
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.PacketByteBuf
|
||||
import java.util.UUID
|
||||
|
||||
class RemoveSpectatorPacket(val battleId: UUID) : NetworkPacket<RemoveSpectatorPacket> {
|
||||
override val id = ID
|
||||
override fun encode(buffer: PacketByteBuf) {
|
||||
buffer.writeUuid(battleId)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val ID = cobblemonResource("remove_spectator")
|
||||
fun decode(buffer: PacketByteBuf) = RemoveSpectatorPacket(buffer.readUuid())
|
||||
}
|
||||
}
|
||||
-26
@@ -1,26 +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.net.messages.server.battle
|
||||
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.PacketByteBuf
|
||||
import java.util.UUID
|
||||
|
||||
class SpectateBattlePacket(val targetedEntityId: UUID) : NetworkPacket<SpectateBattlePacket> {
|
||||
override val id = ID
|
||||
override fun encode(buffer: PacketByteBuf) {
|
||||
buffer.writeUuid(targetedEntityId)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val ID = cobblemonResource("battle_spectate")
|
||||
fun decode(buffer: PacketByteBuf) = SpectateBattlePacket(buffer.readUuid())
|
||||
}
|
||||
}
|
||||
-40
@@ -1,40 +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.net.serverhandling
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||
import com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.RequestPlayerInteractionsPacket
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import java.util.EnumSet
|
||||
|
||||
object RequestInteractionsHandler : ServerNetworkPacketHandler<RequestPlayerInteractionsPacket> {
|
||||
override fun handle(
|
||||
packet: RequestPlayerInteractionsPacket,
|
||||
server: MinecraftServer,
|
||||
player: ServerPlayerEntity
|
||||
) {
|
||||
//We could potentially check if the targeted player has pokemon here
|
||||
val options = EnumSet.of(PlayerInteractOptionsPacket.Options.TRADE)
|
||||
|
||||
val isTargetBattling = BattleRegistry.getBattleByParticipatingPlayerId(packet.targetId) != null
|
||||
if (isTargetBattling and Cobblemon.config.allowSpectating) {
|
||||
options.add(PlayerInteractOptionsPacket.Options.SPECTATE_BATTLE)
|
||||
}
|
||||
else {
|
||||
options.add(PlayerInteractOptionsPacket.Options.BATTLE)
|
||||
}
|
||||
PlayerInteractOptionsPacket(options, packet.targetId, packet.targetNumericId, packet.pokemonId).sendToPlayer(player)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
-26
@@ -1,26 +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.net.serverhandling.battle
|
||||
|
||||
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.RemoveSpectatorPacket
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
|
||||
object RemoveSpectatorHandler : ServerNetworkPacketHandler<RemoveSpectatorPacket> {
|
||||
override fun handle(
|
||||
packet: RemoveSpectatorPacket,
|
||||
server: MinecraftServer,
|
||||
player: ServerPlayerEntity
|
||||
) {
|
||||
BattleRegistry.getBattle(packet.battleId)?.spectators?.remove(player.uuid)
|
||||
}
|
||||
|
||||
}
|
||||
-40
@@ -1,40 +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.net.serverhandling.battle
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
||||
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleInitializePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.SpectateBattlePacket
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.server.network.ServerPlayerEntity
|
||||
import org.apache.logging.log4j.LogManager
|
||||
|
||||
object SpectateBattleHandler : ServerNetworkPacketHandler<SpectateBattlePacket> {
|
||||
val LOGGER = LogManager.getLogger()
|
||||
override fun handle(
|
||||
packet: SpectateBattlePacket,
|
||||
server: MinecraftServer,
|
||||
player: ServerPlayerEntity
|
||||
) {
|
||||
val battle = BattleRegistry.getBattleByParticipatingPlayerId(packet.targetedEntityId)
|
||||
if ((battle != null) and Cobblemon.config.allowSpectating) {
|
||||
battle!!.spectators.add(player.uuid)
|
||||
player.sendPacket(BattleInitializePacket(battle, null))
|
||||
player.sendPacket(BattleMessagePacket(battle.chatLog))
|
||||
}
|
||||
else {
|
||||
LOGGER.error("Battle of player id ${packet.targetedEntityId} not found (${player.uuid} tried spectating)")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -36,7 +36,7 @@ object SendOutPokemonHandler : ServerNetworkPacketHandler<SendOutPokemonPacket>
|
||||
val trace = player.traceBlockCollision(maxDistance = 15F)
|
||||
if (trace != null && !player.world.getBlockState(trace.blockPos.up()).isSolid) {
|
||||
val position = Vec3d(trace.location.x, trace.blockPos.up().toVec3d().y, trace.location.z)
|
||||
pokemon.sendOutWithAnimation(player, player.serverWorld, position)
|
||||
pokemon.sendOutWithAnimation(player, player.serverWorld, position)
|
||||
}
|
||||
} else {
|
||||
val entity = state.entity
|
||||
|
||||
-68
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.pokemon.evolution.progress
|
||||
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.progress.EvolutionProgress
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.evolution.requirements.BattleCriticalHitsRequirement
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.google.gson.JsonObject
|
||||
import net.minecraft.nbt.NbtCompound
|
||||
import net.minecraft.util.Identifier
|
||||
|
||||
class LastBattleCriticalHitsEvolutionProgress : EvolutionProgress<LastBattleCriticalHitsEvolutionProgress.Progress> {
|
||||
|
||||
private var progress = Progress(0)
|
||||
|
||||
override fun id(): Identifier = ID
|
||||
|
||||
override fun currentProgress(): Progress = this.progress
|
||||
|
||||
override fun updateProgress(progress: Progress) {
|
||||
this.progress = progress
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
this.updateProgress(Progress(0))
|
||||
}
|
||||
|
||||
override fun shouldKeep(pokemon: Pokemon): Boolean = supports(pokemon)
|
||||
|
||||
override fun loadFromNBT(nbt: NbtCompound) {
|
||||
val amount = nbt.getInt(AMOUNT)
|
||||
this.updateProgress(Progress(amount))
|
||||
}
|
||||
|
||||
override fun saveToNBT(): NbtCompound = NbtCompound().apply { putInt(AMOUNT, currentProgress().amount) }
|
||||
|
||||
override fun loadFromJson(json: JsonObject) {
|
||||
val amount = json.get(AMOUNT).asInt
|
||||
this.updateProgress(Progress(amount))
|
||||
}
|
||||
|
||||
override fun saveToJson(): JsonObject = JsonObject().apply { addProperty(AMOUNT, currentProgress().amount) }
|
||||
|
||||
data class Progress(val amount: Int)
|
||||
|
||||
companion object {
|
||||
|
||||
val ID = cobblemonResource(BattleCriticalHitsRequirement.ADAPTER_VARIANT)
|
||||
private const val AMOUNT = "amount"
|
||||
|
||||
fun supports(pokemon: Pokemon): Boolean {
|
||||
return pokemon.form.evolutions.any { evolution ->
|
||||
evolution.requirements.any { requirement ->
|
||||
requirement is BattleCriticalHitsRequirement
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+16
-6
@@ -9,8 +9,9 @@
|
||||
package com.cobblemon.mod.common.pokemon.evolution.requirements
|
||||
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.requirement.EvolutionRequirement
|
||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.evolution.progress.LastBattleCriticalHitsEvolutionProgress
|
||||
import kotlin.jvm.optionals.getOrNull
|
||||
|
||||
/**
|
||||
* An [EvolutionRequirement] for a certain amount of critical hits in a single battle.
|
||||
@@ -20,7 +21,6 @@ import com.cobblemon.mod.common.pokemon.evolution.progress.LastBattleCriticalHit
|
||||
* @author Licious
|
||||
* @since October 2nd, 2022
|
||||
*/
|
||||
@Suppress("unused", "CanBePrimaryConstructorProperty")
|
||||
class BattleCriticalHitsRequirement(amount: Int) : EvolutionRequirement {
|
||||
|
||||
constructor() : this(0)
|
||||
@@ -30,10 +30,20 @@ class BattleCriticalHitsRequirement(amount: Int) : EvolutionRequirement {
|
||||
*/
|
||||
val amount = amount
|
||||
|
||||
override fun check(pokemon: Pokemon): Boolean = pokemon.evolutionProxy.current()
|
||||
.progress()
|
||||
.filterIsInstance<LastBattleCriticalHitsEvolutionProgress>()
|
||||
.any { progress -> progress.currentProgress().amount >= this.amount }
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
override fun check(pokemon: Pokemon): Boolean {
|
||||
val pokemonEntity = pokemon.entity ?: return false
|
||||
val battleId = pokemonEntity.battleId.get().getOrNull() ?: return false
|
||||
val battle = BattleRegistry.getBattle(battleId) ?: return false
|
||||
battle.actors.forEach { actor ->
|
||||
actor.pokemonList.forEach { battlePokemon ->
|
||||
if (battlePokemon.effectedPokemon.uuid == pokemon.uuid) {
|
||||
return battlePokemon.criticalHits >= this.amount
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val ADAPTER_VARIANT = "battle_critical_hits"
|
||||
|
||||
+1
-13
@@ -12,7 +12,6 @@ import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
|
||||
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||
import com.cobblemon.mod.common.api.pokemon.helditem.HeldItemManager
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.battleLang
|
||||
@@ -29,7 +28,6 @@ import java.util.function.Function
|
||||
* @author Licious
|
||||
* @since December 30th, 2022
|
||||
*/
|
||||
@Suppress("unused")
|
||||
object CobblemonHeldItemManager : BaseCobblemonHeldItemManager() {
|
||||
|
||||
/**
|
||||
@@ -75,8 +73,8 @@ object CobblemonHeldItemManager : BaseCobblemonHeldItemManager() {
|
||||
}
|
||||
|
||||
override fun handleStartInstruction(pokemon: BattlePokemon, battle: PokemonBattle, battleMessage: BattleMessage) {
|
||||
val consumeHeldItems = Cobblemon.config.consumeHeldItems
|
||||
val itemID = battleMessage.effectAt(1)?.id ?: return
|
||||
val consumeHeldItems = this.shouldConsumeItem(pokemon, battle, itemID)
|
||||
if (battleMessage.hasOptionalArgument("silent")) {
|
||||
if (consumeHeldItems) {
|
||||
this.take(pokemon, itemID)
|
||||
@@ -139,16 +137,6 @@ object CobblemonHeldItemManager : BaseCobblemonHeldItemManager() {
|
||||
battle.broadcastChatMessage(text)
|
||||
}
|
||||
|
||||
override fun shouldConsumeItem(pokemon: BattlePokemon, battle: PokemonBattle, showdownId: String): Boolean {
|
||||
// In 3rd party and the future battles might have multiple types, give it a priority from pvp down to wild.
|
||||
val tag = when {
|
||||
battle.isPvP -> CobblemonItemTags.CONSUMED_IN_PVP_BATTLE
|
||||
battle.isPvN -> CobblemonItemTags.CONSUMED_IN_NPC_BATTLE
|
||||
else -> CobblemonItemTags.CONSUMED_IN_WILD_BATTLE
|
||||
}
|
||||
return pokemon.effectedPokemon.heldItem().isIn(tag)
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a custom mapping from [Item] to showdown ID string.
|
||||
*
|
||||
|
||||
-3
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.api.data.DataRegistry
|
||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||
import com.cobblemon.mod.common.api.pokemon.Natures
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||
import com.cobblemon.mod.common.api.pokemon.status.Statuses
|
||||
import com.cobblemon.mod.common.api.properties.CustomPokemonProperty
|
||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||
import com.cobblemon.mod.common.api.types.ElementalTypes
|
||||
@@ -147,8 +146,6 @@ internal object PropertiesCompletionProvider : DataRegistry {
|
||||
this.inject(setOf("${statName}_iv"), setOf("0", IVs.MAX_VALUE.toString()))
|
||||
this.inject(setOf("${statName}_ev"), setOf("0", EVs.MAX_STAT_VALUE.toString()))
|
||||
}
|
||||
|
||||
this.inject(setOf("status"), Statuses.getPersistentStatuses().map { if (it.name.namespace == Cobblemon.MODID) it.name.path else it.name.toString() })
|
||||
}
|
||||
|
||||
private fun addCustom() {
|
||||
|
||||
@@ -123,15 +123,13 @@ object DataKeys {
|
||||
const val CAN_BE_MILKED = "milkable"
|
||||
const val HAS_BEEN_SHEARED = "sheared"
|
||||
|
||||
// Variants
|
||||
const val IS_MOOSHTANK = "mooshtank"
|
||||
|
||||
// Persistent Data
|
||||
const val POKEMON_PERSISTENT_DATA = "PersistentData"
|
||||
|
||||
// Item Tooltips
|
||||
const val HIDE_TOOLTIP = "HideTooltip"
|
||||
|
||||
|
||||
// Shoulder Mount
|
||||
const val SHOULDER_UUID = "shoulder_uuid"
|
||||
const val SHOULDER_SPECIES = "shoulder_species"
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"sources": [
|
||||
{
|
||||
"type": "directory",
|
||||
"source": "entity/signs",
|
||||
"prefix": "entity/signs/"
|
||||
}
|
||||
]
|
||||
}
|
||||
+140
-555
@@ -4,7 +4,7 @@
|
||||
"animation.poke_ball.open": {
|
||||
"animation_length": 0.5,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": [-5, 0, 0],
|
||||
@@ -21,119 +21,46 @@
|
||||
"0.2083": [-105, 0, 0],
|
||||
"0.4167": [-70, 0, 0]
|
||||
}
|
||||
},
|
||||
"ball": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": [15, 0, 0],
|
||||
"0.1667": [-10, 0, 0],
|
||||
"0.3333": [22.5, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0833": [0, 0, 0],
|
||||
"0.125": [0, -0.1, 0],
|
||||
"0.1667": [0, 0.1, 0],
|
||||
"0.2083": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.open_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": [35, 0, 0]
|
||||
},
|
||||
"lid": {
|
||||
"rotation": ["-70+math.sin(q.anim_time*90*10)*0.6+math.sin(q.anim_time*90*1)*3", 0, 0]
|
||||
},
|
||||
"ball": {
|
||||
"rotation": ["22.5-math.sin(q.anim_time*90*10)*0.4-math.sin(q.anim_time*90*1)*2", 0, "0-math.sin(q.anim_time*90*2)*0.5"],
|
||||
"position": [0, "math.sin(q.anim_time*90*2-60)*0.1", 0]
|
||||
"rotation": [-70, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.shut": {
|
||||
"animation_length": 0.5,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [35, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0833": {
|
||||
"post": [40, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.1667": {
|
||||
"post": [-5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0": [35, 0, 0],
|
||||
"0.0833": [40, 0, 0],
|
||||
"0.1667": [-5, 0, 0],
|
||||
"0.2083": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"lid": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [-70, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0833": {
|
||||
"post": [-80, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.1667": {
|
||||
"post": [2.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0": [-70, 0, 0],
|
||||
"0.0833": [-80, 0, 0],
|
||||
"0.1667": [2.5, 0, 0],
|
||||
"0.2083": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"ball": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [22.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.125": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2083": {
|
||||
"post": [0, 0, -2.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [0, 0, 2.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4167": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": [0, 0, 0],
|
||||
"0.2083": [0, -0.1, 0],
|
||||
"0.25": [0, 0.1, 0],
|
||||
"0.2917": [0, -0.1, 0],
|
||||
"0.3333": [0, 0.1, 0],
|
||||
"0.375": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.shut_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"rotation": ["math.sin(q.anim_time*90*0.5)*0.4", 0, "math.cos(q.anim_time*90*0.5)*0.2"]
|
||||
"base": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"lid": {
|
||||
"rotation": [0, 0, 0]
|
||||
@@ -143,108 +70,40 @@
|
||||
"animation.poke_ball.bounce": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0417": {
|
||||
"post": [5.00232, -2.48336, 3.67327],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0833": {
|
||||
"post": [0, 0, -2.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [0, 1.6, -9],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": {
|
||||
"post": [0, 2.5, -9],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5417": {
|
||||
"post": [0, -2.1, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [0, -3.1, 5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": {
|
||||
"post": [0, -2, 2.1],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [0, -1.9, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.9167": {
|
||||
"post": [0, -0.3, 0.6],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
},
|
||||
"position": {
|
||||
"0.0417": [0, 0, 0],
|
||||
"0.0833": [0, -0.5, 0],
|
||||
"0.125": [0, 1.5, 0],
|
||||
"0.1667": [0, 3.25, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 3.5, 0],
|
||||
"post": [0, 3.5, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [0, 2.75, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4167": {
|
||||
"post": [0, 1.19, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5": {
|
||||
"post": [0, -0.25, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5833": {
|
||||
"post": [0, 1, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7083": {
|
||||
"post": [0, 0.67, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.875": {
|
||||
"post": [0, 0.2, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"lid": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, 0, 0],
|
||||
"0.4583": [0, 0, 0],
|
||||
"0.5417": [2.5, 0, 0],
|
||||
"0.6667": [0, 0, 0],
|
||||
"0.0": [0, 0, 5],
|
||||
"0.0417": [0, 0, -2.5],
|
||||
"0.125": [0, 0, -5],
|
||||
"0.2083": [0, 0, -7.5],
|
||||
"0.2917": [0, 0, -10],
|
||||
"0.4583": [0, 0, -10],
|
||||
"0.5": [0, 0, 0],
|
||||
"0.5833": [0, 0, 5],
|
||||
"0.6667": [0, 0, 7.5],
|
||||
"0.75": [0, 0, 0],
|
||||
"0.7917": [0, 0, -2.5],
|
||||
"0.8333": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, -0.25, 0],
|
||||
"0.0833": [0, -0.5, 0],
|
||||
"0.2083": [0, 0, 0]
|
||||
"0.0": [0, -0.5, 0],
|
||||
"0.0417": [0, 1.5, 0],
|
||||
"0.125": [0, 3.75, 0],
|
||||
"0.2083": [0, 3, 0],
|
||||
"0.2917": [0, 2.75, 0],
|
||||
"0.375": [0, 1.19, 0],
|
||||
"0.4583": [0, -0.25, 0],
|
||||
"0.5833": [0, 1, 0],
|
||||
"0.6667": [0, 0.67, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"lid": {
|
||||
"rotation": [0, 0, 0],
|
||||
"position": {
|
||||
"0.0": [0, -0.25, 0],
|
||||
"0.0417": [0, -0.5, 0],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -252,11 +111,14 @@
|
||||
"animation.poke_ball.bob1": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": ["math.sin(q.anim_time*90*12)*15", 0, "-math.sin(q.anim_time*90*8)*10"],
|
||||
"0.6667": ["math.sin(q.anim_time*90*15)*2", 0, "-math.sin(q.anim_time*90*8)*2"],
|
||||
"0.875": [0, 0, 0]
|
||||
"0.0": [2.46271, -0.86717, 4.92442],
|
||||
"0.0417": [15, 0, 0],
|
||||
"0.1667": [0, 0, -15],
|
||||
"0.2917": [-10, 0, 0],
|
||||
"0.375": [0, 0, 5],
|
||||
"0.5": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -264,11 +126,14 @@
|
||||
"animation.poke_ball.bob2": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": ["math.sin(q.anim_time*90*12)*15", 0, "math.sin(q.anim_time*90*8)*10"],
|
||||
"0.6667": ["math.sin(q.anim_time*90*15)*2", 0, "math.sin(q.anim_time*90*8)*2"],
|
||||
"0.875": [0, 0, 0]
|
||||
"0.0": [2.46271, 0.86717, -4.92442],
|
||||
"0.0417": [15, 0, 0],
|
||||
"0.1667": [0, 0, 15],
|
||||
"0.2917": [-10, 0, 0],
|
||||
"0.375": [0, 0, -5],
|
||||
"0.5": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -276,17 +141,22 @@
|
||||
"animation.poke_ball.bob3": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": ["math.cos(q.anim_time*90*10-60)*1", "math.sin(q.anim_time*90*10-60)*2", "-math.sin(q.anim_time*90*10-60)*14"],
|
||||
"0.5": [0, "math.sin(q.anim_time*90*10-60)*1", "-math.sin(q.anim_time*90*10-60)*6"],
|
||||
"0.75": [0, "math.sin(q.anim_time*90*10-60)*1", "-math.sin(q.anim_time*90*10-60)*1"],
|
||||
"0.9583": [0, 0, 0]
|
||||
"0.0417": [0, 0, 7.5],
|
||||
"0.1667": [0, 0, -12.5],
|
||||
"0.3333": [0, 0, 7.5],
|
||||
"0.4167": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": ["-math.sin(q.anim_time*90*10)*0.5", 0, 0],
|
||||
"0.6667": [0, 0, 0]
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": [-1, 0, 0],
|
||||
"0.125": [-1.5, 0, 0],
|
||||
"0.1667": [-1, 0, 0],
|
||||
"0.25": [1, 0, 0],
|
||||
"0.2917": [1.25, 0, 0],
|
||||
"0.375": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -294,17 +164,22 @@
|
||||
"animation.poke_ball.bob4": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": ["math.cos(q.anim_time*90*10-60)*1", "-math.sin(q.anim_time*90*10-60)*2", "math.sin(q.anim_time*90*10-60)*14"],
|
||||
"0.5": [0, "-math.sin(q.anim_time*90*10-60)*1", "math.sin(q.anim_time*90*10-60)*6"],
|
||||
"0.75": [0, "-math.sin(q.anim_time*90*10-60)*1", "math.sin(q.anim_time*90*10-60)*1"],
|
||||
"0.9583": [0, 0, 0]
|
||||
"0.0417": [0, 0, -7.5],
|
||||
"0.1667": [0, 0, 12.5],
|
||||
"0.3333": [0, 0, -7.5],
|
||||
"0.4167": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": ["math.sin(q.anim_time*90*10)*0.5", 0, 0],
|
||||
"0.6667": [0, 0, 0]
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": [1, 0, 0],
|
||||
"0.125": [1.5, 0, 0],
|
||||
"0.1667": [1, 0, 0],
|
||||
"0.25": [-1, 0, 0],
|
||||
"0.2917": [-1.25, 0, 0],
|
||||
"0.375": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -312,76 +187,24 @@
|
||||
"animation.poke_ball.bob5": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.125": {
|
||||
"post": [10.00933, 2.462, 0.43439],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [-2.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [-5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": {
|
||||
"post": [-7.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": {
|
||||
"post": [-14.98637, 0.64686, 2.41492],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5833": {
|
||||
"post": [4.99527, 0.21782, -2.4905],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7083": {
|
||||
"post": [-1, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.9583": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
"0.0": [10, 0, 0],
|
||||
"0.0833": [-2.5, 0, 0],
|
||||
"0.1667": [-5, 0, 0],
|
||||
"0.25": [-7.5, 0, 0],
|
||||
"0.3333": [-15, 0, 0],
|
||||
"0.375": [0, 0, 0],
|
||||
"0.4583": [5, 0, 0],
|
||||
"0.5": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0833": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 3, 0],
|
||||
"post": [0, 3, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [0, 4.5, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [0, 4, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4167": {
|
||||
"post": [0, 1.75, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": [0, 0, 0],
|
||||
"0.5": [0, -0.1, 0],
|
||||
"0.5417": [0, 0.1, 0],
|
||||
"0.5833": [0, -0.1, 0],
|
||||
"0.625": [0, 0.1, 0],
|
||||
"0.6667": [0, -0.1, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
"0.0": [0, -0.5, 0],
|
||||
"0.0833": [0, 4, 0],
|
||||
"0.1667": [0, 4.5, 0],
|
||||
"0.25": [0, 4, 0],
|
||||
"0.3333": [0, 1.75, 0],
|
||||
"0.375": [0, -0.5, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -389,86 +212,24 @@
|
||||
"animation.poke_ball.bob6": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0417": {
|
||||
"post": [0, 0, -11.1],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.125": {
|
||||
"post": [0, 0, -2.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [0, 0, 10],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [0, 0, 15],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4167": {
|
||||
"post": [0, 0, 13.2],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": {
|
||||
"post": [0, 0, 1.4],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5833": {
|
||||
"post": [0, 0, -5.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.6667": {
|
||||
"post": [0, 0, 0.3],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [0, 0, -0.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.9583": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
"0.0": [0, 0, -10],
|
||||
"0.0833": [0, 0, -2.5],
|
||||
"0.1667": [0, 0, 10],
|
||||
"0.25": [0, 0, 15],
|
||||
"0.3333": [0, 0, 15],
|
||||
"0.375": [0, 0, 0],
|
||||
"0.4583": [0, 0, -7.5],
|
||||
"0.5417": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0833": [0, 0, 0],
|
||||
"0.1667": {
|
||||
"pre": [0, 3, 0],
|
||||
"post": [0, 3, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [0, 4.5, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [0, 4, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4167": {
|
||||
"post": [0, 1.75, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": [0, 0, 0],
|
||||
"0.5": [0, -0.1, 0],
|
||||
"0.5417": [0, 0.1, 0],
|
||||
"0.5833": [0, -0.1, 0],
|
||||
"0.625": [0, 0.1, 0],
|
||||
"0.6667": [0, -0.1, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"ball": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.375": [0, 4, 0],
|
||||
"0.5833": [0, 0, 0]
|
||||
"0.0": [0, -0.5, 0],
|
||||
"0.0833": [0, 4, 0],
|
||||
"0.1667": [0, 4.5, 0],
|
||||
"0.25": [0, 4, 0],
|
||||
"0.3333": [0, 1.75, 0],
|
||||
"0.375": [0, -0.5, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -476,221 +237,45 @@
|
||||
"animation.poke_ball.critical": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"base": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0.5, 0, 0],
|
||||
"0.0833": [-0.5, 0, 0],
|
||||
"0.125": [0, 0, 0],
|
||||
"0.1667": [-0.75, 0, 0],
|
||||
"0.2083": [0.5, 0, 0],
|
||||
"0.25": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.capture": {
|
||||
"animation_length": 0.5,
|
||||
"bones": {
|
||||
"base": {
|
||||
"rotation": {
|
||||
"0.0": [-2.5, 0, 0],
|
||||
"0.0417": [5, 0, 0],
|
||||
"0.0833": [0, 0, 0]
|
||||
},
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"lid": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, "math.sin(q.anim_time*90*10)*3", "math.sin(q.anim_time*90*30-90)*2"],
|
||||
"0.7083": [0, "math.sin(q.anim_time*90*10)*1", "math.sin(q.anim_time*90*10-90)*0.4"],
|
||||
"0.9167": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": ["math.sin(q.anim_time*90*40)*1.5", "math.sin(q.anim_time*90*80)*0.2", 0],
|
||||
"0.4167": ["math.sin(q.anim_time*90*20)*0.3", "math.sin(q.anim_time*90*40)*0.1", 0],
|
||||
"0.75": [0, 0, 0]
|
||||
"0.0417": [2.5, 0, 0],
|
||||
"0.0833": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.throw": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"rotation": ["-(q.anim_time - 0.38) * 720", 0, 0],
|
||||
"position": [0, "4 + Math.Sin((q.anim_time + 0.5) * 720) * 4", "Math.Sin((q.anim_time - 0.1275) * 720) * 4"]
|
||||
},
|
||||
"ball": {
|
||||
"rotation": [0, 0, "-math.sin(q.anim_time*90*1)*10-math.sin(q.anim_time*90*20)*3"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.throw_horizontal": {
|
||||
"loop": true,
|
||||
"animation_length": 2,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"rotation": [0, "(q.anim_time - 0.38) * 720", 0]
|
||||
},
|
||||
"ball": {
|
||||
"rotation": [0, "math.sin(q.anim_time*90*1)*8", "math.sin(q.anim_time*90*2-60)*8+math.sin(q.anim_time*90*8)*2"],
|
||||
"position": ["-math.sin(q.anim_time*90*2)*1", "math.sin(q.anim_time*90*8)*0.1", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.throw_beast": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"scale": [1, 1, "1+math.sin(q.anim_time*90*1)*0.1"]
|
||||
},
|
||||
"ball": {
|
||||
"rotation": [0, 0, "(q.anim_time - 0.38) * 720"],
|
||||
"position": ["math.sin(q.anim_time*90*1)*1", "math.sin(q.anim_time*90*2)*0.5", "math.sin(q.anim_time*90*20)*0.1"],
|
||||
"scale": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.throw_ace": {
|
||||
"loop": true,
|
||||
"animation_length": 2,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"rotation": [0, "(q.anim_time - 0.38) * (1440+720)", 0],
|
||||
"scale": ["1.1+math.sin(q.anim_time*90*2)*0.1", 0.9, "1.1+math.sin(q.anim_time*90*2)*0.1"]
|
||||
},
|
||||
"ball": {
|
||||
"rotation": [0, "math.sin(q.anim_time*90*1)*8", "math.sin(q.anim_time*90*2-60)*8+math.sin(q.anim_time*90*8)*2"],
|
||||
"position": ["-math.sin(q.anim_time*90*2)*1", "math.cos(q.anim_time*90*2)*0.1", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.break": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"ball": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.3333": [0, -15, 0],
|
||||
"0.4583": [0, -15, 0]
|
||||
}
|
||||
},
|
||||
"bottom": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0417": {
|
||||
"post": [10.00933, 2.462, 0.43439],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0833": {
|
||||
"post": [-2.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2083": {
|
||||
"post": [1.2, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [-2.18637, 0.64686, 2.41492],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": {
|
||||
"post": [-0.86335, -0.04043, -0.15093],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5417": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.6667": {
|
||||
"post": [0.5, 0.00297, 0.01109],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [0.2, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, 0, 0],
|
||||
"0.0833": {
|
||||
"pre": [0, 1, 0],
|
||||
"post": [0, 1, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.1667": {
|
||||
"post": [0, 1.7, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [0, 0.55, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": [0, 0, 0],
|
||||
"0.3333": [0, -0.1, 0],
|
||||
"0.375": [0, 0.1, 0],
|
||||
"0.4167": [0, -0.1, 0],
|
||||
"0.4583": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"lid": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [2, 0, 0],
|
||||
"0.125": [-163, 0, -9],
|
||||
"0.2917": [-142.06462, -15.59097, 16.16746],
|
||||
"0.375": {
|
||||
"pre": [-173.66608, -1.87837, 16.30697],
|
||||
"post": [-173.66608, -1.87837, 16.30697],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [-150.60076, -1.11104, 19.38321],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [-153.28391, -1.57451, 20.44204],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.9583": [-154.20104, -1.23272, 20.47764]
|
||||
},
|
||||
"position": {
|
||||
"0.0417": [0, 0, 0],
|
||||
"0.0833": [0, 0, 0],
|
||||
"0.1667": [0, 0, 0],
|
||||
"0.2917": [0, -0.3, 0.2]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.poke_ball.capture": {
|
||||
"animation_length": 0.75,
|
||||
"bones": {
|
||||
"bottom": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": ["-2+math.sin(q.anim_time*90*2)*10", 0, 0],
|
||||
"0.0833": ["1.5+math.sin(q.anim_time*90*16)*2", 0, 0],
|
||||
"0.2917": ["-0.2+math.sin(q.anim_time*90*6)*0.2", 0, 0],
|
||||
"0.4583": [0, 0, 0]
|
||||
},
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"lid": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0417": {
|
||||
"post": [3.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0833": {
|
||||
"post": [0.2, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.1667": {
|
||||
"post": [0.1, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
"base": {
|
||||
"rotation": ["(q.anim_time - 0.38) * 720", 0, 0],
|
||||
"position": [0, "4 + Math.Sin((q.anim_time + 0.5) * 720) * 4", "Math.Sin((q.anim_time - 0.1275) * 720) * -4"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-15
@@ -16,20 +16,8 @@
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "ball",
|
||||
"name": "base",
|
||||
"parent": "poke_ball",
|
||||
"pivot": [0, 4, 0],
|
||||
"locators": {
|
||||
"bottom_particles": {
|
||||
"offset": [0, 0, 0],
|
||||
"rotation": [180, 0, 0]
|
||||
},
|
||||
"center_particles": [0, 4, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "bottom",
|
||||
"parent": "ball",
|
||||
"pivot": [0, 0, 0],
|
||||
"cubes": [
|
||||
{"origin": [-4, 0, -4], "size": [8, 4, 8], "inflate": 0.25, "uv": [32, 20]},
|
||||
@@ -38,13 +26,16 @@
|
||||
},
|
||||
{
|
||||
"name": "lid",
|
||||
"parent": "bottom",
|
||||
"parent": "base",
|
||||
"pivot": [0, 4, 4],
|
||||
"cubes": [
|
||||
{"origin": [-4, 4, -4], "size": [8, 4, 8], "uv": [0, 0]},
|
||||
{"origin": [-1, 3, -4.255], "size": [2, 2, 0], "uv": [0, 0]},
|
||||
{"origin": [-4, 4, -4], "size": [8, 4, 8], "inflate": 0.26, "uv": [0, 20]}
|
||||
]
|
||||
],
|
||||
"locators": {
|
||||
"beam": [0, 0.5, 0]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+201
-55
@@ -3,7 +3,6 @@
|
||||
"animations": {
|
||||
"animation.rattata.ground_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 21.375,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": ["math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
@@ -16,36 +15,39 @@
|
||||
"whisker_right": {
|
||||
"rotation": [0, "math.sin(q.anim_time*90*8*2)*4", 0]
|
||||
},
|
||||
"whisker_left": {
|
||||
"rotation": [0, "-math.sin(q.anim_time*90*8*2)*4", 0]
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": [0, "math.sin(q.anim_time*90*4*2)*2", 0]
|
||||
},
|
||||
"ear_left": {
|
||||
"rotation": [0, "-math.sin(q.anim_time*90*4*2)*2", 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["37.5-math.sin(q.anim_time*90*8*2)*2", 0, 0]
|
||||
"rotation": ["45-math.sin(q.anim_time*90*8*2)*2", 0, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["45-math.sin(q.anim_time*90*8*2)*2", 0, 0]
|
||||
"rotation": ["15-math.sin(q.anim_time*90*8*2)*2", 0, 0]
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.02,-0.035,0.035)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [20, 0, 0]
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.01,-0.035,0.035)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.02,-0.035,0.035)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.01,-0.035,0.035)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.01,-0.025,0.025)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.01,-0.025,0.025)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [15, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -74,26 +76,6 @@
|
||||
],
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": ["math.clamp(math.sin(q.anim_time*90*4*2)*40,0,50)-math.clamp(math.sin(-q.anim_time*90*4*2)*40,0,50)", 0, 0],
|
||||
"position": [
|
||||
0,
|
||||
"-math.clamp(math.sin(q.anim_time*90*4*2)*1,0,2)-math.clamp(math.sin(-q.anim_time*90*4*2)*0.8,0,2)",
|
||||
"math.clamp(math.sin(q.anim_time*90*4*2-30)*0.5,0,2)-math.clamp(math.sin(q.anim_time*90*4*2-30+180)*0.5,0,2)"
|
||||
]
|
||||
},
|
||||
"whisker_right": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4*2)*8", 0]
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4*2)*8", 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": [
|
||||
"math.clamp(math.sin(-q.anim_time*90*4*1)*40,-50,0)+math.clamp(math.sin(q.anim_time*90*4*1)*40,-50,0)+math.clamp(math.sin(-q.anim_time*90*4*2)*50,0,40)",
|
||||
@@ -102,13 +84,39 @@
|
||||
],
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"leg_back_right": {
|
||||
"rotation": ["math.clamp(math.sin(q.anim_time*90*4*2)*40,0,50)-math.clamp(math.sin(-q.anim_time*90*4*2)*40,0,50)", 0, 0],
|
||||
"position": [
|
||||
0,
|
||||
"-math.clamp(math.sin(q.anim_time*90*4*2)*1,0,2)-math.clamp(math.sin(-q.anim_time*90*4*2)*0.8,0,2)",
|
||||
"math.clamp(math.sin(q.anim_time*90*4*2-30)*0.5,0,2)-math.clamp(math.sin(q.anim_time*90*4*2-30+180)*0.5,0,2)"
|
||||
]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": ["math.clamp(math.sin(q.anim_time*90*4*2+20)*40,0,50)-math.clamp(math.sin(-q.anim_time*90*4*2-20)*40,0,50)", 0, 0],
|
||||
"position": [
|
||||
0,
|
||||
"-math.clamp(math.sin(q.anim_time*90*4*2)*1,0,2)-math.clamp(math.sin(-q.anim_time*90*4*2)*0.8,0,2)",
|
||||
"math.clamp(math.sin(q.anim_time*90*4*2-30)*0.5,0,2)-math.clamp(math.sin(q.anim_time*90*4*2-30+180)*0.5,0,2)"
|
||||
]
|
||||
},
|
||||
"whisker_right": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4*2)*8", 0]
|
||||
},
|
||||
"whisker_left": {
|
||||
"rotation": [0, "-15-math.sin(q.anim_time*90*4*2)*8", 0]
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4*2)*8", 0]
|
||||
},
|
||||
"ear_left": {
|
||||
"rotation": [0, "-15-math.sin(q.anim_time*90*4*2)*8", 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [15, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -117,17 +125,23 @@
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [-3.75, 0, 0],
|
||||
"position": [0, -3.1, 0]
|
||||
"position": [0, -2.1, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["11.75-math.sin(q.anim_time*90*2)*1", -15.5, 2.5]
|
||||
"rotation": ["14.25-math.sin(q.anim_time*90*2)*1", -15.5, 2.5]
|
||||
},
|
||||
"whisker_right": {
|
||||
"rotation": [0, "20.25+math.sin(q.anim_time*90*2-40)*5", 0]
|
||||
},
|
||||
"whisker_left": {
|
||||
"rotation": [0, "-7.5-math.sin(q.anim_time*90*2-40)*6", 0]
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": [0, "35.5+math.sin(q.anim_time*90*2-40)*4", 0]
|
||||
},
|
||||
"ear_left": {
|
||||
"rotation": [0, "-20.5-math.sin(q.anim_time*90*2-40)*5", 0]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
@@ -141,31 +155,27 @@
|
||||
"tail2": {
|
||||
"rotation": ["11.25+math.sin(q.anim_time*90*2-40)*2", "28.5-math.sin(q.anim_time*90*2-80)*3", 5.5]
|
||||
},
|
||||
"tail4": {
|
||||
"tail3": {
|
||||
"rotation": ["5-math.sin(q.anim_time*90*2-80)*2", "35.75-math.sin(q.anim_time*90*2-120)*3", 3]
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": [-81.82706, 13.00814, 2.94613],
|
||||
"rotation": [-72.5, 4.25, 10.75],
|
||||
"position": [0, -0.75, 0]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": [-69.5, 10, -5.5],
|
||||
"position": [0, -0.75, 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": [65.81451, -6.32173, 19.33562],
|
||||
"rotation": [83.5, 8.5, -2.5],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": [80.75, 7.5, -15],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*2)*4", 0, 0]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": [-65.929, -37.44427, -4.88648]
|
||||
},
|
||||
"leg_back_right2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": [58.31451, 6.32173, -19.33562]
|
||||
},
|
||||
"leg_back_left2": {
|
||||
"rotation": [5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -223,6 +233,19 @@
|
||||
"1.3333": [0, 57.5, 0]
|
||||
}
|
||||
},
|
||||
"whisker_left": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, 47.5, 0],
|
||||
"0.2917": [0, -17.5, 0],
|
||||
"0.6667": [0, -17.5, 0],
|
||||
"0.8333": [23.28697, -8.33702, -47.37353],
|
||||
"1.2083": [23.28697, -8.33702, -47.37353],
|
||||
"1.25": [0, -17.5, 0],
|
||||
"1.2917": [0, 10, 0],
|
||||
"1.5": [0, -22.5, 0]
|
||||
}
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
@@ -234,6 +257,14 @@
|
||||
"1.3333": [42.37797, -19.10791, 71.77865]
|
||||
}
|
||||
},
|
||||
"ear_left": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": [0, 55, 0],
|
||||
"0.3333": [0, 5, 0],
|
||||
"1.1667": [0, 5, 0]
|
||||
}
|
||||
},
|
||||
"tail": {
|
||||
"rotation": {
|
||||
"0.0": [37.5, 0, 0],
|
||||
@@ -270,7 +301,7 @@
|
||||
"1.8333": [0, 0.15, -0.55]
|
||||
}
|
||||
},
|
||||
"tail4": {
|
||||
"tail3": {
|
||||
"rotation": {
|
||||
"0.0": [37.5, 0, 0],
|
||||
"0.4167": [0, 0, 0],
|
||||
@@ -299,6 +330,20 @@
|
||||
"1.2917": [24.39164, -4.7495, -4.16913]
|
||||
}
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": {
|
||||
"0.0": [-27.5, 0, 0],
|
||||
"0.0417": [32.5, 0, 0],
|
||||
"0.375": [-18.58597, -7.52076, -21.26765],
|
||||
"0.5": [-16.10644, -12.0174, -35.79355],
|
||||
"0.6667": [0.49517, -12.05747, -43.46231],
|
||||
"1.0": [4.14539, -11.34306, -61.32187],
|
||||
"1.2083": [4.15, -11.34, -61.32],
|
||||
"1.25": [-8.52646, 1.41216, 3.24052],
|
||||
"1.2917": [1.40521, -0.33839, -14.11818],
|
||||
"1.3333": [11.37038, -0.45956, -9.11953]
|
||||
}
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": {
|
||||
"0.0": [-20, 0, 0],
|
||||
@@ -310,6 +355,19 @@
|
||||
"1.3333": [35.10477, 0.68983, -3.38568]
|
||||
}
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": {
|
||||
"0.0": [-20, 0, 0],
|
||||
"0.0417": [30, 0, 0],
|
||||
"0.25": [67.5, 0, 0],
|
||||
"0.5": [64.96851, 25.25199, -11.26653],
|
||||
"1.0": [4.96851, 25.25199, -11.26653],
|
||||
"1.1667": [-10.50411, -2.15804, -13.5601],
|
||||
"1.2083": [-22.81593, 3.7097, 0.25192],
|
||||
"1.25": [6.96392, 1.76093, -4.35816],
|
||||
"1.2917": [-3.03608, 1.76093, -4.35816]
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
@@ -351,6 +409,94 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.rattata.cry": {
|
||||
"animation_length": 0.625,
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.125": {
|
||||
"post": [-15, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [-15, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.125": {
|
||||
"post": [60, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [60, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tail": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.125": [15, 0, 0],
|
||||
"0.2917": [15, 0, 0],
|
||||
"0.4583": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0417": {
|
||||
"effect": "pokemon.rattata.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.rattata_male.render": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [50, 0, 0]
|
||||
},
|
||||
"whisker_right": {
|
||||
"rotation": [36.07481, 23.1024, 41.77123]
|
||||
},
|
||||
"whisker_left": {
|
||||
"rotation": [0, -7.5, -25]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [30, 0, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [22.5, 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": [-66.88997, 22.29711, 3.09472],
|
||||
"position": [0, 0, -2.3]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": [17.35932, 2.24944, -7.15656]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+271
-314
@@ -3,7 +3,6 @@
|
||||
"animations": {
|
||||
"animation.rattata_alolan.ground_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 21.375,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": ["math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
@@ -27,25 +26,17 @@
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.02,-0.035,0.035)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.01,-0.035,0.035)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.01,-0.025,0.025)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": [15, 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": [20, 0, 0]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.02,-0.035,0.035)-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*8)*0.2", 0, 0],
|
||||
"position": [0, "-math.clamp(math.sin(q.anim_time*90*8+180)*0.05,-0.5,0.5)", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -112,257 +103,48 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.rattata_alolan.mouth_open": {
|
||||
"animation_length": 1.25,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [57.5, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, -0.3, -0.5]
|
||||
}
|
||||
},
|
||||
"mouth": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, 0, -0.11],
|
||||
"0.75": [0, -1, -0.1]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.rattata_alolan.standing": {
|
||||
"animation_length": 2.5,
|
||||
"animation.rattata_alolan.sleep": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-82.5, 0, 0],
|
||||
"1.25": [-82.5, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, -0.4, 0],
|
||||
"1.125": [0, -0.2, 0],
|
||||
"1.25": [0, -0.4, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
"rotation": [-3.75, 0, 0],
|
||||
"position": [0, -2.1, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [85, 0, 0],
|
||||
"1.25": [85, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, 0.3, -1.7],
|
||||
"1.25": [0, 0.3, -1.7],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
"rotation": ["14.25-math.sin(q.anim_time*90*2)*1", -15.5, 2.5]
|
||||
},
|
||||
"whisker_right": {
|
||||
"rotation": [0, "20.25+math.sin(q.anim_time*90*2-40)*5", 0]
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": [0, "35.5+math.sin(q.anim_time*90*2-40)*4", 0]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": {
|
||||
"0.0": [15, 0, 0],
|
||||
"0.75": [65, 0, 0],
|
||||
"1.25": [65, 0, 0],
|
||||
"2.0": [15, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, 2, -1],
|
||||
"1.25": [0, 2, -1],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
"rotation": ["-17.5+math.sin(q.anim_time*90*2)*2", "10-math.sin(q.anim_time*90*2-40)*3", -5],
|
||||
"position": [0, 0, -0.35]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": {
|
||||
"0.0": [50, 0, 0],
|
||||
"0.75": [50, 0, 0],
|
||||
"1.25": [50, 0, 0],
|
||||
"2.0": [50, 0, 0]
|
||||
}
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": {
|
||||
"0.0": [40, 0, 0],
|
||||
"0.75": [40, 0, 0],
|
||||
"1.25": [40, 0, 0],
|
||||
"2.0": [40, 0, 0]
|
||||
}
|
||||
"rotation": ["11.25+math.sin(q.anim_time*90*2-40)*2", "28.5-math.sin(q.anim_time*90*2-80)*3", 5.5]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": {
|
||||
"0.0": [20, 0, 0],
|
||||
"0.75": [20, 0, 0],
|
||||
"1.25": [20, 0, 0],
|
||||
"2.0": [20, 0, 0]
|
||||
}
|
||||
"rotation": ["5-math.sin(q.anim_time*90*2-80)*2", "35.75-math.sin(q.anim_time*90*2-120)*3", 3]
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 12, 70],
|
||||
"1.25": [45, 12, 70],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-0.2, 0.5, 0.5],
|
||||
"1.25": [-0.2, 0.5, 0.5],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_right_standing": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, 0, -35],
|
||||
"1.25": [0, 0, -35],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_right3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [80, -25, 0],
|
||||
"1.25": [80, -25, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0.3, -0.9, -0.8],
|
||||
"1.25": [0.3, -0.9, -0.8]
|
||||
}
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, -12, -70],
|
||||
"1.25": [45, -12, -70],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0.2, 0.5, 0.5],
|
||||
"1.25": [0.2, 0.5, 0.5],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_left_standing": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, 0, 35],
|
||||
"1.25": [0, 0, 35],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_left3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [80, 25, 0],
|
||||
"1.25": [80, 25, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0.3, -0.9, -0.8],
|
||||
"1.25": [0.3, -0.9, -0.8]
|
||||
}
|
||||
"rotation": [-72.5, 4.25, 10.75],
|
||||
"position": [0, -0.75, 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 0, 27.5],
|
||||
"1.25": [45, 0, 27.5],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0.2, -0.2, 0],
|
||||
"1.125": [0.2, -0.2, 0.2],
|
||||
"1.25": [0.2, -0.2, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
"rotation": [83.5, 8.5, -2.5],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"leg_back_right2": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [49.5, 0, 0],
|
||||
"1.25": [49.5, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, -0.6, -0.7],
|
||||
"1.25": [0, -0.6, -0.7],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_right3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-10, 0, -2],
|
||||
"1.25": [-10, 0, -2],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 0, -27.5],
|
||||
"1.25": [45, 0, -27.5],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-0.2, -0.2, 0],
|
||||
"1.125": [-0.2, -0.2, 0.2],
|
||||
"1.25": [-0.2, -0.2, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_left2": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [49.5, 0, 0],
|
||||
"1.25": [49.5, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, -0.6, -0.7],
|
||||
"1.25": [0, -0.6, -0.7],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_left3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-10, 0, 2],
|
||||
"1.25": [-10, 0, 2],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_left4": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 0, 0],
|
||||
"1.25": [45, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_right4": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 0, 0],
|
||||
"1.25": [45, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
"jaw": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*2)*4", 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -530,63 +312,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.rattata_alolan.sleep": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [-3.75, 0, 0],
|
||||
"position": [0, -3.1, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["11.75-math.sin(q.anim_time*90*2)*1", -15.5, 2.5]
|
||||
},
|
||||
"whisker_right": {
|
||||
"rotation": [0, "20.25+math.sin(q.anim_time*90*2-40)*5", 0]
|
||||
},
|
||||
"ear_right": {
|
||||
"rotation": [0, "35.5+math.sin(q.anim_time*90*2-40)*4", 0]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["-17.5+math.sin(q.anim_time*90*2)*2", "10-math.sin(q.anim_time*90*2-40)*3", -5],
|
||||
"position": [0, 0, -0.35]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["11.25+math.sin(q.anim_time*90*2-40)*2", "28.5-math.sin(q.anim_time*90*2-80)*3", 5.5]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": ["5-math.sin(q.anim_time*90*2-80)*2", "35.75-math.sin(q.anim_time*90*2-120)*3", 3]
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": [-81.82706, 13.00814, 2.94613],
|
||||
"position": [0, -0.75, 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": [65.81451, -6.32173, 19.33562],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*2)*4", 0, 0]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": [-65.929, -37.44427, -4.88648]
|
||||
},
|
||||
"leg_back_right2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": [58.31451, 6.32173, -19.33562]
|
||||
},
|
||||
"leg_back_left2": {
|
||||
"rotation": [5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.rattata_alolan.blink": {
|
||||
"animation_length": 0.16667,
|
||||
"bones": {
|
||||
@@ -606,21 +331,253 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.rattata_alolan.blink2": {
|
||||
"animation_length": 0.16667,
|
||||
"animation.rattata_alolan.mouth_open": {
|
||||
"animation_length": 1.25,
|
||||
"bones": {
|
||||
"eyelid_right": {
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [57.5, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0],
|
||||
"0.125": [-0.1, 0, 0],
|
||||
"0.1667": [0, 0, 0]
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, -0.3, -0.5]
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"mouth": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0],
|
||||
"0.125": [0.1, 0, 0],
|
||||
"0.1667": [0, 0, 0]
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": [0, 0, -0.11],
|
||||
"0.75": [0, -1, -0.1]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.rattata_alolan.standing": {
|
||||
"animation_length": 2.5,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-82.5, 0, 0],
|
||||
"1.25": [-82.5, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, -0.4, 0],
|
||||
"1.25": [0, -0.4, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [85, 0, 0],
|
||||
"1.25": [85, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, 0.3, -1.7],
|
||||
"1.25": [0, 0.3, -1.7],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"tail": {
|
||||
"rotation": {
|
||||
"0.0": [15, 0, 0],
|
||||
"0.75": [65, 0, 0],
|
||||
"1.25": [65, 0, 0],
|
||||
"2.0": [15, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, 2, -1],
|
||||
"1.25": [0, 2, -1],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": {
|
||||
"0.0": [50, 0, 0],
|
||||
"0.75": [50, 0, 0],
|
||||
"1.25": [50, 0, 0],
|
||||
"2.0": [50, 0, 0]
|
||||
}
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": {
|
||||
"0.0": [40, 0, 0],
|
||||
"0.75": [40, 0, 0],
|
||||
"1.25": [40, 0, 0],
|
||||
"2.0": [40, 0, 0]
|
||||
}
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": {
|
||||
"0.0": [20, 0, 0],
|
||||
"0.75": [20, 0, 0],
|
||||
"1.25": [20, 0, 0],
|
||||
"2.0": [20, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 12, 70],
|
||||
"1.25": [45, 12, 70],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-0.2, 0.5, 0.5],
|
||||
"1.25": [-0.2, 0.5, 0.5],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_right_standing": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, 0, -35],
|
||||
"1.25": [0, 0, -35],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_right3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [80, -25, 0],
|
||||
"1.25": [80, -25, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0.3, -0.9, -0.8],
|
||||
"1.25": [0.3, -0.9, -0.8]
|
||||
}
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, -12, -70],
|
||||
"1.25": [45, -12, -70],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0.2, 0.5, 0.5],
|
||||
"1.25": [0.2, 0.5, 0.5],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_left_standing": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, 0, 35],
|
||||
"1.25": [0, 0, 35],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_left3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [80, 25, 0],
|
||||
"1.25": [80, 25, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0.3, -0.9, -0.8],
|
||||
"1.25": [0.3, -0.9, -0.8]
|
||||
}
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 0, 27.5],
|
||||
"1.25": [45, 0, 27.5],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0.2, -0.2, 0],
|
||||
"1.25": [0.2, -0.2, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_right2": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [49.5, 0, 0],
|
||||
"1.25": [49.5, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, -0.6, -0.7],
|
||||
"1.25": [0, -0.6, -0.7],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_right3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-10, 0, -2],
|
||||
"1.25": [-10, 0, -2],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 0, -27.5],
|
||||
"1.25": [45, 0, -27.5],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-0.2, -0.2, 0],
|
||||
"1.25": [-0.2, -0.2, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_left2": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [49.5, 0, 0],
|
||||
"1.25": [49.5, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [0, -0.6, -0.7],
|
||||
"1.25": [0, -0.6, -0.7],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_back_left3": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [-10, 0, 2],
|
||||
"1.25": [-10, 0, 2],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_left4": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 0, 0],
|
||||
"1.25": [45, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"leg_front_right4": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.75": [45, 0, 0],
|
||||
"1.25": [45, 0, 0],
|
||||
"2.0": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-80
@@ -696,86 +696,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.raticate.cry": {
|
||||
"animation_length": 0.79167,
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.1667": {
|
||||
"post": [-9.06, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4583": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"snout": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0833": {
|
||||
"post": [-7.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [-7.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5417": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.0833": {
|
||||
"post": [20, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.125": [12.5, 0, 0],
|
||||
"0.1667": [15, 0, 0],
|
||||
"0.2083": [12.5, 0, 0],
|
||||
"0.25": [15, 0, 0],
|
||||
"0.2917": [12.5, 0, 0],
|
||||
"0.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0833": {
|
||||
"effect": "pokemon.raticate.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user