Compare commits

...
Author SHA1 Message Date
Flarkinater c9da67aa05 First attempt to add stadium camera test block (temporarily using display case assets) 2024-05-22 23:29:25 -04:00
Apion 5e6091c782 Merge branch 'tmetcalfe89/revive-event' into 'main'
added fossil revived event

See merge request cable-mc/cobblemon!1029
2024-05-22 07:26:52 +00:00
Timothy MetcalfeandApion 5a2e5479e0 added fossil revived event 2024-05-22 07:26:52 +00:00
Hiroku 4e1b82917b Merge branch 'Roaming-Gholdengo-Request' into 'main'
Lets Gholdengo maintain its roaming aspect

See merge request cable-mc/cobblemon!1025
2024-05-20 00:11:17 +00:00
Frank The FarmerandHiroku 3b1d257241 Lets Gholdengo maintain its roaming aspect 2024-05-20 00:11:16 +00:00
Hiroku 0b8f916648 Merge branch 'dimension-condition-uses-id-not-effects' into 'main'
Change dimension spawn condition to check with IDs not effects

See merge request cable-mc/cobblemon!1026
2024-05-20 00:11:02 +00:00
David Sadler 5ad7d5406a Change dimension spawn condition to check with IDs not effects 2024-05-19 18:45:34 +01:00
Paul 6ec008ee83 Merge remote-tracking branch 'origin/main' into 1.5-fixy
# Conflicts:
#	CHANGELOG.md
2024-05-19 11:19:13 +10:00
Hiroku f4d2226ec2 Merge branch '1.5.1' into 'main'
Moar 🐛🔫

Closes #847 and #799

See merge request cable-mc/cobblemon!1023
2024-05-18 01:50:12 +00:00
apion 0fc5d5e9d7 Fixed bad null handling 2024-05-17 21:41:58 -04:00
Hiroku 972c0f6430 Merge branch 'dubwool-dye' into 'main'
Make wooloos dyable

Closes #824

See merge request cable-mc/cobblemon!1021
2024-05-18 01:40:13 +00:00
ApionandHiroku 86db95a7dc Make wooloos dyable 2024-05-18 01:40:13 +00:00
apion be95b79e4d Removed unnecessary override 2024-05-17 21:20:20 -04:00
apion 5753443ab2 Optimized a player lookup 2024-05-17 20:39:27 -04:00
apion c6b7186032 Merge branch 'refs/heads/main' into 1.5.1
# Conflicts:
#	CHANGELOG.md
2024-05-17 20:35:50 -04:00
apion 32f3be2687 Changelog 2024-05-17 20:33:24 -04:00
apion 9012d78806 Apparently Kotlin uses .equals when using ==, === is Java == behavior 2024-05-17 20:30:18 -04:00
apion fffdfb7654 Fixes bug with InvMove, closes #847 2024-05-17 20:28:57 -04:00
Hiroku b314733f0b Merge branch 'Frank's-Bug-Fixing-Farm' into 'main'
Frank's bug fixing farm

See merge request cable-mc/cobblemon!1019
2024-05-17 10:44:01 +00:00
Frank The FarmerandHiroku d5aa07fe91 Frank's bug fixing farm 2024-05-17 10:44:00 +00:00
apion 27bedc2d2c Closes #799 2024-05-16 21:59:36 -04:00
Hiroku 86744c23a5 Merge branch '1.5.1' into 'main'
Fix recoil evo bug

Closes #844

See merge request cable-mc/cobblemon!1022
2024-05-17 01:41:41 +00:00
apion 8d1a64136f Fix recoil evo bug 2024-05-16 20:33:19 -04:00
Paul bc550dd32c Fixed unlocked evolutions getting re-checked and eating held items, fixes #843 2024-05-17 10:04:54 +10:00
Paul 3009af8c42 Fixed missing cant.nopp lang key, fixes #842 2024-05-17 08:52:23 +10:00
Hiroku bfd34eb621 Merge branch '1.5.1' into 'main'
Fixes a few issues

Closes #827, #828, #826, and #832

