Compare commits

...
Author SHA1 Message Date
Plastered_Crab 1d8c3df1ab More cleanup 2026-06-19 23:36:40 -07:00
Plastered_Crab ca8ae8f999 Clean up 2026-06-19 20:33:57 -07:00
Plastered_Crab d902e4dbab bye bye white texture 2026-06-19 20:30:23 -07:00
Plastered_Crab 001efd86f3 Remove experimental tinting FX on recalled pokemon 2026-06-19 20:25:18 -07:00
Plastered_Crab 1f2b6173d4 when recalling replace Pokemon texture with a plain white texture and then tint it red 2026-06-19 19:59:31 -07:00
Plastered_Crab e4844c18fb Clean up 2026-06-19 13:12:07 -07:00
Plastered_Crab 2305a1792d Make red recall effect on PokemonRenderer stronger, fix placement of beam from pokeball when catching, show pokeball in hand when recalling party pokemon in both 1st and 3rd person 2026-06-19 12:59:14 -07:00
Plastered_Crab cf0a6d17e0 changes to return pokemon effect 2026-06-19 07:04:39 -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
lion 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
lion 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
阿鱼 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
Polymeta e15ac73b1b Merge branch 'fix-enchanted-fossil-items' into 'main'
Fix crash when using enchanted items in the ressurection machine

Closes #1973

See merge request cable-mc/cobblemon!2307
2026-06-11 21:48:56 +00:00
lion 6c6576c117 Fix crash when using enchanted items in the ressurection machine 2026-06-11 21:48:55 +00:00
Polymeta ebdfa7edc0 Merge branch 'fix-pokemon-properties-nickname-parsing-to-json' into 'main'
Add pokémon nickname when serializing and deserializing to json on pokémon properties

Closes #1981

See merge request cable-mc/cobblemon!2306
2026-06-11 13:48:21 +00:00
lion 297e8eae77 Add pokémon nickname when serializing and deserializing to json on pokémon properties 2026-06-11 13:48:21 +00:00
Polymeta ea8179018d Merge branch 'modded-discs-compat' into 'main'
Add modded discs compatibility with disc shelves

See merge request cable-mc/cobblemon!2305
2026-06-11 08:20:18 +00:00
lion 14fccfae1d Add modded discs compatibility with disc shelves 2026-06-11 08:20:18 +00:00
RedGenesectNinja a3c5a6c377 Implemented Yamask fixes 2026-06-09 21:58:33 -05:00
Watuneni iteite 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 iteite 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 iteite 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
Manrique 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 iteite 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 iteite 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 iteite 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
阿鱼 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
阿鱼 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
78 changed files with 1032 additions and 299 deletions

No files matched your search

