mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-11-01 05:48:53 -05:00
Compare commits
76
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
448605b273 | ||
|
|
b82287f258 | ||
|
|
c884c556cb | ||
|
|
9a8b481fa2 | ||
|
|
e2fb31fad3 | ||
|
|
4e1b82917b | ||
|
|
3b1d257241 | ||
|
|
0b8f916648 | ||
|
|
5ad7d5406a | ||
|
|
6ec008ee83 | ||
|
|
f4d2226ec2 | ||
|
|
0fc5d5e9d7 | ||
|
|
972c0f6430 | ||
|
|
86db95a7dc | ||
|
|
be95b79e4d | ||
|
|
5753443ab2 | ||
|
|
c6b7186032 | ||
|
|
32f3be2687 | ||
|
|
9012d78806 | ||
|
|
fffdfb7654 | ||
|
|
b314733f0b | ||
|
|
d5aa07fe91 | ||
|
|
27bedc2d2c | ||
|
|
86744c23a5 | ||
|
|
8d1a64136f | ||
|
|
bc550dd32c | ||
|
|
3009af8c42 | ||
|
|
bfd34eb621 | ||
|
|
2dc2c96176 | ||
|
|
df4db17cfd | ||
|
|
45bec488f1 | ||
|
|
9287374504 | ||
|
|
90c5180712 | ||
|
|
f2a36cd74a | ||
|
|
158aa05f24 | ||
|
|
8924d0fe0f | ||
|
|
d510eaa462 | ||
|
|
a3122812e4 | ||
|
|
8b63057d9d | ||
|
|
d572b3c505 | ||
|
|
8edc60224a | ||
|
|
a634c4f046 | ||
|
|
7139d4708b | ||
|
|
50e99736a3 | ||
|
|
68c4acf0eb | ||
|
|
5b5e7109f5 | ||
|
|
19698fc0ff | ||
|
|
37596523db | ||
|
|
eb80c20dbf | ||
|
|
7ab3951613 | ||
|
|
e6d51c4d56 | ||
|
|
3813ec3c92 | ||
|
|
b9364304ca | ||
|
|
9be212d2b8 | ||
|
|
2559257b3a | ||
|
|
8236c6fb11 | ||
|
|
2041d43db4 | ||
|
|
a1687e8304 | ||
|
|
94d92b6fc0 | ||
|
|
3aa95b9339 | ||
|
|
4e97f70801 | ||
|
|
404ca565f5 | ||
|
|
93db0e1cda | ||
|
|
4a4d292228 | ||
|
|
0fef9eec3d | ||
|
|
5f3dc395ec | ||
|
|
1bf9d36dbd | ||
|
|
b19c5ed125 | ||
|
|
e3cca0d9cf | ||
|
|
1aa55f8199 | ||
|
|
4c16b2ce2e | ||
|
|
a0b263e392 | ||
|
|
743da2817b | ||
|
|
ebdf69f496 | ||
|
|
995364c960 | ||
|
|
289b2ddc7b |
No files matched your search
@@ -36,6 +36,7 @@ common/src/main/resources/assets/cobblemon/showdown
|
||||
*/generated/resources/*
|
||||
/fabric/src/generated/resources/cobblemon-common.accesswidener
|
||||
/.ignored/
|
||||
common/.fabric
|
||||
|
||||
# MacOS
|
||||
.DS_Store
|
||||
+37
-3
@@ -2,10 +2,44 @@
|
||||
|
||||
## [1.5.1](#1-5-1)
|
||||
|
||||
### 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
|
||||
### Additions
|
||||
- Added unique send out particles for Cherish, Dream, Beast, and Ancient Origin balls.
|
||||
- Made Wooloo and Dubwool dye-able like sheep
|
||||
|
||||
## [1.5.0 - The Ruins and Revival Update (May Xth, 2024)](#1-5-0)
|
||||
### 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.
|
||||
|
||||
### Data Pack & Resource Pack Creators
|
||||
- Added support for MoLang conditions for quirks and poses.
|
||||
- Changed the AttackDefenceRatio requirement to StatCompare and StatEqual.
|
||||
|
||||
## [1.5.0 - The Ruins and Revival Update (May 12th, 2024)](#1-5-0)
|
||||
#### "You're telling me that Mojang has added archaeology to the game? Hmm... that gives me an idea."
|
||||
|
||||
### Additions
|
||||
|
||||
@@ -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
|
||||
@@ -189,6 +188,7 @@ object Cobblemon {
|
||||
implementation.registerEntityAttributes()
|
||||
implementation.registerBlockEntityTypes()
|
||||
implementation.registerWorldGenFeatures()
|
||||
implementation.registerFoliagePlacers()
|
||||
implementation.registerParticles()
|
||||
|
||||
DropEntry.register("command", CommandDropEntry::class.java)
|
||||
@@ -235,7 +235,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 +416,6 @@ object Cobblemon {
|
||||
).ifSuccessful { it.mute = true }
|
||||
}
|
||||
|
||||
CobblemonSherds.registerSherds()
|
||||
}
|
||||
|
||||
fun getLevel(dimension: RegistryKey<World>): World? {
|
||||
|
||||
@@ -234,7 +234,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
||||
"relic_coin_pouch",
|
||||
CoinPouchBlock(
|
||||
AbstractBlock.Settings.create()
|
||||
.sounds(CobblemonSounds.COIN_POUCH_SOUNDS)
|
||||
.sounds(CobblemonSounds.RELIC_COIN_POUCH_SOUNDS)
|
||||
.pistonBehavior(PistonBehavior.DESTROY)
|
||||
.strength(0.4f)
|
||||
.nonOpaque(), true
|
||||
@@ -245,7 +245,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
||||
"relic_coin_sack",
|
||||
CoinPouchBlock(
|
||||
AbstractBlock.Settings.create()
|
||||
.sounds(CobblemonSounds.COIN_POUCH_SOUNDS)
|
||||
.sounds(CobblemonSounds.RELIC_COIN_SACK_SOUNDS)
|
||||
.pistonBehavior(PistonBehavior.DESTROY)
|
||||
.strength(0.4f), false
|
||||
))
|
||||
@@ -528,6 +528,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
|
||||
val WEPEAR_BERRY = this.berryBlock("wepear")
|
||||
val WIKI_BERRY = this.berryBlock("wiki")
|
||||
val YACHE_BERRY = this.berryBlock("yache")
|
||||
//val BINDING_SOIL = this.create("binding_soil", BindingSoilBlock(AbstractBlock.Settings.create()))
|
||||
|
||||
init {
|
||||
/**
|
||||
|
||||
@@ -106,6 +106,8 @@ interface CobblemonImplementation {
|
||||
*/
|
||||
fun registerWorldGenFeatures()
|
||||
|
||||
fun registerFoliagePlacers()
|
||||
|
||||
fun registerParticles()
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,6 +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.BerryItem
|
||||
import com.cobblemon.mod.common.item.berry.FriendshipRaisingBerryItem
|
||||
import com.cobblemon.mod.common.item.berry.HealingBerryItem
|
||||
import com.cobblemon.mod.common.item.berry.PPRestoringBerryItem
|
||||
@@ -985,6 +986,8 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
|
||||
val STEEL_GEM = noSettingsItem("steel_gem")
|
||||
@JvmField
|
||||
val FAIRY_GEM = noSettingsItem("fairy_gem")
|
||||
//@JvmField
|
||||
//val BINDING_SOIL = blockItem("binding_soil", CobblemonBlocks.BINDING_SOIL)
|
||||
|
||||
private fun blockItem(name: String, block: Block): BlockItem = this.create(name, BlockItem(block, Item.Settings()))
|
||||
|
||||
|
||||
@@ -122,13 +122,18 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
|
||||
val FOSSIL_MACHINE_UNPROTECTED = this.create("fossil_machine.unprotected")
|
||||
|
||||
@JvmField
|
||||
val COIN_POUCH_BREAK = this.create("coin_pouch.break")
|
||||
val RELIC_COIN_SACK_BREAK = this.create("relic_coin_sack.break")
|
||||
@JvmField
|
||||
val COIN_POUCH_HIT = this.create("coin_pouch.hit")
|
||||
val RELIC_COIN_SACK_HIT = this.create("relic_coin_sack.hit")
|
||||
@JvmField
|
||||
val COIN_POUCH_STEP = this.create("coin_pouch.step")
|
||||
val RELIC_COIN_SACK_STEP = this.create("relic_coin_sack.step")
|
||||
@JvmField
|
||||
val COIN_POUCH_PLACE = this.create("coin_pouch.place")
|
||||
val RELIC_COIN_SACK_PLACE = this.create("relic_coin_sack.place")
|
||||
@JvmField
|
||||
val RELIC_COIN_POUCH_BREAK = this.create("relic_coin_pouch.break")
|
||||
@JvmField
|
||||
val RELIC_COIN_POUCH_PLACE = this.create("relic_coin_pouch.place")
|
||||
|
||||
@JvmField
|
||||
val TUMBLESTONE_BREAK = this.create("tumblestone.break")
|
||||
@JvmField
|
||||
@@ -189,13 +194,22 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
|
||||
val GILDED_CHEST_PLACE = this.create("gilded_chest.place")
|
||||
|
||||
@JvmField
|
||||
val COIN_POUCH_SOUNDS = BlockSoundGroup(1f, 1f,
|
||||
COIN_POUCH_BREAK,
|
||||
COIN_POUCH_STEP,
|
||||
COIN_POUCH_PLACE,
|
||||
COIN_POUCH_HIT,
|
||||
COIN_POUCH_STEP
|
||||
val RELIC_COIN_SACK_SOUNDS = BlockSoundGroup(1f, 1f,
|
||||
RELIC_COIN_SACK_BREAK,
|
||||
RELIC_COIN_SACK_STEP,
|
||||
RELIC_COIN_SACK_PLACE,
|
||||
RELIC_COIN_SACK_HIT,
|
||||
RELIC_COIN_SACK_STEP
|
||||
)
|
||||
@JvmField
|
||||
val RELIC_COIN_POUCH_SOUNDS = BlockSoundGroup(1f, 1f,
|
||||
RELIC_COIN_POUCH_BREAK,
|
||||
RELIC_COIN_SACK_STEP,
|
||||
RELIC_COIN_POUCH_PLACE,
|
||||
RELIC_COIN_SACK_HIT,
|
||||
RELIC_COIN_SACK_STEP
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val IMPACT_NORMAL = this.create("impact.normal")
|
||||
@JvmField
|
||||
|
||||
@@ -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() }
|
||||
|
||||
@@ -16,7 +16,7 @@ import com.cobblemon.mod.common.api.events.berry.BerryYieldCalculationEvent
|
||||
import com.cobblemon.mod.common.api.mulch.MulchVariant
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.block.entity.BerryBlockEntity
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.item.berry.BerryItem
|
||||
import com.cobblemon.mod.common.pokemon.Nature
|
||||
import com.cobblemon.mod.common.util.readBox
|
||||
import com.cobblemon.mod.common.util.writeBox
|
||||
@@ -45,9 +45,8 @@ import net.minecraft.world.biome.Biome
|
||||
* @property identifier The [Identifier] of this berry.
|
||||
* @property baseYield The [IntRange] possible for the berry tree before [bonusYield] is calculated.
|
||||
* @property preferredBiomeTags The [TagKey]s of the berries preffered biomes. Determines spawning and yield
|
||||
* @property growthTime The [IntRange] possible in minutes for how long the berry tree takes to grow.
|
||||
* @property refreshRate The [IntRange] possible in minutes for how long the berry tree takes to regrow its berries once it has been harvested.
|
||||
* @depreciated @property lifeCycles The [IntRange] possible for the berry to live for between harvests.
|
||||
* @property growthTime The [IntRange] possible in minutes for how long the berry tree takes to grow frome age 0 to age 3
|
||||
* @property refreshRate The [IntRange] possible in minutes for how long the berry tree takes to grow from age 3 to age 5
|
||||
* @property favoriteMulches The types of mulches that benefit this berries yield
|
||||
* @property growthFactors An array of [GrowthFactor]s that will affect this berry. The client is not aware of these.
|
||||
* @property mutations A map of the partner berry as the key and the value as the resulting mutation with this berry.
|
||||
@@ -60,6 +59,7 @@ import net.minecraft.world.biome.Biome
|
||||
* @property flowerTexture The [Identifier] for the texture of the berry in flower form. This is resolved into a [ModelPart] on the client.
|
||||
* @property fruitModelIdentifier The [Identifier] for the model of the berry in flower form. This is resolved into a [ModelPart] on the client.
|
||||
* @property fruitTexture The [Identifier] for the texture of the berry in flower form.
|
||||
* @property stageOnePositioning Transformation of the berry model for age 0
|
||||
*
|
||||
* @throws IllegalArgumentException if the any yield range argument is not a positive range.
|
||||
*/
|
||||
@@ -69,7 +69,6 @@ class Berry(
|
||||
val preferredBiomeTags: List<TagKey<Biome>>,
|
||||
val growthTime: IntRange,
|
||||
val refreshRate: IntRange,
|
||||
//val lifeCycles: IntRange,
|
||||
val favoriteMulches: EnumSet<MulchVariant>,
|
||||
val growthFactors: Collection<GrowthFactor>,
|
||||
val spawnConditions: List<BerrySpawnCondition>,
|
||||
@@ -88,6 +87,7 @@ class Berry(
|
||||
@SerializedName("fruitModel")
|
||||
val fruitModelIdentifier: Identifier,
|
||||
val fruitTexture: Identifier,
|
||||
val stageOnePositioning: GrowthPoint,
|
||||
val weight: Float
|
||||
) {
|
||||
|
||||
@@ -162,7 +162,8 @@ class Berry(
|
||||
var yield = base + bonus.first
|
||||
val treeEntity = world.getBlockEntity(pos) as BerryBlockEntity
|
||||
if (BerryBlock.getMulch(state) == MulchVariant.RICH) {
|
||||
yield = min(yield + 1, maxYield())
|
||||
//I hope the upper bound isnt exclusive, especially when there's a method called nextBetweenExclusive
|
||||
yield += world.random.nextBetween(1, 2)
|
||||
treeEntity.decrementMulchDuration(world, pos, state)
|
||||
}
|
||||
val event = BerryYieldCalculationEvent(this, world, state, pos, placer, yield, bonus.second)
|
||||
@@ -279,6 +280,12 @@ class Berry(
|
||||
buffer.writeIdentifier(this.flowerTexture)
|
||||
buffer.writeIdentifier(this.fruitModelIdentifier)
|
||||
buffer.writeIdentifier(this.fruitTexture)
|
||||
buffer.writeDouble(stageOnePositioning.position.x)
|
||||
buffer.writeDouble(stageOnePositioning.position.y)
|
||||
buffer.writeDouble(stageOnePositioning.position.z)
|
||||
buffer.writeDouble(stageOnePositioning.rotation.x)
|
||||
buffer.writeDouble(stageOnePositioning.rotation.y)
|
||||
buffer.writeDouble(stageOnePositioning.rotation.z)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -339,7 +346,8 @@ class Berry(
|
||||
val flowerTexture = buffer.readIdentifier()
|
||||
val fruitModelIdentifier = buffer.readIdentifier()
|
||||
val fruitTexture = buffer.readIdentifier()
|
||||
return Berry(identifier, baseYield, emptyList(), growthTime, refreshRate, favMulchs, emptySet(), emptyList(), growthPoints, randomizedGrowthPoints, mutations, sproutShapeBoxes, matureShapeBoxes, flavors, tintIndexes, flowerModelIdentifier, flowerTexture, fruitModelIdentifier, fruitTexture, 0F)
|
||||
val stageOneYPos = GrowthPoint(Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()), Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()))
|
||||
return Berry(identifier, baseYield, emptyList(), growthTime, refreshRate, favMulchs, emptySet(), emptyList(), growthPoints, randomizedGrowthPoints, mutations, sproutShapeBoxes, matureShapeBoxes, flavors, tintIndexes, flowerModelIdentifier, flowerTexture, fruitModelIdentifier, fruitTexture, stageOneYPos, 0F)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@ import net.minecraft.util.StringIdentifiable
|
||||
*/
|
||||
enum class MulchVariant(val duration: Int = -1) : StringIdentifiable {
|
||||
COARSE,
|
||||
GROWTH(3),
|
||||
GROWTH(5),
|
||||
HUMID,
|
||||
LOAMY,
|
||||
PEAT,
|
||||
RICH(3),
|
||||
RICH(5),
|
||||
SANDY,
|
||||
SURPRISE(3),
|
||||
NONE;
|
||||
@@ -28,4 +28,8 @@ enum class MulchVariant(val duration: Int = -1) : StringIdentifiable {
|
||||
override fun asString(): String {
|
||||
return name.lowercase()
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val GROWTH_TIME_MULTIPLIER = 0.5
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -34,15 +34,19 @@ abstract class SpawnAction<R>(
|
||||
/**
|
||||
* Runs the spawn action and processes any non-null result.
|
||||
*/
|
||||
open fun complete(): Boolean {
|
||||
open fun complete(): R? {
|
||||
if (future.isDone) {
|
||||
return null
|
||||
}
|
||||
|
||||
ctx.influences.forEach { it.affectAction(this) }
|
||||
val result = run()
|
||||
return if (result != null) {
|
||||
if (result != null) {
|
||||
future.complete(result)
|
||||
true
|
||||
} else {
|
||||
future.completeExceptionally(Exception("Nothing was spawned."))
|
||||
false
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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)
|
||||
|
||||
@@ -99,7 +99,7 @@ open class PCStore(
|
||||
this.lockedSize = lockNewSize
|
||||
if (boxes.size > newSize) {
|
||||
// reduce
|
||||
val slicedBoxes = boxes.slice(boxes.size until newSize)
|
||||
val slicedBoxes = boxes.slice(newSize until boxes.size)
|
||||
boxes.removeAll(slicedBoxes)
|
||||
slicedBoxes.flatMap { it.asIterable() }.forEach(overflowHandler)
|
||||
} else {
|
||||
|
||||
+2
-2
@@ -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() }
|
||||
|
||||
@@ -89,6 +89,7 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
|
||||
.with(WAS_GENERATED, false)
|
||||
.with(AGE, 0)
|
||||
.with(MULCH, MulchVariant.NONE)
|
||||
.with(IS_ROOTED, false)
|
||||
}
|
||||
|
||||
override fun grow(world: ServerWorld, random: Random, pos: BlockPos, state: BlockState) {
|
||||
@@ -143,7 +144,9 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
|
||||
state: BlockState,
|
||||
variant: MulchVariant
|
||||
): Boolean {
|
||||
return getMulch(state) == MulchVariant.NONE && state.get(AGE) < FLOWER_AGE && world.getBlockState(pos.down()).isOf(Blocks.FARMLAND)
|
||||
val underBlockState = world.getBlockState(pos.down())
|
||||
val validSoil = state.get(IS_ROOTED) || underBlockState.isIn(CobblemonBlockTags.BERRY_SOIL)
|
||||
return getMulch(state) == MulchVariant.NONE && state.get(AGE) < FLOWER_AGE && validSoil
|
||||
}
|
||||
|
||||
override fun applyMulch(
|
||||
@@ -189,7 +192,7 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
|
||||
val below = world.getBlockState(pos.down())
|
||||
return (state.get(WAS_GENERATED) && below.isIn(CobblemonBlockTags.BERRY_WILD_SOIL))
|
||||
|| below.isIn(CobblemonBlockTags.BERRY_SOIL)
|
||||
|| below.block is FarmlandBlock
|
||||
|| state.get(IS_ROOTED)
|
||||
}
|
||||
|
||||
@Deprecated("Deprecated in Java")
|
||||
@@ -208,6 +211,7 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
|
||||
builder.add(AGE)
|
||||
builder.add(WAS_GENERATED)
|
||||
builder.add(MULCH)
|
||||
builder.add(IS_ROOTED)
|
||||
}
|
||||
|
||||
override fun getPickStack(world: BlockView?, pos: BlockPos?, state: BlockState?): ItemStack {
|
||||
@@ -239,6 +243,7 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
|
||||
val AGE: IntProperty = IntProperty.of("age", 0, FRUIT_AGE)
|
||||
val MULCH: EnumProperty<MulchVariant> = EnumProperty.of("mulch", MulchVariant::class.java)
|
||||
val WAS_GENERATED: BooleanProperty = BooleanProperty.of("generated")
|
||||
val IS_ROOTED: BooleanProperty = BooleanProperty.of("rooted")
|
||||
// val PLANTED_SHAPE = VoxelShapes.union(
|
||||
// VoxelShapes.cuboid(0.3125, -0.0625, 0.3125, 0.6875, 0.0, 0.6875),
|
||||
// VoxelShapes.cuboid(0.375, 0.0, 0.375, 0.625, 0.0625, 0.625)
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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.block.entity.BerryBlockEntity
|
||||
import com.cobblemon.mod.common.item.berry.BerryItem
|
||||
import net.minecraft.block.AbstractBlock
|
||||
import net.minecraft.block.Block
|
||||
import net.minecraft.block.BlockState
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
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
|
||||
|
||||
/**
|
||||
* @author Apion
|
||||
* @since February 27, 2024
|
||||
*/
|
||||
class BindingSoilBlock(settings: Settings) : Block(settings) {
|
||||
@Deprecated("Deprecated in Java")
|
||||
override fun onUse(
|
||||
state: BlockState,
|
||||
world: World,
|
||||
pos: BlockPos,
|
||||
player: PlayerEntity,
|
||||
hand: Hand,
|
||||
hit: BlockHitResult
|
||||
): ActionResult {
|
||||
if (!world.isClient) {
|
||||
val itemStack = player.getStackInHand(hand)
|
||||
val item = itemStack.item
|
||||
if (item is BerryItem) {
|
||||
world.setBlockState(pos, item.block.defaultState.with(BerryBlock.IS_ROOTED, true))
|
||||
if (!player.isCreative) {
|
||||
itemStack.decrement(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
return ActionResult.SUCCESS
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -43,8 +43,8 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
|
||||
lateinit var berryIdentifier: Identifier
|
||||
private val ticksPerMinute = 1200
|
||||
var renderState: RenderState? = null
|
||||
//The time left for the tree to grow to stage 5
|
||||
var growthTimer: Int = 72000
|
||||
//The time left for the tree until its either age 3 or age 5 (check block state, if we are at age 0<x<3 unti 3 otherwise until 5)
|
||||
var growthTimer: Int = 0
|
||||
set(value) {
|
||||
if (value < 0) {
|
||||
throw IllegalArgumentException("You cannot set the growth time to less than zero")
|
||||
@@ -55,7 +55,7 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
|
||||
field = value
|
||||
}
|
||||
//The time left for the tree to grow to the next stage
|
||||
var stageTimer: Int = growthTimer / BerryBlock.MATURE_AGE
|
||||
var stageTimer: Int = 0
|
||||
set(value) {
|
||||
if (field != value) {
|
||||
this.markDirty()
|
||||
@@ -107,6 +107,8 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
|
||||
}
|
||||
}
|
||||
|
||||
//This function basically runs twice when the berry tree is growing, once when it starts, once when it hits age 3
|
||||
//Why dont we just go 0-5? Design thinks its annoying to balance the numbers using 0-5 and 3-5
|
||||
fun resetGrowTimers(pos: BlockPos, state: BlockState) {
|
||||
val curAge = state.get(BerryBlock.AGE)
|
||||
if (curAge == 5) {
|
||||
@@ -119,12 +121,14 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
|
||||
val upperGrowthLimit = (if (curAge == 0) berry.growthTime.last else berry.refreshRate.last) * multiplier / 10
|
||||
val growthRange = lowerGrowthLimit..upperGrowthLimit
|
||||
|
||||
this.growthTimer = this.applyMulchModifier(pos, growthRange.random() * ticksPerMinute)
|
||||
this.goToNextStageTimer(BerryBlock.FRUIT_AGE - curAge)
|
||||
this.growthTimer = this.applyMulchModifier(pos, growthRange.random() * ticksPerMinute, true)
|
||||
val stagesLeft = if (curAge < 3) BerryBlock.MATURE_AGE - curAge else BerryBlock.FRUIT_AGE - curAge
|
||||
this.goToNextStageTimer(stagesLeft)
|
||||
}
|
||||
|
||||
fun goToNextStageTimer(stagesLeft: Int) {
|
||||
val avgStageTime = growthTimer / stagesLeft
|
||||
//A number between 80% and 100% the average stage time
|
||||
stageTimer = this.world?.random?.nextBetween((avgStageTime * 8) / 10, avgStageTime) ?:
|
||||
(((Math.random() * 0.2) + 0.8) * avgStageTime).toInt()
|
||||
growthTimer -= stageTimer
|
||||
@@ -137,7 +141,7 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
|
||||
* @param timer Timer to be modified
|
||||
* @return The modified timer
|
||||
*/
|
||||
private fun applyMulchModifier(pos: BlockPos, timer: Int): Int {
|
||||
private fun applyMulchModifier(pos: BlockPos, timer: Int, decrementMulch: Boolean = false): Int {
|
||||
val state = world?.getBlockState(pos) ?: return timer
|
||||
|
||||
val curAge = state.get(BerryBlock.AGE)
|
||||
@@ -148,8 +152,12 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
|
||||
if (getMulch(state) != MulchVariant.GROWTH) {
|
||||
return timer
|
||||
}
|
||||
|
||||
return (timer * 0.66).toInt()
|
||||
if (decrementMulch) {
|
||||
world?.let {
|
||||
decrementMulchDuration(it, pos, state)
|
||||
}
|
||||
}
|
||||
return (timer * MulchVariant.GROWTH_TIME_MULTIPLIER).toInt()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -323,8 +331,9 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
|
||||
companion object {
|
||||
internal val TICKER = BlockEntityTicker<BerryBlockEntity> { world, pos, state, blockEntity ->
|
||||
if (world.isClient) return@BlockEntityTicker
|
||||
if (state.get(BerryBlock.IS_ROOTED)) return@BlockEntityTicker
|
||||
if (blockEntity.stageTimer >= 0) {
|
||||
blockEntity.stageTimer--
|
||||
//blockEntity.stageTimer--
|
||||
}
|
||||
if (blockEntity.stageTimer == 0) {
|
||||
(state.block as BerryBlock).grow(world as ServerWorld, world.random, pos, state)
|
||||
|
||||
+12
-15
@@ -56,23 +56,20 @@ class FossilAnalyzerBlockEntity(
|
||||
return ItemStack.EMPTY
|
||||
}
|
||||
|
||||
//Unimplemented since no extract
|
||||
override fun removeStack(slot: Int, amount: 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
|
||||
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) {
|
||||
return fossilMultiblockStructure.fossilInventory.removeAt(slot)
|
||||
}
|
||||
}
|
||||
// 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
|
||||
}
|
||||
|
||||
@@ -99,7 +96,7 @@ class FossilAnalyzerBlockEntity(
|
||||
if(analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
|
||||
return intArrayOf(0,1,2)
|
||||
}
|
||||
return IntArray(1)
|
||||
return IntArray(0)
|
||||
}
|
||||
|
||||
override fun canInsert(slot: Int, stack: ItemStack?, dir: Direction?): Boolean {
|
||||
@@ -114,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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+8
-5
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ import com.bedrockk.molang.runtime.value.MoValue
|
||||
import com.bedrockk.molang.runtime.value.StringValue
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addFunctions
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.getQueryStruct
|
||||
import com.cobblemon.mod.common.api.text.text
|
||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.sound.PositionedSoundInstance
|
||||
@@ -31,6 +32,13 @@ object ClientMoLangFunctions {
|
||||
MinecraftClient.getInstance().soundManager.play(PositionedSoundInstance.master(soundEvent, pitch))
|
||||
}
|
||||
},
|
||||
"is_time" to java.util.function.Function { params ->
|
||||
val time = (MinecraftClient.getInstance().world?.timeOfDay ?: 0) % 24000
|
||||
val min = params.getInt(0)
|
||||
val max = params.getInt(1)
|
||||
time in min..max
|
||||
},
|
||||
"say" to java.util.function.Function { params -> MinecraftClient.getInstance().player?.sendMessage(params.getString(0).text()) ?: Unit },
|
||||
)
|
||||
|
||||
fun MoLangRuntime.setupClient(): MoLangRuntime {
|
||||
|
||||
@@ -272,6 +272,9 @@ class PokemonClientDelegate : PoseableEntityState<PokemonEntity>(), PokemonSideD
|
||||
},
|
||||
"weight" to java.util.function.Function {
|
||||
return@Function DoubleValue(currentEntity.pokemon.species.weight.toDouble())
|
||||
},
|
||||
"friendship" to java.util.function.Function {
|
||||
return@Function DoubleValue(currentEntity.pokemon.friendship.toDouble())
|
||||
}
|
||||
))
|
||||
}
|
||||
|
||||
+33
-2
@@ -33,6 +33,7 @@ import net.minecraft.client.util.math.MatrixStack
|
||||
import net.minecraft.util.math.Box
|
||||
import net.minecraft.util.math.Vec3d
|
||||
import org.joml.Matrix4f
|
||||
import org.joml.Vector3f
|
||||
|
||||
|
||||
class BerryBlockRenderer(private val context: BlockEntityRendererFactory.Context) : BlockEntityRenderer<BerryBlockEntity> {
|
||||
@@ -46,7 +47,7 @@ class BerryBlockRenderer(private val context: BlockEntityRendererFactory.Context
|
||||
if (!isInRenderDistance(entity, entity.pos.toVec3d())) return
|
||||
val blockState = entity.cachedState
|
||||
val age = blockState.get(BerryBlock.AGE)
|
||||
if (age <= BerryBlock.MATURE_AGE) {
|
||||
if (age <= BerryBlock.MATURE_AGE && age != 0) {
|
||||
return
|
||||
}
|
||||
if (entity.renderState == null) {
|
||||
@@ -70,8 +71,38 @@ class BerryBlockRenderer(private val context: BlockEntityRendererFactory.Context
|
||||
CobblemonRenderLayers.BERRY_LAYER.endDrawing()
|
||||
matrices.pop()
|
||||
}
|
||||
|
||||
fun renderToBuffer(entity: BerryBlockEntity, light: Int, overlay: Int, buffer: VertexBuffer) {
|
||||
if (entity.cachedState.get(BerryBlock.AGE) == 0) {
|
||||
renderBabyToBuffer(entity, light, overlay, buffer)
|
||||
}
|
||||
else {
|
||||
renderAdultToBuffer(entity, light, overlay, buffer)
|
||||
}
|
||||
}
|
||||
|
||||
fun renderBabyToBuffer(entity: BerryBlockEntity, light: Int, overlay: Int, buffer: VertexBuffer) {
|
||||
val bufferBuilder = Tessellator.getInstance().buffer
|
||||
bufferBuilder.begin(CobblemonRenderLayers.BERRY_LAYER.drawMode, CobblemonRenderLayers.BERRY_LAYER.vertexFormat)
|
||||
val berry = entity.berry() ?: return
|
||||
val model = BerryModelRepository.modelOf(berry.fruitModelIdentifier) ?: return
|
||||
val pos = berry.stageOnePositioning.position
|
||||
model.setPosition(Axis.X_AXIS.ordinal, pos.x.toFloat())
|
||||
model.setPosition(Axis.Y_AXIS.ordinal, pos.y.toFloat())
|
||||
model.setPosition(Axis.Z_AXIS.ordinal, pos.z.toFloat())
|
||||
val rot = berry.stageOnePositioning.rotation
|
||||
model.setAngles(
|
||||
Math.toRadians(180 - rot.x).toFloat(),
|
||||
Math.toRadians(180 + rot.y).toFloat(),
|
||||
Math.toRadians(rot.z).toFloat()
|
||||
)
|
||||
model.render(MatrixStack(), bufferBuilder, light, overlay)
|
||||
val bufferBuilderFinal = bufferBuilder.end()
|
||||
buffer.bind()
|
||||
buffer.upload(bufferBuilderFinal)
|
||||
VertexBuffer.unbind()
|
||||
}
|
||||
|
||||
fun renderAdultToBuffer(entity: BerryBlockEntity, light: Int, overlay: Int, buffer: VertexBuffer) {
|
||||
val blockState = entity.cachedState
|
||||
val age = blockState.get(BerryBlock.AGE)
|
||||
if (age <= BerryBlock.MATURE_AGE) {
|
||||
|
||||
+9
-2
@@ -20,7 +20,10 @@ import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFram
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.quirk.SimpleQuirk
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.normalizeToArray
|
||||
import com.cobblemon.mod.common.util.resolveBoolean
|
||||
import com.cobblemon.mod.common.util.resolveObject
|
||||
import com.cobblemon.mod.common.util.singularToPluralList
|
||||
import com.google.gson.JsonArray
|
||||
import com.google.gson.JsonObject
|
||||
import com.google.gson.JsonPrimitive
|
||||
@@ -34,6 +37,8 @@ class JsonPose<T : Entity>(model: PoseableEntityModel<T>, json: JsonObject) {
|
||||
it.environment.getQueryStruct().addFunctions(model.functions.functions)
|
||||
}
|
||||
|
||||
val condition: ExpressionLike = json.singularToPluralList("condition").get("condition")?.normalizeToArray()?.map { it.asString }?.asExpressionLike() ?: "true".asExpressionLike()
|
||||
|
||||
val poseName = json.get("poseName")?.asString ?: "pose"
|
||||
val poseTypes = (json.get("poseTypes")?.asJsonArray?.map { name ->
|
||||
PoseType.values().find { it.name.lowercase() == name.asString.lowercase() }
|
||||
@@ -81,8 +86,9 @@ class JsonPose<T : Entity>(model: PoseableEntityModel<T>, json: JsonObject) {
|
||||
}
|
||||
|
||||
json as JsonObject
|
||||
json.singularToPluralList("animation")
|
||||
val animations: (state: PoseableEntityState<T>) -> List<StatefulAnimation<T, *>> = { _ ->
|
||||
(json.get("animations")?.asJsonArray ?: JsonArray()).map { animJson ->
|
||||
(json.get("animations")?.normalizeToArray()?.asJsonArray ?: JsonArray()).map { animJson ->
|
||||
try {
|
||||
val expr = animJson.asString.asExpressionLike()
|
||||
runtime.resolveObject(expr).obj as StatefulAnimation<T, *>
|
||||
@@ -97,10 +103,11 @@ class JsonPose<T : Entity>(model: PoseableEntityModel<T>, json: JsonObject) {
|
||||
val loopTimes = json.get("loopTimes")?.asInt ?: 1
|
||||
val minSeconds = json.get("minSecondsBetweenOccurrences")?.asFloat ?: 8F
|
||||
val maxSeconds = json.get("maxSecondsBetweenOccurrences")?.asFloat ?: 30F
|
||||
val condition = json.get("condition")?.asString?.asExpressionLike() ?: "true".asExpressionLike()
|
||||
|
||||
model.quirkMultiple(
|
||||
secondsBetweenOccurrences = minSeconds to maxSeconds,
|
||||
condition = { true },
|
||||
condition = { it.runtime.resolveBoolean(condition) },
|
||||
loopTimes = 1..loopTimes,
|
||||
animations = animations
|
||||
)
|
||||
|
||||
+13
@@ -46,6 +46,7 @@ import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.getDoubleOrNull
|
||||
import com.cobblemon.mod.common.util.getStringOrNull
|
||||
import com.cobblemon.mod.common.util.plus
|
||||
import com.cobblemon.mod.common.util.resolveBoolean
|
||||
import net.minecraft.client.model.ModelPart
|
||||
import net.minecraft.client.render.OverlayTexture
|
||||
import net.minecraft.client.render.RenderLayer
|
||||
@@ -878,6 +879,18 @@ abstract class PoseableEntityModel<T : Entity>(
|
||||
animations = { listOf(animation(it)) }
|
||||
)
|
||||
|
||||
fun quirkMoLangCondition(
|
||||
secondsBetweenOccurrences: Pair<Float, Float> = 8F to 30F,
|
||||
loopTimes: IntRange = 1..1,
|
||||
conditionExpression: ExpressionLike = "true".asExpressionLike(),
|
||||
animation: (state: PoseableEntityState<T>) -> StatefulAnimation<T, *>
|
||||
) = SimpleQuirk<T>(
|
||||
secondsBetweenOccurrences = secondsBetweenOccurrences,
|
||||
loopTimes = loopTimes,
|
||||
condition = { it.runtime.resolveBoolean(conditionExpression) },
|
||||
animations = { listOf(animation(it)) }
|
||||
)
|
||||
|
||||
fun quirkMultiple(
|
||||
secondsBetweenOccurrences: Pair<Float, Float> = 8F to 30F,
|
||||
loopTimes: IntRange = 1..1,
|
||||
|
||||
+1
-1
@@ -78,7 +78,7 @@ abstract class PoseableEntityState<T : Entity> : Schedulable {
|
||||
"anim_time" to java.util.function.Function { return@Function reusableAnimTime.also { it.value = animationSeconds.toDouble() } },
|
||||
"pose_type" to java.util.function.Function { return@Function StringValue((getEntity() as Poseable).getCurrentPoseType().name) },
|
||||
"pose" to java.util.function.Function { _ -> return@Function StringValue(currentPose ?: "") },
|
||||
"say" to java.util.function.Function { params -> MinecraftClient.getInstance().player?.sendMessage(params.getString(0).text()) ?: Unit },
|
||||
"has_entity" to java.util.function.Function { _ -> return@Function DoubleValue(getEntity() != null) },
|
||||
"sound" to java.util.function.Function { params ->
|
||||
val entity = getEntity() ?: return@Function Unit
|
||||
if (params.get<MoValue>(0) !is StringValue) {
|
||||
|
||||
+5
-19
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon
|
||||
|
||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.JsonPose
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.JsonPoseableEntityModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PoseableEntityState
|
||||
@@ -24,6 +25,7 @@ import com.cobblemon.mod.common.util.isDusk
|
||||
import com.cobblemon.mod.common.util.isStandingOnRedSand
|
||||
import com.cobblemon.mod.common.util.isStandingOnSand
|
||||
import com.cobblemon.mod.common.util.isStandingOnSandOrRedSand
|
||||
import com.cobblemon.mod.common.util.resolveBoolean
|
||||
import com.google.gson.ExclusionStrategy
|
||||
import com.google.gson.FieldAttributes
|
||||
import com.google.gson.GsonBuilder
|
||||
@@ -84,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
|
||||
@@ -192,6 +176,8 @@ class JsonPokemonPoseableModel(override val rootPart: Bone) : PokemonPoseableMod
|
||||
conditionsList.add { mustBeDusk == it.isDusk() }
|
||||
}
|
||||
|
||||
conditionsList.add { (it.delegate as PokemonClientDelegate).runtime.resolveBoolean(pose.condition) }
|
||||
|
||||
val poseCondition: ((PokemonEntity) -> Boolean)? = if (conditionsList.isEmpty()) null else conditionsList.reduce { acc, function -> { acc(it) && function(it) } }
|
||||
|
||||
return Pose(
|
||||
|
||||
+4
-3
@@ -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(),
|
||||
|
||||
+1
-8
@@ -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),
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
+1
-1
@@ -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
|
||||
@@ -59,7 +61,6 @@ import com.cobblemon.mod.common.pokemon.evolution.variants.ItemInteractionEvolut
|
||||
import com.cobblemon.mod.common.pokemon.misc.GimmighoulStashHandler
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
|
||||
import net.minecraft.block.Blocks
|
||||
import java.util.EnumSet
|
||||
import java.util.Optional
|
||||
import java.util.UUID
|
||||
@@ -82,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
|
||||
@@ -102,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
|
||||
@@ -136,6 +141,7 @@ open class PokemonEntity(
|
||||
@JvmStatic val UNBATTLEABLE = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.BOOLEAN)
|
||||
@JvmStatic val COUNTS_TOWARDS_SPAWN_CAP = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.BOOLEAN)
|
||||
@JvmStatic val SPAWN_DIRECTION = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.FLOAT)
|
||||
@JvmStatic val FRIENDSHIP = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.INTEGER)
|
||||
|
||||
const val BATTLE_LOCK = "battle"
|
||||
|
||||
@@ -181,6 +187,8 @@ open class PokemonEntity(
|
||||
set(value) = dataTracker.set(BATTLE_ID, Optional.ofNullable(value))
|
||||
val isBattling: Boolean
|
||||
get() = dataTracker.get(BATTLE_ID).isPresent
|
||||
val friendship: Int
|
||||
get() = dataTracker.get(FRIENDSHIP)
|
||||
|
||||
var drops: DropTable? = null
|
||||
|
||||
@@ -246,7 +254,9 @@ open class PokemonEntity(
|
||||
dataTracker.startTracking(LABEL_LEVEL, 1)
|
||||
dataTracker.startTracking(HIDE_LABEL, false)
|
||||
dataTracker.startTracking(UNBATTLEABLE, false)
|
||||
dataTracker.startTracking(COUNTS_TOWARDS_SPAWN_CAP, true)
|
||||
dataTracker.startTracking(SPAWN_DIRECTION, world.random.nextFloat() * 360F)
|
||||
dataTracker.startTracking(FRIENDSHIP, 0)
|
||||
}
|
||||
|
||||
override fun onTrackedDataSet(data: TrackedData<*>) {
|
||||
@@ -326,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)
|
||||
}
|
||||
@@ -590,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)
|
||||
@@ -655,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)
|
||||
@@ -696,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) {
|
||||
@@ -824,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)) {
|
||||
@@ -1122,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(),
|
||||
@@ -1137,6 +1196,8 @@ open class PokemonEntity(
|
||||
return !this.isBusy && !this.pokemon.isFainted() && !feature.enabled
|
||||
}
|
||||
|
||||
|
||||
|
||||
override fun canUsePortals() = false
|
||||
|
||||
override fun setAir(air: Int) {
|
||||
|
||||
+19
-13
@@ -92,10 +92,28 @@ class PokemonServerDelegate : PokemonSideDelegate {
|
||||
speed = 0.1F
|
||||
entity.despawner.beginTracking(this)
|
||||
}
|
||||
updateTrackedValues()
|
||||
}
|
||||
|
||||
fun getBattle() = entity.battleId?.let(BattleRegistry::getBattle)
|
||||
|
||||
fun updateTrackedValues() {
|
||||
val trackedSpecies = mock?.species ?: entity.pokemon.species.resourceIdentifier.toString()
|
||||
val trackedNickname = mock?.nickname ?: entity.pokemon.nickname ?: Text.empty()
|
||||
val trackedAspects = mock?.aspects ?: entity.pokemon.aspects
|
||||
|
||||
entity.dataTracker.set(PokemonEntity.SPECIES, trackedSpecies)
|
||||
if (entity.dataTracker.get(PokemonEntity.NICKNAME) != trackedNickname) {
|
||||
entity.dataTracker.set(PokemonEntity.NICKNAME, trackedNickname)
|
||||
}
|
||||
entity.dataTracker.set(PokemonEntity.ASPECTS, trackedAspects)
|
||||
entity.dataTracker.set(PokemonEntity.LABEL_LEVEL, entity.pokemon.level)
|
||||
entity.dataTracker.set(PokemonEntity.MOVING, entity.velocity.multiply(1.0, if (entity.isOnGround) 0.0 else 1.0, 1.0).length() > 0.005F)
|
||||
entity.dataTracker.set(PokemonEntity.FRIENDSHIP, entity.pokemon.friendship)
|
||||
|
||||
updatePoseType()
|
||||
}
|
||||
|
||||
override fun onTrackedDataSet(data: TrackedData<*>) {
|
||||
super.onTrackedDataSet(data)
|
||||
if (this::entity.isInitialized) {
|
||||
@@ -162,19 +180,7 @@ class PokemonServerDelegate : PokemonSideDelegate {
|
||||
entity.remove(Entity.RemovalReason.DISCARDED)
|
||||
}
|
||||
|
||||
val trackedSpecies = mock?.species ?: entity.pokemon.species.resourceIdentifier.toString()
|
||||
val trackedNickname = mock?.nickname ?: entity.pokemon.nickname ?: Text.empty()
|
||||
val trackedAspects = mock?.aspects ?: entity.pokemon.aspects
|
||||
|
||||
entity.dataTracker.set(PokemonEntity.SPECIES, trackedSpecies)
|
||||
if (entity.dataTracker.get(PokemonEntity.NICKNAME) != trackedNickname) {
|
||||
entity.dataTracker.set(PokemonEntity.NICKNAME, trackedNickname)
|
||||
}
|
||||
entity.dataTracker.set(PokemonEntity.ASPECTS, trackedAspects)
|
||||
entity.dataTracker.set(PokemonEntity.LABEL_LEVEL, entity.pokemon.level)
|
||||
entity.dataTracker.set(PokemonEntity.MOVING, entity.velocity.multiply(1.0, if (entity.isOnGround) 0.0 else 1.0, 1.0).length() > 0.005F)
|
||||
|
||||
updatePoseType()
|
||||
updateTrackedValues()
|
||||
}
|
||||
|
||||
fun updatePoseType() {
|
||||
|
||||
@@ -87,9 +87,7 @@ object AdvancementHandler {
|
||||
event.battle.actors.forEach { battleActor ->
|
||||
if (!event.winners.contains(battleActor) && battleActor.type == ActorType.WILD) {
|
||||
battleActor.pokemonList.forEach { battlePokemon ->
|
||||
battlePokemon.entity?.pokemon?.let {
|
||||
advancementData.updateTotalDefeatedCount(it)
|
||||
}
|
||||
advancementData.updateTotalDefeatedCount(battlePokemon.originalPokemon)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -10,10 +10,9 @@ package com.cobblemon.mod.common.integration.jei.berry
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.integration.jei.CobblemonJeiProvider
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.item.berry.BerryItem
|
||||
import mezz.jei.api.registration.IRecipeCategoryRegistration
|
||||
import mezz.jei.api.registration.IRecipeRegistration
|
||||
import net.minecraft.item.ItemStack
|
||||
|
||||
class BerryMutationProvider : CobblemonJeiProvider {
|
||||
override fun registerCategory(registration: IRecipeCategoryRegistration) {
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.integration.jei.berry
|
||||
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.item.berry.BerryItem
|
||||
|
||||
//Dont make these ItemStacks, they do not have consistent hash codes, breaks stuff
|
||||
data class BerryMutationRecipe(
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.item
|
||||
package com.cobblemon.mod.common.item.berry
|
||||
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import net.minecraft.item.AliasedBlockItem
|
||||
-1
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stat
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.genericRuntime
|
||||
import com.cobblemon.mod.common.util.resolveInt
|
||||
|
||||
@@ -15,7 +15,6 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
|
||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.genericRuntime
|
||||
|
||||
@@ -16,7 +16,6 @@ import com.cobblemon.mod.common.api.item.PokemonAndMoveSelectingItem
|
||||
import com.cobblemon.mod.common.api.moves.Move
|
||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.genericRuntime
|
||||
|
||||
@@ -15,7 +15,6 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
|
||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.genericRuntime
|
||||
|
||||
@@ -15,7 +15,6 @@ import com.cobblemon.mod.common.api.item.PokemonSelectingItem
|
||||
import com.cobblemon.mod.common.api.pokemon.status.Status
|
||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import net.minecraft.entity.player.PlayerEntity
|
||||
|
||||
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
|
||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.block.BerryBlock
|
||||
import com.cobblemon.mod.common.item.BerryItem
|
||||
import com.cobblemon.mod.common.item.battle.BagItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import net.minecraft.item.ItemStack
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
+6
-1
@@ -39,6 +39,7 @@ class SpawnPokemonPacket(
|
||||
private val hideLabel: Boolean,
|
||||
private val caughtBall: Identifier,
|
||||
private val spawnYaw: Float,
|
||||
private val friendship: Int,
|
||||
vanillaSpawnPacket: EntitySpawnS2CPacket
|
||||
) : SpawnExtraDataEntityPacket<SpawnPokemonPacket, PokemonEntity>(vanillaSpawnPacket) {
|
||||
|
||||
@@ -60,6 +61,7 @@ class SpawnPokemonPacket(
|
||||
entity.dataTracker.get(PokemonEntity.HIDE_LABEL),
|
||||
entity.pokemon.caughtBall.name,
|
||||
entity.dataTracker.get(PokemonEntity.SPAWN_DIRECTION),
|
||||
entity.dataTracker.get(PokemonEntity.FRIENDSHIP),
|
||||
vanillaSpawnPacket
|
||||
)
|
||||
|
||||
@@ -79,6 +81,7 @@ class SpawnPokemonPacket(
|
||||
buffer.writeBoolean(this.hideLabel)
|
||||
buffer.writeIdentifier(this.caughtBall)
|
||||
buffer.writeFloat(this.spawnYaw)
|
||||
buffer.writeInt(this.friendship)
|
||||
}
|
||||
|
||||
override fun applyData(entity: PokemonEntity) {
|
||||
@@ -101,6 +104,7 @@ class SpawnPokemonPacket(
|
||||
entity.dataTracker.set(PokemonEntity.UNBATTLEABLE, unbattlable)
|
||||
entity.dataTracker.set(PokemonEntity.HIDE_LABEL, hideLabel)
|
||||
entity.dataTracker.set(PokemonEntity.SPAWN_DIRECTION, spawnYaw)
|
||||
entity.dataTracker.set(PokemonEntity.FRIENDSHIP, friendship)
|
||||
}
|
||||
|
||||
override fun checkType(entity: Entity): Boolean = entity is PokemonEntity
|
||||
@@ -124,9 +128,10 @@ class SpawnPokemonPacket(
|
||||
val hideLabel = buffer.readBoolean()
|
||||
val caughtBall = buffer.readIdentifier()
|
||||
val spawnAngle = buffer.readFloat()
|
||||
val friendship = buffer.readInt()
|
||||
val vanillaPacket = decodeVanillaPacket(buffer)
|
||||
|
||||
return SpawnPokemonPacket(ownerId, scaleModifier, species, form, aspects, battleId, phasingTargetId, beamModeEmitter, nickname, labelLevel, poseType, unbattlable, hideLabel, caughtBall, spawnAngle, vanillaPacket)
|
||||
return SpawnPokemonPacket(ownerId, scaleModifier, species, form, aspects, battleId, phasingTargetId, beamModeEmitter, nickname, labelLevel, poseType, unbattlable, hideLabel, caughtBall, spawnAngle, friendship, vanillaPacket)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+2
-1
@@ -43,7 +43,8 @@ object CobblemonRequirementAdapter : RequirementAdapter {
|
||||
this.registerType(TimeRangeRequirement.ADAPTER_VARIANT, TimeRangeRequirement::class)
|
||||
this.registerType(LevelRequirement.ADAPTER_VARIANT, LevelRequirement::class)
|
||||
this.registerType(WeatherRequirement.ADAPTER_VARIANT, WeatherRequirement::class)
|
||||
this.registerType(AttackDefenceRatioRequirement.ADAPTER_VARIANT, AttackDefenceRatioRequirement::class)
|
||||
this.registerType(StatCompareRequirement.ADAPTER_VARIANT, StatCompareRequirement::class)
|
||||
this.registerType(StatEqualRequirement.ADAPTER_VARIANT, StatEqualRequirement::class)
|
||||
this.registerType(BattleCriticalHitsRequirement.ADAPTER_VARIANT, BattleCriticalHitsRequirement::class)
|
||||
this.registerType(DamageTakenRequirement.ADAPTER_VARIANT, DamageTakenRequirement::class)
|
||||
this.registerType(UseMoveRequirement.ADAPTER_VARIANT, UseMoveRequirement::class)
|
||||
|
||||
+7
-13
@@ -9,24 +9,18 @@
|
||||
package com.cobblemon.mod.common.pokemon.evolution.requirements
|
||||
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.requirement.EvolutionRequirement
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
class AttackDefenceRatioRequirement : EvolutionRequirement {
|
||||
|
||||
class StatCompareRequirement : EvolutionRequirement {
|
||||
companion object {
|
||||
const val ADAPTER_VARIANT = "attack_defence_ratio"
|
||||
}
|
||||
enum class AttackDefenceRatio {
|
||||
ATTACK_HIGHER,
|
||||
DEFENCE_HIGHER,
|
||||
EQUAL
|
||||
const val ADAPTER_VARIANT = "stat_compare"
|
||||
}
|
||||
|
||||
val ratio = AttackDefenceRatio.ATTACK_HIGHER
|
||||
val highStat = Stats.ATTACK.name
|
||||
val lowStat = Stats.DEFENCE.name
|
||||
|
||||
override fun check(pokemon: Pokemon): Boolean {
|
||||
return when (ratio) {
|
||||
AttackDefenceRatio.ATTACK_HIGHER -> pokemon.attack > pokemon.defence
|
||||
AttackDefenceRatio.DEFENCE_HIGHER -> pokemon.defence > pokemon.attack
|
||||
AttackDefenceRatio.EQUAL -> pokemon.attack == pokemon.defence
|
||||
}
|
||||
return pokemon.getStat(Stats.getStat(highStat)) > pokemon.getStat(Stats.getStat(lowStat))
|
||||
}
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* 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.requirements
|
||||
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.requirement.EvolutionRequirement
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
|
||||
class StatEqualRequirement : EvolutionRequirement {
|
||||
companion object {
|
||||
const val ADAPTER_VARIANT = "stat_equal"
|
||||
}
|
||||
|
||||
val statOne = Stats.ATTACK.name
|
||||
val statTwo = Stats.DEFENCE.name
|
||||
|
||||
override fun check(pokemon: Pokemon): Boolean {
|
||||
return pokemon.getStat(Stats.getStat(statOne)) == pokemon.getStat(Stats.getStat(statTwo))
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -24,7 +24,7 @@ inline fun <reified T> Gson.fromJson(string: String) = fromJson(string, T::class
|
||||
* the list value identified by the plural name. During runtime only the plural exists, but when
|
||||
* configuring the JSON the user can use the singular form for a cleaner document.
|
||||
*/
|
||||
fun JsonObject.singularToPluralList(rootName: String, pluralName: String = "${rootName}s") {
|
||||
fun JsonObject.singularToPluralList(rootName: String, pluralName: String = "${rootName}s"): JsonObject {
|
||||
if (has(rootName)) {
|
||||
if (!has(pluralName)) {
|
||||
add(pluralName, JsonArray())
|
||||
@@ -32,6 +32,7 @@ fun JsonObject.singularToPluralList(rootName: String, pluralName: String = "${ro
|
||||
get(pluralName).asJsonArray.add(get(rootName))
|
||||
remove(rootName)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
fun JsonElement.normalizeToArray(): JsonArray {
|
||||
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
package com.cobblemon.mod.common.world.foliage
|
||||
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.util.math.intprovider.IntProvider
|
||||
import net.minecraft.util.math.random.Random
|
||||
import net.minecraft.world.TestableWorld
|
||||
import net.minecraft.world.gen.feature.TreeFeatureConfig
|
||||
import net.minecraft.world.gen.foliage.FoliagePlacer
|
||||
|
||||
class ApricornFoliagePlacer(
|
||||
val radius: IntProvider,
|
||||
val offset: IntProvider
|
||||
) : FoliagePlacer(radius, offset) {
|
||||
override fun getType() = CobblemonFoliagePlacers.APRICORN_FOLIAGE_PLACER_TYPE
|
||||
|
||||
override fun generate(
|
||||
world: TestableWorld?,
|
||||
placer: BlockPlacer?,
|
||||
random: Random?,
|
||||
config: TreeFeatureConfig?,
|
||||
trunkHeight: Int,
|
||||
treeNode: TreeNode?,
|
||||
foliageHeight: Int,
|
||||
radius: Int,
|
||||
offset: Int
|
||||
) {
|
||||
println("Generating Apricorn Foliage")
|
||||
}
|
||||
|
||||
override fun getRandomHeight(
|
||||
random: Random?,
|
||||
trunkHeight: Int,
|
||||
config: TreeFeatureConfig?
|
||||
): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
override fun isInvalidForLeaves(
|
||||
random: Random?,
|
||||
dx: Int,
|
||||
y: Int,
|
||||
dz: Int,
|
||||
radius: Int,
|
||||
giantTrunk: Boolean
|
||||
): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
companion object {
|
||||
val CODEC = RecordCodecBuilder.mapCodec {
|
||||
it.group(
|
||||
IntProvider.createValidatingCodec(0, 16).fieldOf("radius").forGetter<ApricornFoliagePlacer> {it.radius},
|
||||
IntProvider.createValidatingCodec(0, 16).fieldOf("offset").forGetter<ApricornFoliagePlacer> {it.offset}
|
||||
).apply(it, ::ApricornFoliagePlacer)
|
||||
}
|
||||
val ID = cobblemonResource("apricorn_foliage_placer")
|
||||
}
|
||||
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
package com.cobblemon.mod.common.world.foliage
|
||||
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import net.minecraft.registry.Registries
|
||||
import net.minecraft.registry.Registry
|
||||
import net.minecraft.registry.RegistryKey
|
||||
import net.minecraft.registry.RegistryKeys
|
||||
import net.minecraft.world.gen.foliage.FoliagePlacerType
|
||||
|
||||
/**
|
||||
* Wow what a cool class
|
||||
*
|
||||
* @author Apion
|
||||
* @since May 23, 2024
|
||||
*/
|
||||
object CobblemonFoliagePlacers : PlatformRegistry<Registry<FoliagePlacerType<*>>, RegistryKey<Registry<FoliagePlacerType<*>>>, FoliagePlacerType<*>>() {
|
||||
val APRICORN_FOLIAGE_PLACER_TYPE = this.create("apricorn_foliage_placer", FoliagePlacerType(ApricornFoliagePlacer.CODEC.codec()))
|
||||
|
||||
override val registry = Registries.FOLIAGE_PLACER_TYPE
|
||||
override val registryKey = RegistryKeys.FOLIAGE_PLACER_TYPE
|
||||
}
|
||||
+9
-7
@@ -5,30 +5,32 @@
|
||||
"identifier": "cobblemon:ancientoriginball/ballsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparkle"
|
||||
"texture": "textures/particles/balls/originball/originballsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_steady": {
|
||||
"spawn_rate": 16,
|
||||
"max_particles": 16
|
||||
"spawn_rate": 22,
|
||||
"max_particles": 24
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.5
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"offset": [0, 1.5, 0],
|
||||
"offset": [0, 2, 0],
|
||||
"radius": "math.random(0.5,1.5)*1.5",
|
||||
"surface_only": true,
|
||||
"direction": [0, 1, 0]
|
||||
"direction": ["math.random(-9,9)", "math.random(4,7)", "math.random(-9,9)"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": 0.75,
|
||||
"minecraft:particle_motion_dynamic": {},
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, 2, 0]
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.2, 0.2],
|
||||
"size": [0.175, 0.175],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 36,
|
||||
|
||||
+11
-6
@@ -5,25 +5,30 @@
|
||||
"identifier": "cobblemon:ancientoriginball/battle/ballsendsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
|
||||
"texture": "textures/particles/balls/originball/originballsendsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 8
|
||||
"minecraft:emitter_initialization": {
|
||||
"per_update_expression": "variable.radius = 0.6;"
|
||||
},
|
||||
"minecraft:emitter_rate_steady": {
|
||||
"spawn_rate": 100,
|
||||
"max_particles": 16
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.05,4)*4+0.5", "math.random(-10,10)"]
|
||||
"radius": "variable.radius*math.cos(variable.emitter_age*2080)",
|
||||
"direction": ["math.random(-5,5)*1.75", "math.random(-0.05,6)*3+0.5", "math.random(-5,5)*1.75"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*3",
|
||||
"minecraft:particle_initial_speed": "math.random(3,7)*4",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -5, 0],
|
||||
"linear_acceleration": [0, "-math.random(5,8)", 0],
|
||||
"linear_drag_coefficient": 4
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
|
||||
+29
-15
@@ -5,38 +5,52 @@
|
||||
"identifier": "cobblemon:ancientoriginball/battle/ballsparks",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparks"
|
||||
"texture": "textures/particles/balls/originball/originballsparks"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.sizefunny": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [1, 1, 1, 0.98, 0.93, 0.83, 0.58, -0.01, 0, 0]
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 10
|
||||
"num_particles": 20
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
"active_time": 0.5
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.5", "math.random(-10,10)"]
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.25", "math.random(-10,10)"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*3.5",
|
||||
"minecraft:particle_initial_speed": "math.random(3.1,4.8)*3.5",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 4.5
|
||||
"linear_acceleration": ["math.random(-3.5,3.5)*10", "math.random(-2.5,2.5)*10", "math.random(-3.5,3.5)*10"],
|
||||
"linear_drag_coefficient": 3.5
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.15, 0.15],
|
||||
"size": ["(0.225-(variable.particle_random_3*0.1))*v.sizefunny", "(0.225-(variable.particle_random_3*0.1))*v.sizefunny"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 80,
|
||||
"texture_height": 8,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [8, 8],
|
||||
"step_UV": [8, 0],
|
||||
"frames_per_second": 18,
|
||||
"max_frame": 10
|
||||
"texture_width": 90,
|
||||
"texture_height": 9,
|
||||
"uv": ["math.floor(v.particle_random_3*10)*9", 0],
|
||||
"uv_size": [9, 9]
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.14": "#ffffffff",
|
||||
"0.43": "#FFFF0000",
|
||||
"0.71": "#FF7B0000"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:ancientoriginball/battle/sendflash",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/battle/sendflash"
|
||||
"texture": "textures/particles/balls/originball/battle/originsendflash"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -27,14 +27,14 @@
|
||||
"size": [2.25, 2.25],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 1024,
|
||||
"texture_width": 1088,
|
||||
"texture_height": 64,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [64, 64],
|
||||
"step_UV": [64, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 16
|
||||
"max_frame": 17
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:ancientoriginball/casual/ballsendsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
|
||||
"texture": "textures/particles/balls/originball/originballsendsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 4
|
||||
"num_particles": 6
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,7 +21,7 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,6)*2.5",
|
||||
"minecraft:particle_initial_speed": "math.random(3,6)*3",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -6, 0],
|
||||
"linear_drag_coefficient": 4
|
||||
|
||||
+28
-14
@@ -5,38 +5,52 @@
|
||||
"identifier": "cobblemon:ancientoriginball/casual/ballsparks",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparks"
|
||||
"texture": "textures/particles/balls/originball/originballsparks"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.sizefunny": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [1, 1, 1, 0.98, 0.93, 0.83, 0.58, -0.01, 0, 0, 0]
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 5
|
||||
"num_particles": 10
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
"active_time": 0.5
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.5", "math.random(-10,10)"]
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.25", "math.random(-10,10)"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*2.1",
|
||||
"minecraft:particle_initial_speed": "math.random(3.1,4.8)*2.5",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": ["math.random(-3.5,3.5)*10", "math.random(-2.5,2.5)*10", "math.random(-3.5,3.5)*10"],
|
||||
"linear_drag_coefficient": 3.5
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.1, 0.1],
|
||||
"size": ["(0.225-(variable.particle_random_3*0.1))*v.sizefunny", "(0.225-(variable.particle_random_3*0.1))*v.sizefunny"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 80,
|
||||
"texture_height": 8,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [8, 8],
|
||||
"step_UV": [8, 0],
|
||||
"frames_per_second": 18,
|
||||
"max_frame": 10
|
||||
"texture_width": 90,
|
||||
"texture_height": 9,
|
||||
"uv": ["math.floor(v.particle_random_3*10)*9", 0],
|
||||
"uv_size": [9, 9]
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.14": "#ffffffff",
|
||||
"0.33": "#FFFF0000",
|
||||
"0.61": "#FF7B0000"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:ancientoriginball/casual/sendflash",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/casual/sendcasual"
|
||||
"texture": "textures/particles/balls/originball/casual/originsendcasual"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -27,14 +27,14 @@
|
||||
"size": [1.25, 1.25],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 384,
|
||||
"texture_width": 416,
|
||||
"texture_height": 32,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [32, 32],
|
||||
"step_UV": [32, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 12
|
||||
"max_frame": 13
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
-8
@@ -5,30 +5,32 @@
|
||||
"identifier": "cobblemon:beastball/ballsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparkle"
|
||||
"texture": "textures/particles/balls/beastball/beastballsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_steady": {
|
||||
"spawn_rate": 16,
|
||||
"max_particles": 16
|
||||
"spawn_rate": 24,
|
||||
"max_particles": 18
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.5
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"offset": [0, 1.5, 0],
|
||||
"radius": "math.random(0.5,1.5)*1.5",
|
||||
"offset": [0, 1.75, 0],
|
||||
"radius": 1.25,
|
||||
"surface_only": true,
|
||||
"direction": [0, 1, 0]
|
||||
"direction": ["math.random(-9,9)", "math.random(4,7)", "math.random(-9,9)"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": 0.75,
|
||||
"minecraft:particle_motion_dynamic": {},
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, 2, 0]
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.2, 0.2],
|
||||
"size": [0.15, 0.15],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 36,
|
||||
|
||||
+6
-6
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:beastball/battle/ballsendsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
|
||||
"texture": "textures/particles/balls/beastball/beastballsendsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 8
|
||||
"num_particles": 14
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,13 +21,13 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*3",
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*4.5",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -5, 0],
|
||||
"linear_drag_coefficient": 4
|
||||
"linear_acceleration": [0, -6, 0],
|
||||
"linear_drag_coefficient": 5
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.15, 0.15],
|
||||
"size": [0.125, 0.125],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 99,
|
||||
|
||||
+10
-6
@@ -5,28 +5,32 @@
|
||||
"identifier": "cobblemon:beastball/battle/ballsparks",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparks"
|
||||
"texture": "textures/particles/balls/beastball/beastballsparks"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 10
|
||||
"num_particles": 20
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.5", "math.random(-10,10)"]
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.5,5)*5+0.5", "math.random(-10,10)"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*3.5",
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.random_integer(0,3)*90"
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(3,6)*3",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 4.5
|
||||
"linear_acceleration": [0, -20, 0],
|
||||
"linear_drag_coefficient": 2
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.15, 0.15],
|
||||
"size": ["0.075+0.075*v.particle_random_2", "0.075+0.075*v.particle_random_2"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 80,
|
||||
|
||||
+3
-3
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:beastball/battle/sendflash",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/battle/sendflash"
|
||||
"texture": "textures/particles/balls/beastball/battle/beastsendflash"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -27,14 +27,14 @@
|
||||
"size": [2.25, 2.25],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 1024,
|
||||
"texture_width": 1088,
|
||||
"texture_height": 64,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [64, 64],
|
||||
"step_UV": [64, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 16
|
||||
"max_frame": 17
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:beastball/casual/ballsendsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
|
||||
"texture": "textures/particles/balls/beastball/beastballsendsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 4
|
||||
"num_particles": 6
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,7 +21,7 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,6)*2.5",
|
||||
"minecraft:particle_initial_speed": "math.random(3,6)*3",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -6, 0],
|
||||
"linear_drag_coefficient": 4
|
||||
|
||||
+10
-6
@@ -5,28 +5,32 @@
|
||||
"identifier": "cobblemon:beastball/casual/ballsparks",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparks"
|
||||
"texture": "textures/particles/balls/beastball/beastballsparks"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 5
|
||||
"num_particles": 12
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.5", "math.random(-10,10)"]
|
||||
"direction": ["math.random(-10,10)", "math.random(-0.5,5)*5+0.5", "math.random(-10,10)"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*2.1",
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.random_integer(0,3)*90"
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(3,7)*2",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 3.5
|
||||
"linear_acceleration": [0, -15, 0],
|
||||
"linear_drag_coefficient": 2
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.1, 0.1],
|
||||
"size": ["0.05+0.075*v.particle_random_2", "0.05+0.075*v.particle_random_2"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 80,
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:beastball/casual/sendflash",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/casual/sendcasual"
|
||||
"texture": "textures/particles/balls/beastball/casual/beastsendcasual"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
|
||||
+19
-8
@@ -5,30 +5,32 @@
|
||||
"identifier": "cobblemon:cherishball/ballsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparkle"
|
||||
"texture": "textures/particles/balls/cherishball/cherishballsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_steady": {
|
||||
"spawn_rate": 16,
|
||||
"max_particles": 16
|
||||
"spawn_rate": 24,
|
||||
"max_particles": 18
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.5
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"offset": [0, 1.5, 0],
|
||||
"radius": "math.random(0.5,1.5)*1.5",
|
||||
"offset": [0, 1.75, 0],
|
||||
"radius": 1.25,
|
||||
"surface_only": true,
|
||||
"direction": [0, 1, 0]
|
||||
"direction": ["math.random(-9,9)", "math.random(4,7)", "math.random(-9,9)"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": 0.75,
|
||||
"minecraft:particle_motion_dynamic": {},
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, 2, 0]
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.2, 0.2],
|
||||
"size": [0.15, 0.15],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 36,
|
||||
@@ -41,6 +43,15 @@
|
||||
"max_frame": 4
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.0": "#FFFFFFFF",
|
||||
"0.19": "#FFFF8845"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+17
-6
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:cherishball/battle/ballsendsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
|
||||
"texture": "textures/particles/balls/cherishball/cherishballsendsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 8
|
||||
"num_particles": 14
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,13 +21,13 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*3",
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*4.5",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -5, 0],
|
||||
"linear_drag_coefficient": 4
|
||||
"linear_acceleration": [0, -6, 0],
|
||||
"linear_drag_coefficient": 5
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.15, 0.15],
|
||||
"size": [0.125, 0.125],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 99,
|
||||
@@ -40,6 +40,17 @@
|
||||
"max_frame": 11
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.0": "#FF8DFFC6",
|
||||
"0.2": "#ffffffff",
|
||||
"0.35": "#ffffffff",
|
||||
"0.53": "#FFFF8845"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+15
-4
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:cherishball/battle/ballsparks",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparks"
|
||||
"texture": "textures/particles/balls/cherishball/cherishballsparks"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 10
|
||||
"num_particles": 8
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,9 +21,9 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*3.5",
|
||||
"minecraft:particle_initial_speed": "math.random(3,6)*3.75",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 4.5
|
||||
"linear_drag_coefficient": 5
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.15, 0.15],
|
||||
@@ -39,6 +39,17 @@
|
||||
"max_frame": 10
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.0": "#FF8DFFC6",
|
||||
"0.2": "#ffffffff",
|
||||
"0.35": "#ffffffff",
|
||||
"0.53": "#FFFF8845"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+14
-3
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:cherishball/battle/sendflash",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/battle/sendflash"
|
||||
"texture": "textures/particles/balls/cherishball/battle/cherishsendflash"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -27,14 +27,25 @@
|
||||
"size": [2.25, 2.25],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 1024,
|
||||
"texture_width": 1088,
|
||||
"texture_height": 64,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [64, 64],
|
||||
"step_UV": [64, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 16
|
||||
"max_frame": 17
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.0": "#FF8DFFC6",
|
||||
"0.2": "#ffffffff",
|
||||
"0.35": "#ffffffff",
|
||||
"0.53": "#FFFF8845"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+14
-3
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:cherishball/casual/ballsendsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
|
||||
"texture": "textures/particles/balls/cherishball/cherishballsendsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 4
|
||||
"num_particles": 6
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,7 +21,7 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,6)*2.5",
|
||||
"minecraft:particle_initial_speed": "math.random(3,6)*3",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -6, 0],
|
||||
"linear_drag_coefficient": 4
|
||||
@@ -40,6 +40,17 @@
|
||||
"max_frame": 11
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.0": "#FF8DFFC6",
|
||||
"0.2": "#ffffffff",
|
||||
"0.35": "#ffffffff",
|
||||
"0.53": "#FFFF8845"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+14
-3
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:cherishball/casual/ballsparks",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparks"
|
||||
"texture": "textures/particles/balls/cherishball/cherishballsparks"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -21,9 +21,9 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*2.1",
|
||||
"minecraft:particle_initial_speed": "math.random(3,7)*2",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 3.5
|
||||
"linear_drag_coefficient": 3
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.1, 0.1],
|
||||
@@ -39,6 +39,17 @@
|
||||
"max_frame": 10
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.0": "#FF8DFFC6",
|
||||
"0.2": "#ffffffff",
|
||||
"0.35": "#ffffffff",
|
||||
"0.53": "#FFFF8845"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+14
-3
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:cherishball/casual/sendflash",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/casual/sendcasual"
|
||||
"texture": "textures/particles/balls/cherishball/casual/cherishsendcasual"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -27,14 +27,25 @@
|
||||
"size": [1.25, 1.25],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 384,
|
||||
"texture_width": 416,
|
||||
"texture_height": 32,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [32, 32],
|
||||
"step_UV": [32, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 12
|
||||
"max_frame": 13
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.0": "#FF8DFFC6",
|
||||
"0.2": "#ffffffff",
|
||||
"0.35": "#ffffffff",
|
||||
"0.53": "#FFFF8845"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -5,22 +5,22 @@
|
||||
"identifier": "cobblemon:dreamball/ballsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparkle"
|
||||
"texture": "textures/particles/balls/dreamball/dreamballsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_steady": {
|
||||
"spawn_rate": 16,
|
||||
"max_particles": 16
|
||||
"spawn_rate": 20,
|
||||
"max_particles": 14
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.5
|
||||
},
|
||||
"minecraft:emitter_shape_sphere": {
|
||||
"offset": [0, 1.5, 0],
|
||||
"radius": "math.random(0.5,1.5)*1.5",
|
||||
"offset": [0, 1.25, 0],
|
||||
"radius": "1.25",
|
||||
"surface_only": true,
|
||||
"direction": [0, 1, 0]
|
||||
"direction": "outwards"
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
|
||||
+6
-6
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:dreamball/battle/ballsendsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
|
||||
"texture": "textures/particles/balls/dreamball/dreamballsendsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 8
|
||||
"num_particles": 14
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,13 +21,13 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*3",
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*4.5",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -5, 0],
|
||||
"linear_drag_coefficient": 4
|
||||
"linear_acceleration": [0, -6, 0],
|
||||
"linear_drag_coefficient": 5
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.15, 0.15],
|
||||
"size": [0.125, 0.125],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 99,
|
||||
|
||||
+4
-4
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:dreamball/battle/ballsparks",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparks"
|
||||
"texture": "textures/particles/balls/dreamball/dreamballsparks"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 10
|
||||
"num_particles": 8
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,9 +21,9 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*3.5",
|
||||
"minecraft:particle_initial_speed": "math.random(3,6)*3.75",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 4.5
|
||||
"linear_drag_coefficient": 5
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.15, 0.15],
|
||||
|
||||
+3
-3
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:dreamball/battle/sendflash",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/battle/sendflash"
|
||||
"texture": "textures/particles/balls/dreamball/battle/dreamsendflash"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -27,14 +27,14 @@
|
||||
"size": [2.25, 2.25],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 1024,
|
||||
"texture_width": 1088,
|
||||
"texture_height": 64,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [64, 64],
|
||||
"step_UV": [64, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 16
|
||||
"max_frame": 17
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -5,12 +5,12 @@
|
||||
"identifier": "cobblemon:dreamball/casual/ballsendsparkle",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
|
||||
"texture": "textures/particles/balls/dreamball/dreamballsendsparkle"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 4
|
||||
"num_particles": 6
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
@@ -21,7 +21,7 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,6)*2.5",
|
||||
"minecraft:particle_initial_speed": "math.random(3,6)*3",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -6, 0],
|
||||
"linear_drag_coefficient": 4
|
||||
|
||||
+3
-3
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:dreamball/casual/ballsparks",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/ballsparks"
|
||||
"texture": "textures/particles/balls/dreamball/dreamballsparks"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@@ -21,9 +21,9 @@
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 1
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(4,7)*2.1",
|
||||
"minecraft:particle_initial_speed": "math.random(3,7)*2",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 3.5
|
||||
"linear_drag_coefficient": 3
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": [0.1, 0.1],
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
"identifier": "cobblemon:dreamball/casual/sendflash",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/balls/pokeball/casual/sendcasual"
|
||||
"texture": "textures/particles/balls/dreamball/casual/dreamsendcasual"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
|
||||
+23
-21
@@ -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": {
|
||||
|
||||
+103
-79
@@ -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]}
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
+10
-10
@@ -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]}
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
+204
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+384
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2,7 +2,14 @@
|
||||
"multipart": [
|
||||
{
|
||||
"when": {
|
||||
"age": "0"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/planted",
|
||||
@@ -11,16 +18,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "1"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/sprout",
|
||||
"model": "cobblemon:block/berries/planted_bound",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "2"
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_young",
|
||||
@@ -29,7 +82,30 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "3"
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_young",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_mature",
|
||||
@@ -38,7 +114,14 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "4"
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_mature",
|
||||
@@ -47,7 +130,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "5"
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aguav_mature",
|
||||
|
||||
@@ -2,7 +2,14 @@
|
||||
"multipart": [
|
||||
{
|
||||
"when": {
|
||||
"age": "0"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/planted",
|
||||
@@ -11,16 +18,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "1"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/sprout",
|
||||
"model": "cobblemon:block/berries/planted_bound",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "2"
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_young",
|
||||
@@ -29,7 +82,30 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "3"
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_young",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_mature",
|
||||
@@ -38,7 +114,14 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "4"
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_mature",
|
||||
@@ -47,7 +130,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "5"
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/apicot_mature",
|
||||
|
||||
@@ -2,7 +2,14 @@
|
||||
"multipart": [
|
||||
{
|
||||
"when": {
|
||||
"age": "0"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/planted",
|
||||
@@ -11,16 +18,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "1"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/sprout",
|
||||
"model": "cobblemon:block/berries/planted_bound",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "2"
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_young",
|
||||
@@ -29,7 +82,30 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "3"
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_young",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_mature",
|
||||
@@ -38,7 +114,14 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "4"
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_mature",
|
||||
@@ -47,7 +130,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "5"
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/aspear_mature",
|
||||
|
||||
@@ -2,7 +2,14 @@
|
||||
"multipart": [
|
||||
{
|
||||
"when": {
|
||||
"age": "0"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/planted",
|
||||
@@ -11,16 +18,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "1"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/sprout",
|
||||
"model": "cobblemon:block/berries/planted_bound",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "2"
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_young",
|
||||
@@ -29,7 +82,30 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "3"
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_young",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_mature",
|
||||
@@ -38,7 +114,14 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "4"
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_mature",
|
||||
@@ -47,7 +130,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "5"
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/babiri_mature",
|
||||
|
||||
@@ -2,7 +2,14 @@
|
||||
"multipart": [
|
||||
{
|
||||
"when": {
|
||||
"age": "0"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/planted",
|
||||
@@ -11,16 +18,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "1"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/sprout",
|
||||
"model": "cobblemon:block/berries/planted_bound",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "2"
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_young",
|
||||
@@ -29,7 +82,30 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "3"
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_young",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_mature",
|
||||
@@ -38,7 +114,14 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "4"
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_mature",
|
||||
@@ -47,7 +130,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "5"
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/belue_mature",
|
||||
|
||||
@@ -2,7 +2,14 @@
|
||||
"multipart": [
|
||||
{
|
||||
"when": {
|
||||
"age": "0"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/planted",
|
||||
@@ -11,16 +18,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "1"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/sprout",
|
||||
"model": "cobblemon:block/berries/planted_bound",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "2"
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_young",
|
||||
@@ -29,7 +82,30 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "3"
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_young",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_mature",
|
||||
@@ -38,7 +114,14 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "4"
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_mature",
|
||||
@@ -47,7 +130,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "5"
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/bluk_mature",
|
||||
|
||||
@@ -2,7 +2,14 @@
|
||||
"multipart": [
|
||||
{
|
||||
"when": {
|
||||
"age": "0"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/planted",
|
||||
@@ -11,16 +18,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "1"
|
||||
"AND": [
|
||||
{
|
||||
"age": 0
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/sprout",
|
||||
"model": "cobblemon:block/berries/planted_bound",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "2"
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 1
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_sprout",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_young",
|
||||
@@ -29,7 +82,30 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "3"
|
||||
"AND": [
|
||||
{
|
||||
"age": 2
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_young",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_mature",
|
||||
@@ -38,7 +114,14 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "4"
|
||||
"AND": [
|
||||
{
|
||||
"age": 3
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_mature",
|
||||
@@ -47,7 +130,62 @@
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"age": "5"
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 4
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_mature",
|
||||
"uvlock": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"when": {
|
||||
"AND": [
|
||||
{
|
||||
"age": 5
|
||||
},
|
||||
{
|
||||
"rooted": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"model": "cobblemon:block/berries/charti_mature",
|
||||
|
||||
Loaded 100 of 494 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user