See merge request cable-mc/cobblemon!1012
2024-05-16 22:46:10 +00:00
Hiroku 2dc2c96176 Update CHANGELOG.md [skip-ci] 2024-05-16 22:44:00 +00:00
Hiroku df4db17cfd Removed println 2024-05-16 22:40:56 +00:00
apion 45bec488f1 Fixed bug with pasture block 2024-05-15 20:41:32 -04:00
apion 9287374504 Merge branch 'refs/heads/main' into 1.5.1 2024-05-15 18:24:56 -04:00
apion f2a36cd74a Merge branch 'refs/heads/main' into 1.5.1
# Conflicts:
#	CHANGELOG.md
2024-05-15 14:51:45 -04:00
apion 7ab3951613 Fix gilded chest item drops 2024-05-14 11:16:33 -04:00
apion e6d51c4d56 A little more fossil machine clean up 2024-05-14 10:26:25 -04:00
apion b9364304ca Changelog teehee 2024-05-14 09:47:35 -04:00
apion 8236c6fb11 Merge branch 'refs/heads/main' into 1.5.1 2024-05-14 04:13:40 -04:00
apion 2041d43db4 Hopefully fixed some other bugs 2024-05-14 03:53:35 -04:00
JazzMcNade 94d92b6fc0 Fixes #827
Jade can now view the contents of the analyzer block
2024-05-14 01:53:56 -05:00
apion 4a4d292228 Fixes #828 2024-05-13 17:01:38 -04:00
apion 0fef9eec3d Fixes #826 2024-05-13 17:01:27 -04:00
apion 5f3dc395ec Fixes #832 2024-05-13 12:17:47 -04:00
104 changed files with 1198 additions and 247 deletions
+19
View File
@@ -4,18 +4,37 @@
### Additions
- Added unique send out particles for Cherish, Dream, Beast, and Ancient Origin balls.
- Made Wooloo and Dubwool dye-able like sheep
### Changes
- Sounds for Relic Coin Sacks have been correctly renamed. Relic Coin Pouches received new sounds for breaking and placing.
- Readjusted Petilil portraits
- Changed "dimensions" spawn condition to check with dimension IDs instead of effects, so custom dimension IDs can be used.
### Fixes
- Fixed a bug in which adding organic material to the fossil tank via right click was adding the full count of the stack currently in hand
- Fixed a niche issue where some properties of entities were not initialized correctly, causing Pokémon that appeared to be level 1 until you battle them.
- Fixed Fossilized Drake being missing from the Fossils item tag.
- Fixed Gilded Chest block entity not being cleared on block break
- Fixed sherd brokenness on Forge/Supplementaries incompat
- Fixed Fossil Compartment crash with Jade / WAILA forks
- Fixed PCStore#resize not allowing PC boxes size reduction.
- Fixed pasture block PC lookups when the player is offline.
- Fixed an untranslated battle message that occurs when using a move that just ran out of PP (e.g. Fire Blast that just got spited mid-turn).
- Fixed held items being eaten even when the held item evolutions are already unlocked.
- Fixed Hisuian Decidueye not being Grass/Fighting
- Fixed both Decidueye forms learning both Triple Arrows and Spirit Shackle
- Fixed Pineco being unable to evolve into Shulker Forretress
- Fixed Kabutops T-posing when underwater. It still does not have proper swimming animations yet though.
- Fixed Pidgey's missing walk animation.
- Fixed recoil evo condition.
- Fixed issue where poser debug tools didnt work on JSON posers
- Fixed issue where gilded chests dont close when going far away
### Developer
- Changed SpawnAction#complete to return a nullable generic R (the spawn action result) instead of a boolean. More information this way.
- Added an event when a fossil is revived, with or without a player.
### Data Pack & Resource Pack Creators
- Added support for MoLang conditions for quirks and poses.
@@ -102,7 +102,6 @@ import com.cobblemon.mod.common.pokemon.properties.HiddenAbilityPropertyType
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
import com.cobblemon.mod.common.pokemon.properties.tags.PokemonFlagProperty
import com.cobblemon.mod.common.pokemon.stat.CobblemonStatProvider
import com.cobblemon.mod.common.sherds.CobblemonSherds
import com.cobblemon.mod.common.starter.CobblemonStarterHandler
import com.cobblemon.mod.common.trade.TradeManager
import com.cobblemon.mod.common.util.DataKeys
@@ -235,7 +234,7 @@ object Cobblemon {
val player = event.player
val block = player.world.getBlockState(event.pos).block
player.party().forEach { pokemon ->
pokemon.evolutions
pokemon.lockedEvolutions
.filterIsInstance<BlockClickEvolution>()
.forEach { evolution ->
evolution.attemptEvolution(pokemon, BlockClickEvolution.BlockInteractionContext(block, player.world))
@@ -416,7 +415,6 @@ object Cobblemon {
).ifSuccessful { it.mute = true }
}
CobblemonSherds.registerSherds()
}
fun getLevel(dimension: RegistryKey<World>): World? {
@@ -8,16 +8,8 @@
package com.cobblemon.mod.common
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.block.entity.FossilAnalyzerBlockEntity
import com.cobblemon.mod.common.block.entity.FossilMultiblockEntity
import com.cobblemon.mod.common.block.entity.RestorationTankBlockEntity
import com.cobblemon.mod.common.block.multiblock.FossilMultiblockBuilder
import com.cobblemon.mod.common.block.entity.*
import com.cobblemon.mod.common.block.entity.DisplayCaseBlockEntity
import com.cobblemon.mod.common.block.multiblock.FossilMultiblockBuilder
import com.cobblemon.mod.common.platform.PlatformRegistry
import net.minecraft.block.entity.BlockEntityType
import net.minecraft.registry.Registries
@@ -36,6 +28,9 @@ object CobblemonBlockEntities : PlatformRegistry<Registry<BlockEntityType<*>>, R
@JvmField
val PC: BlockEntityType<PCBlockEntity> = this.create("pc", BlockEntityType.Builder.create(::PCBlockEntity, CobblemonBlocks.PC).build(null))
@JvmField
val STADIUM: BlockEntityType<StadiumBlockEntity> = this.create("stadium_terminal", BlockEntityType.Builder.create(::StadiumBlockEntity, CobblemonBlocks.STADIUM).build(null))
@JvmField
val BERRY = this.create("berry", BlockEntityType.Builder.create(::BerryBlockEntity, *CobblemonBlocks.berries().values.toTypedArray()).build(null))
@@ -11,22 +11,14 @@ package com.cobblemon.mod.common
import com.cobblemon.mod.common.api.apricorn.Apricorn
import com.cobblemon.mod.common.block.*
import com.cobblemon.mod.common.block.MintBlock.MintType
import com.cobblemon.mod.common.block.FossilAnalyzerBlock
import com.cobblemon.mod.common.block.MonitorBlock
import com.cobblemon.mod.common.block.RestorationTankBlock
import com.cobblemon.mod.common.mixin.invoker.DoorBlockInvoker
import com.cobblemon.mod.common.mixin.invoker.PressurePlateBlockInvoker
import com.cobblemon.mod.common.mixin.invoker.StairsBlockInvoker
import com.cobblemon.mod.common.mixin.invoker.TrapdoorBlockInvoker
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.chest.GildedChestBlock
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 com.cobblemon.mod.common.mixin.invoker.*
import com.cobblemon.mod.common.platform.PlatformRegistry
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.block.*
import net.minecraft.block.enums.Instrument
import net.minecraft.block.piston.PistonBehavior
@@ -388,6 +380,19 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
)
)
@JvmField
val STADIUM = create(
"stadium_terminal",
StadiumBlock(
AbstractBlock.Settings.create()
.mapColor(MapColor.IRON_GRAY)
.sounds(BlockSoundGroup.METAL)
.pistonBehavior(PistonBehavior.BLOCK)
.strength(2F)
.nonOpaque()
)
)
@JvmField
val DISPLAY_CASE = create(
"display_case",
@@ -23,12 +23,7 @@ import com.cobblemon.mod.common.item.armor.CobblemonArmorTrims
import com.cobblemon.mod.common.item.battle.DireHitItem
import com.cobblemon.mod.common.item.battle.GuardSpecItem
import com.cobblemon.mod.common.item.battle.XStatItem
import com.cobblemon.mod.common.item.berry.FriendshipRaisingBerryItem
import com.cobblemon.mod.common.item.berry.HealingBerryItem
import com.cobblemon.mod.common.item.berry.PPRestoringBerryItem
import com.cobblemon.mod.common.item.berry.PortionHealingBerryItem
import com.cobblemon.mod.common.item.berry.StatusCuringBerryItem
import com.cobblemon.mod.common.item.berry.VolatileCuringBerryItem
import com.cobblemon.mod.common.item.berry.*
import com.cobblemon.mod.common.item.interactive.*
import com.cobblemon.mod.common.item.interactive.PotionItem
import com.cobblemon.mod.common.item.interactive.ability.AbilityChangeItem
@@ -253,6 +248,8 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
@JvmField
val PC = blockItem("pc", CobblemonBlocks.PC)
@JvmField
val STADIUM = blockItem("stadium_terminal", CobblemonBlocks.STADIUM)
@JvmField
val PASTURE = blockItem("pasture", CobblemonBlocks.PASTURE)
@JvmField
val DISPLAY_CASE = blockItem("display_case", CobblemonBlocks.DISPLAY_CASE)
@@ -226,7 +226,7 @@ open class PokemonBattle(
val facedFainted = opponentPokemon.facedOpponents.contains(faintedPokemon)
val pokemon = opponentPokemon.effectedPokemon
if (facedFainted) {
pokemon.evolutions.forEach { evolution ->
pokemon.lockedEvolutions.forEach { evolution ->
evolution.requirements.filterIsInstance<DefeatRequirement>().forEach { defeatRequirement ->
if (defeatRequirement.target.matches(faintedPokemon.effectedPokemon)) {
val progress = pokemon.evolutionProxy.current().progressFirstOrCreate({ it is DefeatEvolutionProgress && it.currentProgress().target == defeatRequirement.target }) { DefeatEvolutionProgress() }
@@ -78,6 +78,8 @@ object CobblemonEvents {
val POKE_BALL_CAPTURE_CALCULATED = EventObservable<PokeBallCaptureCalculatedEvent>()
@JvmField
val POKEMON_CAPTURED = EventObservable<PokemonCapturedEvent>()
@JvmField
val FOSSIL_REVIVED = EventObservable<FossilRevivedEvent>()
// @JvmField
// val EGG_HATCH = EventObservable<HatchEggEvent>()
@JvmField
@@ -0,0 +1,17 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.api.events.pokemon
import com.cobblemon.mod.common.pokemon.Pokemon
import net.minecraft.server.network.ServerPlayerEntity
data class FossilRevivedEvent (
val pokemon: Pokemon,
val player: ServerPlayerEntity?
)
@@ -52,21 +52,24 @@ abstract class MultiblockBlock(properties: Settings) : BlockWithEntity(propertie
if(hand == Hand.OFF_HAND) {
return ActionResult.SUCCESS
}
val entity = world.getBlockEntity(pos) as MultiblockEntity?
if (entity?.multiblockStructure != null) {
return entity.multiblockStructure!!.onUse(state, world, pos, player, hand, hit)
if (!world.isClient) {
val entity = world.getBlockEntity(pos) as MultiblockEntity?
if (entity?.multiblockStructure != null) {
return entity.multiblockStructure!!.onUse(state, world, pos, player, hand, hit)
}
}
return super.onUse(state, world, pos, player, hand, hit)
}
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity?) {
super.onBreak(world, pos, state, player)
if (!world.isClient) {
val entity = world.getBlockEntity(pos)
if (entity is MultiblockEntity && entity.multiblockStructure != null) {
entity.multiblockStructure!!.onBreak(world, pos, state, player)
}
entity?.markRemoved()
}
super.onBreak(world, pos, state, player)
}
override fun createBlockEntity(pos: BlockPos, state: BlockState): BlockEntity? {
@@ -78,6 +81,7 @@ abstract class MultiblockBlock(properties: Settings) : BlockWithEntity(propertie
return BlockRenderType.MODEL
}
//This is done so a block picked with NBT doesnt absolutely DESTROY multiblocks
override fun getPickStack(world: BlockView, pos: BlockPos, state: BlockState): ItemStack {
val blockEntity = world.getBlockEntity(pos) as? MultiblockEntity ?: return ItemStack.EMPTY
return if (blockEntity.multiblockStructure == null) super.getPickStack(world, pos, state) else ItemStack.EMPTY
@@ -153,7 +153,7 @@ interface Evolution : EvolutionLike {
pokemon.getOwnerPlayer()?.sendMessage(lang("experience.learned_move", pokemon.getDisplayName(), move.displayName))
}
// we want to instantly tick for example you might only evolve your Bulbasaur at level 34 so Venusaur should be immediately available
pokemon.evolutions.filterIsInstance<PassiveEvolution>().forEach { evolution -> evolution.attemptEvolution(pokemon) }
pokemon.lockedEvolutions.filterIsInstance<PassiveEvolution>().forEach { evolution -> evolution.attemptEvolution(pokemon) }
pokemon.getOwnerPlayer()?.playSound(CobblemonSounds.EVOLVING, SoundCategory.NEUTRAL, 1F, 1F)
CobblemonEvents.EVOLUTION_COMPLETE.post(EvolutionCompleteEvent(pokemon, this))
}
@@ -78,7 +78,7 @@ abstract class SpawningCondition<T : SpawningContext> {
return false
} else if (ctx.position.z < minZ.orMin() || ctx.position.z > maxZ.orMax()) {
return false
} else if (dimensions != null && dimensions!!.isNotEmpty() && ctx.world.dimension.effects !in dimensions!!) {
} else if (dimensions != null && dimensions!!.isNotEmpty() && ctx.world.dimensionKey.value !in dimensions!!) {
return false
} else if (moonPhase != null && ctx.moonPhase !in moonPhase!!) {
return false
@@ -124,7 +124,7 @@ open class PlayerPartyStore(
}
// Passive evolutions
pokemon.evolutions.filterIsInstance<PassiveEvolution>().forEach { it.attemptEvolution(pokemon) }
pokemon.lockedEvolutions.filterIsInstance<PassiveEvolution>().forEach { it.attemptEvolution(pokemon) }
val removeList = mutableListOf<Evolution>()
pokemon.evolutionProxy.server().forEach {
if (!it.test(pokemon) && it is LevelUpEvolution && !it.permanent)
@@ -54,8 +54,8 @@ class DamageInstruction(
if (recoiling) {
battlePokemon.effectedPokemon.let { pokemon ->
if (RecoilEvolutionProgress.supports(pokemon)) {
val newPercentage = privateMessage.argumentAt(1)?.split("/")?.getOrNull(0)?.toIntOrNull() ?: 0
val newHealth = (pokemon.hp * (newPercentage / 100.0)).roundToInt()
val healthStr = privateMessage.argumentAt(1) ?: throw UnsupportedOperationException("Cant get recoil string")
val newHealth = "([0-9]+).*".toRegex().find(healthStr)?.groups?.get(1)?.value?.toIntOrNull() ?: throw UnsupportedOperationException("Cant get recoil string")
val difference = pokemon.currentHealth - newHealth
if (difference > 0) {
val progress = pokemon.evolutionProxy.current().progressFirstOrCreate({ it is RecoilEvolutionProgress }) { RecoilEvolutionProgress() }
@@ -38,6 +38,7 @@ import net.minecraft.util.shape.VoxelShapes
import net.minecraft.world.BlockView
import net.minecraft.world.World
import net.minecraft.world.WorldAccess
import net.minecraft.world.WorldEvents
import net.minecraft.world.WorldView
@@ -72,10 +73,12 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity?) {
super.onBreak(world, pos, state, player)
val otherPart = world.getBlockState(getPositionOfOtherPart(state, pos))
if (otherPart.block is RestorationTankBlock) {
world.setBlockState(getPositionOfOtherPart(state, pos), Blocks.AIR.defaultState, 35)
world.syncWorldEvent(player, 2001, getPositionOfOtherPart(state, pos), getRawIdFromState(otherPart))
if (!world.isClient) {
val otherPart = world.getBlockState(getPositionOfOtherPart(state, pos))
if (otherPart.block is RestorationTankBlock) {
world.setBlockState(getPositionOfOtherPart(state, pos), Blocks.AIR.defaultState, Block.NOTIFY_ALL)
world.syncWorldEvent(player, WorldEvents.BLOCK_BROKEN, getPositionOfOtherPart(state, pos), getRawIdFromState(otherPart))
}
}
}
@@ -87,9 +90,9 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
itemStack: ItemStack?
) {
//Place the full block before we call to super to validate the multiblock
world.setBlockState(pos.up(), state.with(PART, TankPart.TOP) as BlockState, 3)
world.setBlockState(pos.up(), state.with(PART, TankPart.TOP) as BlockState, Block.NOTIFY_ALL)
world.updateNeighbors(pos, Blocks.AIR)
state.updateNeighbors(world, pos, 3)
state.updateNeighbors(world, pos, Block.NOTIFY_ALL)
super.onPlaced(world, pos, state, placer, itemStack)
}
@@ -100,7 +103,7 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
val tankBottomPos = pos.down()
val tankBottomState = world.getBlockState(tankBottomPos)
if(tankBottomState.block.equals(CobblemonBlocks.RESTORATION_TANK.asBlock()) && tankBottomState.get(PART) == TankPart.BOTTOM) {
return super.onUse(tankBottomState, world, tankBottomPos, player, hand, hit)
return onUse(tankBottomState, world, tankBottomPos, player, hand, hit)
}
}
return super.onUse(state, world, pos, player, hand, hit)
@@ -0,0 +1,51 @@
/*
* 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
import com.cobblemon.mod.common.api.text.red
import com.cobblemon.mod.common.api.text.text
import com.cobblemon.mod.common.block.entity.StadiumBlockEntity
import net.minecraft.block.BlockState
import net.minecraft.block.BlockWithEntity
import net.minecraft.block.entity.BlockEntity
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.util.ActionResult
import net.minecraft.util.Hand
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
class StadiumBlock(properties: Settings): BlockWithEntity(properties) {
override fun createBlockEntity(blockPos: BlockPos?, blockState: BlockState?): BlockEntity = StadiumBlockEntity(blockPos, blockState)
@Deprecated("Deprecated in Java")
override fun onUse(
blockState: BlockState,
world: World,
blockPos: BlockPos,
player: PlayerEntity,
interactionHand: Hand,
blockHitResult: BlockHitResult
): ActionResult {
if (player !is ServerPlayerEntity) return ActionResult.SUCCESS
val blockEntity = world.getBlockEntity(blockPos)
if (blockEntity !is StadiumBlockEntity) return ActionResult.SUCCESS
val message = "Stadium Pos: " + blockEntity.pos +
"\nPlayer 1 Pos: " + blockEntity.getPlayer1Pos() +
"\nPoke 1 Pos: " + blockEntity.getPoke1Pos() +
"\nPlayer 2 Pos: " + blockEntity.getPlayer2Pos() +
"\nPoke 2 Pos: " + blockEntity.getPoke2Pos()
player.sendMessage(text(message).red())
return ActionResult.SUCCESS
}
}
@@ -27,6 +27,7 @@ import net.minecraft.item.ItemPlacementContext
import net.minecraft.item.ItemStack
import net.minecraft.screen.ScreenHandler
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.server.world.ServerWorld
import net.minecraft.sound.SoundCategory
import net.minecraft.state.StateManager
import net.minecraft.state.property.BooleanProperty
@@ -37,6 +38,7 @@ import net.minecraft.util.*
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Direction
import net.minecraft.util.math.random.Random
import net.minecraft.util.shape.VoxelShape
import net.minecraft.util.shape.VoxelShapes
import net.minecraft.world.BlockView
@@ -125,11 +127,13 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
fun isFake() = (type == Type.FAKE)
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity) {
if (isFake()) {
if (player is ServerPlayerEntity) {
if (!world.isClient) {
if (isFake() && (player is ServerPlayerEntity)) {
spawnPokemon(world, pos, state, player)
}
world.setBlockState(pos, if (state.fluidState.isOf(Fluids.WATER)) Blocks.WATER.defaultState else Blocks.AIR.defaultState)
val bEntity = world.getBlockEntity(pos) as? GildedChestBlockEntity
bEntity?.markRemoved()
} else super.onBreak(world, pos, state, player)
}
@@ -197,9 +201,11 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
newState: BlockState,
moved: Boolean
) {
if (!state.isOf(newState.block)) {
val chest = world.getBlockEntity(pos) as GildedChestBlockEntity
ItemScatterer.spawn(world, pos, chest.inventoryContents)
if (!state.isOf(newState.block) && !world.isClient) {
val chest = world.getBlockEntity(pos) as? GildedChestBlockEntity
chest?.let {
ItemScatterer.spawn(world, pos, chest.inventoryContents)
}
}
}
@@ -261,4 +267,14 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
}
}
override fun scheduledTick(
state: BlockState?,
world: ServerWorld?,
pos: BlockPos?,
random: Random?
) {
val blockEntity = world?.getBlockEntity(pos) as? GildedChestBlockEntity ?: return
blockEntity.onScheduledTick()
}
}
@@ -29,11 +29,17 @@ class FossilAnalyzerBlockEntity(
class FossilAnalyzerInventory(val analyzerEntity: FossilAnalyzerBlockEntity) : SidedInventory {
override fun clear() {
TODO("Not yet implemented")
if(analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
fossilMultiblockStructure.fossilInventory.clear()
}
}
override fun size(): Int {
TODO("Not yet implemented")
if (analyzerEntity.multiblockStructure != null) {
return 3
}
return 0
}
override fun isEmpty(): Boolean {
@@ -41,19 +47,34 @@ class FossilAnalyzerBlockEntity(
}
override fun getStack(slot: Int): ItemStack {
if (analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
if (fossilMultiblockStructure.fossilInventory.size > slot) {
return fossilMultiblockStructure.fossilInventory[slot]
}
}
return ItemStack.EMPTY
}
//Unimplemented since no extract
override fun removeStack(slot: Int, amount: Int): ItemStack {
return ItemStack.EMPTY
return removeStack(slot)
}
override fun removeStack(slot: Int): ItemStack {
// if(analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
// val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
// if (fossilMultiblockStructure.fossilInventory.size > slot) {
// val itemStack = fossilMultiblockStructure.fossilInventory.removeAt(slot)
// markDirty()
// return itemStack
// }
// }
return ItemStack.EMPTY
}
override fun setStack(slot: Int, stack: ItemStack) {
if (analyzerEntity.multiblockStructure != null) {
if (analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
val struct = analyzerEntity.multiblockStructure as FossilMultiblockStructure
analyzerEntity.world?.let {
struct.insertFossil(stack, it)
@@ -72,7 +93,10 @@ class FossilAnalyzerBlockEntity(
}
override fun getAvailableSlots(side: Direction?): IntArray {
return IntArray(1)
if(analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
return intArrayOf(0,1,2)
}
return IntArray(0)
}
override fun canInsert(slot: Int, stack: ItemStack?, dir: Direction?): Boolean {
@@ -87,8 +111,8 @@ class FossilAnalyzerBlockEntity(
}
override fun canExtract(slot: Int, stack: ItemStack?, dir: Direction?): Boolean {
// return analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure && dir == Direction.DOWN
return false
}
}
}
@@ -20,6 +20,7 @@ import net.minecraft.entity.player.PlayerEntity
import net.minecraft.entity.player.PlayerInventory
import net.minecraft.inventory.DoubleInventory
import net.minecraft.inventory.Inventories
import net.minecraft.inventory.Inventory
import net.minecraft.inventory.SidedInventory
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NbtCompound
@@ -58,9 +59,7 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
override fun isPlayerViewing(player: PlayerEntity): Boolean {
if (player.currentScreenHandler is GenericContainerScreenHandler) {
val inventory = (player.currentScreenHandler as GenericContainerScreenHandler).inventory
return inventory === this@GildedChestBlockEntity || inventory is DoubleInventory && inventory.isPart(
this@GildedChestBlockEntity
)
return inventory === this@GildedChestBlockEntity
}
return false
}
@@ -99,8 +98,6 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
return dir == Direction.DOWN
}
override fun canPlayerUse(player: PlayerEntity) = !player.isSpectator
override fun getInvStackList(): DefaultedList<ItemStack> = inventoryContents
override fun setInvStackList(list: DefaultedList<ItemStack>) {
@@ -164,4 +161,10 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
Inventories.readNbt(nbt, inventoryContents)
}
}
fun onScheduledTick() {
if (!this.removed) {
stateManager.updateViewerCount(this.getWorld(), this.getPos(), this.cachedState)
}
}
}
@@ -0,0 +1,25 @@
package com.cobblemon.mod.common.block.entity
import com.cobblemon.mod.common.CobblemonBlockEntities
import net.minecraft.block.BlockState
import net.minecraft.block.entity.BlockEntity
import net.minecraft.util.math.BlockPos
class StadiumBlockEntity(blockPos: BlockPos?, blockState: BlockState?): BlockEntity(CobblemonBlockEntities.STADIUM, blockPos, blockState) {
fun getPlayer1Pos(): BlockPos? {
return pos.add(5, 0, 10)
}
fun getPlayer2Pos(): BlockPos? {
return pos.add(5, 0, -10)
}
fun getPoke1Pos(): BlockPos? {
return pos.add(5, 0, 5)
}
fun getPoke2Pos(): BlockPos? {
return pos.add(5, 0, -5)
}
}
@@ -11,6 +11,8 @@ package com.cobblemon.mod.common.block.multiblock
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.advancement.CobblemonCriteria
import com.cobblemon.mod.common.api.events.CobblemonEvents
import com.cobblemon.mod.common.api.events.pokemon.FossilRevivedEvent
import com.cobblemon.mod.common.api.fossil.Fossil
import com.cobblemon.mod.common.api.fossil.Fossils
import com.cobblemon.mod.common.api.fossil.NaturalMaterials
@@ -113,8 +115,6 @@ class FossilMultiblockStructure (
return ActionResult.FAIL
}
val ballType = (stack.item as PokeBallItem).pokeBall
if (!player.isCreative) {
stack?.decrement(1)
@@ -125,6 +125,7 @@ class FossilMultiblockStructure (
this.fossilState.growthState = "Taken"
player.playSound(CobblemonSounds.FOSSIL_MACHINE_RETRIEVE_POKEMON, SoundCategory.BLOCKS, 1.0F, 1.0F)
CobblemonCriteria.RESURRECT_POKEMON.trigger(player, createdPokemon!!)
CobblemonEvents.FOSSIL_REVIVED.post(FossilRevivedEvent(createdPokemon!!, player))
// Turn the monitor off
val monitorState = world.getBlockState(monitorPos)
@@ -220,6 +221,7 @@ class FossilMultiblockStructure (
entity.setPosition(fixedPosition.toCenterPos().subtract(0.0, 0.5, 0.0))
// TODO: Find a correct way to set the new entity's Yaw rotation. (Face away from the machine)
if (world.spawnEntity(entity)) {
CobblemonEvents.FOSSIL_REVIVED.post(FossilRevivedEvent(pokemon, null))
return true
} else {
Cobblemon.LOGGER.warn("Couldn't spawn resurrected Pokémon for some reason")
@@ -8,25 +8,15 @@
package com.cobblemon.mod.common.client
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.*
import com.cobblemon.mod.common.Cobblemon.LOGGER
import com.cobblemon.mod.common.api.berry.Berries
import com.cobblemon.mod.common.CobblemonBlockEntities
import com.cobblemon.mod.common.CobblemonBlocks
import com.cobblemon.mod.common.CobblemonClientImplementation
import com.cobblemon.mod.common.CobblemonEntities
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.api.scheduling.ClientTaskTracker
import com.cobblemon.mod.common.api.text.gray
import com.cobblemon.mod.common.client.battle.ClientBattle
import com.cobblemon.mod.common.client.gui.PartyOverlay
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.FossilAnalyzerRenderer
import com.cobblemon.mod.common.client.render.block.RestorationTankRenderer
import com.cobblemon.mod.common.client.render.block.GildedChestBlockRenderer
import com.cobblemon.mod.common.client.render.block.HealingMachineRenderer
import com.cobblemon.mod.common.client.render.block.*
import com.cobblemon.mod.common.client.render.boat.CobblemonBoatRenderer
import com.cobblemon.mod.common.client.render.generic.GenericBedrockRenderer
@@ -34,10 +24,7 @@ import com.cobblemon.mod.common.client.render.item.CobblemonBuiltinItemRendererR
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.BlockEntityModelRepository
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.models.blockbench.repository.*
import com.cobblemon.mod.common.client.render.pokeball.PokeBallRenderer
import com.cobblemon.mod.common.client.render.pokemon.PokemonRenderer
import com.cobblemon.mod.common.client.sound.battle.BattleMusicController
@@ -47,9 +34,6 @@ 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.FossilModelRepository
import com.cobblemon.mod.common.client.render.models.blockbench.repository.GenericBedrockEntityModelRepository
import com.cobblemon.mod.common.client.render.models.blockbench.repository.MiscModelRepository
import com.cobblemon.mod.common.platform.events.PlatformEvents
import com.cobblemon.mod.common.util.DataKeys
import com.cobblemon.mod.common.util.asTranslated
@@ -221,7 +205,8 @@ object CobblemonClient {
CobblemonBlocks.LARGE_BUDDING_SKY_TUMBLESTONE,
CobblemonBlocks.SKY_TUMBLESTONE_CLUSTER,
CobblemonBlocks.GIMMIGHOUL_CHEST,
CobblemonBlocks.DISPLAY_CASE
CobblemonBlocks.DISPLAY_CASE,
CobblemonBlocks.STADIUM
)
this.createBoatModelLayers()
@@ -86,30 +86,12 @@ class JsonPokemonPoseableModel(override val rootPart: Bone) : PokemonPoseableMod
override val head: Bone by lazy { headJoint?.let { getPart(it) } ?: rootPart }
@SerializedName("portraitScale")
private val _portraitScale: Float? = null
@SerializedName("portraitTranslation")
private val _portraitTranslation: Vec3d? = null
@SerializedName("profileScale")
private val _profileScale: Float? = null
@SerializedName("profileTranslation")
private val _profileTranslation: Vec3d? = null
//Some weirdness going on here, vars have to be initialized, gson doesn't like multiple fields with the same name
@Transient
//Idk, works fine with Blastoise
override var portraitScale = 1F
get() = _portraitScale ?: 1F
@Transient
override var portraitTranslation = Vec3d.ZERO
get() = _portraitTranslation ?: Vec3d(0.0, 0.0, 0.0)
@Transient
override var profileScale = 1F
get() = _profileScale ?: 1F
@Transient
override var profileTranslation = Vec3d.ZERO
get() = _profileTranslation ?: Vec3d(0.0, 0.0, 0.0)
val faint: Supplier<StatefulAnimation<PokemonEntity, ModelFrame>>? = null
@@ -8,13 +8,14 @@
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.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 net.minecraft.client.model.ModelPart
import net.minecraft.util.math.Vec3d
@@ -56,7 +57,7 @@ class KabutopsModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bipe
standing = registerPose(
poseName = "standing",
poseTypes = UI_POSES + PoseType.STAND,
poseTypes = UI_POSES + STATIONARY_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink),
idleAnimations = arrayOf(
@@ -67,7 +68,7 @@ class KabutopsModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bipe
walk = registerPose(
poseName = "walk",
poseType = PoseType.WALK,
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
idleAnimations = arrayOf(
singleBoneLook(),
@@ -8,21 +8,14 @@
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.createTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BiWingedFrame
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.client.render.models.blockbench.pose.ModelPartTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.parabolaFunction
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.sineFunction
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.SHOULDER_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.math.geometry.toRadians
import net.minecraft.client.model.ModelPart
import net.minecraft.util.math.Vec3d
@@ -66,7 +59,7 @@ class PidgeyModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
stand = registerPose(
poseName = "standing",
poseTypes = SHOULDER_POSES + UI_POSES + PoseType.STANDING_POSES,
poseTypes = SHOULDER_POSES + UI_POSES + PoseType.STATIONARY_POSES - PoseType.HOVER,
transformTicks = 10,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
@@ -25,8 +25,8 @@ class PetililHisuiBiasModel (root: ModelPart) : PokemonPoseableModel(), HeadedFr
val leaf_left = getPart("leaf_left_rotation")
val leaf_right = getPart("leaf_right_rotation")
override var portraitScale = 1.75F
override var portraitTranslation = Vec3d(0.01, -0.39, 0.0)
override var portraitScale = 1.52F
override var portraitTranslation = Vec3d(0.1, -0.25, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3d(0.0, 0.5, 0.0)
@@ -22,8 +22,8 @@ class PetililModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("petilil")
override val head = getPart("head")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3d(-0.3, -1.2, 0.0)
override var portraitScale = 1.52F
override var portraitTranslation = Vec3d(0.1, -0.25, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3d(0.0, 0.5, 0.0)
@@ -28,8 +28,8 @@ class DubwoolModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Quadr
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
val wool = getPart("wool")
val neckWool = getPart("neck_wool")
val wool = getPart("wool_shearable")
val neckWool = getPart("neck_wool_shearable")
override var portraitScale = 3.1F
override var portraitTranslation = Vec3d(-1.2, -0.7, 0.0)
@@ -28,7 +28,7 @@ class WoolooModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Quadru
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
val wool = getPart("wool")
val wool = getPart("wool_shearable")
override var portraitScale = 3.1F
override var portraitTranslation = Vec3d(-0.85, -1.8, 0.0)
@@ -21,7 +21,9 @@ import com.cobblemon.mod.common.api.interaction.PokemonEntityInteraction
import com.cobblemon.mod.common.api.net.serializers.PoseTypeDataSerializer
import com.cobblemon.mod.common.api.net.serializers.StringSetDataSerializer
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.api.pokemon.feature.ChoiceSpeciesFeatureProvider
import com.cobblemon.mod.common.api.pokemon.feature.FlagSpeciesFeature
import com.cobblemon.mod.common.api.pokemon.feature.StringSpeciesFeature
import com.cobblemon.mod.common.api.pokemon.status.Statuses
import com.cobblemon.mod.common.api.reactive.ObservableSubscription
import com.cobblemon.mod.common.api.reactive.SimpleObservable
@@ -81,6 +83,7 @@ import net.minecraft.entity.passive.PassiveEntity
import net.minecraft.entity.passive.TameableShoulderEntity
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.fluid.FluidState
import net.minecraft.item.DyeItem
import net.minecraft.item.ItemStack
import net.minecraft.item.ItemUsage
import net.minecraft.item.Items
@@ -101,8 +104,11 @@ import net.minecraft.sound.SoundEvents
import net.minecraft.text.Text
import net.minecraft.text.TextContent
import net.minecraft.util.ActionResult
import net.minecraft.util.Colors
import net.minecraft.util.DyeColor
import net.minecraft.util.Hand
import net.minecraft.util.Identifier
import net.minecraft.util.Util
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Box
import net.minecraft.util.math.Vec3d
@@ -330,6 +336,21 @@ open class PokemonEntity(
this.tethering = null
this.pokemon.recall()
}
//This is so that pokemon in the pasture block are ALWAYS in sync with the pokemon box
//Before, pokemon entities in pastures would hold an old ref to a pokemon obj and changes to that would not appear to the underlying file
if (this.tethering != null) {
//Only for online players
if (world.getPlayerByUuid(ownerUuid) != null){
this.ownerUuid?.let {
val actualPokemon = Cobblemon.storage.getPC(it)[this.pokemon.uuid]
actualPokemon?.let {
if (it !== pokemon) {
pokemon = it
}
}
}
}
}
schedulingTracker.update(1/20F)
}
@@ -594,6 +615,7 @@ open class PokemonEntity(
override fun interactMob(player: PlayerEntity, hand: Hand) : ActionResult {
val itemStack = player.getStackInHand(hand)
val colorFeature = pokemon.getFeature<StringSpeciesFeature>(DataKeys.CAN_BE_COLORED)
if (itemStack.isOf(Items.SHEARS) && this.isShearable) {
this.sheared(SoundCategory.PLAYERS)
@@ -659,7 +681,6 @@ open class PokemonEntity(
pokemon.lastFlowerFed = ItemStack.EMPTY
return ActionResult.success(world.isClient)
}
else {
val mushroomStew = ItemUsage.exchangeStack(itemStack, player, Items.MUSHROOM_STEW.defaultStack)
player.setStackInHand(hand, mushroomStew)
@@ -700,6 +721,22 @@ open class PokemonEntity(
return ActionResult.SUCCESS
}
}
else if (itemStack.item is DyeItem && colorFeature != null) {
val item = itemStack.item as DyeItem
if (item.color.name.lowercase() != colorFeature.value.lowercase()) {
itemStack.decrement(1)
colorFeature.value = item.color.name.lowercase()
this.pokemon.markFeatureDirty(colorFeature)
this.pokemon.updateAspects()
}
}
else if (itemStack.item.equals(Items.WATER_BUCKET) && colorFeature != null) {
itemStack.decrement(1)
player.giveOrDropItemStack(Items.BUCKET.defaultStack)
colorFeature.value = ""
this.pokemon.markFeatureDirty(colorFeature)
this.pokemon.updateAspects()
}
if (hand == Hand.MAIN_HAND && player is ServerPlayerEntity && pokemon.getOwnerPlayer() == player) {
@@ -828,7 +865,7 @@ open class PokemonEntity(
// Check evolution item interaction
if (pokemon.getOwnerPlayer() == player) {
val context = ItemInteractionEvolution.ItemInteractionContext(stack, player.world)
pokemon.evolutions
pokemon.lockedEvolutions
.filterIsInstance<ItemInteractionEvolution>()
.forEach { evolution ->
if (evolution.attemptEvolution(pokemon, context)) {
@@ -1126,8 +1163,26 @@ open class PokemonEntity(
this.pokemon.markFeatureDirty(feature)
this.pokemon.updateAspects()
val i = this.random.nextInt(3) + 1
for (j in 0 until i) {
val itemEntity = this.dropItem(Items.WHITE_WOOL, 1) ?: return
for (j in 0 .. i) {
val color = this.pokemon.getFeature<StringSpeciesFeature>(DataKeys.CAN_BE_COLORED)?.value ?: "white"
val woolItem = when (color) {
"black" -> Items.BLACK_WOOL
"blue" -> Items.BLUE_WOOL
"brown" -> Items.BROWN_WOOL
"cyan" -> Items.CYAN_WOOL
"gray" -> Items.GRAY_WOOL
"green" -> Items.GREEN_WOOL
"light-blue" -> Items.LIGHT_BLUE_WOOL
"light-gray" -> Items.LIGHT_GRAY_WOOL
"lime" -> Items.LIME_WOOL
"magenta" -> Items.MAGENTA_WOOL
"orange" -> Items.ORANGE_WOOL
"purple" -> Items.PURPLE_WOOL
"red" -> Items.RED_WOOL
"yellow" -> Items.YELLOW_WOOL
else -> Items.WHITE_WOOL
}
val itemEntity = this.dropItem(woolItem, 1) ?: return
itemEntity.velocity = itemEntity.velocity.add(
((this.random.nextFloat() - this.random.nextFloat()) * 0.1f).toDouble(),
(this.random.nextFloat() * 0.05f).toDouble(),
@@ -1141,6 +1196,8 @@ open class PokemonEntity(
return !this.isBusy && !this.pokemon.isFainted() && !feature.enabled
}
override fun canUsePortals() = false
override fun setAir(air: Int) {
@@ -218,6 +218,7 @@ object CobblemonItemGroups {
entries.add(CobblemonItems.MONITOR)
entries.add(CobblemonItems.PC)
entries.add(CobblemonItems.HEALING_MACHINE)
entries.add(CobblemonItems.STADIUM)
entries.add(CobblemonItems.PASTURE)
entries.add(CobblemonItems.GILDED_CHEST)
@@ -19,7 +19,7 @@ class LinkCableItem : CobblemonItem(Settings()), PokemonEntityInteraction {
override val accepted = setOf(PokemonEntityInteraction.Ownership.OWNER)
override fun processInteraction(player: ServerPlayerEntity, entity: PokemonEntity, stack: ItemStack): Boolean {
val pokemon = entity.pokemon
pokemon.evolutions.filterIsInstance<TradeEvolution>().forEach { evolution ->
pokemon.lockedEvolutions.filterIsInstance<TradeEvolution>().forEach { evolution ->
// If an evolution is possible non-optional or has been successfully queued we will consume the item and stop
// validate requirements to respect required held items and such.
if (evolution.requirements.all { it.check(pokemon) } && evolution.evolve(pokemon)) {
@@ -426,6 +426,8 @@ open class Pokemon : ShowdownIdentifiable {
// We want non-optional evolutions to trigger first to avoid unnecessary packets and any cost associate with an optional one that would just be lost
val evolutions: Iterable<Evolution> get() = this.form.evolutions.sortedBy { evolution -> evolution.optional }
val lockedEvolutions: Iterable<Evolution>
get() = evolutions.filter { it !in evolutionProxy.current() }
val preEvolution: PreEvolution? get() = this.form.preEvolution
@@ -98,11 +98,11 @@ object TradeManager {
party2.add(pokemon1)
party1.add(pokemon2)
pokemon1.evolutions.filterIsInstance<TradeEvolution>().firstOrNull {
pokemon1.lockedEvolutions.filterIsInstance<TradeEvolution>().firstOrNull {
it.attemptEvolution(pokemon1, pokemon2)
}
pokemon2.evolutions.filterIsInstance<TradeEvolution>().firstOrNull {
pokemon2.lockedEvolutions.filterIsInstance<TradeEvolution>().firstOrNull {
it.attemptEvolution(pokemon2, pokemon1)
}
CobblemonEvents.TRADE_COMPLETED.post(TradeCompletedEvent(player1, pokemon2, player2, pokemon1))
@@ -134,6 +134,7 @@ object DataKeys {
// Features
const val CAN_BE_MILKED = "milkable"
const val HAS_BEEN_SHEARED = "sheared"
const val CAN_BE_COLORED = "color"
// Variants
const val IS_MOOSHTANK = "mooshtank"
@@ -231,7 +231,7 @@
],
"position": [0, "(math.clamp(math.sin(q.anim_time*90*4-110+180)*1,0.5,1)-0.5)*0.7", 0]
},
"wool": {
"wool_shearable": {
"position": [0, "0.5+Math.sin((query.anim_time-0.3) * 90 * 8) * 0.3", 0]
},
"tail": {
@@ -419,10 +419,10 @@
},
"position": {
"0.0": [0, 0, 0],
"0.1667": [0, -2, -1],
"0.3333": [0, -4, 0],
"1.6667": [0, -4, 0],
"1.8333": [0, -2, -1],
"0.1667": [0, -1, -1],
"0.3333": [0, -3, 0],
"1.6667": [0, -3, 0],
"1.8333": [0, -1, -1],
"2.0": [0, 0, 0]
}
},
@@ -544,26 +544,28 @@
},
"ear_left": {
"rotation": {
"0.0": [0, -10, 0],
"0.2917": [0, -10, -10],
"0.4583": [0, -5, 5],
"0.6667": [0, -10, 0],
"1.6667": [0, -10, 0],
"1.9167": [0, 0, 10],
"2.0417": [0, -15, -5],
"2.1667": [0, -10, 0]
"0.0": [0, 0, 0],
"0.2917": [-5, 10, -10],
"0.4583": [-12.5, 11, -5],
"0.6667": [-14, 12.3, 0],
"1.0": [-15, 11.53, 0],
"1.6667": [-10, 10, 0],
"1.9167": [0, 10, 10],
"2.0417": [0, -5, -5],
"2.1667": [0, 0, 0]
}
},
"ear_right": {
"rotation": {
"0.0": [0, 10, 0],
"0.2917": [0, 10, 10],
"0.4583": [0, 5, -5],
"0.6667": [0, 10, 0],
"1.6667": [0, 10, 0],
"1.9167": [0, 0, -10],
"2.0417": [0, 15, 5],
"2.1667": [0, 10, 0]
"0.0": [0, 0, 0],
"0.2917": [-5, -10, 10],
"0.4583": [-12.5, -11, 5],
"0.6667": [-14, -12.3, 0],
"1.0": [-15, -11.53, 0],
"1.6667": [-10, -10, 0],
"1.9167": [0, -10, -10],
"2.0417": [0, 5, 5],
"2.1667": [0, 0, 0]
}
},
"neck": {
@@ -23,16 +23,16 @@
{
"name": "torso",
"parent": "body",
"pivot": [0, 8.5, 3.75],
"pivot": [0, 7.5, 3.75],
"cubes": [
{"origin": [-3, 6.75, 0], "size": [6, 6, 6], "uv": [24, 26]},
{"origin": [-3, 6.75, -5], "size": [6, 6, 6], "inflate": 0.01, "uv": [0, 26]}
{"origin": [-3, 5.75, 0], "size": [6, 6, 6], "uv": [24, 26]},
{"origin": [-3, 5.75, -5], "size": [6, 6, 6], "inflate": 0.01, "uv": [0, 26]}
]
},
{
"name": "wool",
"name": "wool_shearable",
"parent": "torso",
"pivot": [6.5, 2.75, -5],
"pivot": [6.5, 1.75, -5],
"cubes": [
{"origin": [-6.5, 2.75, -5.5], "size": [13, 13, 13], "inflate": 0.02, "uv": [0, 0]}
]
@@ -58,177 +58,201 @@
{
"name": "neck",
"parent": "torso",
"pivot": [0, 8.65, -1.5],
"pivot": [0, 7.65, -1.5],
"cubes": [
{"origin": [-2, 8.65, -5.5], "size": [4, 4, 4], "inflate": 0.01, "uv": [8, 56]}
{"origin": [-2, 7.65, -5.5], "size": [4, 4, 4], "inflate": 0.01, "uv": [8, 56]}
]
},
{
"name": "head",
"parent": "torso",
"pivot": [0.1, 10.75, -5],
"pivot": [0.1, 9.75, -5],
"cubes": [
{"origin": [-2.5, 8.75, -10.5], "size": [5, 4, 6], "uv": [0, 39]},
{"origin": [-1, 10, -10.5], "size": [2, 1, 0], "inflate": 0.01, "uv": [0, 30]},
{"origin": [-1.9, 12.75, -8.25], "size": [1, 2, 1], "pivot": [-1.9, 12.75, -7.25], "rotation": [0, -5, -5], "uv": [39, 0]},
{"origin": [0.9, 12.75, -8.25], "size": [1, 2, 1], "pivot": [1.9, 12.75, -7.25], "rotation": [0, 5, 5], "uv": [9, 0]}
{"origin": [-2.5, 7.75, -10.5], "size": [5, 4, 6], "uv": [0, 39]},
{"origin": [-1, 9, -10.5], "size": [2, 1, 0], "inflate": 0.01, "uv": [0, 30]}
]
},
{
"name": "horn_right",
"parent": "head",
"pivot": [-2, 12.75, -7.75],
"rotation": [-15, 0, -5],
"cubes": [
{"origin": [-2.5, 11.75, -8.25], "size": [1, 2, 1], "pivot": [-2, 12.75, -7.75], "rotation": [0, 47.5, 0], "uv": [39, 0]}
]
},
{
"name": "horn_left",
"parent": "head",
"pivot": [2, 12.75, -7.75],
"rotation": [-15, 0, 5],
"cubes": [
{"origin": [1.5, 11.75, -8.25], "size": [1, 2, 1], "pivot": [2, 12.75, -7.75], "rotation": [0, -47.5, 0], "uv": [9, 0]}
]
},
{
"name": "eyes",
"parent": "head",
"pivot": [-0.15, 10.75, -9]
"pivot": [-0.15, 9.75, -9]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-3.6, 10, -8.5],
"pivot": [-3.6, 9, -8.5],
"cubes": [
{"origin": [-2.51, 9.75, -9.5], "size": [0, 2, 1], "uv": [18, 25], "mirror": true},
{"origin": [-2.401, 9.75, -9.5], "size": [0, 2, 1], "inflate": 0.1, "uv": [0, 0], "mirror": true},
{"origin": [-2.52, 10.25, -9.5], "size": [0, 1, 1], "uv": [8, 9], "mirror": true}
{"origin": [-2.51, 8.75, -9.5], "size": [0, 2, 1], "uv": [18, 25], "mirror": true},
{"origin": [-2.451, 8.75, -9.5], "size": [0, 2, 1], "inflate": 0.05, "uv": [0, 0], "mirror": true},
{"origin": [-2.52, 9.25, -9.5], "size": [0, 1, 1], "uv": [8, 9], "mirror": true}
]
},
{
"name": "eyelid_right",
"parent": "eye_right",
"pivot": [-1.82, 10.75, -9],
"pivot": [-1.8645, 9.75, -9.01],
"cubes": [
{"origin": [-2.32, 9.75, -9.5], "size": [1, 2, 1], "inflate": 0.11, "uv": [54, 39]}
{"origin": [-2.3645, 8.75, -10.01], "size": [1, 2, 2], "inflate": 0.06, "uv": [54, 39]}
]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [3.75, 10, -8.5],
"pivot": [3.75, 9, -8.5],
"cubes": [
{"origin": [2.51, 9.75, -9.5], "size": [0, 2, 1], "uv": [24, 25], "mirror": true},
{"origin": [2.402, 9.75, -9.5], "size": [0, 2, 1], "inflate": 0.1, "uv": [0, 7], "mirror": true},
{"origin": [2.52, 10.25, -9.5], "size": [0, 1, 1], "uv": [8, 10], "mirror": true}
{"origin": [2.51, 8.75, -9.5], "size": [0, 2, 1], "uv": [24, 25], "mirror": true},
{"origin": [2.452, 8.75, -9.5], "size": [0, 2, 1], "inflate": 0.05, "uv": [0, 7], "mirror": true},
{"origin": [2.52, 9.25, -9.5], "size": [0, 1, 1], "uv": [8, 10], "mirror": true}
]
},
{
"name": "eyelid_left",
"parent": "eye_left",
"pivot": [1.82, 10.75, -9],
"pivot": [1.8645, 9.75, -9.01],
"cubes": [
{"origin": [1.32, 9.75, -9.5], "size": [1, 2, 1], "inflate": 0.11, "uv": [52, 36], "mirror": true}
{"origin": [1.3645, 8.75, -10.01], "size": [1, 2, 2], "inflate": 0.06, "uv": [56, 32], "mirror": true}
]
},
{
"name": "mouth_open",
"parent": "head",
"pivot": [-0.05, 10, -9.5],
"pivot": [-0.05, 9, -9.5],
"cubes": [
{"origin": [-1.05, 8.75, -10.41], "size": [2, 1, 0], "uv": [8, 12]}
{"origin": [-1.05, 7.75, -10.41], "size": [2, 1, 0], "uv": [8, 12]}
]
},
{
"name": "head_wool",
"parent": "head",
"pivot": [-2.3928, 13.73889, -6.69372],
"pivot": [-2.3928, 12.73889, -6.69372],
"cubes": [
{"origin": [-2.025, 12, -9.19785], "size": [2, 2, 2], "pivot": [-1.05693, 12.8315, -8.01133], "rotation": [0, 5, 0], "uv": [50, 24]},
{"origin": [-2.5, 8.5, -7.5], "size": [5, 6, 4], "inflate": 0.01, "uv": [39, 0]},
{"origin": [0.025, 12, -9.19785], "size": [2, 2, 2], "pivot": [1.06611, 12.8315, -8.01133], "rotation": [0, -5, 0], "uv": [52, 10]},
{"origin": [-3.75, 11.5, -8.25], "size": [2, 2, 2], "uv": [8, 49]},
{"origin": [1.75, 11.5, -8.25], "size": [2, 2, 2], "uv": [16, 39]}
{"origin": [-2.025, 11, -9.19785], "size": [2, 2, 2], "pivot": [-1.05693, 11.8315, -8.01133], "rotation": [0, 5, 0], "uv": [50, 24]},
{"origin": [-2.5, 7.5, -7.5], "size": [5, 5, 3], "inflate": 0.01, "uv": [24, 56]},
{"origin": [0.025, 11, -9.19785], "size": [2, 2, 2], "pivot": [1.06611, 11.8315, -8.01133], "rotation": [0, -5, 0], "uv": [52, 10]},
{"origin": [-3.75, 10.75, -8.5], "size": [2, 2, 2], "uv": [8, 49]},
{"origin": [1.75, 10.75, -8.5], "size": [2, 2, 2], "uv": [16, 39]}
]
},
{
"name": "head_wool_shearable",
"parent": "head_wool",
"pivot": [0, -1, 0],
"cubes": [
{"origin": [-2.5, 9.5, -7.5], "size": [5, 4, 4], "inflate": 0.02, "uv": [39, 0]}
]
},
{
"name": "braid_right",
"parent": "head_wool",
"pivot": [-3, 11.5, -7.5],
"pivot": [-3, 10.75, -7.5],
"cubes": [
{"origin": [-3.5, 10.75, -8], "size": [1, 1, 1], "uv": [0, 39]},
{"origin": [-4, 9, -8.5], "size": [2, 2, 2], "uv": [0, 49]}
{"origin": [-3.5, 10, -8], "size": [1, 1, 1], "uv": [0, 39]},
{"origin": [-4, 8.25, -8.5], "size": [2, 2, 2], "uv": [0, 49]}
]
},
{
"name": "braid_middle_right",
"parent": "braid_right",
"pivot": [-3, 9, -7.5],
"pivot": [-3, 8.25, -7.5],
"cubes": [
{"origin": [-3.5, 8.25, -8], "size": [1, 1, 1], "uv": [0, 41]},
{"origin": [-4, 6.5, -8.5], "size": [2, 2, 2], "uv": [36, 48]}
{"origin": [-3.5, 7.5, -8], "size": [1, 1, 1], "uv": [0, 41]},
{"origin": [-4, 5.75, -8.5], "size": [2, 2, 2], "uv": [36, 48]}
]
},
{
"name": "braid_bottom_right",
"parent": "braid_middle_right",
"pivot": [-3, 6.5, -7.5],
"pivot": [-3, 5.75, -7.5],
"cubes": [
{"origin": [-3.5, 5.75, -8], "size": [1, 1, 1], "uv": [0, 43]},
{"origin": [-4, 4, -8.5], "size": [2, 2, 2], "uv": [28, 48]},
{"origin": [-4, 3.75, -8.5], "size": [2, 1, 0], "pivot": [-3, 4.75, -8.5], "rotation": [-12.5, 0, 0], "uv": [0, 61]},
{"origin": [-4, 3.75, -8.5], "size": [0, 1, 2], "pivot": [-4, 4.75, -7.5], "rotation": [0, 0, 12.5], "uv": [0, 60]},
{"origin": [-2, 3.75, -8.5], "size": [0, 1, 2], "pivot": [-2, 4.75, -7.5], "rotation": [0, 0, -12.5], "uv": [0, 61]},
{"origin": [-4, 3.75, -6.5], "size": [2, 1, 0], "pivot": [-3, 4.75, -6.5], "rotation": [12.5, 0, 0], "uv": [0, 60]}
{"origin": [-3.5, 5, -8], "size": [1, 1, 1], "uv": [0, 43]},
{"origin": [-4, 3.25, -8.5], "size": [2, 2, 2], "uv": [28, 48]},
{"origin": [-4, 3, -8.5], "size": [2, 1, 0], "pivot": [-3, 4, -8.5], "rotation": [-12.5, 0, 0], "uv": [0, 61]},
{"origin": [-4, 3, -8.5], "size": [0, 1, 2], "pivot": [-4, 4, -7.5], "rotation": [0, 0, 12.5], "uv": [0, 60]},
{"origin": [-2, 3, -8.5], "size": [0, 1, 2], "pivot": [-2, 4, -7.5], "rotation": [0, 0, -12.5], "uv": [0, 61]},
{"origin": [-4, 3, -6.5], "size": [2, 1, 0], "pivot": [-3, 4, -6.5], "rotation": [12.5, 0, 0], "uv": [0, 60]}
]
},
{
"name": "braid_left",
"parent": "head_wool",
"pivot": [3, 11.5, -7.5],
"pivot": [3, 10.75, -7.5],
"cubes": [
{"origin": [2.5, 10.75, -8], "size": [1, 1, 1], "uv": [26, 26]},
{"origin": [2, 9, -8.5], "size": [2, 2, 2], "uv": [48, 30]}
{"origin": [2.5, 10, -8], "size": [1, 1, 1], "uv": [26, 26]},
{"origin": [2, 8.25, -8.5], "size": [2, 2, 2], "uv": [48, 30]}
]
},
{
"name": "braid_middle_left",
"parent": "braid_left",
"pivot": [3, 9, -7.5],
"pivot": [3, 8.25, -7.5],
"cubes": [
{"origin": [2.5, 8.25, -8], "size": [1, 1, 1], "uv": [26, 28]},
{"origin": [2, 6.5, -8.5], "size": [2, 2, 2], "uv": [32, 39]}
{"origin": [2.5, 7.5, -8], "size": [1, 1, 1], "uv": [26, 28]},
{"origin": [2, 5.75, -8.5], "size": [2, 2, 2], "uv": [32, 39]}
]
},
{
"name": "braid_bottom_left",
"parent": "braid_middle_left",
"pivot": [3, 6.5, -7.5],
"pivot": [3, 5.75, -7.5],
"cubes": [
{"origin": [2.5, 5.75, -8], "size": [1, 1, 1], "uv": [26, 30]},
{"origin": [2, 4, -8.5], "size": [2, 2, 2], "uv": [0, 8]},
{"origin": [2, 3.75, -8.5], "size": [2, 1, 0], "pivot": [3, 4.75, -8.5], "rotation": [-12.5, 0, 0], "uv": [4, 61], "mirror": true},
{"origin": [2, 3.75, -8.5], "size": [0, 1, 2], "pivot": [2, 4.75, -7.5], "rotation": [0, 0, 12.5], "uv": [4, 61], "mirror": true},
{"origin": [4, 3.75, -8.5], "size": [0, 1, 2], "pivot": [4, 4.75, -7.5], "rotation": [0, 0, -12.5], "uv": [4, 60], "mirror": true},
{"origin": [2, 3.75, -6.5], "size": [2, 1, 0], "pivot": [3, 4.75, -6.5], "rotation": [12.5, 0, 0], "uv": [4, 60], "mirror": true}
{"origin": [2.5, 5, -8], "size": [1, 1, 1], "uv": [26, 30]},
{"origin": [2, 3.25, -8.5], "size": [2, 2, 2], "uv": [0, 8]},
{"origin": [2, 3, -8.5], "size": [2, 1, 0], "pivot": [3, 4, -8.5], "rotation": [-12.5, 0, 0], "uv": [4, 61], "mirror": true},
{"origin": [2, 3, -8.5], "size": [0, 1, 2], "pivot": [2, 4, -7.5], "rotation": [0, 0, 12.5], "uv": [4, 61], "mirror": true},
{"origin": [4, 3, -8.5], "size": [0, 1, 2], "pivot": [4, 4, -7.5], "rotation": [0, 0, -12.5], "uv": [4, 60], "mirror": true},
{"origin": [2, 3, -6.5], "size": [2, 1, 0], "pivot": [3, 4, -6.5], "rotation": [12.5, 0, 0], "uv": [4, 60], "mirror": true}
]
},
{
"name": "ear_left",
"parent": "head",
"pivot": [2.5, 11.75, -6.5],
"pivot": [2.5, 10.75, -6.5],
"rotation": [0, 0, 15],
"cubes": [
{"origin": [2.25, 10, -6.5], "size": [4, 2, 0], "uv": [48, 34]}
{"origin": [2.25, 9, -6.5], "size": [4, 2, 0], "uv": [48, 34]}
]
},
{
"name": "ear_right",
"parent": "head",
"pivot": [-2.5, 11.75, -6.5],
"pivot": [-2.5, 10.75, -6.5],
"rotation": [0, 0, -15],
"cubes": [
{"origin": [-6.25, 10, -6.5], "size": [4, 2, 0], "uv": [39, 10]}
{"origin": [-6.25, 9, -6.5], "size": [4, 2, 0], "uv": [39, 10]}
]
},
{
"name": "leg_front_right",
"parent": "body",
"pivot": [2.25, 8.5, -3],
"pivot": [2.25, 7.5, -3],
"cubes": [
{"origin": [0.75, 5, -4.5], "size": [3, 5, 3], "uv": [0, 0]}
{"origin": [0.75, 4, -4.5], "size": [3, 5, 3], "uv": [0, 0]}
]
},
{
"name": "leg_front_right2",
"parent": "leg_front_right",
"pivot": [2.25, 6, -3.75],
"pivot": [2.25, 5, -3.75],
"cubes": [
{"origin": [1.25, 1.25, -3.75], "size": [2, 4, 2], "uv": [18, 26]}
{"origin": [1.25, 1.25, -3.75], "size": [2, 3, 2], "uv": [18, 26]}
]
},
{
@@ -242,17 +266,17 @@
{
"name": "leg_front_left",
"parent": "body",
"pivot": [-2.25, 8.5, -3],
"pivot": [-2.25, 7.5, -3],
"cubes": [
{"origin": [-3.75, 5, -4.5], "size": [3, 5, 3], "uv": [47, 45]}
{"origin": [-3.75, 4, -4.5], "size": [3, 5, 3], "uv": [47, 45]}
]
},
{
"name": "leg_front_left2",
"parent": "leg_front_left",
"pivot": [-2.25, 5, -3.75],
"pivot": [-2.25, 4, -3.75],
"cubes": [
{"origin": [-3.25, 1.25, -3.75], "size": [2, 4, 2], "uv": [42, 26]}
{"origin": [-3.25, 1.25, -3.75], "size": [2, 3, 2], "uv": [42, 26]}
]
},
{
@@ -266,17 +290,17 @@
{
"name": "leg_back_right",
"parent": "body",
"pivot": [2.25, 8.5, 3.5],
"pivot": [2.25, 7.5, 3.5],
"cubes": [
{"origin": [0.75, 5, 1.5], "size": [3, 5, 4], "uv": [22, 39]}
{"origin": [0.75, 4, 1.5], "size": [3, 5, 4], "uv": [22, 39]}
]
},
{
"name": "leg_back_right2",
"parent": "leg_back_right",
"pivot": [2.25, 5, 5],
"pivot": [2.25, 4, 5],
"cubes": [
{"origin": [1.25, 1.25, 3.75], "size": [2, 4, 2], "uv": [46, 37]}
{"origin": [1.25, 1.25, 3.75], "size": [2, 3, 2], "uv": [46, 37]}
]
},
{
@@ -290,17 +314,17 @@
{
"name": "leg_back_left",
"parent": "body",
"pivot": [-2.25, 8.5, 3.5],
"pivot": [-2.25, 7.5, 3.5],
"cubes": [
{"origin": [-3.75, 5, 1.5], "size": [3, 5, 4], "uv": [36, 39]}
{"origin": [-3.75, 4, 1.5], "size": [3, 5, 4], "uv": [36, 39]}
]
},
{
"name": "leg_back_left2",
"parent": "leg_back_left",
"pivot": [-2.25, 5, 5],
"pivot": [-2.25, 4, 5],
"cubes": [
{"origin": [-3.25, 1.25, 3.75], "size": [2, 4, 2], "uv": [20, 48]}
{"origin": [-3.25, 1.25, 3.75], "size": [2, 3, 2], "uv": [20, 48]}
]
},
{
@@ -30,7 +30,7 @@
]
},
{
"name": "wool",
"name": "wool_shearable",
"parent": "torso",
"pivot": [0, 12.75, 0.25],
"cubes": [
@@ -47,7 +47,7 @@
]
},
{
"name": "neck_wool",
"name": "neck_wool_shearable",
"parent": "neck",
"pivot": [0, 15.5, -9.5],
"rotation": [-62.5, 0, 0],
@@ -57,7 +57,7 @@
},
{
"name": "neck_wool_middle_right",
"parent": "neck_wool",
"parent": "neck_wool_shearable",
"pivot": [0.25, 13.75, -9.5],
"rotation": [7.5, 0, 12.5],
"cubes": [
@@ -66,7 +66,7 @@
},
{
"name": "neck_wool_middle_left",
"parent": "neck_wool",
"parent": "neck_wool_shearable",
"pivot": [-0.25, 13.75, -9.5],
"rotation": [7.5, 0, -12.5],
"cubes": [
@@ -75,7 +75,7 @@
},
{
"name": "neck_wool_right",
"parent": "neck_wool",
"parent": "neck_wool_shearable",
"pivot": [-1.75, 13.75, -9.5],
"rotation": [12.5, 0, 25],
"cubes": [
@@ -84,7 +84,7 @@
},
{
"name": "neck_wool_left",
"parent": "neck_wool",
"parent": "neck_wool_shearable",
"pivot": [1.75, 13.75, -9.5],
"rotation": [12.5, 0, -25],
"cubes": [
@@ -324,19 +324,19 @@
{
"name": "tail",
"parent": "torso",
"pivot": [0, 15, 7],
"pivot": [0, 14, 7],
"rotation": [-42.5, 0, 0],
"cubes": [
{"origin": [-0.5, 14, 7], "size": [1, 1, 3], "inflate": 0.01, "uv": [102, 1]}
{"origin": [-0.5, 13, 7], "size": [1, 1, 3], "inflate": 0.01, "uv": [102, 1]}
]
},
{
"name": "tail2",
"parent": "tail",
"pivot": [0, 14, 10],
"pivot": [0, 13, 10],
"rotation": [35, 0, 0],
"cubes": [
{"origin": [-0.5, 14, 10], "size": [1, 1, 3], "uv": [98, 26]}
{"origin": [-0.5, 13, 10], "size": [1, 1, 3], "uv": [98, 26]}
]
},
{
@@ -14,6 +14,210 @@
"shiny"
],
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_shiny.png"
},
{
"aspects": [
"color-black"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_black.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_brown.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_cyan.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_green.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_light_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_light_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_lime.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_magenta.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_orange.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_pink.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_purple.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_red.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_yellow.png",
"emissive": false
}
]
}
]
}
@@ -14,6 +14,390 @@
"shiny"
],
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_shiny.png"
},
{
"aspects": [
"color-black"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_black.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_brown.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_cyan.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_green.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_lime.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_magenta.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_orange.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_pink.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_purple.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_red.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_white.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_yellow.png",
"emissive": false
}
]
},
{
"aspects": [
"color-black shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_black_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_blue_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_brown_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_cyan_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_gray_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_green_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_blue_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_gray_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_lime_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_magenta_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_orange_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_pink_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_purple_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_red_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_white_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_yellow_shiny.png",
"emissive": false
}
]
}
]
}
@@ -0,0 +1,19 @@
{
"variants": {
"facing=south": {
"model": "cobblemon:block/stadium_terminal"
},
"facing=west": {
"model": "cobblemon:block/stadium_terminal",
"y": 90
},
"facing=north": {
"model": "cobblemon:block/stadium_terminal",
"y": 180
},
"facing=east": {
"model": "cobblemon:block/stadium_terminal",
"y": 270
}
}
}
@@ -478,6 +478,7 @@
"block.cobblemon.healing_machine.tooltip1": "Must be charged after placing.",
"block.cobblemon.healing_machine.tooltip2": "Charges over time.",
"block.cobblemon.pc": "PC",
"block.cobblemon.stadium_terminal": "Stadium Terminal",
"block.cobblemon.restoration_tank": "Restoration Tank",
"block.cobblemon.fossil_analyzer": "Fossil Analyzer",
"block.cobblemon.monitor": "Data Monitor",
@@ -1130,6 +1131,7 @@
"cobblemon.battle.cant.shelltrap": "%1$s's shell trap didn't work!",
"cobblemon.battle.cant.taunt": "%1$s can't use %2$s after the taunt!",
"cobblemon.battle.cant.throatchop": "The effects of Throat Chop prevent %1$s from using certain moves!",
"cobblemon.battle.cant.nopp": "%1$s can't use %2$s because it is out of PP!",
"cobblemon.battle.activate.confusion": "%1$s is confused!",
"cobblemon.battle.activate.happyhour": "Everyone is caught up in the happy atmosphere!",
@@ -0,0 +1,126 @@
{
"credit": "Made with Blockbench by dhi_holo (@holo_modeller)",
"texture_size": [32, 32],
"textures": {
"0": "cobblemon:block/display_case_bottom",
"1": "cobblemon:block/display_case_side",
"2": "cobblemon:block/display_case_top",
"3": "cobblemon:block/display_case_internal",
"4": "cobblemon:block/display_case_pillow",
"particle": "cobblemon:block/display_case_bottom"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 4, 16],
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
},
{
"name": "glasss",
"from": [0, 4, 0],
"to": [16, 16, 0],
"faces": {
"north": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "north"}
}
},
{
"name": "glasss",
"from": [0, 4, 16],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "south"}
}
},
{
"name": "glasss",
"from": [0, 4, 0],
"to": [0, 16, 16],
"faces": {
"east": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "west"}
}
},
{
"name": "glasss",
"from": [16, 4, 0],
"to": [16, 16, 16],
"faces": {
"east": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "east"}
}
},
{
"name": "glasss",
"from": [0, 16, 0],
"to": [16, 16, 16],
"faces": {
"up": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "up"}
}
},
{
"from": [2, 4, 2],
"to": [14, 5, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 2]},
"faces": {
"north": {"uv": [1, 13, 13, 14], "texture": "#4"},
"east": {"uv": [0, 1, 1, 13], "rotation": 270, "texture": "#4"},
"south": {"uv": [1, 0, 13, 1], "rotation": 180, "texture": "#4"},
"west": {"uv": [13, 1, 14, 13], "rotation": 90, "texture": "#4"},
"up": {"uv": [13, 13, 1, 1], "texture": "#4"}
}
}
],
"groups": [
0,
{
"name": "glass",
"origin": [0, 0, 0],
"color": 0,
"children": [1, 2, 3, 4, 5]
},
6
],
"gui_light": "side",
"display": {
"gui": {
"rotation": [ 30, 225, 0 ],
"translation": [ 0, 0, 0 ],
"scale":[ 0.625, 0.625, 0.625 ]
},
"ground": {
"rotation": [ 0, 0, 0 ],
"translation": [ 0, 3, 0 ],
"scale":[ 0.25, 0.25, 0.25 ]
},
"fixed": {
"rotation": [ 0, 0, 0 ],
"translation": [ 0, 0, 0 ],
"scale":[ 0.5, 0.5, 0.5 ]
},
"thirdperson_righthand": {
"rotation": [ 75, 135, 0 ],
"translation": [ 0, 2.5, 0 ],
"scale": [ 0.375, 0.375, 0.375 ]
},
"firstperson_righthand": {
"rotation": [ 0, 135, 0 ],
"translation": [ 0, 0, 0 ],
"scale": [ 0.40, 0.40, 0.40 ]
},
"firstperson_lefthand": {
"rotation": [ 0, 135, 0 ],
"translation": [ 0, 0, 0 ],
"scale": [ 0.40, 0.40, 0.40 ]
}
}
}
@@ -0,0 +1,3 @@
{
"parent": "cobblemon:block/stadium_terminal"
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -215,6 +215,7 @@
"variant": "level_up",
"result": "forretress shulker",
"consumeHeldItem": true,
"permanent": true,
"learnableMoves": [
"heavyslam"
],
@@ -17,8 +17,7 @@
"speed": 70
},
"features": [
"hisuian",
"regional"
"hisuian"
],
"catchRate": 45,
"maleRatio": 0.875,
@@ -63,7 +62,6 @@
"1:leafstorm",
"1:tackle",
"1:uturn",
"1:spiritshackle",
"9:peck",
"12:shadowsneak",
"15:razorleaf",
@@ -140,8 +138,7 @@
"hisui_regional"
],
"aspects": [
"hisuian",
"regional-hisui"
"hisuian"
],
"height": 16,
"weight": 370,
@@ -191,7 +188,6 @@
"1:leafage",
"1:leafstorm",
"1:phantomforce",
"1:spiritshackle",
"1:spite",
"1:tackle",
"1:uturn",
@@ -1,4 +1,4 @@
{
"pokemon": ["conkeldurr"],
"pokemon": ["conkeldurr", "wooloo", "dubwool"],
"features": ["color"]
}

Some files were not shown because too many files have changed in this diff Show More