Compare commits

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

Closes #2023

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

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

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

Closes #2012

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-13 07:46:03 +00:00
RedGenesectNinja a3c5a6c377 Implemented Yamask fixes 2026-06-09 21:58:33 -05:00
Watuneni iteiteandWeblate abb5346305 Translated using Weblate (Japanese)
Currently translated at 96.5% (9139 of 9467 strings)

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

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

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-09 14:01:57 +00:00
ManriqueandWeblate 15f0ad1821 Translated using Weblate (Spanish)
Currently translated at 97.2% (9211 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-06-08 08:42:34 +00:00
Watuneni iteiteandWeblate a16975c750 Translated using Weblate (Japanese)
Currently translated at 96.1% (9105 of 9467 strings)

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

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

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-07 12:02:11 +00:00
ewwww b7e27fa52a Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-06-05 21:10:08 -04:00
ewwww dc87ffd2a8 luvdisc faint fix 2026-06-05 21:09:49 -04:00
阿鱼andWeblate cbeda361d4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.3% (8835 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-04 15:12:59 +00:00
阿鱼andWeblate 079a2fb50d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 93.3% (8835 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-06-03 06:11:14 +00:00
74 changed files with 851 additions and 372 deletions
+12 -3
View File
@@ -42,9 +42,8 @@
- All ruin structures gilded chest loot tables have been updated to include a guaranteed TM not learned naturally by any Pokémon through their level-up moveset. Each ruin gets its own specific TM, so you can now go hunting ruins to complete your move dex!
- All fossil structures have been transferred over to biome features, allowing for better placement in generation.
- The prehistoric_underwater_fissure & prehistoric_submerged_impact fossil structures now use the biome tag `#cobblemon:is_temperate_ocean`.
- A new Biome tag called `#cobblemon:is_stony_beach` has been added.
- Gimmighoul towers now generate at ground level rather than sinking one block into the ground.
- 1 New shipwreck cove structure called the "magma_shipwreck_cove" has been added.
- A new shipwreck cove structure called the "magma_shipwreck_cove" has been added.
- Shipwreck coves now generate slightly more frequently.
- Added equipment loot tables for shipwreck cove enemies.
- Maps from abandoned fishing boats leading to shipwreck coves now will skip explored chunks, allowing the player to find more shipwreck coves easier.
@@ -57,6 +56,7 @@
- Pokémon cries now play when clicking Pokémon in the summary screen.
- Pressing the Summary key while either the starter selection or summary screen are open now closes those screens
- Ice type Pokémon are now immune to Packed Snow
- Held item visibility can now be controlled by the held_item_visible command argument.
### New rideable Pokémon
- Drampa
@@ -301,6 +301,12 @@
- Resolved Z-Fighting on Pokédex Models
- Restored Ninjask's ability to do barrel rolls
- Fixed a crash caused by adding enchanted items to the Resurrection Machine
- Fixed a crash that could occur when starting a PvN battle with only fainted Pokémon.
- Fixed the Remember Riding Camera config not being respected when dismounting and resolved the incompatibility with the Auto Third Person mod
- Fixed Full Heal block not dropping Full Heals
- Fixed status cure items not returning an empty bottle when used
- Fixed Panpour consuming its held item when evolving with a Water Stone
- Fixed Smoked Tail Curry returning a Wooden Bowl when consumed despite it not being included in the recipe
### Fixes
- Fixed Croagunk's walkspeed
@@ -351,6 +357,8 @@
- Fixed Guilded chests being more accessible than intended
- Fixed fished up Pokémon not being added as "seen" to the Pokedex
- Fixed surprised Gimmighoul encounters not being added as "seen" to the Pokedex
- Fixed a crash involving berry trees that have been world edited.
- Fixed visual desync in multiplayer for players mounting Pokémon outside other players' loaded chunks
### Developer
- Added `PokeSnackSpawnerFactory` which allows influence registration on PokeSnack encounters
@@ -361,7 +369,8 @@
- Separated all the functions of MoLangFunctions.kt into their own files.
- Spawn buckets and their base weights are now provided by the spawner, with different base weights for world, fishing, snack, and habitat spawn buckets.
- Removed "SpawnBucket" class in favour of just storing maps of bucket names to weights.
- Fixed nicknames not being applied to Pokémon spawned from `spawn_pool_world` files
- Fixed nicknames not being applied to Pokémon spawned from `spawn_pool_world` files.
- Added support for `profilePokedexScale`, `profilePokedexTranslation`, `profileSummaryScale`, and `profileSummaryTranslation` in poser files for finer control over profile displays.
### Molang & Datapacks
- Added `moveset_builders` datapack folder for different styles of movesets.
@@ -108,6 +108,7 @@ import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
import com.cobblemon.mod.common.pokemon.properties.AspectPropertyType
import com.cobblemon.mod.common.pokemon.properties.BattleCloneProperty
import com.cobblemon.mod.common.pokemon.properties.FreezeFrameProperty
import com.cobblemon.mod.common.pokemon.properties.HeldItemVisibleProperty
import com.cobblemon.mod.common.pokemon.properties.HiddenAbilityPropertyType
import com.cobblemon.mod.common.pokemon.properties.LabelProperty
import com.cobblemon.mod.common.pokemon.properties.NoAIProperty
@@ -350,6 +351,7 @@ object Cobblemon {
CustomPokemonProperty.register(UnaspectPropertyType)
CustomPokemonProperty.register(FreezeFrameProperty)
CustomPokemonProperty.register(NoAIProperty)
CustomPokemonProperty.register(HeldItemVisibleProperty)
CobblemonEvents.POKEMON_PROPERTY_INITIALISED.emit(Unit)
@@ -405,7 +405,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val BIG_MALASADA = regionalFoodItem("big_malasada", 64, 7, 0.3f, false)
@JvmField
val SMOKED_TAIL_CURRY = regionalFoodItem("smoked_tail_curry", 64, 10, 0.6f, false, ItemStack(Items.BOWL, 1))
val SMOKED_TAIL_CURRY = regionalFoodItem("smoked_tail_curry", 64, 10, 0.6f, false)
@JvmField
val JUBILIFE_MUFFIN = regionalFoodItem("jubilife_muffin", 64, 7, 0.3f, false)
@JvmField
@@ -35,6 +35,7 @@ import com.cobblemon.mod.common.client.net.gui.PokedexUIPacketHandler
import com.cobblemon.mod.common.client.net.gui.SetActiveTMPacketHandler
import com.cobblemon.mod.common.client.net.gui.SetTMMachineContainerDataPacketHandler
import com.cobblemon.mod.common.client.net.gui.SummaryUIPacketHandler
import com.cobblemon.mod.common.client.net.gui.SynchronizeActiveTMHandler
import com.cobblemon.mod.common.client.net.habitat.OpenHabitatBlockEditorHandler
import com.cobblemon.mod.common.client.net.npc.CloseNPCEditorHandler
import com.cobblemon.mod.common.client.net.npc.OpenNPCEditorHandler
@@ -147,6 +148,7 @@ import com.cobblemon.mod.common.net.messages.client.ui.PokedexUIPacket
import com.cobblemon.mod.common.net.messages.client.ui.SetActiveTMPacket
import com.cobblemon.mod.common.net.messages.client.ui.SetTMMachineContainerDataPacket
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
import com.cobblemon.mod.common.net.messages.server.BattleChallengePacket
import com.cobblemon.mod.common.net.messages.server.BattleChallengeResponsePacket
import com.cobblemon.mod.common.net.messages.server.BenchMovePacket
@@ -375,6 +377,7 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(PlayerInteractOptionsPacket.ID, PlayerInteractOptionsPacket::decode, PlayerInteractOptionsHandler))
list.add(PacketRegisterInfo(PokedexUIPacket.ID, PokedexUIPacket::decode, PokedexUIPacketHandler))
list.add(PacketRegisterInfo(ExpGainedDataPacket.ID, ExpGainedDataPacket::decode, ExpGainedDataPacketHandler))
list.add(PacketRegisterInfo(SynchronizeActiveTMPacket.ID, SynchronizeActiveTMPacket::decode, SynchronizeActiveTMHandler))
// Starter packets
list.add(PacketRegisterInfo(OpenStarterUIPacket.ID, OpenStarterUIPacket::decode, StarterUIPacketHandler))
@@ -69,7 +69,7 @@ class HabitatPool {
pool.spawns = spawns
return pool
} else {
return HabitatPools.habitatPoolsById[poolId] ?: HabitatPool.default()
return HabitatPools.habitatPoolsById[poolId] ?: default()
}
}
}
@@ -94,6 +94,14 @@ class HabitatPool {
return spawns.mapNotNull { it.createSpawnDetail(habitatBlockEntity) }
}
fun getPhaseCount(): Int {
return spawns
.flatMap { it.phases?.ranges?.flatten() ?: emptySet() }
.toSet()
.count()
.coerceAtLeast(1)
}
fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeResourceLocation(id)
buffer.writeUtf(name)
@@ -17,7 +17,6 @@ import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.resources.ResourceLocation
class HabitatSettingsDTO() {
var numberOfPhases = 1
var phaseOrder = HabitatPhaseOrder.SIMPLE
lateinit var levelRange: IntRange
var modifiers: String = ""
@@ -28,7 +27,6 @@ class HabitatSettingsDTO() {
var naturalSettings: NaturalHabitatSettingsDTO? = null
constructor(habitatBlockEntity: HabitatBlockEntity) : this() {
this.numberOfPhases = habitatBlockEntity.numberOfPhases
this.phaseOrder = habitatBlockEntity.phaseOrder
this.levelRange = habitatBlockEntity.levelRange
this.modifiers = habitatBlockEntity.modifiers.asString()
@@ -44,7 +42,6 @@ class HabitatSettingsDTO() {
}
fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeInt(numberOfPhases)
buffer.writeEnum(phaseOrder)
buffer.writeInt(levelRange.first)
buffer.writeInt(levelRange.last)
@@ -60,7 +57,6 @@ class HabitatSettingsDTO() {
}
fun decode(buffer: RegistryFriendlyByteBuf) {
this.numberOfPhases = buffer.readInt()
this.phaseOrder = buffer.readEnum(HabitatPhaseOrder::class.java)
val levelRangeStart = buffer.readInt()
val levelRangeEnd = buffer.readInt()
@@ -349,11 +349,12 @@ object BattleBuilder {
npcPartyStores.add(npcParty)
}
if (playerActor.pokemonList.size < battleFormat.battleType.slotsPerActor) {
val playerAvailablePokemon = playerActor.pokemonList.count { it.health > 0 }
if (playerAvailablePokemon < battleFormat.battleType.slotsPerActor) {
errors.participantErrors[playerActor] += BattleStartError.insufficientPokemon(
actorEntity = player,
requiredCount = battleFormat.battleType.slotsPerActor,
hadCount = playerActor.pokemonList.size
hadCount = playerAvailablePokemon
)
}
@@ -163,7 +163,8 @@ class TrackerActor(val uuid: UUID) {
//we assume that AI knows it all about our allies
trackerActor.party.addAll(actor.pokemonList.map { createAllied(it) })
actor.activePokemon.forEach {
val active = trackerActor.party.first { trackMon -> trackMon.id == it.battlePokemon!!.uuid }
val battlePokemon = it.battlePokemon ?: return@forEach
val active = trackerActor.party.first { trackMon -> trackMon.id == battlePokemon.uuid }
trackerActor.party.remove(active)
trackerActor.activePokemon.add(active)
}
@@ -176,7 +177,8 @@ class TrackerActor(val uuid: UUID) {
//only know basics of what we see right now
trackerActor.party.addAll(actor.pokemonList.map { createOpposing(it) })
actor.activePokemon.forEach {
val active = trackerActor.party.first { trackMon -> trackMon.id == it.battlePokemon!!.uuid }
val battlePokemon = it.battlePokemon ?: return@forEach
val active = trackerActor.party.first { trackMon -> trackMon.id == battlePokemon.uuid }
trackerActor.party.remove(active)
trackerActor.activePokemon.add(active)
}
@@ -9,7 +9,6 @@
package com.cobblemon.mod.common.block
//import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler.pos
import com.cobblemon.mod.common.CobblemonBlockEntities
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.berry.Berries
import com.cobblemon.mod.common.api.berry.Berry
@@ -40,7 +39,11 @@ import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.BaseEntityBlock
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.BonemealableBlock
import net.minecraft.world.level.block.RenderShape
import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.entity.BlockEntityTicker
import net.minecraft.world.level.block.entity.BlockEntityType
@@ -128,7 +131,10 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
val newAge = curAge + 1
if (newAge > FRUIT_AGE) return
val newState = state.setValue(AGE, newAge)
val treeEntity = world.getBlockEntity(pos) as BerryBlockEntity
val treeEntity = world.getBlockEntity(pos) as? BerryBlockEntity ?: run {
world.setBlock(pos, Blocks.AIR.defaultBlockState(), UPDATE_CLIENTS)
return
}
if (curAge == MATURE_AGE) {
treeEntity.generateGrowthPoints(world, newState, pos, null)
determineMutation(world, random, pos, newState)
@@ -60,10 +60,12 @@ class HabitatBlockEntity(pos: BlockPos, state: BlockState) :
var spawningStyle: HabitatSpawningStyle = ActivatedHabitatSpawning(this)
var numberOfPhases: Int = 1
var phaseOrder = HabitatPhaseOrder.SIMPLE
var currentPhase = 1
val numberOfPhases: Int
get() = pool.getPhaseCount()
var levelRange: IntRange = 1..Cobblemon.config.maxPokemonLevel
var modifiers: PokemonProperties = PokemonProperties()
var pool: HabitatPool = HabitatPool.default()
@@ -139,7 +141,6 @@ class HabitatBlockEntity(pos: BlockPos, state: BlockState) :
val activatedSettings = habitatSettingsDTO.activatedSettings
val naturalSettings = habitatSettingsDTO.naturalSettings
val isActivated = habitatSettingsDTO.isActivatedSpawning
this.numberOfPhases = habitatSettingsDTO.numberOfPhases
this.phaseOrder = habitatSettingsDTO.phaseOrder
this.levelRange = habitatSettingsDTO.levelRange
this.modifiers = PokemonProperties.parse(habitatSettingsDTO.modifiers)
@@ -169,7 +170,6 @@ class HabitatBlockEntity(pos: BlockPos, state: BlockState) :
override fun saveAdditional(tag: CompoundTag, registryLookup: HolderLookup.Provider) {
super.saveAdditional(tag, registryLookup)
tag.putString(DataKeys.HABITAT_MIMIC, mimicId.toString())
tag.putInt(DataKeys.HABITAT_PHASE_COUNT, numberOfPhases)
tag.putString(DataKeys.HABITAT_PHASE_ORDER, phaseOrder.toString())
// Only save the level range when it's a non-trivial one
if (levelRange.first != 1 || levelRange.last != Cobblemon.config.maxPokemonLevel) {
@@ -201,7 +201,6 @@ class HabitatBlockEntity(pos: BlockPos, state: BlockState) :
return // Client doesn't need to try loading the rest
}
numberOfPhases = tag.getInt(DataKeys.HABITAT_PHASE_COUNT)
phaseOrder = HabitatPhaseOrder.valueOf(tag.getString(DataKeys.HABITAT_PHASE_ORDER))
levelRange = tag.getString(DataKeys.HABITAT_LEVEL_RANGE).takeIf { it.isNotBlank() }?.let(IntRangeAdapter::deserialize) ?: 1..Cobblemon.config.maxPokemonLevel
modifiers = tag.getString(DataKeys.HABITAT_MODIFIERS).takeIf { it.isNotBlank() }?.let(PokemonProperties::parse) ?: PokemonProperties()
@@ -10,11 +10,13 @@ package com.cobblemon.mod.common.block.tmmachine
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.CobblemonMenuType
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
import com.cobblemon.mod.common.api.moves.Moves
import com.cobblemon.mod.common.api.tms.TechnicalMachine
import com.cobblemon.mod.common.api.tms.TechnicalMachines
import com.cobblemon.mod.common.block.entity.TMMachineBlockEntity
import com.cobblemon.mod.common.util.itemRegistry
import net.minecraft.server.level.ServerLevel
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
import net.minecraft.server.level.ServerPlayer
import net.minecraft.util.Mth
import net.minecraft.world.Container
import net.minecraft.world.SimpleContainer
@@ -35,38 +37,20 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
var inventory: Container? = null
var containerData: ContainerData? = null
var currentlySelectedTM: TechnicalMachine? = null
private var lastSelectedTM: TechnicalMachine? = null
var onSelectedTMUpdate: (TechnicalMachine?) -> Unit = {}
constructor(syncId: Int, playerInventory: Inventory) : this(CobblemonMenuType.TM_MACHINE, syncId) {
this.playerInventory = playerInventory
this.inventory = SimpleContainer(5)
this.containerData = SimpleContainerData(6)
this.tmMachineEntity = (inventory as? TMMachineBlockEntity.TMMachineBlockInventory)?.blockEntity
this.addDataSlots(containerData!!)
inventory?.startOpen(playerInventory.player)
val startX = 15
val startY = 144
val slotWidth = 18
val slotHeight = 18
for (row in 0..2) {
for (col in 0..8) {
this.addSlot(Slot(playerInventory, 9 + (row * 9) + col, startX + (slotWidth * col), startY + (slotHeight * row)))
}
}
for (col in 0..8) {
this.addSlot(Slot(playerInventory, col, startX + (slotWidth * col), startY + 58))
}
val container = inventory
container?.let {
this.addSlot(TMResultSlot(container, RESULT_SLOT, startX + 37, startY - 28)) // Output slot
this.addSlot(BlankTMSlot(container, BLANK_TM_SLOT, startX + 90, startY - 28)) // Blank TM
for (index in INGREDIENT_SLOTS) {
this.addSlot(Slot(container, index, startX + 114 + (18 * (index - INGREDIENT_SLOTS.first)), startY - 28))
}
}
this.addSlotListener(this)
initiateSlots()
}
constructor(syncId: Int, playerInventory: Inventory, inventory: Container, containerData: ContainerData) : this(CobblemonMenuType.TM_MACHINE, syncId) {
@@ -78,6 +62,20 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
this.addDataSlots(containerData)
inventory.startOpen(playerInventory.player)
initiateSlots()
tmMachineEntity?.let {
val move = Moves.getByName(it.activeMove)
move.let {
currentlySelectedTM = TechnicalMachines.moveToTM[it]
synchronizeSelectedTM()
}
}
this.addSlotListener(this)
}
private fun initiateSlots() {
val startX = 15
val startY = 144
val slotWidth = 18
@@ -92,7 +90,7 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
this.addSlot(Slot(playerInventory, col, startX + (slotWidth * col), startY + 58))
}
val container = inventory
val container = inventory!!
container.let {
this.addSlot(TMResultSlot(container, RESULT_SLOT, startX + 37, startY - 28)) // Output slot
this.addSlot(BlankTMSlot(container, BLANK_TM_SLOT, startX + 90, startY - 28)) // Blank TM
@@ -100,7 +98,6 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
this.addSlot(Slot(container, index, startX + 114 + (18 * (index - INGREDIENT_SLOTS.first)), startY - 28))
}
}
this.addSlotListener(this)
}
override fun quickMoveStack(player: Player, index: Int): ItemStack {
@@ -207,4 +204,25 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
override fun dataChanged(containerMenu: AbstractContainerMenu, dataSlotIndex: Int, value: Int) {
broadcastChanges()
}
fun synchronizeSelectedTM() {
val serverPlayer = playerInventory?.player as? ServerPlayer ?: return
serverPlayer.sendPacket(SynchronizeActiveTMPacket(currentlySelectedTM))
lastSelectedTM = currentlySelectedTM
}
override fun sendAllDataToRemote() {
super.sendAllDataToRemote()
synchronizeSelectedTM()
}
override fun broadcastChanges() {
super.broadcastChanges()
if (lastSelectedTM != currentlySelectedTM) synchronizeSelectedTM()
}
fun clientSetSelectedTM(tm: TechnicalMachine?) {
currentlySelectedTM = tm
onSelectedTMUpdate(tm)
}
}
@@ -49,7 +49,7 @@ object MountedCameraTypeHandler {
return
}
val currentCameraType = mc.options.cameraType
if (currentCameraType != unmountedCameraType) {
if (Cobblemon.config.rememberRidingCamera && currentCameraType != unmountedCameraType) {
mc.options.cameraType = unmountedCameraType
}
val data = ClientPersistedData.ridingPerspectives
@@ -27,10 +27,18 @@ import net.minecraft.client.renderer.RenderType
import net.minecraft.client.renderer.texture.OverlayTexture
import net.minecraft.resources.ResourceLocation
import net.minecraft.util.Mth
import net.minecraft.world.phys.Vec3
import org.joml.Quaternionf
import org.joml.Vector3f
import kotlin.math.atan
enum class ProfileTransformType {
PROFILE,
NONE,
POKEDEX,
SUMMARY,
}
fun drawProfilePokemon(
renderablePokemon: RenderablePokemon,
matrixStack: PoseStack,
@@ -39,7 +47,7 @@ fun drawProfilePokemon(
state: PosableState,
partialTicks: Float,
scale: Float = 20F,
applyProfileTransform: Boolean = true,
profileTransformType: ProfileTransformType = ProfileTransformType.PROFILE,
applyBaseScale: Boolean = false,
r: Float = 1F,
g: Float = 1F,
@@ -56,7 +64,7 @@ fun drawProfilePokemon(
state = state.also { it.currentAspects = renderablePokemon.aspects },
partialTicks = partialTicks,
scale = scale,
applyProfileTransform = applyProfileTransform,
profileTransformType = profileTransformType,
applyBaseScale = applyBaseScale,
r = r,
g = g,
@@ -75,7 +83,7 @@ fun drawProfilePokemon(
state: PosableState,
partialTicks: Float,
scale: Float = 20F,
applyProfileTransform: Boolean = true,
profileTransformType: ProfileTransformType = ProfileTransformType.PROFILE,
applyBaseScale: Boolean = false,
doQuirks: Boolean = false,
r: Float = 1F,
@@ -114,18 +122,38 @@ fun drawProfilePokemon(
state.setPoseToFirstSuitable(poseType)
state.updatePartialTicks(partialTicks)
if (applyProfileTransform) {
matrixStack.translate(
model.profileTranslation.x,
model.profileTranslation.y + 1.5 * model.profileScale,
model.profileTranslation.z - 4.0
)
matrixStack.scale(model.profileScale, model.profileScale, 1 / model.profileScale)} else {
if (profileTransformType == ProfileTransformType.NONE) {
matrixStack.translate(0F, 0F, -4.0F)
if (applyBaseScale) {
matrixStack.scale(baseScale, baseScale, 1 / baseScale)
}
} else {
var profileScale: Float
var profileTranslation: Vec3
when (profileTransformType) {
ProfileTransformType.POKEDEX -> {
profileScale = model.profilePokedexScale ?: model.profileScale
profileTranslation = model.profilePokedexTranslation ?: model.profileTranslation
}
ProfileTransformType.SUMMARY -> {
profileScale = model.profileSummaryScale ?: model.profileScale
profileTranslation = model.profileSummaryTranslation ?: model.profileTranslation
}
else -> {
profileScale = model.profileScale
profileTranslation = model.profileTranslation
}
}
matrixStack.translate(
profileTranslation.x,
profileTranslation.y + 1.5 * profileScale,
profileTranslation.z - 4.0
)
matrixStack.scale(profileScale, profileScale, 1 / profileScale)
}
matrixStack.mulPose(rotation)
model.applyAnimations(null, state, 0F, 0F, 0F, headYaw, headPitch)
@@ -0,0 +1,97 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.gui
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
import com.mojang.blaze3d.platform.InputConstants
import net.minecraft.client.Minecraft
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.phys.Vec3
fun handleProfileDebugKeys(keyCode: Int, poserResourceLocation: ResourceLocation, state: FloatingState) {
if (!Cobblemon.config.enableDebugKeys) {
return
}
val model = VaryingModelRepository.getPoser(poserResourceLocation, state)
val delta = when (keyCode) {
InputConstants.KEY_UP -> Vec3(0.0, -0.01, 0.0)
InputConstants.KEY_DOWN -> Vec3(0.0, 0.01, 0.0)
InputConstants.KEY_LEFT -> Vec3(-0.01, 0.0, 0.0)
InputConstants.KEY_RIGHT -> Vec3(0.01, 0.0, 0.0)
else -> null
}
if (delta != null) {
model.profileTranslation = model.profileTranslation.add(delta)
model.profileSummaryTranslation = model.profileSummaryTranslation?.add(delta)
model.profilePokedexTranslation = model.profilePokedexTranslation?.add(delta)
}
val scaleDelta = when (keyCode) {
InputConstants.KEY_EQUALS -> 0.01F
InputConstants.KEY_MINUS -> -0.01F
else -> null
}
if (scaleDelta != null) {
model.profileScale += scaleDelta
model.profileSummaryScale = model.profileSummaryScale?.plus(scaleDelta)
model.profilePokedexScale = model.profilePokedexScale?.plus(scaleDelta)
}
}
fun logProfileTranslations(poserResourceLocation: ResourceLocation, state: FloatingState) {
if (!Cobblemon.config.enableDebugKeys) {
return
}
val model = VaryingModelRepository.getPoser(poserResourceLocation, state)
val player = Minecraft.getInstance().player
fun Double.f2() = "%.2f".format(this)
fun Float.f2() = "%.2f".format(this)
fun sendTranslation(name: String, translation: Vec3) {
player?.sendSystemMessage(Component.literal("$name Translation: (${translation.x.f2()}, ${translation.y.f2()}, ${translation.z.f2()})"))
}
fun sendScale(name: String, scale: Float) {
player?.sendSystemMessage(Component.literal("$name Scale: ${scale.f2()}"))
}
fun logTranslation(name: String, translation: Vec3) {
Cobblemon.LOGGER.info("override var ${name.replaceFirstChar(Char::lowercase)}Translation = Vec3(${translation.x.f2()}, ${translation.y.f2()}, ${translation.z.f2()})")
}
fun logScale(name: String, scale: Float) {
Cobblemon.LOGGER.info("override var ${name.replaceFirstChar(Char::lowercase)}Scale = ${scale.f2()}F")
}
sendTranslation("Profile", model.profileTranslation)
sendScale("Profile", model.profileScale)
model.profileSummaryTranslation?.let { sendTranslation("Summary Profile", it) }
model.profileSummaryScale?.let { sendScale("Summary Profile", it) }
model.profilePokedexTranslation?.let { sendTranslation("Pokedex Profile", it) }
model.profilePokedexScale?.let { sendScale("Pokedex Profile", it) }
logTranslation("Profile", model.profileTranslation)
logScale("Profile", model.profileScale)
model.profileSummaryTranslation?.let { logTranslation("ProfileSummary", it) }
model.profileSummaryScale?.let { logScale("ProfileSummary", it) }
model.profilePokedexTranslation?.let { logTranslation("ProfilePokedex", it) }
model.profilePokedexScale?.let { logScale("ProfilePokedex", it) }
}
@@ -115,35 +115,19 @@ class HabitatEditGUI(
addOptionWidget(mimicInput)
y += spacing
labels.add(lang("ui.edit.habitat.phase_number") to (10 to y))
y += 12
val phasesInput = EditBox(font, 10, y, buttonWidth, 20, "Phases".text())
phasesInput.value = habitatSettingsDTO.numberOfPhases.toString()
phasesInput.setResponder { value ->
val phases = value.toIntOrNull()
val valid = phases != null && phases > 0
if (valid) {
habitatSettingsDTO.numberOfPhases = phases
}
phasesInput.setTextColor(if (valid) validTextColor else invalidTextColor)
setFieldValidity("phases", valid, "ui.edit.habitat.validation.phases")
// Phase setting only visible if there's more than one phase
val phaseCount = habitatSettingsDTO.pool.toHabitatPool()?.getPhaseCount() ?: 1
if (phaseCount > 1) {
phaseOrderButton = addOptionWidget(
Button.builder(getPhaseOrderText()) {
val orders = HabitatPhaseOrder.entries
val currentIndex = orders.indexOf(habitatSettingsDTO.phaseOrder)
habitatSettingsDTO.phaseOrder = orders[(currentIndex + 1) % orders.size]
refresh()
}.bounds(10, y, buttonWidth, 20).build()
)
y += spacing
}
val initialPhases = phasesInput.value.toIntOrNull()
val initialPhasesValid = initialPhases != null && initialPhases > 0
phasesInput.setTextColor(if (initialPhasesValid) validTextColor else invalidTextColor)
setFieldValidity("phases", initialPhasesValid, "ui.edit.habitat.validation.phases")
addOptionWidget(phasesInput)
y += spacing
phaseOrderButton = addOptionWidget(
Button.builder(getPhaseOrderText()) {
val orders = HabitatPhaseOrder.entries
val currentIndex = orders.indexOf(habitatSettingsDTO.phaseOrder)
habitatSettingsDTO.phaseOrder = orders[(currentIndex + 1) % orders.size]
refresh()
}.bounds(10, y, buttonWidth, 20).build()
)
y += spacing
labels.add(lang("ui.edit.habitat.level_range") to (10 to y))
y += 12
@@ -390,7 +374,10 @@ class HabitatEditGUI(
}
fun refresh() {
phaseOrderButton.message = getPhaseOrderText()
val phaseCount = habitatSettingsDTO.pool.toHabitatPool()?.getPhaseCount() ?: 1
if (phaseCount > 1 && ::phaseOrderButton.isInitialized) {
phaseOrderButton.message = getPhaseOrderText()
}
spawnModeButton.message = getSpawnModeText()
poolSelectorButton.message = getPoolText()
viewPoolButton.message = getViewPoolText()
@@ -439,6 +426,7 @@ class HabitatEditGUI(
}
habitatSettingsDTO.pool = newCustomPool
}
rebuildWidgets()
return
}
@@ -451,6 +439,7 @@ class HabitatEditGUI(
}
habitatSettingsDTO.pool = selectedPool
rebuildWidgets()
}
private fun validateLevelRangeInputs() {
@@ -45,7 +45,6 @@ class HabitatSpawnEditorGUI(
private val actionButtonBottomMargin = 10
private val validTextColor = 0xFFFFFF
private val invalidTextColor = 0xFF5555
private val moonPhaseRange = 0..7
private lateinit var positionTypeButton: Button
private lateinit var bucketButton: Button
private lateinit var timeOfDayButton: Button
@@ -185,7 +184,7 @@ class HabitatSpawnEditorGUI(
phasesInput.setTextColor(validTextColor)
setFieldValidity("phases_list", true, "ui.edit.habitat.validation.phases_list")
} else {
val parsed = parseMoonPhases(value)
val parsed = parsePhases(value)
val valid = parsed != null
if (valid) {
spawn.phases = parsed
@@ -194,7 +193,7 @@ class HabitatSpawnEditorGUI(
setFieldValidity("phases_list", valid, "ui.edit.habitat.validation.phases_list")
}
}
val initialPhasesValid = phasesInput.value.isBlank() || parseMoonPhases(phasesInput.value) != null
val initialPhasesValid = phasesInput.value.isBlank() || parsePhases(phasesInput.value) != null
phasesInput.setTextColor(if (initialPhasesValid) validTextColor else invalidTextColor)
setFieldValidity("phases_list", initialPhasesValid, "ui.edit.habitat.validation.phases_list")
addOptionWidget(phasesInput)
@@ -332,7 +331,7 @@ class HabitatSpawnEditorGUI(
return runCatching { PokemonSpecies.getByName(lowered) }.getOrNull()
}
private fun parseMoonPhases(raw: String): IntRanges? {
private fun parsePhases(raw: String): IntRanges? {
val ranges = mutableListOf<IntRange>()
val tokens = raw.split(",").map(String::trim)
if (tokens.isEmpty() || tokens.any { it.isEmpty() }) {
@@ -344,13 +343,12 @@ class HabitatSpawnEditorGUI(
val range = when (parts.size) {
1 -> {
val value = parts[0].toIntOrNull() ?: return null
if (value !in moonPhaseRange) return null
value..value
}
2 -> {
val start = parts[0].toIntOrNull() ?: return null
val end = parts[1].toIntOrNull() ?: return null
if (start !in moonPhaseRange || end !in moonPhaseRange || start > end) {
if (start > end) {
return null
}
start..end
@@ -32,6 +32,8 @@ import com.cobblemon.mod.common.client.ClientMoLangFunctions.setupClient
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
import com.cobblemon.mod.common.client.gui.handleProfileDebugKeys
import com.cobblemon.mod.common.client.gui.logProfileTranslations
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.BASE_HEIGHT
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.BASE_WIDTH
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_WIDTH
@@ -427,6 +429,11 @@ class PokedexGUI private constructor(
override fun onClose() {
if (blockPos != null) AdjustBlockEntityViewerCountPacket(blockPos, false).sendToServer()
playSound(CobblemonSounds.POKEDEX_CLOSE)
selectedEntry?.speciesId?.let { speciesId ->
logProfileTranslations(speciesId, pokemonInfoWidget.state)
}
super.onClose()
}
@@ -757,6 +764,12 @@ class PokedexGUI private constructor(
return true
}
if (!searchWidget.isFocused) {
selectedEntry?.speciesId?.let { speciesId ->
handleProfileDebugKeys(keyCode, speciesId, pokemonInfoWidget.state)
}
}
return super.keyPressed(keyCode, scanCode, modifiers)
}
@@ -22,6 +22,7 @@ import com.cobblemon.mod.common.api.types.ElementalType
import com.cobblemon.mod.common.client.ClientMoLangFunctions.setupClient
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.ProfileTransformType
import com.cobblemon.mod.common.client.gui.TypeIcon
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_HEIGHT
@@ -386,7 +387,8 @@ class PokemonInfoWidget(val pX: Int, val pY: Int, val updateForm: (PokedexForm)
partialTicks = delta,
rotation = Quaternionf().fromEulerXYZDegrees(rotationVector),
state = state,
blockLight = 15
blockLight = 15,
profileTransformType = ProfileTransformType.POKEDEX,
)
matrices.popPose()
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.gui.pokedex.widgets
import com.cobblemon.mod.common.api.gui.blitk
import com.cobblemon.mod.common.api.text.bold
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.ProfileTransformType
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_WIDTH
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.POKEMON_DESCRIPTION_HEIGHT
@@ -90,7 +91,7 @@ class SizeWidget(val pX: Int, val pY: Int) : SoundlessWidget(
rotation = Quaternionf().fromEulerXYZDegrees(Vector3f(0F, 0F, 0F)),
state = FloatingState(),
scale = modelScale,
applyProfileTransform = false,
profileTransformType = ProfileTransformType.NONE,
applyBaseScale = true,
r = 0F,
g = 0F,
@@ -8,7 +8,6 @@
package com.cobblemon.mod.common.client.gui.summary
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.CobblemonNetwork.sendToServer
import com.cobblemon.mod.common.CobblemonSounds
@@ -21,14 +20,8 @@ import com.cobblemon.mod.common.api.text.bold
import com.cobblemon.mod.common.api.text.text
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
import com.cobblemon.mod.common.client.gui.ExitButton
import com.cobblemon.mod.common.client.gui.TypeIcon
import com.cobblemon.mod.common.client.gui.summary.widgets.EvolutionSelectScreen
import com.cobblemon.mod.common.client.gui.summary.widgets.MarkingsWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.ModelWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.NicknameEntryWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.PartyWidget
import com.cobblemon.mod.common.client.gui.*
import com.cobblemon.mod.common.client.gui.summary.widgets.*
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.SummaryTab
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.info.InfoWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.marks.MarksWidget
@@ -37,7 +30,6 @@ import com.cobblemon.mod.common.client.gui.summary.widgets.screens.moves.MovesWi
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.stats.StatWidget
import com.cobblemon.mod.common.client.keybind.keybinds.SummaryBinding
import com.cobblemon.mod.common.client.render.drawScaledText
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetItemHiddenPacket
import com.cobblemon.mod.common.net.messages.server.storage.party.MovePartyPokemonPacket
import com.cobblemon.mod.common.net.messages.server.storage.party.SwapPartyPokemonPacket
@@ -715,27 +707,9 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
) {
this.focused = null
}
if (Cobblemon.config.enableDebugKeys) {
val model = VaryingModelRepository.getPoser(selectedPokemon.species.resourceIdentifier, modelWidget.state)
if (keyCode == InputConstants.KEY_UP) {
model.profileTranslation = model.profileTranslation.add(0.0, -0.01, 0.0)
}
if (keyCode == InputConstants.KEY_DOWN) {
model.profileTranslation = model.profileTranslation.add(0.0, 0.01, 0.0)
}
if (keyCode == InputConstants.KEY_LEFT) {
model.profileTranslation = model.profileTranslation.add(-0.01, 0.0, 0.0)
}
if (keyCode == InputConstants.KEY_RIGHT) {
model.profileTranslation = model.profileTranslation.add(0.01, 0.0, 0.0)
}
if (keyCode == InputConstants.KEY_EQUALS) {
model.profileScale += 0.01F
}
if (keyCode == InputConstants.KEY_MINUS) {
model.profileScale -= 0.01F
}
}
handleProfileDebugKeys(keyCode, selectedPokemon.species.resourceIdentifier, modelWidget.state)
return super.keyPressed(keyCode, scanCode, modifiers)
}
@@ -744,13 +718,8 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
}
override fun onClose() {
if (Cobblemon.config.enableDebugKeys) {
val model = VaryingModelRepository.getPoser(selectedPokemon.species.resourceIdentifier, modelWidget.state)
Minecraft.getInstance().player?.sendSystemMessage(Component.literal("Profile Translation: ${model.profileTranslation}"))
Minecraft.getInstance().player?.sendSystemMessage(Component.literal("Profile Scale: ${model.profileScale}"))
Cobblemon.LOGGER.info("override var profileTranslation = Vec3d(${model.profileTranslation.x}, ${model.profileTranslation.y}, ${model.profileTranslation.z})")
Cobblemon.LOGGER.info("override var profileScale = ${model.profileScale}F")
}
logProfileTranslations(selectedPokemon.species.resourceIdentifier, modelWidget.state)
super.onClose()
}
}
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.gui.summary.widgets
import com.bedrockk.molang.runtime.value.DoubleValue
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
import com.cobblemon.mod.common.client.gui.ProfileTransformType
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
import com.cobblemon.mod.common.client.gui.calculateHeadYawAndPitch
import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState
@@ -116,7 +117,8 @@ class ModelWidget(
partialTicks = partialTicks,
headYaw = currentYawAndPitch.first,
headPitch = currentYawAndPitch.second,
blockLight = blockLight
blockLight = blockLight,
profileTransformType = ProfileTransformType.SUMMARY,
)
heldItemRenderer.renderOnModel(
@@ -120,7 +120,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
fun getLogoResource(langCode: String?): ResourceLocation =
logoResourceMap.entries.find { it.value.contains(langCode?.substringBefore("_")) }?.key ?: logo
}
var selectedTM: TechnicalMachine? = null
var heldStackMove: MoveTemplate? = null
var tmList: SettableObservable<MutableList<TechnicalMachine>> = SettableObservable(mutableListOf())
var output: ItemStack? = null
@@ -159,6 +159,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
var oldIngredientItems: Array<Item> = arrayOf(Items.AIR, Items.AIR, Items.AIR)
var oldResultTmSlotItem: Item = Items.AIR
var moveInfoTM: TechnicalMachine? = null
override fun init() {
imageWidth = WIDTH
imageHeight = HEIGHT
@@ -171,6 +173,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
logoPosY = topPos + 1
scanPosY = topPos + 1
menu.onSelectedTMUpdate = { updateSelectedTM(it) }
partySlotList.clear()
CobblemonClient.storage.party.forEachIndexed { index, pokemon ->
partySlotList.add(TMPartySlotWidget(
@@ -226,7 +230,14 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
pX = leftPos + 4,
pY = topPos + 29,
tmList,
setTM = { tm, clicked -> setSelectedTM(tm, clicked) }
setTM = { tm, clicked ->
if (clicked) {
if (tm != menu.currentlySelectedTM) SetActiveTMPacket(tm).sendToServer()
setScreenFromMode(TM_BURN_MODE)
} else {
updateMoveInformation(tm)
}
}
)
if (!children().contains(movesScrollingList)) addRenderableWidget(movesScrollingList)
@@ -252,24 +263,21 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
selectedMoveButton = MoveSlotButton(
leftPos + 6,
topPos + 6,
move = selectedTM?.moveName,
pp = selectedTM?.moveName?.pp ?: 0,
move = menu.currentlySelectedTM?.moveName,
pp = menu.currentlySelectedTM?.moveName?.pp ?: 0,
ppAsFraction = false
) {
if ((it as MoveSlotButton).enabled) {
if (::movesScrollingList.isInitialized && movesScrollingList.children().isEmpty()) setMoveList()
playSound(CobblemonSounds.GUI_CLICK)
setScreenFromMode(MOVE_SELECT_MODE)
// Clear active TM
CobblemonNetwork.sendToServer(SetActiveTMPacket(null))
}
}
if (!children().contains(selectedMoveButton)) addRenderableWidget(selectedMoveButton)
startButton = StartButton(leftPos + 5F, topPos + 35F) {
if (!(it as StartButton).disabled) {
selectedTM?.let {
menu.currentlySelectedTM?.let {
val burnActive = menu.containerData?.get(TMMachineBlockEntity.BURN_ACTIVE_INDEX) ?: 0
CobblemonNetwork.sendToServer(SetTMMachineContainerDataPacket(
TMMachineBlockEntity.BURN_ACTIVE_INDEX,
@@ -284,17 +292,14 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
))
}*/
CobblemonNetwork.sendToServer(SetActiveTMPacket(it))
//CobblemonNetwork.sendToServer(SetActiveTMPacket(it))
if (burnActive != 1) playSound(CobblemonSounds.TM_MACHINE_START)
inventory.setChanged()
menu.broadcastChanges()
}
}
}
if (!children().contains(startButton)) addRenderableWidget(startButton)
setScreenFromMode(mode)
initScreen = false
updateSlotItemMemory()
}
@@ -306,7 +311,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
if (scanPosY + 1 >= (topPos + SCREEN_SAVER_HEIGHT) * 2) scanPosY = 0
if (mode == TM_BURN_MODE) {
selectedTM?.let { tm ->
menu.currentlySelectedTM?.let { tm ->
val resultStack = menu.inventory!!.getItem(TMMachineMenu.RESULT_SLOT)
val craftedTmStack = ItemStack(CobblemonItems.TECHNICAL_MACHINE)
.also { TMMoveComponent.setTMMove(it, tm.moveName) }
@@ -339,7 +344,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
if (::selectedMoveButton.isInitialized) {
selectedMoveButton.enabled = !isBurnActive() && (heldStackMove == null || heldStackMove == selectedTM?.moveName)
selectedMoveButton.enabled = (heldStackMove == null || heldStackMove == menu.currentlySelectedTM?.moveName)
}
if (isBurnActive()) {
@@ -350,9 +355,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
}
}
} else {
// Check if screen should be switched upon opening UI
if (!initScreen) loadBurnScreenData()
}
if (heldMoveItemChanged) {
@@ -400,32 +402,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
return wasScreenSaverActive
}
private fun loadBurnScreenData() {
var tm: TechnicalMachine? = null
val blockPos = menu.containerData?.let {
val x = it.get(TMMachineBlockEntity.POSITION_X_INDEX)
val y = it.get(TMMachineBlockEntity.POSITION_Y_INDEX)
val z = it.get(TMMachineBlockEntity.POSITION_Z_INDEX)
BlockPos(x, y, z)
}
inventory.player.level().getBlockEntity(blockPos)?.let { blockEntity ->
if (blockEntity is TMMachineBlockEntity) {
Moves.getByName(blockEntity.activeMove)?.let {
tm = TechnicalMachines.moveToTM[it]
}
}
}
// If burn currently in progress or if active TM set, set to burn screen
if (isBurnActive() || tm != null) {
setSelectedTM(tm, true)
}
initScreen = true
}
private fun isBurnActive(): Boolean = (menu.containerData?.get(TMMachineBlockEntity.BURN_ACTIVE_INDEX) ?: 0) == 1
private fun setScreenFromMode(screen: Int) {
@@ -467,7 +443,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
private fun toggleTypeSelect(isVisible: Boolean) {
if (isVisible) {
setSelectedTM(null, false)
if (::moveSearchWidget.isInitialized) moveSearchWidget.value = ""
if (selectedPokemon != null) selectedPokemon = null
sortType = null
@@ -505,7 +480,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
private fun toggleTMBurn(isVisible: Boolean) {
if (!isVisible) setSelectedTM(null, false)
if (::selectedMoveButton.isInitialized) selectedMoveButton.visible = isVisible
if (::startButton.isInitialized) startButton.visible = isVisible
}
@@ -516,35 +490,40 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
return if (learnableMoves.contains(move)) TMPartySlotWidget.CAN_LEARN else TMPartySlotWidget.CANNOT_LEARN
}
fun setSelectedTM(tm: TechnicalMachine?, clicked: Boolean) {
if (selectedTM != tm) {
selectedTM = tm
updatePartySlotStatus(tm?.moveName)
fun updateSelectedTM(tm: TechnicalMachine?) {
if (!initScreen) {
initScreen = true
setScreenFromMode(TM_BURN_MODE)
tm?.let {
sortType = ElementalTypes.get(tm.type)
setMoveList()
}
}
if (::movesScrollingList.isInitialized) {
movesScrollingList.setSlotHighlighted(if (clicked) null else selectedTM?.id)
if (mode == TM_BURN_MODE) updateMoveInformation(tm)
tm?.let {
if (::selectedMoveButton.isInitialized) {
selectedMoveButton.apply {
move = it.moveName
pp = it.moveName.pp
}
}
}
}
fun updateMoveInformation(tm: TechnicalMachine?) {
moveInfoTM = tm
if (::moveDescriptionWidget.isInitialized) {
val selectedDescription = selectedTM?.moveName?.description?.string
val selectedDescription = tm?.moveName?.description?.string
moveDescriptionWidget.setText(
if (selectedDescription != null) listOf(selectedDescription) else emptyList()
)
}
if (clicked) {
CobblemonNetwork.sendToServer(SetActiveTMPacket(tm))
selectedTM?.let {
if (::selectedMoveButton.isInitialized) {
selectedMoveButton.apply {
move = it.moveName
pp = it.moveName.pp
}
setScreenFromMode(TM_BURN_MODE)
}
}
if (::movesScrollingList.isInitialized) {
movesScrollingList.setSlotHighlighted(tm?.id)
}
}
@@ -557,7 +536,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
fun renderDiscTypeOverlay(poseStack: PoseStack, isDiscRotating: Boolean, alpha: Float = 1F) {
selectedTM?.let {
menu.currentlySelectedTM?.let {
val primaryRgb = it.moveName.elementalType.primaryColor.toRGB()
val secondaryRgb = it.moveName.elementalType.secondaryColor.toRGB()
blitk(
@@ -706,7 +685,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
fun renderMoveInfo(context: GuiGraphics, mouseX: Int, mouseY: Int) {
val moveTemplate = selectedTM?.moveName
val moveTemplate = moveInfoTM?.moveName
blitk(
matrixStack = context.pose(),
@@ -1057,7 +1036,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
movesScrollingList.setDisabled(true, TechnicalMachines.moveToTM[heldStackMove])
if (mode == MOVE_SELECT_MODE) {
val heldStackTm = TechnicalMachines.moveToTM[heldStackMove]
setSelectedTM(if (tmList.get().contains(heldStackTm)) heldStackTm else null, false)
updateMoveInformation(if (tmList.get().contains(heldStackTm)) heldStackTm else null)
// Scroll to move if moves list contains held TM move
if (tmList.get().contains(heldStackTm)) {
@@ -1077,8 +1056,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
heldStackMove = null
// Reset selected move on move select screen
if (mode == MOVE_SELECT_MODE) setSelectedTM(null, false)
updatePartySlotStatus(selectedTM?.moveName)
if (mode == MOVE_SELECT_MODE) updateMoveInformation(null)
updatePartySlotStatus(menu.currentlySelectedTM?.moveName)
if (::movesScrollingList.isInitialized) {
movesScrollingList.setDisabled(false)
@@ -1155,7 +1134,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
if (isInventoryKeyPressed(minecraft, keyCode, scanCode)) {
if (searchFocused) { return true }
else {
Minecraft.getInstance().setScreen(null)
onClose()
return true
}
}
@@ -1166,7 +1145,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
this.focused = null
return true
} else {
Minecraft.getInstance().setScreen(null)
onClose()
return true
}
}
@@ -19,7 +19,6 @@ import net.minecraft.world.level.block.Block
object SetActiveTMPacketHandler : ServerNetworkPacketHandler<SetActiveTMPacket> {
override fun handle(packet: SetActiveTMPacket, server: MinecraftServer, player: ServerPlayer) {
val menu = player.containerMenu as? TMMachineMenu ?: return
val inventory = menu.inventory ?: return
val tmData = Cobblemon.playerDataManager.getTMData(player)
if (packet.tm != null && (!packet.tm.isPassivelyObtained() && packet.tm.id !in tmData.learnedTMs)) {
@@ -30,9 +29,17 @@ object SetActiveTMPacketHandler : ServerNetworkPacketHandler<SetActiveTMPacket>
blockEntity.activeMove = packet.tm?.moveName?.name ?: ""
blockEntity.setChanged()
player.level().sendBlockUpdated(blockEntity.blockPos, blockEntity.blockState, blockEntity.blockState, Block.UPDATE_CLIENTS)
}
inventory.setChanged()
menu.broadcastChanges()
blockEntity.burnActive = false
blockEntity.burnProgress = 0
player.level().players().forEach { thePlayer -> //Update all players with matching menu/blockentity
val tmmMenu = thePlayer.containerMenu as? TMMachineMenu ?: return@forEach
if (tmmMenu.tmMachineEntity == blockEntity) {
tmmMenu.currentlySelectedTM = packet.tm
tmmMenu.broadcastChanges()
}
}
}
}
}
@@ -0,0 +1,21 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.net.gui
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
import com.cobblemon.mod.common.block.tmmachine.TMMachineMenu
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
import net.minecraft.client.Minecraft
object SynchronizeActiveTMHandler: ClientNetworkPacketHandler<SynchronizeActiveTMPacket> {
override fun handle(packet: SynchronizeActiveTMPacket, client: Minecraft) {
val tmmMenu = client.player?.containerMenu as? TMMachineMenu ?: return
tmmMenu.clientSetSelectedTM(packet.tm)
}
}
@@ -134,6 +134,11 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
*/
open var profileTranslation = Vec3(0.0, 0.0, 0.0)
open var profilePokedexScale: Float? = null
open var profilePokedexTranslation: Vec3? = null
open var profileSummaryScale: Float? = null
open var profileSummaryTranslation: Vec3? = null
var red = 1F
var green = 1F
var blue = 1F
@@ -36,7 +36,7 @@ import net.minecraft.world.level.block.Block
class StatusCureItem(val itemName: String, vararg val status: Status, block: Block) : ItemNameBlockItem(block, Properties()), PokemonSelectingItem {
override val bagItem = object : BagItem {
override val itemName = this@StatusCureItem.itemName
override val returnItem = Items.AIR
override val returnItem = Items.GLASS_BOTTLE
override fun canUse(stack: ItemStack, battle: PokemonBattle, target: BattlePokemon) = canUseOnPokemon(stack, target.effectedPokemon)
override fun getShowdownInput(actor: BattleActor, battlePokemon: BattlePokemon, data: String?) = "cure_status${status.takeIf { it.isNotEmpty() }?.let { " ${it.joinToString(separator = " ") { it.showdownName } }" } ?: "" }"
}
@@ -64,6 +64,7 @@ class SpawnPokemonPacket(
var rideStamina: Float,
var isAlpha: Boolean,
var silent: Boolean,
var riders: List<Int>,
vanillaSpawnPacket: ClientboundAddEntityPacket,
) : SpawnExtraDataEntityPacket<SpawnPokemonPacket, PokemonEntity>(vanillaSpawnPacket) {
@@ -98,6 +99,7 @@ class SpawnPokemonPacket(
entity.entityData.get(PokemonEntity.RIDE_STAMINA),
entity.entityData.get(PokemonEntity.IS_ALPHA),
entity.isSilent,
entity.occupiedSeats.map { entry -> entry.value.id }.toList(),
vanillaSpawnPacket
)
@@ -134,6 +136,7 @@ class SpawnPokemonPacket(
buffer.writeFloat(rideStamina)
buffer.writeBoolean(isAlpha)
buffer.writeBoolean(silent)
buffer.writeCollection(this.riders) { pb, value -> pb.writeInt(value) }
}
override fun applyData(entity: PokemonEntity, level: ClientLevel) {
@@ -184,6 +187,10 @@ class SpawnPokemonPacket(
entity.tickSpawned = this.tickSpawned
entity.delegate.updateAge(this.tickSpawned)
if (this.riders.isNotEmpty()) {
this.riders.forEach { level.getEntity(it)?.startRiding(entity) }
}
}
override fun checkType(entity: Entity): Boolean = entity is PokemonEntity
@@ -222,6 +229,7 @@ class SpawnPokemonPacket(
val rideStamina = buffer.readFloat()
val isAlpha = buffer.readBoolean()
val silent = buffer.readBoolean()
val riders = buffer.readList { it.readInt() }.toList()
val vanillaPacket = decodeVanillaPacket(buffer)
return SpawnPokemonPacket(
@@ -253,6 +261,7 @@ class SpawnPokemonPacket(
rideStamina,
isAlpha,
silent,
riders,
vanillaPacket
)
}
@@ -0,0 +1,33 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.net.messages.client.ui
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.api.tms.TechnicalMachine
import com.cobblemon.mod.common.api.tms.TechnicalMachines
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class SynchronizeActiveTMPacket(val tm: TechnicalMachine?): NetworkPacket<SynchronizeActiveTMPacket> {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeNullable(tm?.id) { pb, value -> pb.writeResourceLocation(value) }
}
companion object {
val ID = cobblemonResource("synchronize_active_tm")
fun decode(buffer: RegistryFriendlyByteBuf): SynchronizeActiveTMPacket {
val resourceLocation = buffer.readNullable { it.readResourceLocation() }
if (resourceLocation == null) return SynchronizeActiveTMPacket(null)
val tm = TechnicalMachines.tmMap[resourceLocation]
return SynchronizeActiveTMPacket(tm)
}
}
}
@@ -0,0 +1,34 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.pokemon.properties
import com.cobblemon.mod.common.api.properties.CustomPokemonPropertyType
object HeldItemVisibleProperty : CustomPokemonPropertyType<BooleanProperty> {
override val keys = setOf("held_item_visible")
override val needsKey = true
override fun fromString(value: String?) =
when {
value == null || value.lowercase() in listOf("true", "yes") -> heldItemVisible(true)
value.lowercase() in listOf("false", "no") -> heldItemVisible(false)
else -> null
}
fun heldItemVisible(value: Boolean) = BooleanProperty(
key = keys.first(),
value = value,
pokemonApplicator = { pokemon, _ -> pokemon.heldItemVisible = value },
entityApplicator = { pokemonEntity, _ -> pokemonEntity.pokemon.heldItemVisible = value },
pokemonMatcher = { pokemon, _ -> pokemon.heldItemVisible == value },
entityMatcher = { pokemonEntity, _ -> pokemonEntity.pokemon.heldItemVisible == value }
)
override fun examples() = setOf("yes", "no")
}
@@ -274,11 +274,9 @@ object DataKeys {
// Habitat Blocks
const val HABITAT_SPAWNING_STYLE = "SpawningStyle"
const val HABITAT_MIMIC = "MimicId"
const val HABITAT_PHASE_COUNT = "PhaseCount"
const val HABITAT_PHASE_ORDER = "PhaseOrder"
const val HABITAT_LEVEL_RANGE = "LevelRange"
const val HABITAT_MODIFIERS = "Modifiers"
const val HABITAT_POOL = "Pool"
// --- Pools
const val HABITAT_POOL_ID = "PoolId"
@@ -281,7 +281,7 @@
},
"animation.luvdisc.ground_faint": {
"loop": true,
"animation_length": 2.5,
"animation_length": 3,
"bones": {
"body": {
"rotation": {
@@ -39,11 +39,11 @@
]
},
{
"name": "locator_seat1",
"name": "locator_seat_1",
"parent": "thorax",
"pivot": [0, 11, 0],
"locators": {
"seat1": [0, 11, 1]
"seat_1": [0, 11, 1]
}
},
{
@@ -79,7 +79,7 @@
"parent": "torso",
"pivot": [0, 21, 3.75],
"locators": {
"seat_2": [0, 21, 3.75]
"seat_1": [0, 21, 3.75]
}
},
{
@@ -78,7 +78,7 @@
"parent": "torso",
"pivot": [0, 21, 3.75],
"locators": {
"seat_2": [0, 21, 3.75]
"seat_1": [0, 21, 3.75]
}
},
{
@@ -377,11 +377,11 @@
]
},
{
"name": "locator_seat1",
"name": "locator_seat_1",
"parent": "saddle",
"pivot": [0, 23.525, 0],
"locators": {
"seat1": [0, 23.525, 0]
"seat_1": [0, 23.525, 0]
}
},
{
@@ -30,6 +30,14 @@
"parent": "body_rotation",
"pivot": [0, 8.5, 0]
},
{
"name": "locator_seat_1",
"parent": "waist_rotation",
"pivot": [0, 36, 0],
"locators": {
"seat_1": [0, 35.75, 8.5]
}
},
{
"name": "waist_scale",
"parent": "waist_rotation",
@@ -188,12 +188,10 @@
"parent": "eyes",
"pivot": [-1.51, 13.3, -1],
"cubes": [
{"origin": [-1.51, 12.8, -2], "size": [0, 1, 2], "uv": [60, 14]},
{"origin": [-1.51, 12.8, -0.5], "size": [0, 1, 2], "uv": [56, 14]},
{"origin": [-1.51, 11.3, -2], "size": [0, 1, 2], "uv": [60, 16]},
{"origin": [-1.51, 11.3, -0.5], "size": [0, 1, 2], "uv": [56, 16]},
{"origin": [-1.51, 11.8, -2], "size": [0, 1, 2], "uv": [60, 15]},
{"origin": [-1.51, 11.8, -0.5], "size": [0, 1, 2], "uv": [56, 15]}
{"origin": [-1.52, 12.8, -2], "size": [0, 1, 1], "uv": [62, 15]},
{"origin": [-1.53, 12.8, -1.5], "size": [0, 1, 3], "uv": [56, 13]},
{"origin": [-1.51, 11.3, -2], "size": [0, 2, 3], "uv": [56, 14]},
{"origin": [-1.52, 11.3, 0.5], "size": [0, 2, 1], "uv": [62, 16]}
]
},
{
@@ -201,8 +199,8 @@
"parent": "eye_right",
"pivot": [-1.51, 13.8, -0.25],
"cubes": [
{"origin": [-1.51, 13.8, -0.5], "size": [0, 1, 2], "uv": [56, 13]},
{"origin": [-1.51, 13.8, -2], "size": [0, 1, 2], "uv": [60, 13]}
{"origin": [-1.53, 13.8, -1.5], "size": [0, 1, 3], "uv": [56, 12]},
{"origin": [-1.52, 13.8, -2], "size": [0, 1, 1], "uv": [62, 14]}
]
},
{
@@ -223,7 +221,7 @@
"parent": "pupil_right",
"pivot": [-1.52, 13, -0.25],
"cubes": [
{"origin": [-1.52, 12.5, -0.75], "size": [0, 1, 1], "uv": [1, 0]}
{"origin": [-1.54, 12.5, -0.75], "size": [0, 1, 1], "uv": [1, 0]}
]
},
{
@@ -240,7 +238,7 @@
"parent": "pupil_right",
"pivot": [-1.42, 13, -1.25],
"cubes": [
{"origin": [-1.42, 12.5, -1.75], "size": [0, 1, 1], "uv": [1, 1]}
{"origin": [-1.44, 12.5, -1.75], "size": [0, 1, 1], "uv": [1, 1]}
]
},
{
@@ -248,7 +246,7 @@
"parent": "pupil_right",
"pivot": [-1.42, 13, 0.75],
"cubes": [
{"origin": [-1.42, 12.5, 0.25], "size": [0, 1, 1], "uv": [1, 2]}
{"origin": [-1.44, 12.5, 0.25], "size": [0, 1, 1], "uv": [1, 2]}
]
},
{
@@ -272,12 +270,10 @@
"parent": "eyes",
"pivot": [1.51, 13.3, -1],
"cubes": [
{"origin": [1.51, 12.8, -2], "size": [0, 1, 2], "uv": [52, 14], "mirror": true},
{"origin": [1.51, 12.8, -0.5], "size": [0, 1, 2], "uv": [48, 14], "mirror": true},
{"origin": [1.51, 11.3, -2], "size": [0, 1, 2], "uv": [52, 16], "mirror": true},
{"origin": [1.51, 11.3, -0.5], "size": [0, 1, 2], "uv": [48, 16], "mirror": true},
{"origin": [1.51, 11.8, -2], "size": [0, 1, 2], "uv": [52, 15], "mirror": true},
{"origin": [1.51, 11.8, -0.5], "size": [0, 1, 2], "uv": [48, 15], "mirror": true}
{"origin": [1.52, 12.8, -2], "size": [0, 1, 1], "uv": [54, 15], "mirror": true},
{"origin": [1.53, 12.8, -1.5], "size": [0, 1, 3], "uv": [48, 13], "mirror": true},
{"origin": [1.51, 11.3, -2], "size": [0, 2, 3], "uv": [48, 14], "mirror": true},
{"origin": [1.52, 11.3, 0.5], "size": [0, 2, 1], "uv": [54, 16], "mirror": true}
]
},
{
@@ -285,8 +281,8 @@
"parent": "eye_left",
"pivot": [1.51, 13.8, -0.25],
"cubes": [
{"origin": [1.51, 13.8, -0.5], "size": [0, 1, 2], "uv": [48, 13], "mirror": true},
{"origin": [1.51, 13.8, -2], "size": [0, 1, 2], "uv": [52, 13], "mirror": true}
{"origin": [1.53, 13.8, -1.5], "size": [0, 1, 3], "uv": [48, 12], "mirror": true},
{"origin": [1.52, 13.8, -2], "size": [0, 1, 1], "uv": [54, 14], "mirror": true}
]
},
{
@@ -307,7 +303,7 @@
"parent": "pupil_left",
"pivot": [1.52, 13, -0.25],
"cubes": [
{"origin": [1.52, 12.5, -0.75], "size": [0, 1, 1], "uv": [3, 0], "mirror": true}
{"origin": [1.54, 12.5, -0.75], "size": [0, 1, 1], "uv": [3, 0], "mirror": true}
]
},
{
@@ -324,7 +320,7 @@
"parent": "pupil_left",
"pivot": [1.42, 13, -1.25],
"cubes": [
{"origin": [1.42, 12.5, -1.75], "size": [0, 1, 1], "uv": [3, 1], "mirror": true}
{"origin": [1.44, 12.5, -1.75], "size": [0, 1, 1], "uv": [3, 1], "mirror": true}
]
},
{
@@ -332,7 +328,7 @@
"parent": "pupil_left",
"pivot": [1.42, 13, 0.75],
"cubes": [
{"origin": [1.42, 12.5, 0.25], "size": [0, 1, 1], "uv": [3, 2], "mirror": true}
{"origin": [1.44, 12.5, 0.25], "size": [0, 1, 1], "uv": [3, 2], "mirror": true}
]
},
{
@@ -188,12 +188,10 @@
"parent": "eyes",
"pivot": [-1.51, 13.3, -1],
"cubes": [
{"origin": [-1.51, 12.8, -2], "size": [0, 1, 2], "uv": [60, 12]},
{"origin": [-1.51, 12.8, -0.5], "size": [0, 1, 2], "uv": [56, 12]},
{"origin": [-1.51, 11.3, -2], "size": [0, 1, 2], "uv": [60, 14]},
{"origin": [-1.51, 11.3, -0.5], "size": [0, 1, 2], "uv": [56, 14]},
{"origin": [-1.51, 11.8, -2], "size": [0, 1, 2], "uv": [60, 13]},
{"origin": [-1.51, 11.8, -0.5], "size": [0, 1, 2], "uv": [56, 13]}
{"origin": [-1.52, 12.8, -2], "size": [0, 1, 1], "uv": [62, 13]},
{"origin": [-1.53, 12.8, -1.5], "size": [0, 1, 3], "uv": [56, 11]},
{"origin": [-1.51, 11.3, -2], "size": [0, 2, 3], "uv": [56, 12]},
{"origin": [-1.52, 11.3, 0.5], "size": [0, 2, 1], "uv": [62, 14]}
]
},
{
@@ -201,8 +199,8 @@
"parent": "eye_right",
"pivot": [-1.51, 13.8, -0.25],
"cubes": [
{"origin": [-1.51, 13.8, -0.5], "size": [0, 1, 2], "uv": [56, 11]},
{"origin": [-1.51, 13.8, -2], "size": [0, 1, 2], "uv": [60, 11]}
{"origin": [-1.53, 13.8, -1.5], "size": [0, 1, 3], "uv": [56, 10]},
{"origin": [-1.52, 13.8, -2], "size": [0, 1, 1], "uv": [62, 12]}
]
},
{
@@ -211,7 +209,7 @@
"pivot": [-1.31, 11.6, 1.3],
"cubes": [
{"origin": [-1.81, 10.6, 0.3], "size": [1, 2, 2], "inflate": -0.3, "uv": [58, 17]},
{"origin": [-1.61, 10.4, 1.5], "size": [1, 1, 1], "inflate": -0.1, "uv": [48, 19]}
{"origin": [-1.62, 10.4, 1.5], "size": [1, 1, 1], "inflate": -0.1, "uv": [48, 19]}
]
},
{
@@ -224,7 +222,7 @@
"parent": "pupil_right",
"pivot": [-1.52, 13, -0.25],
"cubes": [
{"origin": [-1.52, 12.5, -0.75], "size": [0, 1, 1], "uv": [1, 0]}
{"origin": [-1.54, 12.5, -0.75], "size": [0, 1, 1], "uv": [1, 0]}
]
},
{
@@ -257,12 +255,10 @@
"parent": "eyes",
"pivot": [1.51, 13.3, -1],
"cubes": [
{"origin": [1.51, 12.8, -2], "size": [0, 1, 2], "uv": [52, 12], "mirror": true},
{"origin": [1.51, 12.8, -0.5], "size": [0, 1, 2], "uv": [48, 12], "mirror": true},
{"origin": [1.51, 11.3, -2], "size": [0, 1, 2], "uv": [52, 14], "mirror": true},
{"origin": [1.51, 11.3, -0.5], "size": [0, 1, 2], "uv": [48, 14], "mirror": true},
{"origin": [1.51, 11.8, -2], "size": [0, 1, 2], "uv": [52, 13], "mirror": true},
{"origin": [1.51, 11.8, -0.5], "size": [0, 1, 2], "uv": [48, 13], "mirror": true}
{"origin": [1.52, 12.8, -2], "size": [0, 1, 1], "uv": [54, 13], "mirror": true},
{"origin": [1.53, 12.8, -1.5], "size": [0, 1, 3], "uv": [48, 11], "mirror": true},
{"origin": [1.51, 11.3, -2], "size": [0, 2, 3], "uv": [48, 12], "mirror": true},
{"origin": [1.52, 11.3, 0.5], "size": [0, 2, 1], "uv": [54, 14], "mirror": true}
]
},
{
@@ -270,8 +266,8 @@
"parent": "eye_left",
"pivot": [1.51, 13.8, -0.25],
"cubes": [
{"origin": [1.51, 13.8, -0.5], "size": [0, 1, 2], "uv": [48, 11], "mirror": true},
{"origin": [1.51, 13.8, -2], "size": [0, 1, 2], "uv": [52, 11], "mirror": true}
{"origin": [1.53, 13.8, -1.5], "size": [0, 1, 3], "uv": [48, 10], "mirror": true},
{"origin": [1.52, 13.8, -2], "size": [0, 1, 1], "uv": [54, 12], "mirror": true}
]
},
{
@@ -280,7 +276,7 @@
"pivot": [1.31, 11.6, 1.3],
"cubes": [
{"origin": [0.81, 10.6, 0.3], "size": [1, 2, 2], "inflate": -0.3, "uv": [52, 17], "mirror": true},
{"origin": [0.61, 10.4, 1.5], "size": [1, 1, 1], "inflate": -0.1, "uv": [48, 17], "mirror": true}
{"origin": [0.62, 10.4, 1.5], "size": [1, 1, 1], "inflate": -0.1, "uv": [48, 17], "mirror": true}
]
},
{
@@ -293,7 +289,7 @@
"parent": "pupil_left",
"pivot": [1.52, 13, -0.25],
"cubes": [
{"origin": [1.52, 12.5, -0.75], "size": [0, 1, 1], "uv": [3, 0], "mirror": true}
{"origin": [1.54, 12.5, -0.75], "size": [0, 1, 1], "uv": [3, 0], "mirror": true}
]
},
{
@@ -274,6 +274,14 @@
"parent": "lower_gear_rotation",
"pivot": [0, 9, -6]
},
{
"name": "locator_seat_1",
"parent": "lower_gear_rotation",
"pivot": [0, 10.5, -4.5],
"locators": {
"seat_1": [0, 10.5, -4.5]
}
},
{
"name": "gear4",
"parent": "lower_gear",
@@ -447,6 +447,14 @@
"cubes": [
{"origin": [0, -24.5, -8], "size": [0, 12, 7], "uv": [98, 109]}
]
},
{
"name": "locator_seat_1",
"parent": "body",
"pivot": [0, 54, -10],
"locators": {
"seat_1": [0, 54, -10]
}
}
]
}
@@ -474,6 +474,67 @@
"cubes": [
{"origin": [27, 10.5, 5], "size": [15, 19, 0], "uv": [223, 39]}
]
},
{
"name": "locator_seat_1",
"parent": "torso",
"pivot": [0, 30, -19],
"locators": {
"seat_1": [0, 30, -19]
}
},
{
"name": "locator_seat_2",
"parent": "torso",
"pivot": [13, 30, -14],
"rotation": [0, -90, 0],
"locators": {
"seat_2": [13, 30, -14]
}
},
{
"name": "locator_seat_3",
"parent": "torso",
"pivot": [-13, 30, -14],
"rotation": [0, 90, 0],
"locators": {
"seat_3": [-13, 30, -14]
}
},
{
"name": "locator_seat_4",
"parent": "torso",
"pivot": [0, 34, -3],
"locators": {
"seat_4": [0, 34, -3]
}
},
{
"name": "locator_seat_5",
"parent": "torso",
"pivot": [13, 30, 2],
"rotation": [0, -90, 0],
"locators": {
"seat_5": [13, 30, 2]
}
},
{
"name": "locator_seat_6",
"parent": "torso",
"pivot": [-13, 30, 2],
"rotation": [0, 90, 0],
"locators": {
"seat_6": [-13, 30, 2]
}
},
{
"name": "locator_seat_7",
"parent": "torso",
"pivot": [0, 33, 7],
"rotation": [0, 180, 0],
"locators": {
"seat_7": [0, 33, 7]
}
}
]
}
@@ -2,7 +2,8 @@
"portraitScale": 1.03,
"portraitTranslation": [-0.31, 0.12, 0],
"profileScale": 0.47,
"profileTranslation": [0, 0.98, 0.0],
"profileTranslation": [0.07, 0.98, 0.0],
"profilePokedexTranslation": [0, 0.98, 0],
"rootBone": "venusaur",
"firstPersonCameraOffset": {
"seat_1": [0, 0.25, 0]
@@ -1,8 +1,8 @@
{
"portraitScale": 1.89,
"portraitTranslation": [-0.13, 0.91, 0],
"profileScale": 0.63,
"profileTranslation": [0, 0.81, 0],
"profileScale": 0.77,
"profileTranslation": [0, 0.65, 0],
"rootBone": "charmeleon",
"animations": {
"cry": "q.bedrock_stateful('charmeleon', 'cry')"
@@ -2,7 +2,7 @@
"portraitScale": 2.1,
"portraitTranslation": [-1.11, 2.43, 0],
"profileScale": 0.54,
"profileTranslation": [0, 0.96, -10],
"profileTranslation": [0, 0.92, -10],
"rootBone": "charizard",
"firstPersonCameraOffset": {
"seat_1": [0, 0.45, 0]
@@ -1,8 +1,8 @@
{
"portraitScale": 1.89,
"portraitTranslation": [-0.8, 1.36, 0.0],
"profileScale": 0.59,
"profileTranslation": [0, 0.84, 0.0],
"profileScale": 0.57,
"profileTranslation": [0, 0.81, 0.0],
"rootBone": "nidoking",
"animations": {
"cry": "q.bedrock_stateful('nidoking', 'cry')",
@@ -2,7 +2,7 @@
"portraitScale": 1.8,
"portraitTranslation": [-0.35, -0.8, 0],
"profileScale": 0.8,
"profileTranslation": [0, 0.45, 0.0],
"profileTranslation": [0, 0.52, 0.0],
"rootBone": "parasect",
"firstPersonCameraOffset": {
"seat_1": [0, 0.45, 0]
@@ -1,6 +1,6 @@
{
"portraitScale": 1.96,
"portraitTranslation": [ -0.48, 1.61, 0],
"portraitTranslation": [ -0.3, 1.86, 0],
"profileScale": 0.53,
"profileTranslation": [0, 0.92, 0],
"rootBone": "mr_rime",
@@ -2,7 +2,7 @@
"portraitScale": 1.73,
"portraitTranslation": [-0.45, -1.17, 0],
"profileScale": 0.7,
"profileTranslation": [-0.06, 0.59, 0],
"profileTranslation": [0, 0.59, 0],
"rootBone": "dunsparce",
"animations": {
"cry": "q.bedrock_stateful('dunsparce', 'cry')",
@@ -2,7 +2,7 @@
"portraitScale": 1.73,
"portraitTranslation": [-0.09, 0.26, 0],
"profileScale": 0.60,
"profileTranslation": [0.16, 0.90, 0],
"profileTranslation": [0, 0.90, 0],
"rootBone": "beautifly",
"poses": {
"battle-standing": {
@@ -2,7 +2,7 @@
"portraitScale": 1.65,
"portraitTranslation": [-0.10, 0.16, 0],
"profileScale": 0.63,
"profileTranslation": [0.13, 0.64, 0],
"profileTranslation": [0, 0.64, 0],
"rootBone": "dustox",
"poses": {
"battle-standing": {
@@ -2,7 +2,9 @@
"portraitScale": 1.63,
"portraitTranslation": [-1.76, 1.25, 0],
"profileScale": 0.53,
"profileTranslation": [-0.09, 0.92, 0],
"profileTranslation": [0.49, 0.96, 0],
"profilePokedexTranslation": [0, 0.96, 0],
"profileSummaryTranslation": [-0.30, 0.87, 0],
"rootBone": "drapion",
"animations": {
"cry": "q.bedrock_stateful('drapion', 'cry')"
@@ -2,7 +2,7 @@
"portraitScale": 1.98,
"portraitTranslation": [-0.96, 1.39, 0],
"profileScale": 0.59,
"profileTranslation": [0.13, 0.82, 0],
"profileTranslation": [0, 0.84, 0],
"rootBone": "pyroar_female",
"animations": {
"cry": "q.bedrock_stateful('pyroar_female', 'cry')"
@@ -2,7 +2,7 @@
"portraitScale": 1.89,
"portraitTranslation": [-1.12, 1.78, 0],
"profileScale": 0.51,
"profileTranslation": [0.12, 0.94, 0],
"profileTranslation": [0, 0.97, 0],
"rootBone": "pyroar_male",
"animations": {
"cry": "q.bedrock_stateful('pyroar_male', 'cry')"
@@ -2,7 +2,8 @@
"portraitScale": 1.1,
"portraitTranslation": [-1.2, -0.009, 0],
"profileScale": 0.5,
"profileTranslation": [-0.18, 0.96, 0],
"profileTranslation": [0, 0.96, 0],
"profileSummaryTranslation": [-0.20, 0.87, 0],
"rootBone": "dudunsparce",
"firstPersonCameraOffset": {
"seat_1": [0, 0.45, 0],
@@ -2,7 +2,7 @@
"portraitScale": 1.1,
"portraitTranslation": [-0.8, -0.009, 0],
"profileScale": 0.5,
"profileTranslation": [-0.18, 0.96, 0],
"profileTranslation": [0, 0.96, 0],
"rootBone": "dudunsparce",
"firstPersonCameraOffset": {
"seat_1": [0, 0.45, 0],
@@ -1137,7 +1137,6 @@
"cobblemon.container.tm_machine": "TM Machine",
"cobblemon.ui.edit.habitat": "Habitat Editor",
"cobblemon.ui.edit.habitat.mimic_id": "Mimic Block ID",
"cobblemon.ui.edit.habitat.phase_number": "Number of Phases",
"cobblemon.ui.edit.habitat.phase_order": "Phase Order: %s",
"cobblemon.ui.edit.habitat.level_range": "Level Range (Min - Max)",
"cobblemon.ui.edit.habitat.mode": "Mode: %s",
@@ -1187,7 +1186,7 @@
"cobblemon.ui.edit.habitat.validation.species": "Species must be a valid Pokemon name.",
"cobblemon.ui.edit.habitat.validation.weight": "Weight must be greater than 0.",
"cobblemon.ui.edit.habitat.validation.modifiers": "Modifiers format is invalid.",
"cobblemon.ui.edit.habitat.validation.phases_list": "Phases must use valid moon phases (0-7), e.g. 1-3 or 1, 3-5, 6.",
"cobblemon.ui.edit.habitat.validation.phases_list": "Phases must use a valid format for integer ranges, e.g. 1-3 or 1, 3-5, 6.",
"cobblemon.ui.edit.habitat.validation.min_light": "Min Light must be between 0 and 15.",
"cobblemon.ui.edit.habitat.validation.max_light": "Max Light must be between 0 and 15.",
@@ -9351,11 +9351,11 @@
"cobblemon.habitat.natural_lightning_rod.name": "Pararrayos natural",
"cobblemon.habitat.quartz_spikes.name": "Picos de Cuarzo",
"cobblemon.subtitle.tm.use": "Máquina Técnica usada",
"cobblemon.subtitle.block.tm_machine.craft": "Máquina MT imprime MT",
"cobblemon.subtitle.block.tm_machine.craft": "Máquina MT termina de imprimir la MT",
"cobblemon.subtitle.block.tm_machine.off": "Máquina MT desactivada",
"cobblemon.subtitle.block.tm_machine.on": "Máquina MT activada",
"cobblemon.subtitle.block.tm_machine.open": "La tapa de la Máquina MT se abre",
"cobblemon.subtitle.block.tm_machine.close": "Ma tapa de la Máquina MT se cierra",
"cobblemon.subtitle.block.tm_machine.close": "La tapa de la Máquina MT se cierra",
"cobblemon.subtitle.block.tm_machine.place_disc": "MT en blanco insertada en la Máquina MT",
"cobblemon.ui.exp.number": "+%1$s §oEXP",
"cobblemon.config.ui.award_experience_to_fainted_pokemon": "Da Exp. a Pokémon derrotados",
@@ -9511,5 +9511,9 @@
"advancements.cobblemon.cook_poke_snack": "Un aroma tentador",
"advancements.cobblemon.cook_poke_snack.description": "Hornea un Poké Señuelo, un delicioso pastel que atrae a ciertos Pokémon según las bayas que uses",
"advancements.cobblemon.register_all_tms": "Discografía completa",
"advancements.cobblemon.plant_tumblestone.description": "Coloca un guijarro cerca de lava o de magma para que crezca a lo largo del tiempo"
"advancements.cobblemon.plant_tumblestone.description": "Coloca un guijarro cerca de lava o de magma para que crezca a lo largo del tiempo",
"cobblemon.subtitle.block.tm_machine.burn_loop": "Máquina MT imprime MT",
"cobblemon.subtitle.block.tm_machine.start": "Maquina MT empieza a imprimir MT",
"cobblemon.subtitle.block.tm_machine.tm_insert": "MT en blanco colocada en la Máquina MT",
"cobblemon.subtitle.block.tm_machine.tm_retrieve": "MT retirada de la Máquina MT"
}
@@ -1235,10 +1235,10 @@
"cobblemon.battle.fail.healblock": "%1$sは かいふくふうじで 回復できない!",
"cobblemon.battle.fail.darkvoid": "しかし %1$sは 使うことが できなかった!",
"cobblemon.battle.fail.teatime": "しかし 何も 起こらなかった!",
"cobblemon.battle.fail.slp": "%1$sは すでに 眠っている",
"cobblemon.battle.fail.par": "%1$sは すでに まひしている",
"cobblemon.battle.fail.slp": "しかし %1$sは 眠らない!",
"cobblemon.battle.fail.par": "しかし %1$sは まひにならない!",
"cobblemon.battle.fail.tox": "%1$sは すでに 毒を あびている",
"cobblemon.battle.fail.psn": "%1$sは すでに 毒を あびている",
"cobblemon.battle.fail.psn": "しかし %1$sは 毒にならない!",
"cobblemon.battle.fail.brn": "%1$sは すでに やけどを 負っている",
"cobblemon.battle.fail.frz": "%1$sは すでに 凍っている",
"cobblemon.battle.fail.uproar": "%1$sは 騒いでいて 眠れない!",
@@ -9302,5 +9302,61 @@
"cobblemon.habitat.pinkflowerbed_clearing.name": "ピンクフラワーベッドの開拓地",
"cobblemon.habitat.sandpit_clearing.name": "砂場の開拓地",
"cobblemon.habitat.sunflowerbed_clearing.name": "ヒマワリベッドの開拓地",
"cobblemon.habitat.sunscorched_clearing.name": "日差しに焼かれた開拓地"
"cobblemon.habitat.sunscorched_clearing.name": "日差しに焼かれた開拓地",
"cobblemon.habitat.quartz_spikes.name": "クォーツスパイク",
"cobblemon.habitat.reclaimed_desert_monument.name": "再生された砂漠の記念碑",
"cobblemon.habitat.reclaimed_lush_monument.name": "再生された繁茂した記念碑",
"cobblemon.habitat.rocky_outcrop.name": "岩の露頭",
"cobblemon.habitat.rocky_tide_pool.name": "岩場の潮だまり",
"cobblemon.habitat.root_nursery.name": "根苗圃",
"cobblemon.habitat.sandy_tide_pool.name": "砂地の潮だまり",
"cobblemon.habitat.skeletal_fall.name": "骸骨の墓場",
"cobblemon.habitat.snowy_burrow.name": "雪に覆われた巣穴",
"cobblemon.habitat.snowy_grotto.name": "雪に覆われた洞窟",
"cobblemon.habitat.snowy_thermal_vents.name": "雪に覆われた熱水噴出孔",
"cobblemon.habitat.thermal_crevices.name": "熱の裂け目",
"cobblemon.habitat.treasure_hoard.name": "秘宝の宝庫",
"cobblemon.habitat.volcanic_plume.name": "火山噴出柱",
"cobblemon.habitat.zen_garden.name": "思念の庭園",
"cobblemon.subtitle.tm.use": "わざマシン使用済み",
"cobblemon.subtitle.block.tm_machine.burn_loop": "わざマシンマシンでわざマシンをプリントする",
"cobblemon.subtitle.block.tm_machine.start": "わざマシンマシンがわざマシンのプリントを開始しました",
"cobblemon.subtitle.block.tm_machine.craft": "わざマシンマシンがわざマシンのプリントを完了しました",
"cobblemon.subtitle.block.tm_machine.open": "わざマシンマシンの蓋が開きます",
"cobblemon.subtitle.block.tm_machine.close": "わざマシンマシンの蓋が閉じます",
"cobblemon.subtitle.block.tm_machine.tm_insert": "わざマシンマシンに空のわざマシンをセットする",
"cobblemon.subtitle.block.tm_machine.tm_retrieve": "わざマシンをわざマシンマシンから入手",
"cobblemon.subtitle.block.tm_machine.item_insert": "アイテムをわざマシンマシンに配置しました",
"cobblemon.subtitle.block.tm_machine.item_retrieve": "わざマシンマシンからアイテムを取り出した",
"cobblemon.ui.exp.number": "+%1$s §o経験値",
"cobblemon.config.ui.award_experience_to_fainted_pokemon": "倒れたポケモンにも経験値を与える",
"cobblemon.config.ui.award_experience_to_fainted_pokemon.tooltip": "バトル中ひんしになったポケモンは、ひんしになる前に倒すのに貢献した相手から経験値を獲得できるか。",
"cobblemon.config.ui.award_experience_on_battle_loss": "戦闘敗北時の経験値",
"cobblemon.config.ui.award_experience_on_battle_loss.tooltip": "バトルに負けた場合でも、倒した相手からポケモンは経験値を獲得できるか。ひんしになったポケモンが経験値を獲得するには、「倒れたポケモンにも経験値を与える」が有効になっている必要がある。",
"cobblemon.config.ui.fossil_machine_alpha_chance": "化石マシンのオヤブン出現確率",
"cobblemon.config.ui.fossil_machine_alpha_chance.tooltip": "化石マシンから入手できるポケモンがオヤブンになる確率。\"[入力した数値]分の1\"として計算される。",
"cobblemon.config.ui.fossil_machine_shiny_chance.tooltip": "ふくげんマシンから入手できるポケモンが色違いになる確率。\"[入力した数値]分の1\"として計算される。",
"cobblemon.config.ui.honey_slather_alpha_chance.tooltip": "ミツ塗りの木から入手できるポケモンがオヤブンになる確率。\"[入力した数値]分の1\"として計算される。",
"cobblemon.config.ui.honey_slather_shiny_chance.tooltip": "ミツ塗りの木から入手できるポケモンが色違いになる確率。\"[入力した数値]分の1\"として計算される。",
"cobblemon.config.ui.fossil_machine_shiny_chance": "化石マシンの色違い出現確率",
"cobblemon.config.ui.honey_slather_alpha_chance": "ミツ塗りの木のオヤブン出現確率",
"cobblemon.config.ui.honey_slather_shiny_chance": "ミツ塗りの木の色違い出現確率",
"cobblemon.config.ui.data_monitor_alpha_rate": "データモニターのオヤブン出現確率",
"cobblemon.config.ui.data_monitor_alpha_rate.tooltip": "データモニターから入手できるポケモンがオヤブンになる確率。\"[入力した数値]分の1\"として計算される。",
"cobblemon.config.ui.data_monitor_shiny_rate": "データモニターの色違い出現確率",
"cobblemon.config.ui.data_monitor_shiny_rate.tooltip": "データモニターから入手できるポケモンが色違いになる確率。\"[入力した数値]分の1\"として計算される。",
"cobblemon.config.ui.pokemon_intrinsic_size_min.tooltip": "出現するポケモンの最小固有サイズ倍率。",
"cobblemon.config.ui.pokemon_intrinsic_size_min": "ポケモンの最小固有サイズ",
"cobblemon.config.ui.pokemon_intrinsic_size_max": "ポケモンの最大固有サイズ",
"cobblemon.config.ui.pokemon_intrinsic_size_max.tooltip": "出現するポケモンの最大固有サイズ倍率。",
"cobblemon.config.ui.alpha_pokemon_size_small_multiplier.tooltip": "当たり判定が0.5ブロック未満のポケモンに対するオヤブンサイズ倍率。",
"cobblemon.config.ui.alpha_pokemon_size_small_multiplier": "小さいオヤブンサイズ倍率",
"cobblemon.config.ui.alpha_pokemon_size_medium_multiplier": "中くらいのオヤブンサイズ倍率",
"cobblemon.config.ui.alpha_pokemon_size_medium_multiplier.tooltip": "当たり判定が0.5ブロックから1.5ブロックの間のポケモンに対するオヤブンサイズ倍率。",
"cobblemon.config.ui.alpha_pokemon_size_large_multiplier": "大きいオヤブンサイズ倍率",
"cobblemon.config.ui.alpha_pokemon_size_large_multiplier.tooltip": "当たり判定が1.5ブロックから10ブロックの間のポケモンに対するオヤブンサイズ倍率。",
"cobblemon.config.ui.alpha_pokemon_size_extra_large_multiplier.tooltip": "当たり判定が10ブロック以上のポケモンに対するオヤブンサイズ倍率。",
"cobblemon.config.ui.alpha_pokemon_size_extra_large_multiplier": "とても大きいオヤブンサイズ倍率",
"cobblemon.config.ui.baby_pokemon_level_duration": "ベイビィポケモン期間レベル",
"cobblemon.config.ui.baby_pokemon_level_duration.tooltip": "ポケモンが通常よりも小さく見える「ベイビィポケモン」とみなされるレベル数。"
}
@@ -5936,14 +5936,14 @@
"block.cobblemon.red_apricorn": "红球果",
"block.cobblemon.yellow_apricorn": "黄球果",
"block.cobblemon.lectern": "讲台",
"cobblemon.fishing_bait_effects.nature.tooltip": "%1$s%%-%2$s↑性格出现率",
"cobblemon.fishing_bait_effects.iv.tooltip": "%1$s%%-%2$s个体值+%3$s",
"cobblemon.fishing_bait_effects.ev.tooltip": "%1$s%%-%2$s基础点数出现率",
"cobblemon.fishing_bait_effects.bite_time.tooltip": "%1$s%% - 上钩时间缩短 %3$s%%",
"cobblemon.fishing_bait_effects.gender_chance.tooltip": "%1$s%%-%2$s性别出现率",
"cobblemon.fishing_bait_effects.level_raise.tooltip": "%1$s%% - 等级 +%3$s",
"cobblemon.fishing_bait_effects.nature.tooltip": "%1$s%% - %2$s↑性格出现率",
"cobblemon.fishing_bait_effects.iv.tooltip": "%1$s%% - %2$s个体值+%3$s",
"cobblemon.fishing_bait_effects.ev.tooltip": "%1$s%% - %2$s基础点数出现率",
"cobblemon.fishing_bait_effects.bite_time.tooltip": "%1$s%% - 上钩时间缩短%3$s%%",
"cobblemon.fishing_bait_effects.gender_chance.tooltip": "%1$s%% - %2$s性别出现率",
"cobblemon.fishing_bait_effects.level_raise.tooltip": "%1$s%% - 等级+%3$s",
"cobblemon.fishing_bait_effects.tera.tooltip": "%1$s%% - 吸引 %2$s 太晶属性",
"cobblemon.fishing_bait_effects.shiny_reroll.tooltip": "%1$s%% - 异色概率 ×%3$s",
"cobblemon.fishing_bait_effects.shiny_reroll.tooltip": "%1$s%% - 发光概率×%3$s",
"cobblemon.fishing_bait_effects.ha_chance.tooltip": "%1$s%% - 隐藏特性出现率",
"cobblemon.fishing_bait_effects.pokemon_chance.tooltip": "%1$s%% - 上钩一只宝可梦",
"cobblemon.fishing_bait_effects.friendship.tooltip": "%1$s%% - 亲密度 +%3$s",
@@ -6179,7 +6179,7 @@
"cobblemon.species.ironjugulis.desc": "它与超自然杂志曾报道过的宝可梦很相似。报道中的宝可梦是爱上机器人的三首恶龙所生的孩子。",
"cobblemon.species.pecharunt.desc": "会让对手吃下能提升欲望和能力的毒粘糕,然后通过锁链控制对手。",
"cobblemon.ability.teraformzero.desc": "太乐巴戈斯变为星晶形态时,蕴藏在它身上的力量会将天气和场地的影响全部归零。",
"cobblemon.subtitle.pokemon.shiny_shine": "被捕获的异色宝可梦闪闪发光",
"cobblemon.subtitle.pokemon.shiny_shine": "被捕获的发光宝可梦闪闪发光",
"cobblemon.battle.heal.bagitemrevive": "%1$s 恢复了活力!",
"cobblemon.battle.detailschange.noice": "%1$s的样子发生了变化!",
"cobblemon.battle.detailschange.eiscue": "%1$s的样子发生了变化!",
@@ -6206,9 +6206,9 @@
"cobblemon.ability.hospitality": "款待",
"cobblemon.ability.poisonpuppeteer": "毒傀儡",
"cobblemon.ability.supersweetsyrup": "甘露之蜜",
"cobblemon.subtitle.pokemon.wild_shiny_shine": "野生的异色宝可梦!",
"cobblemon.subtitle.pokemon.owned_shiny_ambient": "周围的异色宝可梦闪闪发光",
"cobblemon.subtitle.pokemon.shiny_ambient": "野生的异色宝可梦闪闪发光!",
"cobblemon.subtitle.pokemon.wild_shiny_shine": "野生的发光宝可梦!",
"cobblemon.subtitle.pokemon.owned_shiny_ambient": "周围的发光宝可梦闪闪发光",
"cobblemon.subtitle.pokemon.shiny_ambient": "野生的发光宝可梦闪闪发光!",
"cobblemon.battle.withdraw.self": "%1$s ,回来!",
"cobblemon.battle.withdraw.other": "%1$s换下了%2$s!",
"cobblemon.type.suffix": "%1$s 属性",
@@ -6399,34 +6399,34 @@
"cobblemon.pokerod.remove": "右键移除饵料",
"item.cobblemon.galarica_nuts": "伽勒豆蔻枝",
"item.cobblemon.npc_editor": "NPC的训练家证",
"item.cobblemon.dragon_scale.tooltip": "在连接交换时携带,可使海刺龙进化为刺龙王",
"item.cobblemon.link_cable.tooltip": "使需要通过交换进化的宝可梦进化",
"item.cobblemon.dragon_scale.tooltip": "当海刺龙携带进行连接交换时,可使其进化为刺龙王",
"item.cobblemon.link_cable.tooltip": "可使需要连接交换的宝可梦进化",
"item.cobblemon.kings_rock.tooltip_2": "在交换时携带,可使蚊香君进化为蚊香蛙皇,呆呆兽进化为呆呆王",
"item.cobblemon.metal_coat.tooltip_1": "携带后,钢属性的招式威力就会增强",
"item.cobblemon.kings_rock.tooltip_1": "携带该道具的宝可梦造成伤害时,有概率使目标陷入畏缩状态",
"item.cobblemon.metal_coat.tooltip_2": "在连接交换时携带,可使大岩蛇进化为大钢蛇,使飞天螳螂进化为巨钳螳螂",
"item.cobblemon.upgrade.tooltip": "在连接交换时携带,可使多边兽进化为多边兽2型",
"item.cobblemon.dubious_disc.tooltip": "在连接交换时携带,可使多边兽2型进化为多边兽乙型",
"item.cobblemon.metal_coat.tooltip_2": "在连接交换时携带,可使大岩蛇进化为大钢蛇,飞天螳螂进化为巨钳螳螂",
"item.cobblemon.upgrade.tooltip": "当多边兽携带进行连接交换时,可使其进化为多边兽2型",
"item.cobblemon.dubious_disc.tooltip": "当多边兽2型携带进行连接交换时,可使其进化为多边兽乙型",
"item.cobblemon.deep_sea_scale.tooltip_1": "大幅提升珍珠贝的特防",
"item.cobblemon.deep_sea_scale.tooltip_2": "在连接交换时携带,可使珍珠贝进化为樱花鱼",
"item.cobblemon.deep_sea_tooth.tooltip_2": "在连接交换时携带,可使珍珠贝进化为猎斑鱼",
"item.cobblemon.electirizer.tooltip": "在连接交换时携带,可使电击兽进化为电击魔兽",
"item.cobblemon.magmarizer.tooltip": "当鸭嘴火兽携带进行连接进化时,会使其进化为鸭嘴炎兽",
"item.cobblemon.oval_stone.tooltip": "当小福蛋携带进行连接交换时,会使其进化为吉利蛋",
"item.cobblemon.protector.tooltip": "当钻角犀兽携带进行连接交换时,会使其进化为超甲狂犀",
"item.cobblemon.prism_scale.tooltip": "当丑丑鱼携带进行连接交换时,会使其进化为美纳斯",
"item.cobblemon.sachet.tooltip": "当粉香香携带进行连接交换时,会使其进化为芳香精",
"item.cobblemon.whipped_dream.tooltip": "当绵绵泡芙携带进行连接交换时,会使其进化为胖甜妮",
"item.cobblemon.love_sweet.tooltip": "当小仙奶携带时,会使其进化为霜奶仙的爱心形态",
"item.cobblemon.berry_sweet.tooltip": "当小仙奶携带时,会使其进化为霜奶仙的野莓形态",
"item.cobblemon.flower_sweet.tooltip": "当小仙奶携带时,会使其进化为霜奶仙的花朵形态",
"item.cobblemon.ribbon_sweet.tooltip": "当小仙奶携带时,会使其进化为霜奶仙的蝴蝶结形态",
"item.cobblemon.cracked_pot.tooltip": "当对赝品来悲茶使用时,会使其进化为怖思壶",
"item.cobblemon.unremarkable_teacup.tooltip": "当对斯魔茶(冒牌货的样子)使用时,会使其进化为来悲粗茶(凡作的样子)",
"item.cobblemon.sweet_apple.tooltip": "当对啃果虫使用时,会使其进化为丰蜜龙",
"item.cobblemon.tart_apple.tooltip": "当对啃果虫使用时,会使其进化为苹裹龙",
"item.cobblemon.galarica_wreath.tooltip": "当对呆呆兽(伽勒尔的样子)使用时,会使其进化为呆呆王(伽勒尔的样子)",
"item.cobblemon.black_augurite.tooltip": "当对飞天螳螂使用,会使其进化为劈斧螳螂",
"item.cobblemon.deep_sea_scale.tooltip_2": "当珍珠贝携带进行连接交换时,可使其进化为樱花鱼",
"item.cobblemon.deep_sea_tooth.tooltip_2": "当珍珠贝携带进行连接交换时,可使其进化为猎斑鱼",
"item.cobblemon.electirizer.tooltip": "当电击兽携带进行连接交换时,可使其进化为电击魔兽",
"item.cobblemon.magmarizer.tooltip": "当鸭嘴火兽携带进行连接交换时,可使其进化为鸭嘴炎兽",
"item.cobblemon.oval_stone.tooltip": "当小福蛋携带并处于白天时,可使其进化为吉利蛋",
"item.cobblemon.protector.tooltip": "当钻角犀兽携带进行连接交换时,可使其进化为超甲狂犀",
"item.cobblemon.prism_scale.tooltip": "当丑丑鱼携带进行连接交换时,可使其进化为美纳斯",
"item.cobblemon.sachet.tooltip": "当粉香香携带进行连接交换时,可使其进化为芳香精",
"item.cobblemon.whipped_dream.tooltip": "当绵绵泡芙携带进行连接交换时,可使其进化为胖甜妮",
"item.cobblemon.love_sweet.tooltip": "当小仙奶携带时,可使其进化为霜奶仙的爱心形态",
"item.cobblemon.berry_sweet.tooltip": "当小仙奶携带时,可使其进化为霜奶仙的野莓形态",
"item.cobblemon.flower_sweet.tooltip": "当小仙奶携带时,可使其进化为霜奶仙的花朵形态",
"item.cobblemon.ribbon_sweet.tooltip": "当小仙奶携带时,可使其进化为霜奶仙的蝴蝶结形态",
"item.cobblemon.cracked_pot.tooltip": "当对赝品来悲茶使用时,可使其进化为怖思壶",
"item.cobblemon.unremarkable_teacup.tooltip": "当对斯魔茶(冒牌货的样子)使用时,可使其进化为来悲粗茶(凡作的样子)",
"item.cobblemon.sweet_apple.tooltip": "当对啃果虫使用时,可使其进化为丰蜜龙",
"item.cobblemon.tart_apple.tooltip": "当对啃果虫使用时,可使其进化为苹裹龙",
"item.cobblemon.galarica_wreath.tooltip": "当对呆呆兽(伽勒尔的样子)使用时,可使其进化为呆呆王(伽勒尔的样子)",
"item.cobblemon.black_augurite.tooltip": "当对飞天螳螂使用,可使其进化为劈斧螳螂",
"item.cobblemon.moon_stone.tooltip": "进化特定宝可梦",
"item.cobblemon.dawn_stone.tooltip": "进化特定宝可梦",
"item.cobblemon.fire_stone.tooltip": "进化特定宝可梦",
@@ -6480,8 +6480,8 @@
"item.cobblemon.absorb_bulb.tooltip_2": "使用后消耗",
"item.cobblemon.air_balloon.tooltip_1": "携带后,会浮在空中",
"item.cobblemon.assault_vest.tooltip": "虽然携带后特防会提高,但会无法使出变化招式",
"item.cobblemon.auspicious_armor.tooltip": "当对炭小侍使用时,会使其进化为红莲铠骑",
"item.cobblemon.malicious_armor.tooltip": "当对炭小侍使用时,会使其进化为苍炎刃鬼",
"item.cobblemon.auspicious_armor.tooltip": "当对炭小侍使用时,可使其进化为红莲铠骑",
"item.cobblemon.malicious_armor.tooltip": "当对炭小侍使用时,可使其进化为苍炎刃鬼",
"item.cobblemon.binding_band.tooltip": "携带后,绑紧招式的威力会变强",
"item.cobblemon.black_belt.tooltip": "携带后,格斗属性的招式威力就会提高",
"item.cobblemon.black_sludge.tooltip": "携带后,毒属性的宝可梦会缓缓回复HP。其他属性的话,HP则会减少",
@@ -6532,7 +6532,7 @@
"item.cobblemon.shed_shell.tooltip": "携带后,必定可以和后备的宝可梦进行替换",
"item.cobblemon.shell_bell.tooltip": "携带后,攻击对手并造成伤害时,能回复少量HP",
"item.cobblemon.shell_helmet": "硬壳头盔",
"item.cobblemon.shell_helmet.tooltip": "当对盖盖虫使用时,会使其进化为骑士蜗牛",
"item.cobblemon.shell_helmet.tooltip": "当对盖盖虫使用时,可使其进化为骑士蜗牛",
"item.cobblemon.silver_powder.tooltip": "携带后,虫属性的招式威力就会提高",
"item.cobblemon.soft_sand.tooltip": "携带后,地面属性的招式威力就会提高",
"item.cobblemon.soothe_bell.tooltip": "携带后,会变得容易和训练家亲密",
@@ -6604,13 +6604,13 @@
"item.cobblemon.flying_gem.tooltip_1": "携带后,飞行属性的招式威力会增强一次",
"item.cobblemon.flying_gem.tooltip_2": "使用后消耗",
"block.cobblemon.big_root.tooltip": "携带后,吸取HP的招式可以比平时更多地回复自己的HP",
"item.cobblemon.clover_sweet.tooltip": "当小仙奶携带时,会使其进化为霜奶仙的幸运草形态",
"item.cobblemon.clover_sweet.tooltip": "当小仙奶携带时,可使其进化为霜奶仙的幸运草形态",
"item.cobblemon.water_stone.tooltip": "进化特定宝可梦",
"item.cobblemon.jolly_mint.tooltip": "当对宝可梦使用后,会使其性格影响改变为爽朗性格",
"item.cobblemon.cell_battery.tooltip_1": "携带它的宝可梦如果受到电属性招式的伤害,攻击就会提高",
"item.cobblemon.dragon_fang.tooltip": "携带后,龙属性的招式威力就会提高",
"item.cobblemon.eject_button.tooltip_1": "携带它的宝可梦如果受到招式的伤害,就能逃脱战斗",
"item.cobblemon.razor_fang.tooltip_2": "当天蝎携带在夜晚进行等级升级时,会使其进化为天蝎王",
"item.cobblemon.razor_fang.tooltip_2": "当天蝎携带在夜晚进行等级升级时,可使其进化为天蝎王",
"item.cobblemon.ring_target.tooltip": "携带后,原本因属性相克关系而无效的招式现在会变得能够击中自己",
"item.cobblemon.wise_glasses.tooltip": "携带后,特殊招式的威力就会少量提高",
"item.cobblemon.power_bracer.tooltip": "携带后,在战斗中获得经验值时,会获得8点攻击基础点数",
@@ -6618,9 +6618,9 @@
"item.cobblemon.x_special_defence.tooltip": "在战斗中使用时,会使目标的特防提升一级",
"item.cobblemon.full_heal.tooltip": "治愈一只宝可梦的所有异常状态",
"item.cobblemon.paralyze_heal.tooltip": "治愈一只宝可梦的麻痹状态",
"item.cobblemon.reaper_cloth.tooltip": "当彷徨夜灵携带进行连接交换时,会使其进化为黑夜魔灵",
"item.cobblemon.masterpiece_teacup.tooltip": "当对斯魔茶(高档货的样子)使用时,会使其进化为来悲粗茶(杰作的样子)",
"item.cobblemon.galarica_cuff.tooltip": "当对呆呆兽(伽勒尔的样子)使用时,会使其进化为呆壳兽(伽勒尔的样子)",
"item.cobblemon.reaper_cloth.tooltip": "当彷徨夜灵携带进行连接交换时,可使其进化为黑夜魔灵",
"item.cobblemon.masterpiece_teacup.tooltip": "当对斯魔茶(高档货的样子)使用时,可使其进化为来悲粗茶(杰作的样子)",
"item.cobblemon.galarica_cuff.tooltip": "当对呆呆兽(伽勒尔的样子)使用时,可使其进化为呆壳兽(伽勒尔的样子)",
"item.cobblemon.ability_capsule.tooltip": "当对宝可梦使用后,会使其特性改变为另一种常见特性",
"item.cobblemon.lonely_mint.tooltip": "当对宝可梦使用后,会使其性格影响改变为怕寂寞性格",
"item.cobblemon.brave_mint.tooltip": "当对宝可梦使用后,会使其性格影响改变为勇敢性格",
@@ -6636,13 +6636,13 @@
"item.cobblemon.burn_heal.tooltip": "治愈一只宝可梦的灼伤状态",
"item.cobblemon.dragon_gem.tooltip_2": "使用后消耗",
"item.cobblemon.ground_gem.tooltip_1": "携带后,地面属性的招式威力会增强一次",
"item.cobblemon.peat_block.tooltip": "当在满月对圈圈熊使用时,会使其进化为月月熊",
"item.cobblemon.strawberry_sweet.tooltip": "当小仙奶携带时,会使其进化为霜奶仙的草莓形态",
"item.cobblemon.chipped_pot.tooltip": "当对真品来悲茶使用时,会使其进化为怖思壶",
"item.cobblemon.peat_block.tooltip": "当在满月对圈圈熊使用时,可使其进化为月月熊",
"item.cobblemon.strawberry_sweet.tooltip": "当小仙奶携带时,可使其进化为霜奶仙的草莓形态",
"item.cobblemon.chipped_pot.tooltip": "当对真品来悲茶使用时,可使其进化为怖思壶",
"item.cobblemon.focus_band.tooltip": "携带后,即便受到可能会导致昏厥的招式,有时也能仅以1HP撑过去",
"item.cobblemon.light_clay.tooltip": "携带后,使出像光墙和反射壁一样的保护招式时,效果会比平时持续得更长",
"item.cobblemon.red_card.tooltip_1": "携带后,能让对自己造成伤害的对手退场",
"item.cobblemon.medicinal_leek.tooltip_1": "能用来调制成药品",
"item.cobblemon.medicinal_leek.tooltip_1": "可调制成药品",
"item.cobblemon.remedy.tooltip": "使一只宝可梦回复20HP,同时小幅降低它的亲密度",
"item.cobblemon.fine_remedy.tooltip": "使一只宝可梦回复60HP,同时小幅降低它的亲密度",
"item.cobblemon.superb_remedy.tooltip": "使一只宝可梦回复120HP,同时小幅降低它的亲密度",
@@ -6653,7 +6653,7 @@
"item.cobblemon.ghost_gem.tooltip_1": "携带后,幽灵属性的招式威力会增强一次",
"item.cobblemon.rock_gem.tooltip_1": "携带后,岩石属性的招式威力会增强一次",
"item.cobblemon.psychic_gem.tooltip_2": "使用后消耗",
"item.cobblemon.star_sweet.tooltip": "当小仙奶携带时,会使其进化为霜奶仙的星星形态",
"item.cobblemon.star_sweet.tooltip": "当小仙奶携带时,可使其进化为霜奶仙的星星形态",
"item.cobblemon.relaxed_mint.tooltip": "当对宝可梦使用后,会使其性格影响改变为悠闲性格",
"item.cobblemon.quiet_mint.tooltip": "当对宝可梦使用后,会使其性格影响改变为冷静性格",
"item.cobblemon.careful_mint.tooltip": "当对宝可梦使用后,会使其性格影响改变为慎重性格",
@@ -6678,8 +6678,8 @@
"item.cobblemon.bug_gem.tooltip_1": "携带后,虫属性的招式威力会增强一次",
"item.cobblemon.deep_sea_tooth.tooltip_1": "大幅提升珍珠贝的特攻",
"cobblemon.fishing.no_bite": "甚至连一口都没有。",
"cobblemon.fishing_bait_effects.typing.tooltip": "%1$s%%-%2$s属性出现率×%3$s",
"cobblemon.fishing_bait_effects.egg_group.tooltip": "%1$s%%-%2$s蛋群出现率×%3$s",
"cobblemon.fishing_bait_effects.typing.tooltip": "%1$s%% - %2$s属性出现率×%3$s",
"cobblemon.fishing_bait_effects.egg_group.tooltip": "%1$s%% - %2$s蛋群出现率×%3$s",
"cobblemon.egg_group.monster": "怪兽",
"cobblemon.egg_group.water_1": "水中1",
"cobblemon.egg_group.bug": "虫",
@@ -6712,7 +6712,7 @@
"cobblemon.ui.interact.ride": "骑乘",
"cobblemon.ui.interact.request_already_expired": "该请求已过期!",
"cobblemon.ui.pokedex.search.search_by": "搜索 %1$s 中",
"cobblemon.ui.pokedex.search.type.species": "物种名称",
"cobblemon.ui.pokedex.search.type.species": "宝可梦名称",
"cobblemon.ui.pokedex.search.type.abilities": "特性",
"cobblemon.ui.pokedex.search.type.drops": "掉落物",
"cobblemon.cosmetic.held_logs.crimson": "绯红菌柄",
@@ -6911,10 +6911,10 @@
"cobblemon.config.ui.display_entity_name_label": "显示宝可梦的名字",
"cobblemon.config.ui.display_entity_level_label": "显示宝可梦的等级",
"cobblemon.config.ui.display_entity_labels_when_crouching_only.tooltip": "控制是否只在蹲下时显示宝可梦的标签。",
"cobblemon.config.ui.shiny_rate": "异色概率",
"cobblemon.config.ui.shiny_rate.tooltip": "生成的宝可梦为异色的概率。若设为0,则生成的宝可梦不会出现异色。该概率以1/x的形式计算。",
"cobblemon.config.ui.shiny_notice_particles_distance": "异色粒子的显示距离",
"cobblemon.config.ui.shiny_notice_particles_distance.tooltip": "宝可梦异色粒子效果开始显示的距离。",
"cobblemon.config.ui.shiny_rate": "发光概率",
"cobblemon.config.ui.shiny_rate.tooltip": "生成发光宝可梦的概率。若设为0,则发光宝可梦不会生成。该概率以1/x的形式计算。",
"cobblemon.config.ui.shiny_notice_particles_distance": "发光粒子的显示距离",
"cobblemon.config.ui.shiny_notice_particles_distance.tooltip": "宝可梦发光粒子效果开始显示的距离。",
"cobblemon.config.ui.capture_calculator": "捕获计算器",
"cobblemon.config.ui.player_damage_pokemon": "玩家攻击宝可梦",
"cobblemon.config.ui.player_damage_pokemon.tooltip": "控制玩家是否可以攻击一般实体一样攻击宝可梦。",
@@ -7073,7 +7073,7 @@
"cobblemon.battle.block.aromaveil": "%1$s 正受到芳香幕的保护!",
"cobblemon.species.mimikyu-busted.desc": "因正身就要暴露而很悲痛。绝不原谅折断了它脖子的对手,会向对方报仇。",
"item.cobblemon.syrupy_apple": "蜜汁苹果",
"item.cobblemon.syrupy_apple.tooltip": "当啃果虫使用时,会使其进化为裹蜜虫",
"item.cobblemon.syrupy_apple.tooltip": "当啃果虫使用时,可使其进化为裹蜜虫",
"cobblemon.command.unlockablepcboxwallpaper.invalid-wallpaper": "无效的壁纸标识",
"cobblemon.ui.pc.wallpaper": "壁纸",
"cobblemon.ui.pc.filter": "筛选",
@@ -8577,9 +8577,9 @@
"cobblemon.ui.pokedex.info.form.dartrix-hisuibias": "洗翠趋异的样子",
"block.cobblemon.potted_saccharine_sapling": "蜜露树苗盆栽",
"item.cobblemon.saccharine_sapling": "蜜露树苗",
"item.cobblemon.metal_alloy.tooltip": "当对铝钢龙使用时,会使其进化为铝钢桥龙",
"item.cobblemon.metal_alloy.tooltip": "当对铝钢龙使用时,可使其进化为铝钢桥龙",
"item.cobblemon.health_mochi": "体力粘糕",
"item.cobblemon.scroll_of_waters.tooltip": "当对熊徒弟使用时,会使其进化为武道熊师(连击流)",
"item.cobblemon.scroll_of_waters.tooltip": "当对熊徒弟使用时,可使其进化为武道熊师(连击流)",
"item.cobblemon.potato_mochi": "马铃薯粘糕",
"item.cobblemon.aprijuice_black": "黑球果汁",
"item.cobblemon.health_mochi.tooltip": "提升宝可梦的HP基础点数4点",
@@ -8592,7 +8592,7 @@
"item.cobblemon.metal_alloy": "复合金属",
"item.cobblemon.scroll_of_darkness": "恶之挂轴",
"item.cobblemon.scroll_of_waters": "水之挂轴",
"item.cobblemon.scroll_of_darkness.tooltip": "当对熊徒弟使用时,会使其进化为武道熊师(一击流)",
"item.cobblemon.scroll_of_darkness.tooltip": "当对熊徒弟使用时,可使其进化为武道熊师(一击流)",
"item.cobblemon.fried_rice": "炒饭",
"item.cobblemon.candied_apple": "蜜饯苹果",
"item.cobblemon.moomoo_milk": "哞哞鲜奶",
@@ -8673,13 +8673,13 @@
"item.cobblemon.ponigiri": "宝可饭团",
"item.cobblemon.poke_puff.frosted": "珍奇 %s 宝芙蕾",
"tooltip.cobblemon.poke_puff.nature.neutral": "中性",
"item.cobblemon.health_candy.tooltip_1": "提升宝可梦HP的有效个体值1点",
"item.cobblemon.brittle_candy.tooltip_1": "降低宝可梦防御的有效个体值1点",
"item.cobblemon.numb_candy.tooltip_1": "降低宝可梦特攻的有效个体值1点",
"item.cobblemon.health_candy.tooltip_1": "提升宝可梦的HP有效个体值1点",
"item.cobblemon.brittle_candy.tooltip_1": "降低宝可梦的防御有效个体值1点",
"item.cobblemon.numb_candy.tooltip_1": "降低宝可梦的特攻有效个体值1点",
"cobblemon.ui.info.gender": "性别",
"item.cobblemon.courage_candy.tooltip_1": "提升宝可梦特防的有效个体值1点",
"item.cobblemon.courage_candy.tooltip_1": "提升宝可梦的特防有效个体值1点",
"cobblemon.command.behaviouredit.non_scriptable": "您并没有看着一个可执行MoLang脚本的实体。",
"cobblemon.command.pcsearch.tooltip.shiny": "这只宝可梦已经是异色了!",
"cobblemon.command.pcsearch.tooltip.shiny": "这只是发光宝可梦!",
"cobblemon.command.pcsearch.entry": "- %1$s %2$s",
"block.cobblemon.campfire": "营火",
"block.cobblemon.campfire_pot_black": "黑色营火锅",
@@ -8711,20 +8711,20 @@
"cobblemon.tooltip.poke_puff.friendship_effects": "亲密度影响",
"item.cobblemon.health_candy": "元气糖果",
"item.cobblemon.mighty_candy": "力量糖果",
"item.cobblemon.mighty_candy.tooltip_1": "提升宝可梦攻击的有效个体值1点",
"item.cobblemon.mighty_candy.tooltip_1": "提升宝可梦的攻击有效个体值1点",
"item.cobblemon.tough_candy": "守护糖果",
"item.cobblemon.tough_candy.tooltip_1": "提升宝可梦防御的有效个体值1点",
"item.cobblemon.tough_candy.tooltip_1": "提升宝可梦的防御有效个体值1点",
"item.cobblemon.smart_candy": "知识糖果",
"item.cobblemon.smart_candy.tooltip_1": "提升宝可梦特攻的有效个体值1点",
"item.cobblemon.smart_candy.tooltip_1": "提升宝可梦的特攻有效个体值1点",
"item.cobblemon.courage_candy": "心灵糖果",
"item.cobblemon.quick_candy": "敏捷糖果",
"item.cobblemon.quick_candy.tooltip_1": "提升宝可梦速度的有效个体值1点",
"item.cobblemon.quick_candy.tooltip_1": "提升宝可梦的速度有效个体值1点",
"item.cobblemon.sickly_candy": "虚弱糖果",
"item.cobblemon.sickly_candy.tooltip_1": "降低宝可梦HP的有效个体值1点",
"item.cobblemon.weak_candy.tooltip_1": "降低宝可梦攻击的有效个体值1点",
"item.cobblemon.sickly_candy.tooltip_1": "降低宝可梦的HP有效个体值1点",
"item.cobblemon.weak_candy.tooltip_1": "降低宝可梦的攻击有效个体值1点",
"item.cobblemon.weak_candy": "软弱糖果",
"item.cobblemon.coward_candy.tooltip_1": "降低宝可梦特防的有效个体值1点",
"item.cobblemon.slow_candy.tooltip_1": "降低宝可梦速度的有效个体值1点",
"item.cobblemon.coward_candy.tooltip_1": "降低宝可梦的特防有效个体值1点",
"item.cobblemon.slow_candy.tooltip_1": "降低宝可梦的速度有效个体值1点",
"item.cobblemon.brittle_candy": "脆弱糖果",
"item.cobblemon.numb_candy": "迟钝糖果",
"item.cobblemon.coward_candy": "胆怯糖果",
@@ -9106,7 +9106,7 @@
"item.cobblemon.eggant_berry": "子茄果",
"cobblemon.entity.variable.look_at_entity_types.desc": "该实体将看向的实体类型。",
"cobblemon.entity.variable.look_at_entity_types.name": "看向实体类型",
"cobblemon.fishing_bait_effects.drops_reroll.tooltip": "%1$s%% - %3$s× 额外掉落",
"cobblemon.fishing_bait_effects.drops_reroll.tooltip": "%1$s%% - %3$s×额外掉落",
"cobblemon.requires_debug_keys": "必须在服务器上启用调试键才能使用此功能。",
"cobblemon.ui.stats.blocks_traveled": "步数",
"cobblemon.requires_permission": "你没有执行此操作的权限。",
@@ -9213,5 +9213,125 @@
"cobblemon.behaviour.defend_owner.desc": "在主人受到攻击时保护他们。",
"stat.cobblemon.riding_land": "骑着宝可梦在陆地移动距离",
"stat.cobblemon.riding_air": "骑着宝可梦在空中移动距离",
"stat.cobblemon.riding_liquid": "骑着宝可梦在水域移动距离"
"stat.cobblemon.riding_liquid": "骑着宝可梦在水域移动距离",
"item.cobblemon.sweet_heart.tooltip": "非常甜腻的巧克力",
"item.cobblemon.sweet_heart": "心形甜点",
"item.cobblemon.technical_machine": "招式学习器",
"item.cobblemon.blank_tm": "空白招式学习器",
"block.cobblemon.deepslate_crystal_core": "深层水晶母岩",
"block.cobblemon.normal_gem_block": "一般宝石块",
"block.cobblemon.fire_gem_block": "火之宝石块",
"block.cobblemon.water_gem_block": "水之宝石块",
"block.cobblemon.electric_gem_block": "草之宝石块",
"block.cobblemon.grass_gem_block": "电之宝石块",
"block.cobblemon.ice_gem_block": "冰之宝石块",
"block.cobblemon.fighting_gem_block": "格斗宝石块",
"block.cobblemon.poison_gem_block": "毒之宝石块",
"block.cobblemon.ground_gem_block": "地面宝石块",
"block.cobblemon.flying_gem_block": "飞行宝石块",
"block.cobblemon.psychic_gem_block": "超能力宝石块",
"block.cobblemon.bug_gem_block": "虫之宝石块",
"block.cobblemon.rock_gem_block": "岩石宝石块",
"block.cobblemon.ghost_gem_block": "幽灵宝石块",
"block.cobblemon.dragon_gem_block": "龙之宝石块",
"block.cobblemon.dark_gem_block": "恶之宝石块",
"block.cobblemon.steel_gem_block": "钢之宝石块",
"block.cobblemon.fairy_gem_block": "妖精宝石块",
"block.cobblemon.normal_gem_cluster": "一般宝石簇",
"block.cobblemon.fire_gem_cluster": "火之宝石簇",
"block.cobblemon.water_gem_cluster": "水之宝石簇",
"block.cobblemon.electric_gem_cluster": "电之宝石簇",
"block.cobblemon.grass_gem_cluster": "草之宝石簇",
"block.cobblemon.ice_gem_cluster": "冰之宝石簇",
"block.cobblemon.fighting_gem_cluster": "格斗宝石簇",
"block.cobblemon.poison_gem_cluster": "毒之宝石簇",
"block.cobblemon.ground_gem_cluster": "地面宝石簇",
"block.cobblemon.flying_gem_cluster": "飞行宝石簇",
"block.cobblemon.psychic_gem_cluster": "超能力宝石簇",
"block.cobblemon.bug_gem_cluster": "虫之宝石簇",
"block.cobblemon.rock_gem_cluster": "岩石宝石簇",
"block.cobblemon.ghost_gem_cluster": "幽灵宝石簇",
"block.cobblemon.dragon_gem_cluster": "龙之宝石簇",
"block.cobblemon.dark_gem_cluster": "恶之宝石簇",
"block.cobblemon.steel_gem_cluster": "钢之宝石簇",
"block.cobblemon.fairy_gem_cluster": "妖精宝石簇",
"cobblemon.item_class.technical_machine": "招式学习器",
"block.cobblemon.damaged_monitor": "损坏的数据显示器",
"block.cobblemon.tm_machine": "招式学习器机",
"block.cobblemon.disc_shelf": "唱片架",
"cobblemon.fishing_bait_effects.mark_chance.tooltip": "%1$s%% - 证章出现率+%3$s%%",
"cobblemon.fishing_bait_effects.alpha_chance.tooltip": "%1$s%% - 头目宝可梦出现率",
"cobblemon.fishing_bait_effects.size.tooltip": "%1$s%% - 体型%3$s%%",
"cobblemon.technical_machine_effect_header": "招式学习器机信息:",
"cobblemon.command.technicalmachine.invalid-tm": "无效招式学习器",
"cobblemon.ui.generic.question_marks": "???",
"cobblemon.container.tm_machine": "招式学习器机",
"cobblemon.ui.edit.habitat": "栖息地编辑器",
"cobblemon.ui.edit.habitat.mimic_id": "模仿方块ID",
"cobblemon.ui.edit.habitat.level_range": "等级范围(最小—最大)",
"cobblemon.ui.edit.habitat.mode": "模式:%s",
"cobblemon.ui.edit.habitat.mode.activated": "已激活",
"cobblemon.ui.edit.habitat.mode.natural": "自然",
"cobblemon.ui.edit.habitat.trigger": "触发器:%s",
"cobblemon.ui.edit.habitat.phase_number": "阶段数",
"cobblemon.ui.edit.habitat.phase_order": "阶段顺序:%s",
"cobblemon.ui.edit.habitat.spawn_range": "生成范围(方块数)",
"cobblemon.ui.edit.habitat.cancelled_range": "取消自然生成的范围(方块数)",
"cobblemon.ui.edit.habitat.max_spawns": "最大生成数量(-1为无限)",
"cobblemon.ui.edit.habitat.replace_spawns": "替换正常生成:%s",
"cobblemon.ui.edit.habitat.influence_range": "影响范围(方块数)",
"cobblemon.ui.edit.habitat.pool": "生成池:%s",
"cobblemon.ui.edit.habitat.pool.custom": "自定义",
"cobblemon.ui.edit.habitat.view_pool": "查看生成池",
"cobblemon.ui.edit.habitat.edit_pool": "编辑生成池",
"cobblemon.ui.edit.habitat.pool.title": "生成池编辑器",
"cobblemon.ui.edit.habitat.pool.species": "宝可梦",
"cobblemon.ui.edit.habitat.spawn.species_name": "宝可梦名称",
"cobblemon.ui.edit.habitat.pool.levels": "等级",
"cobblemon.ui.edit.habitat.pool.phases": "阶段",
"cobblemon.ui.edit.habitat.pool.position": "位置",
"cobblemon.ui.edit.habitat.pool.weight": "权重",
"cobblemon.ui.edit.habitat.pool.bucket": "稀有度档位",
"cobblemon.ui.edit.habitat.pool.add_spawn": "增加生成",
"cobblemon.ui.edit.habitat.pool.back": "返回",
"cobblemon.ui.edit.habitat.pool.select": "选择生成池",
"cobblemon.ui.edit.habitat.spawn": "生成编辑器",
"cobblemon.ui.edit.habitat.spawn.position_type": "位置类型:%s",
"cobblemon.ui.edit.habitat.spawn.bucket": "稀有度档位:%s",
"cobblemon.ui.edit.habitat.spawn.weight": "权重",
"cobblemon.ui.edit.habitat.spawn.level_range": "等级范围(最小—最大)",
"cobblemon.ui.edit.habitat.spawn.modifiers": "修饰词(例如:shiny gender=male)",
"cobblemon.ui.edit.habitat.spawn.phases": "阶段(例如:1-3, 5)",
"cobblemon.ui.edit.habitat.spawn.time_of_day": "时段",
"cobblemon.ui.edit.habitat.spawn.time_of_day.value": "时段:%s",
"cobblemon.ui.edit.habitat.spawn.time_of_day.any": "所有",
"cobblemon.ui.edit.habitat.spawn.min_light": "最低光照度(0-15,可选)",
"cobblemon.ui.edit.habitat.spawn.max_light": "最高光照度(0-15, 可选)",
"cobblemon.ui.edit.habitat.spawn.back": "返回",
"cobblemon.ui.edit.habitat.validation.mimic": "模仿方块必须是被允许且有效的方块ID(查看 habitat_mimics.json)。",
"cobblemon.ui.edit.habitat.validation.phases": "阶段数必须大于0。",
"cobblemon.ui.edit.habitat.validation.level_range": "等级范围必须处于1到100之间,且最小值不能大于最大值。",
"cobblemon.ui.edit.habitat.validation.spawn_range": "生成范围必须为0或更高。",
"cobblemon.ui.edit.habitat.validation.cancelled_range": "被取消的自然生成范围必须为 -1(不取消)或在 0 到 64 之间。",
"cobblemon.ui.edit.habitat.validation.max_spawns": "最大生成数必须是-1或更高。",
"cobblemon.ui.edit.habitat.validation.influence_range": "影响范围必须为0或更高。",
"cobblemon.ui.edit.habitat.validation.species": "必须为一个有效的宝可梦。",
"cobblemon.ui.edit.habitat.validation.weight": "权重必须大于0。",
"cobblemon.ui.edit.habitat.validation.modifiers": "修饰词的格式无效。",
"cobblemon.ui.edit.habitat.validation.min_light": "最低光照度必须处于0到15之间。",
"cobblemon.ui.edit.habitat.validation.max_light": "最高光照度必须处于0到15之间。",
"cobblemon.ui.moves.learnset.tm.discovered": "发现了",
"cobblemon.ui.moves.level": "等级提升",
"cobblemon.ui.moves.egg": "蛋",
"cobblemon.ui.moves.tm": "招式学习器",
"cobblemon.ui.tm_machine.can_learn": "能学习",
"cobblemon.ui.tm_machine.cannot_learn": "不能学",
"cobblemon.ui.tm_machine.learned": "已学会",
"cobblemon.tms.unknown_move": "未知招式",
"cobblemon.tms.already_known": "%1$s 已经学会了 %2$s!",
"cobblemon.tms.teach_move": "%1$s 学会了 %2$s!",
"cobblemon.tms.cannot_learn": "%1$s 不能学习 %2$s!",
"cobblemon.tms.unlock_tm": "你解锁了 %1$s 招式学习器!",
"cobblemon.tms.new_tms_learned": "学会了新的招式学习器!",
"cobblemon.tms.check_tmm": "查看招式学习器机"
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 317 B

After

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 B

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 B

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 B

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 274 B

@@ -190,7 +190,7 @@
"id": "panpour_simipour",
"variant": "item_interact",
"result": "simipour",
"consumeHeldItem": true,
"consumeHeldItem": false,
"learnableMoves": [],
"requirements": [],
"requiredContext": "cobblemon:water_stone"
@@ -8,19 +8,9 @@
"texture": "cobblemon:textures/pokemon/0102_exeggcute/exeggcute_alola_bias.png",
"layers": []
},
{
"aspects": ["alolan"],
"model": "cobblemon:exeggcute_alola_bias.geo",
"texture": "cobblemon:textures/pokemon/0102_exeggcute/exeggcute_alola_bias.png",
"layers": []
},
{
"aspects": ["shiny", "region-bias-alola"],
"texture": "cobblemon:textures/pokemon/0102_exeggcute/exeggcute_alola_bias_shiny.png"
},
{
"aspects": ["shiny", "alolan"],
"texture": "cobblemon:textures/pokemon/0102_exeggcute/exeggcute_alola_bias_shiny.png"
}
]
}