Compare commits

...
Author SHA1 Message Date
Charzard4261 52133711ad Added a check before setting the Monitor's Block State, as it was causing a crash for some people. Unsure on the root cause, but this should prevent the crash. 2024-05-22 22:53:34 +01:00
Hiroku 4e1b82917b Merge branch 'Roaming-Gholdengo-Request' into 'main'
Lets Gholdengo maintain its roaming aspect

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

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

Closes #847 and #799

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

Closes #824

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

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

Closes #844

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

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

See merge request cable-mc/cobblemon!1012
2024-05-16 22:46:10 +00:00
Hiroku 2dc2c96176 Update CHANGELOG.md [skip-ci] 2024-05-16 22:44:00 +00:00
Hiroku df4db17cfd Removed println 2024-05-16 22:40:56 +00:00
apion 45bec488f1 Fixed bug with pasture block 2024-05-15 20:41:32 -04:00
apion 9287374504 Merge branch 'refs/heads/main' into 1.5.1 2024-05-15 18:24:56 -04:00
apion 90c5180712 Revert "update Forge to current RB, update Fabric deps to latest"
This reverts commit 7139d4708b.
2024-05-15 18:17:29 -04:00
apion f2a36cd74a Merge branch 'refs/heads/main' into 1.5.1
# Conflicts:
#	CHANGELOG.md
2024-05-15 14:51:45 -04:00
Nick 158aa05f24 Merge branch 'fix/downgrade-loom' into 'main'
fix: resolve mapping issues by downgrading loom

See merge request cable-mc/cobblemon!1015
2024-05-15 15:38:09 +00:00
Apion 8924d0fe0f Merge branch 'navneetset-main-patch-27693' into 'main'
Fix PC store downsizing not working with .resize()

See merge request cable-mc/cobblemon!1016
2024-05-15 12:12:04 +00:00
PebblesandApion d510eaa462 Fix PC store downsizing not working with .resize() 2024-05-15 12:12:04 +00:00
Hiroku 8b63057d9d Merge branch 'we-ballin' into 'main'
Cherish, Dream, Beast, and Ancient Origin Send Out Particles

See merge request cable-mc/cobblemon!1018
2024-05-15 10:26:08 +00:00
Hiroku d572b3c505 Missed a bit [skip-ci] 2024-05-15 10:25:21 +00:00
Hiroku 8edc60224a Merge branch 'main' into 'we-ballin'
# Conflicts:
#   CHANGELOG.md
2024-05-15 10:24:54 +00:00
Hiroku a634c4f046 Merge branch 'update-libs' into 'main'
Update libs

See merge request cable-mc/cobblemon!1017
2024-05-15 10:23:14 +00:00
MoeBoy76 7139d4708b update Forge to current RB, update Fabric deps to latest 2024-05-15 11:11:02 +10:00
dhi_holo 50e99736a3 Partial Fix
Origin Ball now plays correctly in resource pack, but not in the mod itself, updated jsons to match, so all that's left is working out why the mod refuses to read the new jsons even though the new jsons are read in the files, in intellij, and in github desktop.
2024-05-15 10:43:09 +10:00
MoeBoy76 68c4acf0eb Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon 2024-05-15 09:21:22 +10:00
broccoli 5b5e7109f5 fix: resolve mapping issues by downgrading loom
fixes regression in fd7b82dbe3
2024-05-14 23:17:16 +01:00
Hiroku 37596523db Merge branch 'tmetcalfe89/abstract-stat-ratio-requirement' into 'main'
abstracted stat ratio requirement

See merge request cable-mc/cobblemon!1011
2024-05-14 20:15:13 +00:00
tmetcalfe89 eb80c20dbf updated readme 2024-05-14 09:11:16 -07:00
apion 7ab3951613 Fix gilded chest item drops 2024-05-14 11:16:33 -04:00
apion e6d51c4d56 A little more fossil machine clean up 2024-05-14 10:26:25 -04:00
Apion 3813ec3c92 Merge branch 'sound' into 'main'
Renamed Relic Coin Sack sound assets. Added new sounds for Relic Coin Pouches.

See merge request cable-mc/cobblemon!1013
2024-05-14 14:12:24 +00:00
apion b9364304ca Changelog teehee 2024-05-14 09:47:35 -04:00
Sterrezo 9be212d2b8 Renamed Relic Coin Sack sound assets. Added new sounds for Relic Coin Pouches.
Renamed all sounds called "coin_pouch..." to "relic_coin_sack..." Added new sounds for breaking and placing Relic Coin Pouches with a new sound group for them.
2024-05-14 13:27:11 +02:00
tmetcalfe89 2559257b3a added licenses 2024-05-14 01:16:30 -07:00
apion 8236c6fb11 Merge branch 'refs/heads/main' into 1.5.1 2024-05-14 04:13:40 -04:00
apion 2041d43db4 Hopefully fixed some other bugs 2024-05-14 03:53:35 -04:00
Apion a1687e8304 Merge branch 'tmetcalfe89/ensure-defeat-count' into 'main'
Ensure update total defeat count on battle win

See merge request cable-mc/cobblemon!1010
2024-05-14 07:25:09 +00:00
JazzMcNade 94d92b6fc0 Fixes #827
Jade can now view the contents of the analyzer block
2024-05-14 01:53:56 -05:00
tmetcalfe89 3aa95b9339 abstracted stat ratio requirement 2024-05-13 23:39:01 -07:00
tmetcalfe89 4e97f70801 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into tmetcalfe89/ensure-defeat-count 2024-05-13 22:39:56 -07:00
dhi_holo 404ca565f5 4 balls maybe working
Send out particles for Cherish, Dream, Beast, and Ancient Origin balls

Needs testing on one issue before MR
2024-05-14 15:35:32 +10:00
MoeBoy76 93db0e1cda Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon 2024-05-14 08:57:15 +10:00
apion 4a4d292228 Fixes #828 2024-05-13 17:01:38 -04:00
apion 0fef9eec3d Fixes #826 2024-05-13 17:01:27 -04:00
apion 5f3dc395ec Fixes #832 2024-05-13 12:17:47 -04:00
Hiroku 1bf9d36dbd Merge branch 'wheres-the-tag-drake' into 'main'
Updated fossils.json Item Tag

Closes #834

See merge request cable-mc/cobblemon!1009
2024-05-13 09:45:38 +00:00
dhi_holo b19c5ed125 Updated fossils.json Item Tag
Sorted the fossils tag to match the order on Bulbapedia (just to make sure all other fossils were there, and because it looks a little nicer), and added Fossilized Drake to the tag
2024-05-13 17:51:19 +10:00
Paul e3cca0d9cf SpawnAction#complete returns R instead of Boolean 2024-05-13 15:08:55 +10:00
tmetcalfe89 1aa55f8199 replaced entity ref with originalPokemon 2024-05-12 21:49:58 -07:00
Paul 4c16b2ce2e Track friendship on client entities, tweaks to dataTracker initializing, MoLang in pose & quirk conditions 2024-05-13 12:47:53 +10:00
Hiroku 920e314444 Merge branch '830-only-player-entity-can-send-out-pokemon' into 'main'
Remove unnecessary cast of phaseTarget to PlayerEntity in PokemonRenderer.renderTransition

Closes #830

See merge request cable-mc/cobblemon!1008
2024-05-12 10:23:34 +00:00
David Sadler 3e4fdc0f22 Remove unnecessary cast of phaseTarget to PlayerEntity in PokemonRenderer.renderTransition 2024-05-12 11:04:52 +01:00
Hiroku 209ac71e06 Merge branch 'FossilTankFixes' into 'main'
Fix for using incorrect item count when applying organic material with right click.

See merge request cable-mc/cobblemon!1007
2024-05-12 08:05:27 +00:00
JazzMcNade ecfc77f311 Updated Changelog 2024-05-12 02:49:19 -05:00
JazzMcNade e64de3aa7d Fixed a bug in which adding organic material was adding the full count of the stack currently in hand 2024-05-12 01:29:55 -05:00
Nick fd7b82dbe3 Merge branch 'build/gradle-updates' into 'main'
gradle and build improvements