+9
View File
@@ -300,6 +300,13 @@
- Regional Foods will now prioritize being eaten instead of used for healing Pokémon, shift clicking will use it as healing
- 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
@@ -360,6 +367,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.
- 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.
@@ -10,11 +10,13 @@ package com.cobblemon.mod.common.mixin.client;
import com.cobblemon.mod.common.OrientationControllable;
import com.cobblemon.mod.common.client.render.player.MountedPlayerRenderer;
import com.cobblemon.mod.common.client.render.player.RecallArmAnimationTracker;
import com.cobblemon.mod.common.duck.RidePassenger;
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import org.spongepowered.asm.mixin.Final;
@@ -96,4 +98,26 @@ public class HumanoidModelMixin {
MountedPlayerRenderer.INSTANCE.animate((HumanoidModel<AbstractClientPlayer>)(Object)this, pokemonEntity, player, netHeadYaw, headPitch, ageInTicks, limbSwing, limbSwingAmount);
}
}
// Pose the right arm forward while recalling so the held Poké Ball sits out in front.
@Inject(method = "setupAnim*", at = @At("TAIL"))
public void cobblemon$poseRecallArm(
LivingEntity entity,
float limbSwing,
float limbSwingAmount,
float ageInTicks,
float netHeadYaw,
float headPitch,
CallbackInfo ci
) {
if (!(entity instanceof AbstractClientPlayer player)) return;
// Skip while riding so we don't override the mounted-riding arm animation.
if (entity.getVehicle() instanceof PokemonEntity) return;
float raise = RecallArmAnimationTracker.INSTANCE.raiseFactor(player.getUUID());
if (raise <= 0f) return;
float armForwardXRot = (float) (-Math.PI / 2.0);
this.rightArm.xRot = Mth.lerp(raise, this.rightArm.xRot, armForwardXRot);
this.rightArm.yRot = Mth.lerp(raise, this.rightArm.yRot, 0f);
this.rightArm.zRot = Mth.lerp(raise, this.rightArm.zRot, 0f);
}
}
@@ -0,0 +1,45 @@
/*
* 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.mixin.client;
import com.cobblemon.mod.common.client.render.player.RecallArmAnimationTracker;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.layers.ItemInHandLayer;
import net.minecraft.world.entity.HumanoidArm;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
/**
* Hides the player's right-hand item while recalling so it doesn't overlap the recall Poké Ball
* drawn by PlayerRecallBallRenderer.
*/
@Mixin(ItemInHandLayer.class)
public class ItemInHandLayerMixin {
@Inject(method = "renderArmWithItem", at = @At("HEAD"), cancellable = true)
private void cobblemon$hideRecallHandItem(
LivingEntity entity,
ItemStack itemStack,
ItemDisplayContext itemDisplayContext,
HumanoidArm humanoidArm,
PoseStack poseStack,
MultiBufferSource multiBufferSource,
int light,
CallbackInfo ci
) {
if (humanoidArm == HumanoidArm.RIGHT && RecallArmAnimationTracker.INSTANCE.isRecalling(entity.getUUID())) {
ci.cancel();
}
}
}
@@ -9,6 +9,8 @@
package com.cobblemon.mod.common.mixin.client;
import com.cobblemon.mod.common.OrientationControllable;
import com.cobblemon.mod.common.client.render.player.FirstPersonRecallBallRenderer;
import com.cobblemon.mod.common.client.render.player.RecallArmAnimationTracker;
import com.cobblemon.mod.common.item.PokedexItem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
@@ -31,6 +33,12 @@ public class ItemInHandRendererMixin {
if (abstractClientPlayer.isUsingItem() && abstractClientPlayer.getUseItem().getItem() instanceof PokedexItem) {
ci.cancel();
}
// While recalling, swap the main-hand item for the rising Poké Ball.
else if (interactionHand == InteractionHand.MAIN_HAND
&& RecallArmAnimationTracker.INSTANCE.isRecalling(abstractClientPlayer.getUUID())
&& FirstPersonRecallBallRenderer.INSTANCE.render(poseStack, multiBufferSource, j, f)) {
ci.cancel();
}
else if (abstractClientPlayer instanceof OrientationControllable controllable && controllable.getOrientationController().isActive()) {
}
@@ -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
@@ -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()
@@ -759,6 +759,7 @@ open class PokemonProperties {
shiny?.let { json.addProperty(DataKeys.POKEMON_SHINY, it) }
gender?.let { json.addProperty(DataKeys.POKEMON_GENDER, it.name) }
species?.let { json.addProperty(DataKeys.POKEMON_SPECIES_TEXT, it) }
nickname?.let { json.addProperty(DataKeys.POKEMON_NICKNAME, it.string) }
form?.let { json.addProperty(DataKeys.POKEMON_FORM_ID, it) }
friendship?.let { json.addProperty(DataKeys.POKEMON_FRIENDSHIP, it) }
fullness?.let { json.addProperty(DataKeys.POKEMON_FULLNESS, it) }
@@ -795,6 +796,7 @@ open class PokemonProperties {
shiny = json.get(DataKeys.POKEMON_SHINY)?.asBoolean
gender = json.get(DataKeys.POKEMON_GENDER)?.asString?.let { Gender.valueOf(it) }
species = json.get(DataKeys.POKEMON_SPECIES_TEXT)?.asString
nickname = json.get(DataKeys.POKEMON_NICKNAME)?.asString?.let(Component::literal)
form = json.get(DataKeys.POKEMON_FORM_ID)?.asString
friendship = json.get(DataKeys.POKEMON_FRIENDSHIP)?.asInt
fullness = json.get(DataKeys.POKEMON_FULLNESS)?.asInt
@@ -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)
}
@@ -16,24 +16,20 @@ import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.core.HolderLookup
import net.minecraft.core.NonNullList
import net.minecraft.core.component.DataComponents
import net.minecraft.nbt.CompoundTag
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket
import net.minecraft.sounds.SoundEvent
import net.minecraft.sounds.SoundSource
import net.minecraft.world.ContainerHelper
import net.minecraft.world.Containers
import net.minecraft.world.InteractionResult
import net.minecraft.world.ItemInteractionResult
import net.minecraft.world.WorldlyContainer
import net.minecraft.world.*
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.level.gameevent.GameEvent
import java.util.OptionalInt
import net.minecraft.world.phys.BlockHitResult
import java.util.*
import kotlin.math.pow
class DiscShelfBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(CobblemonBlockEntities.DISC_SHELF, pos, state), WorldlyContainer {
@@ -134,25 +130,7 @@ class DiscShelfBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobbl
return stack.item is TechnicalMachineItem
|| stack.item == CobblemonItems.UPGRADE
|| stack.item == CobblemonItems.DUBIOUS_DISC
|| stack.item == Items.MUSIC_DISC_13
|| stack.item == Items.MUSIC_DISC_CAT
|| stack.item == Items.MUSIC_DISC_BLOCKS
|| stack.item == Items.MUSIC_DISC_CHIRP
|| stack.item == Items.MUSIC_DISC_FAR
|| stack.item == Items.MUSIC_DISC_MALL
|| stack.item == Items.MUSIC_DISC_MELLOHI
|| stack.item == Items.MUSIC_DISC_STAL
|| stack.item == Items.MUSIC_DISC_STRAD
|| stack.item == Items.MUSIC_DISC_WARD
|| stack.item == Items.MUSIC_DISC_11
|| stack.item == Items.MUSIC_DISC_WAIT
|| stack.item == Items.MUSIC_DISC_OTHERSIDE
|| stack.item == Items.MUSIC_DISC_5
|| stack.item == Items.MUSIC_DISC_RELIC
|| stack.item == Items.MUSIC_DISC_PRECIPICE
|| stack.item == Items.MUSIC_DISC_CREATOR
|| stack.item == Items.MUSIC_DISC_CREATOR_MUSIC_BOX
|| stack.item == Items.MUSIC_DISC_PIGSTEP
|| stack.has(DataComponents.JUKEBOX_PLAYABLE)
}
fun onNoteBlockPulse(level: Level, noteBlockPos: BlockPos, soundEvent: SoundEvent) {
@@ -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()
@@ -630,7 +630,8 @@ class FossilMultiblockStructure (
result.putInt(DataKeys.ORGANIC_MATERIAL, organicMaterialInside)
val fossilInv = ListTag()
fossilInventory.forEach { fossilInv.add(ItemStack.CODEC.encodeStart(NbtOps.INSTANCE, it).orThrow) }
val ops = registryLookup.createSerializationContext(NbtOps.INSTANCE)
fossilInventory.forEach { fossilInv.add(ItemStack.CODEC.encodeStart(ops, it).getOrThrow()) }
result.put(DataKeys.FOSSIL_INVENTORY, fossilInv)
result.putString(DataKeys.CONNECTOR_DIRECTION, tankConnectorDirection?.toString())
@@ -669,7 +670,10 @@ class FossilMultiblockStructure (
val fossilInv = if (nbt.contains(DataKeys.FOSSIL_INVENTORY)) { (nbt.get(DataKeys.FOSSIL_INVENTORY) as ListTag) } else ListTag()
val actualFossilList = mutableListOf<ItemStack>()
fossilInv.forEach { ItemStack.parse(registryLookup, it).ifPresent(actualFossilList::add) }
val ops = registryLookup.createSerializationContext(NbtOps.INSTANCE)
fossilInv.forEach { ItemStack.CODEC.parse(ops, it).result().ifPresent(actualFossilList::add) }
result.fossilInventory = actualFossilList
result.tankConnectorDirection = Direction.byName(nbt.getString(DataKeys.CONNECTOR_DIRECTION))
@@ -44,6 +44,7 @@ import com.cobblemon.mod.common.client.render.entity.PokeBobberEntityRenderer
import com.cobblemon.mod.common.client.render.generic.GenericBedrockRenderer
import com.cobblemon.mod.common.client.render.item.CobblemonBuiltinItemRendererRegistry
import com.cobblemon.mod.common.client.render.item.PokemonItemRenderer
import com.cobblemon.mod.common.client.render.layer.PlayerRecallBallRenderer
import com.cobblemon.mod.common.client.render.layer.PokemonOnShoulderRenderer
import com.cobblemon.mod.common.client.render.models.blockbench.bedrock.animation.BedrockAnimationRepository
import com.cobblemon.mod.common.client.render.models.blockbench.repository.BerryModelRepository
@@ -405,8 +406,10 @@ object CobblemonClient {
var renderer: LivingEntityRenderer<Player, PlayerModel<Player>>? =
skinMap?.get(PlayerSkin.Model.WIDE) as LivingEntityRenderer<Player, PlayerModel<Player>>
renderer?.addLayer(PokemonOnShoulderRenderer(renderer))
renderer?.addLayer(PlayerRecallBallRenderer(renderer))
renderer = skinMap[PlayerSkin.Model.SLIM] as LivingEntityRenderer<Player, PlayerModel<Player>>?
renderer?.addLayer(PokemonOnShoulderRenderer(renderer))
renderer?.addLayer(PlayerRecallBallRenderer(renderer))
}
private fun registerMenuScreens() {
@@ -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
@@ -32,6 +32,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.animation.ActiveAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.animation.PrimaryAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
import com.cobblemon.mod.common.client.render.player.RecallArmAnimationTracker
import com.cobblemon.mod.common.client.render.pokemon.PokemonRenderer.Companion.ease
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.net.messages.server.pokemon.update.ServerboundUpdateRidingStatePacket
@@ -320,6 +321,13 @@ class PokemonClientDelegate : PosableState(), PokemonSideDelegate {
ballOffset = 0f
ballRotOffset = 0f
sendOutPosition = null
// If a player is recalling, have them hold the matching Poké Ball out in their
// right hand for the duration of the beam (see ourRecallArmAnimationTracker class).
currentEntity.ownerUUID?.let { ownerId ->
if (currentEntity.level().getPlayerByUUID(ownerId) != null) {
RecallArmAnimationTracker.start(ownerId, currentEntity.exposedBall, emptySet())
}
}
afterOnClient(seconds = BEAM_EXTEND_TIME) {
activeSendoutScale = 1F
@@ -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(
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.util.cobblemonResource
import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.blaze3d.vertex.VertexConsumer
import com.mojang.math.Axis
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.LevelRenderer
import net.minecraft.client.renderer.MultiBufferSource
import net.minecraft.client.renderer.RenderType
@@ -39,13 +40,13 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
private val leftMargin = 1f
private val rightMargin = 1f
private val topMargin = 1f
private val bottomMargin = 1f
private val interRowSpacing = 0f
private val tmOverlayDepthOffset = -0.0002f
private val slotBrightnessMultiplier = 0.65f
private val tmBaseTexture = cobblemonResource("textures/block/disc_shelf/technical_machine_base.png")
private val tmOverlayTexture = cobblemonResource("textures/block/disc_shelf/technical_machine_overlay.png")
private val musicDiscUnknownTexture = cobblemonResource("textures/block/disc_shelf/music_disc_unknown.png")
override fun render(
entity: DiscShelfBlockEntity,
@@ -77,7 +78,6 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
val slotWidth = slotWidthPixels / textureSize
val slotHeight = slotHeightPixels / textureSize
val verticalSpacing = (slotHeightPixels + interRowSpacing) / textureSize
val totalHeight = slotHeight * 7 + interRowSpacing * 6 / textureSize
val startY = topMargin / textureSize
for ((index, item) in entity.items.withIndex()) {
@@ -188,6 +188,13 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
private fun getItemTexture(itemStack: ItemStack): ResourceLocation {
val id = BuiltInRegistries.ITEM.getKey(itemStack.item)
return cobblemonResource("textures/block/disc_shelf/${id.path}.png")
val resource = cobblemonResource("textures/block/disc_shelf/${id.path}.png")
val resourceManager = Minecraft.getInstance().resourceManager
if (resourceManager.getResource(resource).isEmpty) {
return musicDiscUnknownTexture
}
return resource
}
}
@@ -0,0 +1,127 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.layer
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
import com.cobblemon.mod.common.client.render.player.RecallArmAnimationTracker
import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.math.Axis
import net.minecraft.client.Minecraft
import net.minecraft.client.model.PlayerModel
import net.minecraft.client.renderer.MultiBufferSource
import net.minecraft.client.renderer.RenderType
import net.minecraft.client.renderer.entity.ItemRenderer
import net.minecraft.client.renderer.entity.RenderLayerParent
import net.minecraft.client.renderer.entity.layers.RenderLayer
import net.minecraft.client.renderer.texture.OverlayTexture
import net.minecraft.world.entity.HumanoidArm
import net.minecraft.world.entity.player.Player
import net.minecraft.world.phys.Vec3
import org.joml.Vector3f
/**
* Draws the matching Poké Ball in a recalling player's right hand and records where the recall beam
* should start. Driven by [RecallArmAnimationTracker]; the right arm is posed forward in
* HumanoidModelMixin so [PlayerModel.translateToHand] lands on the extended hand.
*
* The local player in first person is handled by FirstPersonRecallBallRenderer instead, so it's
* skipped here.
*/
class PlayerRecallBallRenderer<T : Player>(
renderLayerParent: RenderLayerParent<T, PlayerModel<T>>
) : RenderLayer<T, PlayerModel<T>>(renderLayerParent) {
companion object {
private const val BALL_SCALE = 0.5F
private const val HAND_X = 0.0625
private const val HAND_Y = 0.125
private const val HAND_Z = -0.625
private const val BALL_YAW_SPIN = 180F
private const val BALL_INFLATE = 1.08F
private const val BEAM_X_OFFSET = 0F
private const val BEAM_Y_OFFSET = 0.18F
private const val BEAM_Z_OFFSET = -0.30F
}
private val ballContext = RenderContext().also {
it.put(RenderContext.RENDER_STATE, RenderContext.RenderState.WORLD)
}
override fun render(
matrixStack: PoseStack,
buffer: MultiBufferSource,
packedLight: Int,
player: T,
limbSwing: Float,
limbSwingAmount: Float,
partialTicks: Float,
ageInTicks: Float,
netHeadYaw: Float,
headPitch: Float
) {
val anim = RecallArmAnimationTracker.get(player.uuid) ?: return
val mc = Minecraft.getInstance()
if (player === mc.player && mc.options.cameraType.isFirstPerson) return
matrixStack.pushPose()
getParentModel().translateToHand(HumanoidArm.RIGHT, matrixStack)
matrixStack.mulPose(Axis.XP.rotationDegrees(-90F))
matrixStack.mulPose(Axis.YP.rotationDegrees(180F))
matrixStack.translate(HAND_X, HAND_Y, HAND_Z)
renderBall(anim, matrixStack, buffer, packedLight, partialTicks)
matrixStack.popPose()
}
private fun renderBall(
anim: RecallArmAnimationTracker.RecallAnim,
matrixStack: PoseStack,
buffer: MultiBufferSource,
packedLight: Int,
partialTicks: Float
) {
val state = anim.ballState
val ball = anim.ball
matrixStack.pushPose()
matrixStack.scale(BALL_INFLATE, BALL_INFLATE, BALL_INFLATE)
matrixStack.translate(0.0, (-8.0 / 16.0) * BALL_SCALE, 0.0)
matrixStack.scale(BALL_SCALE, -BALL_SCALE, -BALL_SCALE)
matrixStack.mulPose(Axis.YP.rotationDegrees(BALL_YAW_SPIN))
val model = VaryingModelRepository.getPoser(ball.name, state)
val texture = VaryingModelRepository.getTexture(ball.name, state)
state.updatePartialTicks(partialTicks)
model.context = ballContext
ballContext.put(RenderContext.ASPECTS, state.aspects)
ballContext.put(RenderContext.POSABLE_STATE, state)
model.applyAnimations(null, state, 0F, 0F, 0F, 0F, 0F)
state.locatorStates["beam"]?.let { beamLocator ->
matrixStack.pushPose()
matrixStack.mulPose(beamLocator.matrix)
val camRelative = matrixStack.last().pose().transformPosition(Vector3f(BEAM_X_OFFSET, BEAM_Y_OFFSET, BEAM_Z_OFFSET))
matrixStack.popPose()
val camera = Minecraft.getInstance().gameRenderer.mainCamera.position
anim.beamOrigin = Vec3(camera.x + camRelative.x, camera.y + camRelative.y, camera.z + camRelative.z)
}
val consumer = ItemRenderer.getFoilBufferDirect(buffer, RenderType.entityCutout(texture), false, false)
model.render(ballContext, matrixStack, consumer, packedLight, OverlayTexture.NO_OVERLAY, -0x1)
model.red = 1F
model.green = 1F
model.blue = 1F
model.resetLayerContext()
matrixStack.popPose()
}
}
@@ -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
@@ -0,0 +1,76 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.player
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.math.Axis
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.MultiBufferSource
import net.minecraft.client.renderer.RenderType
import net.minecraft.client.renderer.entity.ItemRenderer
import net.minecraft.client.renderer.texture.OverlayTexture
/**
* Draws the recalling player's Poké Ball in first person, rising into view from the bottom of the
* screen in place of their held item. The world-space beam still starts near the hand (the eye/look
* fallback in PokemonRenderer), so this is cosmetic only.
*
* Called from ItemInHandRendererMixin, which cancels the vanilla main-hand item while recalling.
*/
object FirstPersonRecallBallRenderer {
/** Resting position of the ball in view space (right, up, forward). */
private const val REST_X = 0.45
private const val REST_Y = -0.55
private const val REST_Z = -.6
/** How far below REST_Y the ball starts before rising into view. */
private const val RISE_DISTANCE = 0.6
private const val BALL_SCALE = 0.45F
private val ballContext = RenderContext().also {
it.put(RenderContext.RENDER_STATE, RenderContext.RenderState.WORLD)
}
/**
* @return true if a recall ball was rendered (so the caller should cancel the vanilla item).
*/
fun render(poseStack: PoseStack, buffer: MultiBufferSource, packedLight: Int, partialTicks: Float): Boolean {
val player = Minecraft.getInstance().player ?: return false
val anim = RecallArmAnimationTracker.get(player.uuid) ?: return false
val rise = RecallArmAnimationTracker.raiseFactor(player.uuid)
poseStack.pushPose()
poseStack.translate(REST_X, REST_Y - RISE_DISTANCE * (1.0 - rise), REST_Z)
poseStack.scale(BALL_SCALE, -BALL_SCALE, -BALL_SCALE)
poseStack.mulPose(Axis.YP.rotationDegrees(180F))
poseStack.mulPose(Axis.XP.rotationDegrees(15F))
val state = anim.ballState
val ball = anim.ball
val model = VaryingModelRepository.getPoser(ball.name, state)
val texture = VaryingModelRepository.getTexture(ball.name, state)
state.updatePartialTicks(partialTicks)
model.context = ballContext
ballContext.put(RenderContext.ASPECTS, state.aspects)
ballContext.put(RenderContext.POSABLE_STATE, state)
model.applyAnimations(null, state, 0F, 0F, 0F, 0F, 0F)
val consumer = ItemRenderer.getFoilBufferDirect(buffer, RenderType.entityCutout(texture), false, false)
model.render(ballContext, poseStack, consumer, packedLight, OverlayTexture.NO_OVERLAY, -0x1)
model.red = 1F
model.green = 1F
model.blue = 1F
model.resetLayerContext()
poseStack.popPose()
return true
}
}
@@ -0,0 +1,73 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.player
import com.cobblemon.mod.common.client.battle.ClientBallDisplay
import com.cobblemon.mod.common.pokeball.PokeBall
import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
import net.minecraft.util.Mth
import net.minecraft.world.phys.Vec3
/**
* Tracks which players are recalling a Pokémon so we can pose their arm, draw the Poké Ball in their
* hand, and start the recall beam from it.
*
* Keyed by player UUID. Entries time out on their own once the beam is done, and a new recall resets
* the timer, so nothing has to clear them.
*
* Written by PokemonClientDelegate on recall (beamMode 3); read by HumanoidModelMixin, the ball
* renderers, and PokemonRenderer.
*/
object RecallArmAnimationTracker {
// How long the arm stays raised, in seconds.
const val ARM_HOLD_SECONDS = 0.8
// Fraction of the hold spent easing the arm up at the start and down at the end.
private const val EASE_SECONDS = 0.15
class RecallAnim(
val ball: PokeBall,
val aspects: Set<String>,
val startTimeMs: Long
) {
val ballState = ClientBallDisplay(ball, aspects)
var beamOrigin: Vec3? = null
}
private val activeRecalls = ConcurrentHashMap<UUID, RecallAnim>()
fun start(playerUuid: UUID, ball: PokeBall, aspects: Set<String>) {
activeRecalls[playerUuid] = RecallAnim(ball, aspects, System.currentTimeMillis())
}
/** Returns the active recall for the player, or null if there is none or if it has expired. */
fun get(playerUuid: UUID): RecallAnim? {
val anim = activeRecalls[playerUuid] ?: return null
if (secondsSince(anim) > ARM_HOLD_SECONDS) {
activeRecalls.remove(playerUuid)
return null
}
return anim
}
fun isRecalling(playerUuid: UUID): Boolean = get(playerUuid) != null
private fun secondsSince(anim: RecallAnim) = (System.currentTimeMillis() - anim.startTimeMs) / 1000.0
/** 0..1 ramp: eases in at the start, holds at 1, eases out at the end. 0 when not recalling. */
fun raiseFactor(playerUuid: UUID): Float {
val anim = get(playerUuid) ?: return 0F
val elapsed = secondsSince(anim)
val riseIn = Mth.clamp((elapsed / EASE_SECONDS).toFloat(), 0F, 1F)
val fallOut = Mth.clamp(((ARM_HOLD_SECONDS - elapsed) / EASE_SECONDS).toFloat(), 0F, 1F)
return minOf(riseIn, fallOut)
}
}
@@ -26,6 +26,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PosableP
import com.cobblemon.mod.common.client.render.models.blockbench.repository.MiscModelRepository
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
import com.cobblemon.mod.common.client.render.player.RecallArmAnimationTracker
import com.cobblemon.mod.common.client.render.pokeball.PokeBallPosableState
import com.cobblemon.mod.common.client.render.renderBeaconBeam
import com.cobblemon.mod.common.client.settings.ServerSettings
@@ -60,6 +61,7 @@ import net.minecraft.network.chat.Style
import net.minecraft.resources.ResourceLocation
import net.minecraft.util.Mth
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.player.Player
import net.minecraft.world.phys.Vec3
import org.joml.*
import kotlin.math.*
@@ -69,6 +71,9 @@ class PokemonRenderer(
) : MobRenderer<PokemonEntity, PosablePokemonEntityModel>(context, PosablePokemonEntityModel(), 0.5f) {
companion object {
val recallBeamColour = Vector4f(1F, 0.1F, 0.1F, 1F)
private const val CAPTURE_BEAM_X_OFFSET = 0.0
private const val CAPTURE_BEAM_Y_OFFSET = 0.2
private const val CAPTURE_BEAM_Z_OFFSET = 0.45
fun ease(x: Double): Double {
return 1 - (1 - x).pow(3)
}
@@ -142,8 +147,6 @@ class PokemonRenderer(
}
modelNow.setLayerContext(buffer, clientDelegate, VaryingModelRepository.getLayers(entity.pokemon.species.resourceIdentifier, clientDelegate))
if (entity.passengers.isNotEmpty()) {
renderRiding(entity, entityYaw, partialTicks, poseMatrix, buffer, packedLight)
} else {
@@ -316,8 +319,15 @@ class PokemonRenderer(
fun renderBeam(matrixStack: PoseStack, partialTicks: Float, entity: PokemonEntity, beamTarget: Entity, buffer: MultiBufferSource, offset: Vec3) {
val clientDelegate = entity.delegate as PokemonClientDelegate
val pokemonPosition = entity.position().add(0.0, entity.bbHeight / 2.0 * clientDelegate.activeSendoutScale.toDouble(), 0.0)
var beamSourcePosition = if (beamTarget is EmptyPokeBallEntity) {
(beamTarget.delegate as PokeBallPosableState).locatorStates["beam"]?.getOrigin() ?: beamTarget.position()
// If a player is recalling, start the beam from the Poké Ball held in their hand
val recallBallOrigin = (beamTarget as? Player)?.let { RecallArmAnimationTracker.get(it.uuid)?.beamOrigin }
var beamSourcePosition = if (recallBallOrigin != null) {
recallBallOrigin
} else if (beamTarget is EmptyPokeBallEntity) {
(beamTarget.delegate as PokeBallPosableState).locatorStates["beam"]
?.transformPosition(Vec3(CAPTURE_BEAM_X_OFFSET, CAPTURE_BEAM_Y_OFFSET, CAPTURE_BEAM_Z_OFFSET))
?: beamTarget.position()
} else {
if (beamTarget.uuid == Minecraft.getInstance().player?.uuid) {
val lookVec = beamTarget.lookAngle.yRot((PI / 2).toFloat()).multiply(1.0, 0.0, 1.0).normalize()
@@ -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 } }" } ?: "" }"
}
@@ -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"
@@ -27,6 +27,7 @@
"client.EntryListWidgetMixin",
"client.GameRendererMixin",
"client.HumanoidModelMixin",
"client.ItemInHandLayerMixin",
"client.ItemInHandRendererMixin",
"client.ItemRendererMixin",
"client.LivingEntityRendererMixin",
@@ -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"
}
]
}