See merge request cable-mc/cobblemon!1006
2024-05-11 23:40:09 +00:00
broccolaiandNick 7ef48402fb gradle and build improvements 2024-05-11 23:40:09 +00:00
Nick 81ac6f3b44 Snapshot = true 2024-05-11 16:39:06 -07:00
MoeBoy76 a0b263e392 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon 2024-05-03 10:45:11 +10:00
211 changed files with 1781 additions and 857 deletions
+1
View File
@@ -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
+41 -1
View File
@@ -1,5 +1,45 @@
# Changelog
## [1.5.0 - The Ruins and Revival Update (May Xth, 2024)](#1-5-0)
## [1.5.1](#1-5-1)
### Additions
- Added unique send out particles for Cherish, Dream, Beast, and Ancient Origin balls.
- Made Wooloo and Dubwool dye-able like sheep
### Changes
- Sounds for Relic Coin Sacks have been correctly renamed. Relic Coin Pouches received new sounds for breaking and placing.
- Readjusted Petilil portraits
- Changed "dimensions" spawn condition to check with dimension IDs instead of effects, so custom dimension IDs can be used.
### Fixes
- Fixed a bug in which adding organic material to the fossil tank via right click was adding the full count of the stack currently in hand
- Fixed a niche issue where some properties of entities were not initialized correctly, causing Pokémon that appeared to be level 1 until you battle them.
- Fixed Fossilized Drake being missing from the Fossils item tag.
- Fixed Gilded Chest block entity not being cleared on block break
- Fixed sherd brokenness on Forge/Supplementaries incompat
- Fixed Fossil Compartment crash with Jade / WAILA forks
- Fixed PCStore#resize not allowing PC boxes size reduction.
- Fixed pasture block PC lookups when the player is offline.
- Fixed an untranslated battle message that occurs when using a move that just ran out of PP (e.g. Fire Blast that just got spited mid-turn).
- Fixed held items being eaten even when the held item evolutions are already unlocked.
- Fixed Hisuian Decidueye not being Grass/Fighting
- Fixed both Decidueye forms learning both Triple Arrows and Spirit Shackle
- Fixed Pineco being unable to evolve into Shulker Forretress
- Fixed Kabutops T-posing when underwater. It still does not have proper swimming animations yet though.
- Fixed Pidgey's missing walk animation.
- Fixed recoil evo condition.
- Fixed issue where poser debug tools didnt work on JSON posers
- Fixed issue where gilded chests dont close when going far away
### Developer
- Changed SpawnAction#complete to return a nullable generic R (the spawn action result) instead of a boolean. More information this way.
### 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
-10
View File
@@ -1,10 +0,0 @@
import ca.stellardrift.build.configurate.ConfigFormats
import ca.stellardrift.build.configurate.catalog.PolyglotVersionCatalogExtension
plugins {
id("ca.stellardrift.polyglot-version-catalogs") version "5.0.1"
}
extensions.configure<PolyglotVersionCatalogExtension> {
from(ConfigFormats.YAML, file("../gradle/libs.versions.yml"))
}
@@ -1,21 +0,0 @@
plugins {
`java-library`
}
tasks {
val collectJars by registering(Copy::class) {
val tasks = subprojects.filter { it.path != ":common" }.map { it.tasks.named("remapJar") }
dependsOn(tasks)
from(tasks)
into(buildDir.resolve("libs"))
}
assemble {
dependsOn(collectJars)
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
+2 -3
View File
@@ -1,13 +1,12 @@
plugins {
base
id("cobblemon.root-conventions")
id ("net.nemerosa.versioning") version "2.8.2"
}
group = "com.cobblemon.mod"
version = "${project.property("mod_version")}+${project.property("mc_version")}"
val isSnapshot = project.property("snapshot")?.equals("true") ?: false
if (isSnapshot) {
version = "$version-${versioning.info.branch}-${versioning.info.build}"
val fixedBranchName = versioning.info.branch.substringAfter("/")
version = "$version-${fixedBranchName}-${versioning.info.build}"
}
+18 -24
View File
@@ -1,5 +1,5 @@
import extensions.isSnapshot
import extensions.version
import utilities.isSnapshot
import utilities.version
import java.time.OffsetDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter
@@ -20,7 +20,7 @@ plugins {
id("net.kyori.blossom")
id("org.jetbrains.gradle.plugin.idea-ext")
id ("net.nemerosa.versioning") version "2.8.2"
id("net.nemerosa.versioning") version "2.8.2"
}
architectury {
@@ -34,31 +34,26 @@ repositories {
}
dependencies {
implementation(libs.stdlib)
implementation(libs.reflect)
modImplementation(libs.fabricLoader)
//Flywheel has no common dep so just pick one and don't use any platform specific code in common
// modCompileOnly(libs.flywheelFabric)
implementation(libs.bundles.kotlin)
modImplementation(libs.fabric.loader)
modApi(libs.molang)
compileOnlyApi(libs.jeiApi)
modCompileOnly(libs.adornFabric)
modCompileOnly(libs.lambDynamicLights) { isTransitive = false }
// For Showdown
// Integrations
compileOnlyApi(libs.jei.api)
modCompileOnly(libs.bundles.fabric.integrations.compileOnly) {
isTransitive = false
}
// Flywheel has no common dep so just pick one and don't use any platform specific code in common
// modCompileOnly(libs.flywheelFabric)
// Showdown
modCompileOnly(libs.graal)
//shadowCommon group: 'commons-io', name: 'commons-io', version: '2.6'
// Data Storage
modCompileOnly(libs.bundles.mongo)
// For datastore
modCompileOnly(libs.mongoDriverCore)
modCompileOnly(libs.mongoDriverSync)
testImplementation(libs.fabricJunit)
testImplementation(libs.junitParams)
testImplementation(libs.mockito)
testImplementation(libs.mockk)
testImplementation(libs.classgraph)
// Unit Testing
testImplementation(libs.bundles.unitTesting)
}
tasks.withType<Test> {
@@ -94,7 +89,6 @@ sourceSets {
property("gitCommit", versioning.info.commit)
property("branch", versioning.info.branch)
System.getProperty("buildNumber")?.let { property("buildNumber", it) }
property("timestamp", OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss")) + " UTC")
}
}
}
@@ -26,7 +26,6 @@ public final class CrashReportMixin {
cobblemon.add("Is Snapshot", CobblemonBuildDetails.SNAPSHOT);
cobblemon.add("Git Commit", CobblemonBuildDetails.INSTANCE.smallCommitHash() + " (" + "https://gitlab.com/cable-mc/cobblemon/-/commit/" + CobblemonBuildDetails.GIT_COMMIT + ")");
cobblemon.add("Branch", CobblemonBuildDetails.BRANCH);
cobblemon.add("Timestamp", CobblemonBuildDetails.TIMESTAMP);
cobblemon.addStackTrace(builder);
builder.append("\n\n");
@@ -10,7 +10,6 @@ object CobblemonBuildDetails {
const val GIT_COMMIT = "{{ gitCommit | default("Not Specified") }}"
const val BRANCH = "{{ branch | default("Not Specified") }}"
const val TIMESTAMP = "{{ timestamp }}"
fun smallCommitHash(): String {
return this.GIT_COMMIT.substring(0, 7)
@@ -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
@@ -179,7 +178,6 @@ object Cobblemon {
if(CobblemonBuildDetails.SNAPSHOT) {
this.LOGGER.info(" - Git Commit: ${smallCommitHash()} (https://gitlab.com/cable-mc/cobblemon/-/commit/${CobblemonBuildDetails.GIT_COMMIT})")
this.LOGGER.info(" - Branch: ${CobblemonBuildDetails.BRANCH}")
this.LOGGER.info(" - Timestamp: ${CobblemonBuildDetails.TIMESTAMP}")
}
implementation.registerPermissionValidator()
@@ -236,7 +234,7 @@ object Cobblemon {
val player = event.player
val block = player.world.getBlockState(event.pos).block
player.party().forEach { pokemon ->
pokemon.evolutions
pokemon.lockedEvolutions
.filterIsInstance<BlockClickEvolution>()
.forEach { evolution ->
evolution.attemptEvolution(pokemon, BlockClickEvolution.BlockInteractionContext(block, player.world))
@@ -417,7 +415,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
))
@@ -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() }
@@ -52,21 +52,24 @@ abstract class MultiblockBlock(properties: Settings) : BlockWithEntity(propertie
if(hand == Hand.OFF_HAND) {
return ActionResult.SUCCESS
}
val entity = world.getBlockEntity(pos) as MultiblockEntity?
if (entity?.multiblockStructure != null) {
return entity.multiblockStructure!!.onUse(state, world, pos, player, hand, hit)
if (!world.isClient) {
val entity = world.getBlockEntity(pos) as MultiblockEntity?
if (entity?.multiblockStructure != null) {
return entity.multiblockStructure!!.onUse(state, world, pos, player, hand, hit)
}
}
return super.onUse(state, world, pos, player, hand, hit)
}
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity?) {
super.onBreak(world, pos, state, player)
if (!world.isClient) {
val entity = world.getBlockEntity(pos)
if (entity is MultiblockEntity && entity.multiblockStructure != null) {
entity.multiblockStructure!!.onBreak(world, pos, state, player)
}
entity?.markRemoved()
}
super.onBreak(world, pos, state, player)
}
override fun createBlockEntity(pos: BlockPos, state: BlockState): BlockEntity? {
@@ -78,6 +81,7 @@ abstract class MultiblockBlock(properties: Settings) : BlockWithEntity(propertie
return BlockRenderType.MODEL
}
//This is done so a block picked with NBT doesnt absolutely DESTROY multiblocks
override fun getPickStack(world: BlockView, pos: BlockPos, state: BlockState): ItemStack {
val blockEntity = world.getBlockEntity(pos) as? MultiblockEntity ?: return ItemStack.EMPTY
return if (blockEntity.multiblockStructure == null) super.getPickStack(world, pos, state) else ItemStack.EMPTY
@@ -153,7 +153,7 @@ interface Evolution : EvolutionLike {
pokemon.getOwnerPlayer()?.sendMessage(lang("experience.learned_move", pokemon.getDisplayName(), move.displayName))
}
// we want to instantly tick for example you might only evolve your Bulbasaur at level 34 so Venusaur should be immediately available
pokemon.evolutions.filterIsInstance<PassiveEvolution>().forEach { evolution -> evolution.attemptEvolution(pokemon) }
pokemon.lockedEvolutions.filterIsInstance<PassiveEvolution>().forEach { evolution -> evolution.attemptEvolution(pokemon) }
pokemon.getOwnerPlayer()?.playSound(CobblemonSounds.EVOLVING, SoundCategory.NEUTRAL, 1F, 1F)
CobblemonEvents.EVOLUTION_COMPLETE.post(EvolutionCompleteEvent(pokemon, this))
}
@@ -78,7 +78,7 @@ abstract class SpawningCondition<T : SpawningContext> {
return false
} else if (ctx.position.z < minZ.orMin() || ctx.position.z > maxZ.orMax()) {
return false
} else if (dimensions != null && dimensions!!.isNotEmpty() && ctx.world.dimension.effects !in dimensions!!) {
} else if (dimensions != null && dimensions!!.isNotEmpty() && ctx.world.dimensionKey.value !in dimensions!!) {
return false
} else if (moonPhase != null && ctx.moonPhase !in moonPhase!!) {
return false
@@ -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
}
}
@@ -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 {
@@ -54,8 +54,8 @@ class DamageInstruction(
if (recoiling) {
battlePokemon.effectedPokemon.let { pokemon ->
if (RecoilEvolutionProgress.supports(pokemon)) {
val newPercentage = privateMessage.argumentAt(1)?.split("/")?.getOrNull(0)?.toIntOrNull() ?: 0
val newHealth = (pokemon.hp * (newPercentage / 100.0)).roundToInt()
val healthStr = privateMessage.argumentAt(1) ?: throw UnsupportedOperationException("Cant get recoil string")
val newHealth = "([0-9]+).*".toRegex().find(healthStr)?.groups?.get(1)?.value?.toIntOrNull() ?: throw UnsupportedOperationException("Cant get recoil string")
val difference = pokemon.currentHealth - newHealth
if (difference > 0) {
val progress = pokemon.evolutionProxy.current().progressFirstOrCreate({ it is RecoilEvolutionProgress }) { RecoilEvolutionProgress() }
@@ -38,6 +38,7 @@ import net.minecraft.util.shape.VoxelShapes
import net.minecraft.world.BlockView
import net.minecraft.world.World
import net.minecraft.world.WorldAccess
import net.minecraft.world.WorldEvents
import net.minecraft.world.WorldView
@@ -72,10 +73,12 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity?) {
super.onBreak(world, pos, state, player)
val otherPart = world.getBlockState(getPositionOfOtherPart(state, pos))
if (otherPart.block is RestorationTankBlock) {
world.setBlockState(getPositionOfOtherPart(state, pos), Blocks.AIR.defaultState, 35)
world.syncWorldEvent(player, 2001, getPositionOfOtherPart(state, pos), getRawIdFromState(otherPart))
if (!world.isClient) {
val otherPart = world.getBlockState(getPositionOfOtherPart(state, pos))
if (otherPart.block is RestorationTankBlock) {
world.setBlockState(getPositionOfOtherPart(state, pos), Blocks.AIR.defaultState, Block.NOTIFY_ALL)
world.syncWorldEvent(player, WorldEvents.BLOCK_BROKEN, getPositionOfOtherPart(state, pos), getRawIdFromState(otherPart))
}
}
}
@@ -87,9 +90,9 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
itemStack: ItemStack?
) {
//Place the full block before we call to super to validate the multiblock
world.setBlockState(pos.up(), state.with(PART, TankPart.TOP) as BlockState, 3)
world.setBlockState(pos.up(), state.with(PART, TankPart.TOP) as BlockState, Block.NOTIFY_ALL)
world.updateNeighbors(pos, Blocks.AIR)
state.updateNeighbors(world, pos, 3)
state.updateNeighbors(world, pos, Block.NOTIFY_ALL)
super.onPlaced(world, pos, state, placer, itemStack)
}
@@ -100,7 +103,7 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
val tankBottomPos = pos.down()
val tankBottomState = world.getBlockState(tankBottomPos)
if(tankBottomState.block.equals(CobblemonBlocks.RESTORATION_TANK.asBlock()) && tankBottomState.get(PART) == TankPart.BOTTOM) {
return super.onUse(tankBottomState, world, tankBottomPos, player, hand, hit)
return onUse(tankBottomState, world, tankBottomPos, player, hand, hit)
}
}
return super.onUse(state, world, pos, player, hand, hit)
@@ -27,6 +27,7 @@ import net.minecraft.item.ItemPlacementContext
import net.minecraft.item.ItemStack
import net.minecraft.screen.ScreenHandler
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.server.world.ServerWorld
import net.minecraft.sound.SoundCategory
import net.minecraft.state.StateManager
import net.minecraft.state.property.BooleanProperty
@@ -37,6 +38,7 @@ import net.minecraft.util.*
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Direction
import net.minecraft.util.math.random.Random
import net.minecraft.util.shape.VoxelShape
import net.minecraft.util.shape.VoxelShapes
import net.minecraft.world.BlockView
@@ -125,11 +127,13 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
fun isFake() = (type == Type.FAKE)
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity) {
if (isFake()) {
if (player is ServerPlayerEntity) {
if (!world.isClient) {
if (isFake() && (player is ServerPlayerEntity)) {
spawnPokemon(world, pos, state, player)
}
world.setBlockState(pos, if (state.fluidState.isOf(Fluids.WATER)) Blocks.WATER.defaultState else Blocks.AIR.defaultState)
val bEntity = world.getBlockEntity(pos) as? GildedChestBlockEntity
bEntity?.markRemoved()
} else super.onBreak(world, pos, state, player)
}
@@ -197,9 +201,11 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
newState: BlockState,
moved: Boolean
) {
if (!state.isOf(newState.block)) {
val chest = world.getBlockEntity(pos) as GildedChestBlockEntity
ItemScatterer.spawn(world, pos, chest.inventoryContents)
if (!state.isOf(newState.block) && !world.isClient) {
val chest = world.getBlockEntity(pos) as? GildedChestBlockEntity
chest?.let {
ItemScatterer.spawn(world, pos, chest.inventoryContents)
}
}
}
@@ -261,4 +267,14 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
}
}
override fun scheduledTick(
state: BlockState?,
world: ServerWorld?,
pos: BlockPos?,
random: Random?
) {
val blockEntity = world?.getBlockEntity(pos) as? GildedChestBlockEntity ?: return
blockEntity.onScheduledTick()
}
}
@@ -29,11 +29,17 @@ class FossilAnalyzerBlockEntity(
class FossilAnalyzerInventory(val analyzerEntity: FossilAnalyzerBlockEntity) : SidedInventory {
override fun clear() {
TODO("Not yet implemented")
if(analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
fossilMultiblockStructure.fossilInventory.clear()
}
}
override fun size(): Int {
TODO("Not yet implemented")
if (analyzerEntity.multiblockStructure != null) {
return 3
}
return 0
}
override fun isEmpty(): Boolean {
@@ -41,19 +47,34 @@ class FossilAnalyzerBlockEntity(
}
override fun getStack(slot: Int): ItemStack {
if (analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
if (fossilMultiblockStructure.fossilInventory.size > slot) {
return fossilMultiblockStructure.fossilInventory[slot]
}
}
return ItemStack.EMPTY
}
//Unimplemented since no extract
override fun removeStack(slot: Int, amount: Int): ItemStack {
return ItemStack.EMPTY
return removeStack(slot)
}
override fun removeStack(slot: Int): ItemStack {
// if(analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
// val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
// if (fossilMultiblockStructure.fossilInventory.size > slot) {
// val itemStack = fossilMultiblockStructure.fossilInventory.removeAt(slot)
// markDirty()
// return itemStack
// }
// }
return ItemStack.EMPTY
}
override fun setStack(slot: Int, stack: ItemStack) {
if (analyzerEntity.multiblockStructure != null) {
if (analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
val struct = analyzerEntity.multiblockStructure as FossilMultiblockStructure
analyzerEntity.world?.let {
struct.insertFossil(stack, it)
@@ -72,7 +93,10 @@ class FossilAnalyzerBlockEntity(
}
override fun getAvailableSlots(side: Direction?): IntArray {
return IntArray(1)
if(analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
return intArrayOf(0,1,2)
}
return IntArray(0)
}
override fun canInsert(slot: Int, stack: ItemStack?, dir: Direction?): Boolean {
@@ -87,8 +111,8 @@ class FossilAnalyzerBlockEntity(
}
override fun canExtract(slot: Int, stack: ItemStack?, dir: Direction?): Boolean {
// return analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure && dir == Direction.DOWN
return false
}
}
}
@@ -20,6 +20,7 @@ import net.minecraft.entity.player.PlayerEntity
import net.minecraft.entity.player.PlayerInventory
import net.minecraft.inventory.DoubleInventory
import net.minecraft.inventory.Inventories
import net.minecraft.inventory.Inventory
import net.minecraft.inventory.SidedInventory
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NbtCompound
@@ -58,9 +59,7 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
override fun isPlayerViewing(player: PlayerEntity): Boolean {
if (player.currentScreenHandler is GenericContainerScreenHandler) {
val inventory = (player.currentScreenHandler as GenericContainerScreenHandler).inventory
return inventory === this@GildedChestBlockEntity || inventory is DoubleInventory && inventory.isPart(
this@GildedChestBlockEntity
)
return inventory === this@GildedChestBlockEntity
}
return false
}
@@ -99,8 +98,6 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
return dir == Direction.DOWN
}
override fun canPlayerUse(player: PlayerEntity) = !player.isSpectator
override fun getInvStackList(): DefaultedList<ItemStack> = inventoryContents
override fun setInvStackList(list: DefaultedList<ItemStack>) {
@@ -164,4 +161,10 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
Inventories.readNbt(nbt, inventoryContents)
}
}
fun onScheduledTick() {
if (!this.removed) {
stateManager.updateViewerCount(this.getWorld(), this.getPos(), this.cachedState)
}
}
}
@@ -188,7 +188,7 @@ class FossilMultiblockStructure (
// Check if the player is holding a natural material and if so, feed it to the machine.
if (NaturalMaterials.isNaturalMaterial(stack)) {
if (!this.isRunning() && this.createdPokemon == null && this.organicMaterialInside < MATERIAL_TO_START && insertOrganicMaterial(stack, world)) {
if (!this.isRunning() && this.createdPokemon == null && this.organicMaterialInside < MATERIAL_TO_START && insertOrganicMaterial(ItemStack(stack.item, 1), world)) {
this.lastInteraction = world.time
if (!player.isCreative) {
val returnItem = NaturalMaterials.getReturnItem(stack)
@@ -480,15 +480,19 @@ class FossilMultiblockStructure (
}
fun updateProgress(world: World) {
val screenID = if(protectionTime > 0F ) {
val screenID = if (protectionTime > 0F) {
MonitorBlock.MonitorScreen.GREEN_PROGRESS_9
} else if (timeRemaining <= 0) {
MonitorBlock.MonitorScreen.OFF
} else {
getProgressScreen((TIME_TO_TAKE - timeRemaining) / TIME_PER_STAGE)
}
val monitorState = world.getBlockState(monitorPos)
world.setBlockState(monitorPos, monitorState.with(MonitorBlock.SCREEN, screenID))
if (monitorState.contains(MonitorBlock.SCREEN)) {
world.setBlockState(monitorPos, monitorState.with(MonitorBlock.SCREEN, screenID))
}
}
fun getProgressScreen(progress:Int) : MonitorBlock.MonitorScreen {
@@ -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())
}
))
}
@@ -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
)
@@ -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,
@@ -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) {
@@ -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(
@@ -8,13 +8,14 @@
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.ModelPart
import net.minecraft.util.math.Vec3d
@@ -56,7 +57,7 @@ class KabutopsModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bipe
standing = registerPose(
poseName = "standing",
poseTypes = UI_POSES + PoseType.STAND,
poseTypes = UI_POSES + STATIONARY_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink),
idleAnimations = arrayOf(
@@ -67,7 +68,7 @@ class KabutopsModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bipe
walk = registerPose(
poseName = "walk",
poseType = PoseType.WALK,
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
idleAnimations = arrayOf(
singleBoneLook(),
@@ -8,21 +8,14 @@
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WingFlapIdleAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.createTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BiWingedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.parabolaFunction
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.sineFunction
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.SHOULDER_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.math.geometry.toRadians
import net.minecraft.client.model.ModelPart
import net.minecraft.util.math.Vec3d
@@ -66,7 +59,7 @@ class PidgeyModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
stand = registerPose(
poseName = "standing",
poseTypes = SHOULDER_POSES + UI_POSES + PoseType.STANDING_POSES,
poseTypes = SHOULDER_POSES + UI_POSES + PoseType.STATIONARY_POSES - PoseType.HOVER,
transformTicks = 10,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
@@ -25,8 +25,8 @@ class PetililHisuiBiasModel (root: ModelPart) : PokemonPoseableModel(), HeadedFr
val leaf_left = getPart("leaf_left_rotation")
val leaf_right = getPart("leaf_right_rotation")
override var portraitScale = 1.75F
override var portraitTranslation = Vec3d(0.01, -0.39, 0.0)
override var portraitScale = 1.52F
override var portraitTranslation = Vec3d(0.1, -0.25, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3d(0.0, 0.5, 0.0)
@@ -22,8 +22,8 @@ class PetililModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("petilil")
override val head = getPart("head")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3d(-0.3, -1.2, 0.0)
override var portraitScale = 1.52F
override var portraitTranslation = Vec3d(0.1, -0.25, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3d(0.0, 0.5, 0.0)
@@ -28,8 +28,8 @@ class DubwoolModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Quadr
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
val wool = getPart("wool")
val neckWool = getPart("neck_wool")
val wool = getPart("wool_shearable")
val neckWool = getPart("neck_wool_shearable")
override var portraitScale = 3.1F
override var portraitTranslation = Vec3d(-1.2, -0.7, 0.0)
@@ -28,7 +28,7 @@ class WoolooModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Quadru
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
val wool = getPart("wool")
val wool = getPart("wool_shearable")
override var portraitScale = 3.1F
override var portraitTranslation = Vec3d(-0.85, -1.8, 0.0)
@@ -41,7 +41,6 @@ import net.minecraft.client.render.entity.model.EntityModel
import net.minecraft.client.render.item.ItemRenderer
import net.minecraft.client.util.math.MatrixStack
import net.minecraft.entity.Entity
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.text.Text
import net.minecraft.util.Identifier
import net.minecraft.util.math.MathConstants.PI
@@ -153,7 +152,6 @@ class PokemonRenderer(
var beamSourcePosition = if (phaseTarget is EmptyPokeBallEntity) {
(phaseTarget.delegate as PokeBallPoseableState).locatorStates["beam"]?.getOrigin() ?: phaseTarget.pos
} else {
phaseTarget as PlayerEntity
if (phaseTarget.uuid == MinecraftClient.getInstance().player?.uuid) {
val lookVec = phaseTarget.rotationVector.rotateY(PI / 2).multiply(1.0, 0.0, 1.0).normalize()
phaseTarget.getCameraPosVec(partialTicks).subtract(0.0, 0.4, 0.0).subtract(lookVec.multiply(0.3))
@@ -65,12 +65,6 @@ object CobblemonInfoCommand {
.append(this.SPACE)
.append(CobblemonBuildDetails.BRANCH)
message.append(this.NEW_LINE)
.append(this.INDENT)
.append(Text.literal("Timestamp:").styled { it.withColor(Formatting.GRAY) })
.append(this.SPACE)
.append(CobblemonBuildDetails.TIMESTAMP)
ctx.source.sendMessage(message)
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) {
@@ -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)
}
}
}
@@ -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)) {
@@ -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
@@ -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)
@@ -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))
}
}
@@ -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 {
@@ -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,
@@ -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": {
@@ -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"
}
}
}
@@ -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
}
}
}
@@ -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
@@ -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"
}
}
}
@@ -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
}
}
}
@@ -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,
@@ -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,
@@ -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,
@@ -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
}
}
}
@@ -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
@@ -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,
@@ -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": {
@@ -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"
}
}
}
}
}
@@ -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"
}
}
}
}
}
@@ -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"
}
}
}
}
}
@@ -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"
}
}
}
@@ -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"
}
}
}
}
}
@@ -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"
}
}
}
}
}
@@ -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"
}
}
}
@@ -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
@@ -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,
@@ -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],
@@ -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
}
}
}
@@ -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
@@ -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],
@@ -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": {
@@ -231,7 +231,7 @@
],
"position": [0, "(math.clamp(math.sin(q.anim_time*90*4-110+180)*1,0.5,1)-0.5)*0.7", 0]
},
"wool": {
"wool_shearable": {
"position": [0, "0.5+Math.sin((query.anim_time-0.3) * 90 * 8) * 0.3", 0]
},
"tail": {
@@ -419,10 +419,10 @@
},
"position": {
"0.0": [0, 0, 0],
"0.1667": [0, -2, -1],
"0.3333": [0, -4, 0],
"1.6667": [0, -4, 0],
"1.8333": [0, -2, -1],
"0.1667": [0, -1, -1],
"0.3333": [0, -3, 0],
"1.6667": [0, -3, 0],
"1.8333": [0, -1, -1],
"2.0": [0, 0, 0]
}
},
@@ -544,26 +544,28 @@
},
"ear_left": {
"rotation": {
"0.0": [0, -10, 0],
"0.2917": [0, -10, -10],
"0.4583": [0, -5, 5],
"0.6667": [0, -10, 0],
"1.6667": [0, -10, 0],
"1.9167": [0, 0, 10],
"2.0417": [0, -15, -5],
"2.1667": [0, -10, 0]
"0.0": [0, 0, 0],
"0.2917": [-5, 10, -10],
"0.4583": [-12.5, 11, -5],
"0.6667": [-14, 12.3, 0],
"1.0": [-15, 11.53, 0],
"1.6667": [-10, 10, 0],
"1.9167": [0, 10, 10],
"2.0417": [0, -5, -5],
"2.1667": [0, 0, 0]
}
},
"ear_right": {
"rotation": {
"0.0": [0, 10, 0],
"0.2917": [0, 10, 10],
"0.4583": [0, 5, -5],
"0.6667": [0, 10, 0],
"1.6667": [0, 10, 0],
"1.9167": [0, 0, -10],
"2.0417": [0, 15, 5],
"2.1667": [0, 10, 0]
"0.0": [0, 0, 0],
"0.2917": [-5, -10, 10],
"0.4583": [-12.5, -11, 5],
"0.6667": [-14, -12.3, 0],
"1.0": [-15, -11.53, 0],
"1.6667": [-10, -10, 0],
"1.9167": [0, -10, -10],
"2.0417": [0, 5, 5],
"2.1667": [0, 0, 0]
}
},
"neck": {
@@ -23,16 +23,16 @@
{
"name": "torso",
"parent": "body",
"pivot": [0, 8.5, 3.75],
"pivot": [0, 7.5, 3.75],
"cubes": [
{"origin": [-3, 6.75, 0], "size": [6, 6, 6], "uv": [24, 26]},
{"origin": [-3, 6.75, -5], "size": [6, 6, 6], "inflate": 0.01, "uv": [0, 26]}
{"origin": [-3, 5.75, 0], "size": [6, 6, 6], "uv": [24, 26]},
{"origin": [-3, 5.75, -5], "size": [6, 6, 6], "inflate": 0.01, "uv": [0, 26]}
]
},
{
"name": "wool",
"name": "wool_shearable",
"parent": "torso",
"pivot": [6.5, 2.75, -5],
"pivot": [6.5, 1.75, -5],
"cubes": [
{"origin": [-6.5, 2.75, -5.5], "size": [13, 13, 13], "inflate": 0.02, "uv": [0, 0]}
]
@@ -58,177 +58,201 @@
{
"name": "neck",
"parent": "torso",
"pivot": [0, 8.65, -1.5],
"pivot": [0, 7.65, -1.5],
"cubes": [
{"origin": [-2, 8.65, -5.5], "size": [4, 4, 4], "inflate": 0.01, "uv": [8, 56]}
{"origin": [-2, 7.65, -5.5], "size": [4, 4, 4], "inflate": 0.01, "uv": [8, 56]}
]
},
{
"name": "head",
"parent": "torso",
"pivot": [0.1, 10.75, -5],
"pivot": [0.1, 9.75, -5],
"cubes": [
{"origin": [-2.5, 8.75, -10.5], "size": [5, 4, 6], "uv": [0, 39]},
{"origin": [-1, 10, -10.5], "size": [2, 1, 0], "inflate": 0.01, "uv": [0, 30]},
{"origin": [-1.9, 12.75, -8.25], "size": [1, 2, 1], "pivot": [-1.9, 12.75, -7.25], "rotation": [0, -5, -5], "uv": [39, 0]},
{"origin": [0.9, 12.75, -8.25], "size": [1, 2, 1], "pivot": [1.9, 12.75, -7.25], "rotation": [0, 5, 5], "uv": [9, 0]}
{"origin": [-2.5, 7.75, -10.5], "size": [5, 4, 6], "uv": [0, 39]},
{"origin": [-1, 9, -10.5], "size": [2, 1, 0], "inflate": 0.01, "uv": [0, 30]}
]
},
{
"name": "horn_right",
"parent": "head",
"pivot": [-2, 12.75, -7.75],
"rotation": [-15, 0, -5],
"cubes": [
{"origin": [-2.5, 11.75, -8.25], "size": [1, 2, 1], "pivot": [-2, 12.75, -7.75], "rotation": [0, 47.5, 0], "uv": [39, 0]}
]
},
{
"name": "horn_left",
"parent": "head",
"pivot": [2, 12.75, -7.75],
"rotation": [-15, 0, 5],
"cubes": [
{"origin": [1.5, 11.75, -8.25], "size": [1, 2, 1], "pivot": [2, 12.75, -7.75], "rotation": [0, -47.5, 0], "uv": [9, 0]}
]
},
{
"name": "eyes",
"parent": "head",
"pivot": [-0.15, 10.75, -9]
"pivot": [-0.15, 9.75, -9]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-3.6, 10, -8.5],
"pivot": [-3.6, 9, -8.5],
"cubes": [
{"origin": [-2.51, 9.75, -9.5], "size": [0, 2, 1], "uv": [18, 25], "mirror": true},
{"origin": [-2.401, 9.75, -9.5], "size": [0, 2, 1], "inflate": 0.1, "uv": [0, 0], "mirror": true},
{"origin": [-2.52, 10.25, -9.5], "size": [0, 1, 1], "uv": [8, 9], "mirror": true}
{"origin": [-2.51, 8.75, -9.5], "size": [0, 2, 1], "uv": [18, 25], "mirror": true},
{"origin": [-2.451, 8.75, -9.5], "size": [0, 2, 1], "inflate": 0.05, "uv": [0, 0], "mirror": true},
{"origin": [-2.52, 9.25, -9.5], "size": [0, 1, 1], "uv": [8, 9], "mirror": true}
]
},
{
"name": "eyelid_right",
"parent": "eye_right",
"pivot": [-1.82, 10.75, -9],
"pivot": [-1.8645, 9.75, -9.01],
"cubes": [
{"origin": [-2.32, 9.75, -9.5], "size": [1, 2, 1], "inflate": 0.11, "uv": [54, 39]}
{"origin": [-2.3645, 8.75, -10.01], "size": [1, 2, 2], "inflate": 0.06, "uv": [54, 39]}
]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [3.75, 10, -8.5],
"pivot": [3.75, 9, -8.5],
"cubes": [
{"origin": [2.51, 9.75, -9.5], "size": [0, 2, 1], "uv": [24, 25], "mirror": true},
{"origin": [2.402, 9.75, -9.5], "size": [0, 2, 1], "inflate": 0.1, "uv": [0, 7], "mirror": true},
{"origin": [2.52, 10.25, -9.5], "size": [0, 1, 1], "uv": [8, 10], "mirror": true}
{"origin": [2.51, 8.75, -9.5], "size": [0, 2, 1], "uv": [24, 25], "mirror": true},
{"origin": [2.452, 8.75, -9.5], "size": [0, 2, 1], "inflate": 0.05, "uv": [0, 7], "mirror": true},
{"origin": [2.52, 9.25, -9.5], "size": [0, 1, 1], "uv": [8, 10], "mirror": true}
]
},
{
"name": "eyelid_left",
"parent": "eye_left",
"pivot": [1.82, 10.75, -9],
"pivot": [1.8645, 9.75, -9.01],
"cubes": [
{"origin": [1.32, 9.75, -9.5], "size": [1, 2, 1], "inflate": 0.11, "uv": [52, 36], "mirror": true}
{"origin": [1.3645, 8.75, -10.01], "size": [1, 2, 2], "inflate": 0.06, "uv": [56, 32], "mirror": true}
]
},
{
"name": "mouth_open",
"parent": "head",
"pivot": [-0.05, 10, -9.5],
"pivot": [-0.05, 9, -9.5],
"cubes": [
{"origin": [-1.05, 8.75, -10.41], "size": [2, 1, 0], "uv": [8, 12]}
{"origin": [-1.05, 7.75, -10.41], "size": [2, 1, 0], "uv": [8, 12]}
]
},
{
"name": "head_wool",
"parent": "head",
"pivot": [-2.3928, 13.73889, -6.69372],
"pivot": [-2.3928, 12.73889, -6.69372],
"cubes": [
{"origin": [-2.025, 12, -9.19785], "size": [2, 2, 2], "pivot": [-1.05693, 12.8315, -8.01133], "rotation": [0, 5, 0], "uv": [50, 24]},
{"origin": [-2.5, 8.5, -7.5], "size": [5, 6, 4], "inflate": 0.01, "uv": [39, 0]},
{"origin": [0.025, 12, -9.19785], "size": [2, 2, 2], "pivot": [1.06611, 12.8315, -8.01133], "rotation": [0, -5, 0], "uv": [52, 10]},
{"origin": [-3.75, 11.5, -8.25], "size": [2, 2, 2], "uv": [8, 49]},
{"origin": [1.75, 11.5, -8.25], "size": [2, 2, 2], "uv": [16, 39]}
{"origin": [-2.025, 11, -9.19785], "size": [2, 2, 2], "pivot": [-1.05693, 11.8315, -8.01133], "rotation": [0, 5, 0], "uv": [50, 24]},
{"origin": [-2.5, 7.5, -7.5], "size": [5, 5, 3], "inflate": 0.01, "uv": [24, 56]},
{"origin": [0.025, 11, -9.19785], "size": [2, 2, 2], "pivot": [1.06611, 11.8315, -8.01133], "rotation": [0, -5, 0], "uv": [52, 10]},
{"origin": [-3.75, 10.75, -8.5], "size": [2, 2, 2], "uv": [8, 49]},
{"origin": [1.75, 10.75, -8.5], "size": [2, 2, 2], "uv": [16, 39]}
]
},
{
"name": "head_wool_shearable",
"parent": "head_wool",
"pivot": [0, -1, 0],
"cubes": [
{"origin": [-2.5, 9.5, -7.5], "size": [5, 4, 4], "inflate": 0.02, "uv": [39, 0]}
]
},
{
"name": "braid_right",
"parent": "head_wool",
"pivot": [-3, 11.5, -7.5],
"pivot": [-3, 10.75, -7.5],
"cubes": [
{"origin": [-3.5, 10.75, -8], "size": [1, 1, 1], "uv": [0, 39]},
{"origin": [-4, 9, -8.5], "size": [2, 2, 2], "uv": [0, 49]}
{"origin": [-3.5, 10, -8], "size": [1, 1, 1], "uv": [0, 39]},
{"origin": [-4, 8.25, -8.5], "size": [2, 2, 2], "uv": [0, 49]}
]
},
{
"name": "braid_middle_right",
"parent": "braid_right",
"pivot": [-3, 9, -7.5],
"pivot": [-3, 8.25, -7.5],
"cubes": [
{"origin": [-3.5, 8.25, -8], "size": [1, 1, 1], "uv": [0, 41]},
{"origin": [-4, 6.5, -8.5], "size": [2, 2, 2], "uv": [36, 48]}
{"origin": [-3.5, 7.5, -8], "size": [1, 1, 1], "uv": [0, 41]},
{"origin": [-4, 5.75, -8.5], "size": [2, 2, 2], "uv": [36, 48]}
]
},
{
"name": "braid_bottom_right",
"parent": "braid_middle_right",
"pivot": [-3, 6.5, -7.5],
"pivot": [-3, 5.75, -7.5],
"cubes": [
{"origin": [-3.5, 5.75, -8], "size": [1, 1, 1], "uv": [0, 43]},
{"origin": [-4, 4, -8.5], "size": [2, 2, 2], "uv": [28, 48]},
{"origin": [-4, 3.75, -8.5], "size": [2, 1, 0], "pivot": [-3, 4.75, -8.5], "rotation": [-12.5, 0, 0], "uv": [0, 61]},
{"origin": [-4, 3.75, -8.5], "size": [0, 1, 2], "pivot": [-4, 4.75, -7.5], "rotation": [0, 0, 12.5], "uv": [0, 60]},
{"origin": [-2, 3.75, -8.5], "size": [0, 1, 2], "pivot": [-2, 4.75, -7.5], "rotation": [0, 0, -12.5], "uv": [0, 61]},
{"origin": [-4, 3.75, -6.5], "size": [2, 1, 0], "pivot": [-3, 4.75, -6.5], "rotation": [12.5, 0, 0], "uv": [0, 60]}
{"origin": [-3.5, 5, -8], "size": [1, 1, 1], "uv": [0, 43]},
{"origin": [-4, 3.25, -8.5], "size": [2, 2, 2], "uv": [28, 48]},
{"origin": [-4, 3, -8.5], "size": [2, 1, 0], "pivot": [-3, 4, -8.5], "rotation": [-12.5, 0, 0], "uv": [0, 61]},
{"origin": [-4, 3, -8.5], "size": [0, 1, 2], "pivot": [-4, 4, -7.5], "rotation": [0, 0, 12.5], "uv": [0, 60]},
{"origin": [-2, 3, -8.5], "size": [0, 1, 2], "pivot": [-2, 4, -7.5], "rotation": [0, 0, -12.5], "uv": [0, 61]},
{"origin": [-4, 3, -6.5], "size": [2, 1, 0], "pivot": [-3, 4, -6.5], "rotation": [12.5, 0, 0], "uv": [0, 60]}
]
},
{
"name": "braid_left",
"parent": "head_wool",
"pivot": [3, 11.5, -7.5],
"pivot": [3, 10.75, -7.5],
"cubes": [
{"origin": [2.5, 10.75, -8], "size": [1, 1, 1], "uv": [26, 26]},
{"origin": [2, 9, -8.5], "size": [2, 2, 2], "uv": [48, 30]}
{"origin": [2.5, 10, -8], "size": [1, 1, 1], "uv": [26, 26]},
{"origin": [2, 8.25, -8.5], "size": [2, 2, 2], "uv": [48, 30]}
]
},
{
"name": "braid_middle_left",
"parent": "braid_left",
"pivot": [3, 9, -7.5],
"pivot": [3, 8.25, -7.5],
"cubes": [
{"origin": [2.5, 8.25, -8], "size": [1, 1, 1], "uv": [26, 28]},
{"origin": [2, 6.5, -8.5], "size": [2, 2, 2], "uv": [32, 39]}
{"origin": [2.5, 7.5, -8], "size": [1, 1, 1], "uv": [26, 28]},
{"origin": [2, 5.75, -8.5], "size": [2, 2, 2], "uv": [32, 39]}
]
},
{
"name": "braid_bottom_left",
"parent": "braid_middle_left",
"pivot": [3, 6.5, -7.5],
"pivot": [3, 5.75, -7.5],
"cubes": [
{"origin": [2.5, 5.75, -8], "size": [1, 1, 1], "uv": [26, 30]},
{"origin": [2, 4, -8.5], "size": [2, 2, 2], "uv": [0, 8]},
{"origin": [2, 3.75, -8.5], "size": [2, 1, 0], "pivot": [3, 4.75, -8.5], "rotation": [-12.5, 0, 0], "uv": [4, 61], "mirror": true},
{"origin": [2, 3.75, -8.5], "size": [0, 1, 2], "pivot": [2, 4.75, -7.5], "rotation": [0, 0, 12.5], "uv": [4, 61], "mirror": true},
{"origin": [4, 3.75, -8.5], "size": [0, 1, 2], "pivot": [4, 4.75, -7.5], "rotation": [0, 0, -12.5], "uv": [4, 60], "mirror": true},
{"origin": [2, 3.75, -6.5], "size": [2, 1, 0], "pivot": [3, 4.75, -6.5], "rotation": [12.5, 0, 0], "uv": [4, 60], "mirror": true}
{"origin": [2.5, 5, -8], "size": [1, 1, 1], "uv": [26, 30]},
{"origin": [2, 3.25, -8.5], "size": [2, 2, 2], "uv": [0, 8]},
{"origin": [2, 3, -8.5], "size": [2, 1, 0], "pivot": [3, 4, -8.5], "rotation": [-12.5, 0, 0], "uv": [4, 61], "mirror": true},
{"origin": [2, 3, -8.5], "size": [0, 1, 2], "pivot": [2, 4, -7.5], "rotation": [0, 0, 12.5], "uv": [4, 61], "mirror": true},
{"origin": [4, 3, -8.5], "size": [0, 1, 2], "pivot": [4, 4, -7.5], "rotation": [0, 0, -12.5], "uv": [4, 60], "mirror": true},
{"origin": [2, 3, -6.5], "size": [2, 1, 0], "pivot": [3, 4, -6.5], "rotation": [12.5, 0, 0], "uv": [4, 60], "mirror": true}
]
},
{
"name": "ear_left",
"parent": "head",
"pivot": [2.5, 11.75, -6.5],
"pivot": [2.5, 10.75, -6.5],
"rotation": [0, 0, 15],
"cubes": [
{"origin": [2.25, 10, -6.5], "size": [4, 2, 0], "uv": [48, 34]}
{"origin": [2.25, 9, -6.5], "size": [4, 2, 0], "uv": [48, 34]}
]
},
{
"name": "ear_right",
"parent": "head",
"pivot": [-2.5, 11.75, -6.5],
"pivot": [-2.5, 10.75, -6.5],
"rotation": [0, 0, -15],
"cubes": [
{"origin": [-6.25, 10, -6.5], "size": [4, 2, 0], "uv": [39, 10]}
{"origin": [-6.25, 9, -6.5], "size": [4, 2, 0], "uv": [39, 10]}
]
},
{
"name": "leg_front_right",
"parent": "body",
"pivot": [2.25, 8.5, -3],
"pivot": [2.25, 7.5, -3],
"cubes": [
{"origin": [0.75, 5, -4.5], "size": [3, 5, 3], "uv": [0, 0]}
{"origin": [0.75, 4, -4.5], "size": [3, 5, 3], "uv": [0, 0]}
]
},
{
"name": "leg_front_right2",
"parent": "leg_front_right",
"pivot": [2.25, 6, -3.75],
"pivot": [2.25, 5, -3.75],
"cubes": [
{"origin": [1.25, 1.25, -3.75], "size": [2, 4, 2], "uv": [18, 26]}
{"origin": [1.25, 1.25, -3.75], "size": [2, 3, 2], "uv": [18, 26]}
]
},
{
@@ -242,17 +266,17 @@
{
"name": "leg_front_left",
"parent": "body",
"pivot": [-2.25, 8.5, -3],
"pivot": [-2.25, 7.5, -3],
"cubes": [
{"origin": [-3.75, 5, -4.5], "size": [3, 5, 3], "uv": [47, 45]}
{"origin": [-3.75, 4, -4.5], "size": [3, 5, 3], "uv": [47, 45]}
]
},
{
"name": "leg_front_left2",
"parent": "leg_front_left",
"pivot": [-2.25, 5, -3.75],
"pivot": [-2.25, 4, -3.75],
"cubes": [
{"origin": [-3.25, 1.25, -3.75], "size": [2, 4, 2], "uv": [42, 26]}
{"origin": [-3.25, 1.25, -3.75], "size": [2, 3, 2], "uv": [42, 26]}
]
},
{
@@ -266,17 +290,17 @@
{
"name": "leg_back_right",
"parent": "body",
"pivot": [2.25, 8.5, 3.5],
"pivot": [2.25, 7.5, 3.5],
"cubes": [
{"origin": [0.75, 5, 1.5], "size": [3, 5, 4], "uv": [22, 39]}
{"origin": [0.75, 4, 1.5], "size": [3, 5, 4], "uv": [22, 39]}
]
},
{
"name": "leg_back_right2",
"parent": "leg_back_right",
"pivot": [2.25, 5, 5],
"pivot": [2.25, 4, 5],
"cubes": [
{"origin": [1.25, 1.25, 3.75], "size": [2, 4, 2], "uv": [46, 37]}
{"origin": [1.25, 1.25, 3.75], "size": [2, 3, 2], "uv": [46, 37]}
]
},
{
@@ -290,17 +314,17 @@
{
"name": "leg_back_left",
"parent": "body",
"pivot": [-2.25, 8.5, 3.5],
"pivot": [-2.25, 7.5, 3.5],
"cubes": [
{"origin": [-3.75, 5, 1.5], "size": [3, 5, 4], "uv": [36, 39]}
{"origin": [-3.75, 4, 1.5], "size": [3, 5, 4], "uv": [36, 39]}
]
},
{
"name": "leg_back_left2",
"parent": "leg_back_left",
"pivot": [-2.25, 5, 5],
"pivot": [-2.25, 4, 5],
"cubes": [
{"origin": [-3.25, 1.25, 3.75], "size": [2, 4, 2], "uv": [20, 48]}
{"origin": [-3.25, 1.25, 3.75], "size": [2, 3, 2], "uv": [20, 48]}
]
},
{
@@ -30,7 +30,7 @@
]
},
{
"name": "wool",
"name": "wool_shearable",
"parent": "torso",
"pivot": [0, 12.75, 0.25],
"cubes": [
@@ -47,7 +47,7 @@
]
},
{
"name": "neck_wool",
"name": "neck_wool_shearable",
"parent": "neck",
"pivot": [0, 15.5, -9.5],
"rotation": [-62.5, 0, 0],
@@ -57,7 +57,7 @@
},
{
"name": "neck_wool_middle_right",
"parent": "neck_wool",
"parent": "neck_wool_shearable",
"pivot": [0.25, 13.75, -9.5],
"rotation": [7.5, 0, 12.5],
"cubes": [
@@ -66,7 +66,7 @@
},
{
"name": "neck_wool_middle_left",
"parent": "neck_wool",
"parent": "neck_wool_shearable",
"pivot": [-0.25, 13.75, -9.5],
"rotation": [7.5, 0, -12.5],
"cubes": [
@@ -75,7 +75,7 @@
},
{
"name": "neck_wool_right",
"parent": "neck_wool",
"parent": "neck_wool_shearable",
"pivot": [-1.75, 13.75, -9.5],
"rotation": [12.5, 0, 25],
"cubes": [
@@ -84,7 +84,7 @@
},
{
"name": "neck_wool_left",
"parent": "neck_wool",
"parent": "neck_wool_shearable",
"pivot": [1.75, 13.75, -9.5],
"rotation": [12.5, 0, -25],
"cubes": [
@@ -324,19 +324,19 @@
{
"name": "tail",
"parent": "torso",
"pivot": [0, 15, 7],
"pivot": [0, 14, 7],
"rotation": [-42.5, 0, 0],
"cubes": [
{"origin": [-0.5, 14, 7], "size": [1, 1, 3], "inflate": 0.01, "uv": [102, 1]}
{"origin": [-0.5, 13, 7], "size": [1, 1, 3], "inflate": 0.01, "uv": [102, 1]}
]
},
{
"name": "tail2",
"parent": "tail",
"pivot": [0, 14, 10],
"pivot": [0, 13, 10],
"rotation": [35, 0, 0],
"cubes": [
{"origin": [-0.5, 14, 10], "size": [1, 1, 3], "uv": [98, 26]}
{"origin": [-0.5, 13, 10], "size": [1, 1, 3], "uv": [98, 26]}
]
},
{
@@ -14,6 +14,210 @@
"shiny"
],
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_shiny.png"
},
{
"aspects": [
"color-black"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_black.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_brown.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_cyan.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_green.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_light_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_light_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_lime.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_magenta.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_orange.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_pink.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_purple.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_red.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_yellow.png",
"emissive": false
}
]
}
]
}
@@ -14,6 +14,390 @@
"shiny"
],
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_shiny.png"
},
{
"aspects": [
"color-black"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_black.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_brown.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_cyan.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_green.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_lime.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_magenta.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_orange.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_pink.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_purple.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_red.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_white.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_yellow.png",
"emissive": false
}
]
},
{
"aspects": [
"color-black shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_black_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_blue_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_brown_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_cyan_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_gray_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_green_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_blue_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_gray_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_lime_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_magenta_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_orange_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_pink_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_purple_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_red_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_white_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_yellow_shiny.png",
"emissive": false
}
]
}
]
}
@@ -1130,6 +1130,7 @@
"cobblemon.battle.cant.shelltrap": "%1$s's shell trap didn't work!",
"cobblemon.battle.cant.taunt": "%1$s can't use %2$s after the taunt!",
"cobblemon.battle.cant.throatchop": "The effects of Throat Chop prevent %1$s from using certain moves!",
"cobblemon.battle.cant.nopp": "%1$s can't use %2$s because it is out of PP!",
"cobblemon.battle.activate.confusion": "%1$s is confused!",
"cobblemon.battle.activate.happyhour": "Everyone is caught up in the happy atmosphere!",
@@ -159,36 +159,36 @@
"gimmighoul.reveal": {
"sounds": [ "cobblemon:gimmighoul_reveal" ]
},
"coin_pouch.break": {
"relic_coin_sack.break": {
"sounds": [
"cobblemon:block/coin_pouch/coin_pouch_block_break_1",
"cobblemon:block/coin_pouch/coin_pouch_block_break_2",
"cobblemon:block/coin_pouch/coin_pouch_block_break_3",
"cobblemon:block/coin_pouch/coin_pouch_block_break_4"
"cobblemon:block/relic_coin_sack/relic_coin_sack_break_1",
"cobblemon:block/relic_coin_sack/relic_coin_sack_break_2",
"cobblemon:block/relic_coin_sack/relic_coin_sack_break_3",
"cobblemon:block/relic_coin_sack/relic_coin_sack_break_4"
]
},
"coin_pouch.hit": {
"relic_coin_sack.hit": {
"sounds": [
{ "name": "cobblemon:block/coin_pouch/coin_pouch_block_hit_1", "volume": 0.6 },
{ "name": "cobblemon:block/coin_pouch/coin_pouch_block_hit_2", "volume": 0.6 },
{ "name": "cobblemon:block/coin_pouch/coin_pouch_block_hit_3", "volume": 0.6 },
{ "name": "cobblemon:block/coin_pouch/coin_pouch_block_hit_4", "volume": 0.6 }
{ "name": "cobblemon:block/relic_coin_sack/relic_coin_sack_hit_1", "volume": 0.5 },
{ "name": "cobblemon:block/relic_coin_sack/relic_coin_sack_hit_2", "volume": 0.5 },
{ "name": "cobblemon:block/relic_coin_sack/relic_coin_sack_hit_3", "volume": 0.5 },
{ "name": "cobblemon:block/relic_coin_sack/relic_coin_sack_hit_4", "volume": 0.5 }
]
},
"coin_pouch.place": {
"relic_coin_sack.place": {
"sounds": [
"cobblemon:block/coin_pouch/coin_pouch_block_place_1",
"cobblemon:block/coin_pouch/coin_pouch_block_place_2",
"cobblemon:block/coin_pouch/coin_pouch_block_place_3",
"cobblemon:block/coin_pouch/coin_pouch_block_place_4"
"cobblemon:block/relic_coin_sack/relic_coin_sack_place_1",
"cobblemon:block/relic_coin_sack/relic_coin_sack_place_2",
"cobblemon:block/relic_coin_sack/relic_coin_sack_place_3",
"cobblemon:block/relic_coin_sack/relic_coin_sack_place_4"
]
},
"coin_pouch.step": {
"relic_coin_sack.step": {
"sounds": [
"cobblemon:block/coin_pouch/coin_pouch_block_step_1",
"cobblemon:block/coin_pouch/coin_pouch_block_step_2",
"cobblemon:block/coin_pouch/coin_pouch_block_step_3",
"cobblemon:block/coin_pouch/coin_pouch_block_step_4"
"cobblemon:block/relic_coin_sack/relic_coin_sack_step_1",
"cobblemon:block/relic_coin_sack/relic_coin_sack_step_2",
"cobblemon:block/relic_coin_sack/relic_coin_sack_step_3",
"cobblemon:block/relic_coin_sack/relic_coin_sack_step_4"
]
},
"tumblestone.break": {
@@ -199,6 +199,22 @@
"cobblemon:block/tumblestone/tumblestone_break_4"
]
},
"relic_coin_pouch.break": {
"sounds": [
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_break_1",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_break_2",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_break_3",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_break_4"
]
},
"relic_coin_pouch.place": {
"sounds": [
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_place_1",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_place_2",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_place_3",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_place_4"
]
},
"tumblestone.block_break": {
"sounds": [
"cobblemon:block/tumblestone/tumblestone_block_break_1",

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