mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-28 13:06:25 -04:00
Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4c4dadee1 | ||
|
|
990cb1886e | ||
|
|
15ae1100ac | ||
|
|
f4140a097d | ||
|
|
b79dbcca80 | ||
|
|
5ac12a897a | ||
|
|
ae5f7c83f2 | ||
|
|
4caa736e0b | ||
|
|
c3e9051918 | ||
|
|
0b38e063d2 |
+1
-27
@@ -2,41 +2,15 @@
|
||||
## [1.8.x (MONTH xth, 2026)](#1-8-x)
|
||||
|
||||
### Additions
|
||||
|
||||
### New rideable Pokémon
|
||||
|
||||
### Pokémon Added
|
||||
|
||||
### Model updates for the following Pokémon
|
||||
- Froakie
|
||||
- Frogadier
|
||||
- Greninja
|
||||
(They have eyelids now.)
|
||||
|
||||
### Animation updates for the following Pokémon
|
||||
- Froakie
|
||||
- Frogadier
|
||||
- Greninja
|
||||
(They can blink now.)
|
||||
- You can now view the biome, level, and date you caught a Pokémon.
|
||||
|
||||
### Changes
|
||||
- Reworked spawn presets and added structure tags for spawns
|
||||
|
||||
### Fixes
|
||||
- Fixed blank Cooking Pot recipe book entries and missing tabs on Fabric.
|
||||
- Fixed Minior's "Shields Down" ability not working as intended
|
||||
- Fixed Dusclops using Squirtle's cry
|
||||
- Fixed size error with ceiling attached Orb hitbox
|
||||
|
||||
### Developer
|
||||
|
||||
### Molang & Datapacks
|
||||
- Added `q.target_fainted` function to move action effects that checks if any opponents fainted from the move.
|
||||
|
||||
### Particles
|
||||
- Updated Water shuriken to account for new `q.target_fainted` function
|
||||
|
||||
#### New Move Animations
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
@@ -0,0 +1,25 @@
|
||||
# Changelog
|
||||
## [1.8.4 (October 27th, 2026)](#1-8-4)
|
||||
|
||||
### Changes
|
||||
- The Froakie line now blinks. The world will never be the same.
|
||||
|
||||
### Fixes
|
||||
- Fixed heaps of spawns not working. This was caused by us missing something before release. RIP.
|
||||
- Fixed a crash caused by Fearow blinking while you're riding one. Makes sense to me.
|
||||
- Fixed Minior's "Shields Down" ability being very broken.
|
||||
- Fixed Dusclops using Squirtle's cry sound (lol).
|
||||
- Fixed blank Cooking Pot recipe book entries and missing tabs on Fabric.
|
||||
- Fixed a hitbox issue with placeable Orb held items attached to a ceiling.
|
||||
- Fixed something sneaky. I'll tell you about it later.
|
||||
|
||||
### Molang & Datapacks
|
||||
- Added `q.target_fainted` function to move action effects that checks if any opponents fainted from the move.
|
||||
|
||||
### Particles
|
||||
- Updated Water Shuriken effect to be timed better when the opponent faints.
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
- Korean
|
||||
- Simplified Chinese
|
||||
@@ -344,6 +344,7 @@ object CobblemonNetwork {
|
||||
list.add(PacketRegisterInfo(RideStaminaUpdatePacket.ID, RideStaminaUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||
list.add(PacketRegisterInfo(AlphaUpdatePacket.ID, AlphaUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||
list.add(PacketRegisterInfo(ScaleModifierUpdatePacket.ID, ScaleModifierUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||
list.add(PacketRegisterInfo(MetDataUpdatePacket.ID, MetDataUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||
|
||||
// Evolution start
|
||||
list.add(PacketRegisterInfo(AddEvolutionPacket.ID, AddEvolutionPacket::decode, PokemonUpdatePacketHandler()))
|
||||
|
||||
+67
-7
@@ -6,23 +6,59 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.gui.summary.widgets.screens.moves
|
||||
package com.cobblemon.mod.common.client.gui.summary
|
||||
|
||||
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
|
||||
import com.cobblemon.mod.common.client.render.drawScaledText
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.client.gui.components.ObjectSelectionList
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.util.Mth
|
||||
|
||||
class MoveDescriptionScrollList(
|
||||
class ScrollableTextBoxEntry(
|
||||
var line : MutableComponent
|
||||
) :
|
||||
ObjectSelectionList.Entry<ScrollableTextBoxEntry>() {
|
||||
|
||||
override fun render(
|
||||
context: GuiGraphics,
|
||||
index: Int,
|
||||
rowTop: Int,
|
||||
rowLeft: Int,
|
||||
rowWidth: Int,
|
||||
rowHeight: Int,
|
||||
mouseX: Int,
|
||||
mouseY: Int,
|
||||
isHovered: Boolean,
|
||||
partialTicks: Float
|
||||
) {
|
||||
drawScaledText(
|
||||
context = context,
|
||||
text = line,
|
||||
x = rowLeft + 82,
|
||||
y = rowTop,
|
||||
scale = 0.5F,
|
||||
shadow = true
|
||||
)
|
||||
}
|
||||
|
||||
override fun getNarration(): Component {
|
||||
return line
|
||||
}
|
||||
}
|
||||
|
||||
class ScrollableTextBox(
|
||||
private val listX: Int,
|
||||
private val listY: Int,
|
||||
height: Int,
|
||||
width: Int,
|
||||
slotHeight: Int
|
||||
) : ObjectSelectionList<MoveDescriptionEntry>(
|
||||
) : ObjectSelectionList<ScrollableTextBoxEntry>(
|
||||
Minecraft.getInstance(),
|
||||
60, // width
|
||||
30, // height
|
||||
width, // width
|
||||
height, // height
|
||||
0, // top
|
||||
slotHeight
|
||||
), CobblemonRenderable {
|
||||
@@ -38,8 +74,31 @@ class MoveDescriptionScrollList(
|
||||
return x + width - 3
|
||||
}
|
||||
|
||||
override fun getMaxPosition(): Int {
|
||||
return super.getMaxPosition() + 3 // add bottom padding
|
||||
}
|
||||
|
||||
// we do our own scrollbar rendering, and this being true renders the vanilla one
|
||||
override fun scrollbarVisible() = false
|
||||
|
||||
override fun renderWidget(context: GuiGraphics, pMouseX: Int, pMouseY: Int, f: Float) {
|
||||
isHovered = pMouseX >= x && pMouseY >= y && pMouseX < x + width && pMouseY < y + height
|
||||
|
||||
if (maxScroll > 0) {
|
||||
val right = x + width
|
||||
val bottom = y + height
|
||||
val darkGray = 0xFF5B595B.toInt()
|
||||
val lightGray = 0xFF8C8C8C.toInt()
|
||||
context.fill(right - 2, y + 2, right - 4, bottom - 2, darkGray)
|
||||
// vanilla scrollbar mumbo jumbo
|
||||
var scrollHeight = ((height * height).toFloat() / maxPosition.toFloat()).toInt()
|
||||
scrollHeight = Mth.clamp(scrollHeight, 32, height - 8)
|
||||
var scrollY = scrollAmount.toInt() * (height - scrollHeight + 2) / maxScroll + y - 1
|
||||
if (scrollY < y) { scrollY = y }
|
||||
|
||||
context.fill(right - 2, scrollY + 2, right - 4, scrollY + scrollHeight - 3, lightGray)
|
||||
}
|
||||
|
||||
context.enableScissor(
|
||||
x,
|
||||
y,
|
||||
@@ -79,7 +138,7 @@ class MoveDescriptionScrollList(
|
||||
&& mouseY < bottom
|
||||
}
|
||||
|
||||
fun setMoveDescription(moveDescription: MutableComponent) {
|
||||
fun setText(moveDescription: MutableComponent) {
|
||||
clearEntries()
|
||||
val splitWidth = 100
|
||||
val text = moveDescription.string
|
||||
@@ -103,7 +162,8 @@ class MoveDescriptionScrollList(
|
||||
}
|
||||
|
||||
for (part in splitText) {
|
||||
addEntry(MoveDescriptionEntry(Component.literal(part)))
|
||||
addEntry(ScrollableTextBoxEntry(Component.literal(part)))
|
||||
}
|
||||
scrollAmount = 0.0
|
||||
}
|
||||
}
|
||||
+32
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.api.gui.MultiLineLabelK
|
||||
import com.cobblemon.mod.common.api.gui.blitk
|
||||
import com.cobblemon.mod.common.api.text.*
|
||||
import com.cobblemon.mod.common.client.CobblemonResources
|
||||
import com.cobblemon.mod.common.client.gui.summary.ScrollableTextBox
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.SoundlessWidget
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.common.reformatNatureTextIfMinted
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.stats.StatWidget.Companion.SCALE
|
||||
@@ -27,6 +28,7 @@ import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
|
||||
class InfoWidget(
|
||||
pX: Int,
|
||||
@@ -45,6 +47,25 @@ class InfoWidget(
|
||||
private val infoBaseResource = cobblemonResource("textures/gui/summary/summary_info_base.png")
|
||||
}
|
||||
|
||||
private var metDataWidget: ScrollableTextBox = ScrollableTextBox(x + 5, y + 123, 20, 61, 5)
|
||||
|
||||
init {
|
||||
pokemon.metData?.let { metData ->
|
||||
val biome = ResourceLocation.parse(metData.biome.registeredName)
|
||||
val biomeName = Component.translatable("biome.${biome.namespace}.${biome.path}")
|
||||
metDataWidget.setText(lang("ui.info.met_data",
|
||||
biomeName,
|
||||
metData.date.monthValue,
|
||||
metData.date.dayOfMonth,
|
||||
metData.date.year,
|
||||
metData.level
|
||||
))
|
||||
} ?: run {
|
||||
metDataWidget.setText(lang("ui.info.met_data_unavailable"))
|
||||
}
|
||||
addWidget(metDataWidget)
|
||||
}
|
||||
|
||||
override fun renderWidget(context: GuiGraphics, pMouseX: Int, pMouseY: Int, pPartialTicks: Float) {
|
||||
val matrices = context.pose()
|
||||
// Base texture
|
||||
@@ -163,6 +184,17 @@ class InfoWidget(
|
||||
)
|
||||
matrices.popPose()
|
||||
|
||||
metDataWidget.render(context, pMouseX, pMouseY, pPartialTicks)
|
||||
|
||||
|
||||
// val textLines = mutableListOf<MutableComponent>()
|
||||
// pokemon.metData?.let { metData ->
|
||||
|
||||
// }
|
||||
//
|
||||
// metDataWidget.textLines = textLines
|
||||
// metDataWidget.render(context, pMouseX, pMouseY, pPartialTicks)
|
||||
|
||||
drawScaledText(
|
||||
context = context,
|
||||
text = lang("ui.info.experience_points"),
|
||||
|
||||
-47
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* 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.summary.widgets.screens.moves
|
||||
|
||||
import com.cobblemon.mod.common.client.render.drawScaledText
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.client.gui.components.ObjectSelectionList
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
|
||||
class MoveDescriptionEntry(
|
||||
var line : MutableComponent
|
||||
) :
|
||||
ObjectSelectionList.Entry<MoveDescriptionEntry>() {
|
||||
|
||||
override fun render(
|
||||
context: GuiGraphics,
|
||||
index: Int,
|
||||
rowTop: Int,
|
||||
rowLeft: Int,
|
||||
rowWidth: Int,
|
||||
rowHeight: Int,
|
||||
mouseX: Int,
|
||||
mouseY: Int,
|
||||
isHovered: Boolean,
|
||||
partialTicks: Float
|
||||
) {
|
||||
drawScaledText(
|
||||
context = context,
|
||||
text = line,
|
||||
x = rowLeft + 82,
|
||||
y = rowTop,
|
||||
scale = 0.5F,
|
||||
shadow = true
|
||||
)
|
||||
}
|
||||
|
||||
override fun getNarration(): Component {
|
||||
return line
|
||||
}
|
||||
}
|
||||
+6
-3
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.api.gui.blitk
|
||||
import com.cobblemon.mod.common.api.moves.Move
|
||||
import com.cobblemon.mod.common.api.text.text
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.gui.summary.ScrollableTextBox
|
||||
import com.cobblemon.mod.common.client.gui.summary.Summary
|
||||
import com.cobblemon.mod.common.client.gui.summary.widgets.SoundlessWidget
|
||||
import com.cobblemon.mod.common.client.render.drawScaledText
|
||||
@@ -70,9 +71,11 @@ class MovesWidget(
|
||||
addWidget(it)
|
||||
}
|
||||
|
||||
private var descriptionScrollList = MoveDescriptionScrollList(
|
||||
x + 69,
|
||||
private var descriptionScrollList = ScrollableTextBox(
|
||||
x + 68,
|
||||
y + 113,
|
||||
30,
|
||||
61,
|
||||
5
|
||||
)
|
||||
|
||||
@@ -215,7 +218,7 @@ class MovesWidget(
|
||||
|
||||
fun selectMove(move: Move?) {
|
||||
selectedMove = if (selectedMove == move || move == null) null else move
|
||||
descriptionScrollList.setMoveDescription(selectedMove?.description ?: "".text())
|
||||
descriptionScrollList.setText(selectedMove?.description ?: "".text())
|
||||
}
|
||||
|
||||
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
||||
|
||||
+10
@@ -47,6 +47,7 @@ import com.cobblemon.mod.common.net.messages.client.battle.BattleCaptureStartPac
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnPokeballPacket
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||
import com.cobblemon.mod.common.pokemon.PokemonMetData
|
||||
import com.cobblemon.mod.common.pokemon.ai.PokemonBrain
|
||||
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
|
||||
import com.cobblemon.mod.common.util.*
|
||||
@@ -74,6 +75,9 @@ import net.minecraft.world.phys.BlockHitResult
|
||||
import net.minecraft.world.phys.EntityHitResult
|
||||
import net.minecraft.world.phys.HitResult
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import java.time.LocalDate
|
||||
import java.time.ZoneId
|
||||
import java.util.Date
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragModifier, Schedulable {
|
||||
@@ -360,6 +364,12 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
party.add(pokemon.pokemon)
|
||||
val leashHolder = pokemon.leashHolder
|
||||
|
||||
pokemon.pokemon.metData = PokemonMetData(
|
||||
this.level().getBiome(this.blockPosition()),
|
||||
LocalDate.now(ZoneId.systemDefault()),
|
||||
pokemon.pokemon.level
|
||||
)
|
||||
|
||||
if (leashHolder != null) {
|
||||
val blockPos = leashHolder.blockPosition()
|
||||
val blockState = level().getBlockState(blockPos)
|
||||
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
package com.cobblemon.mod.common.net.messages.client.pokemon.update
|
||||
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.PokemonMetData
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import java.time.Instant
|
||||
import java.time.ZoneId
|
||||
import kotlin.jvm.optionals.getOrNull
|
||||
|
||||
class MetDataUpdatePacket(pokemon: () -> Pokemon?, value: PokemonMetData): SingleUpdatePacket<PokemonMetData, MetDataUpdatePacket>(pokemon, value) {
|
||||
override val id = ID
|
||||
|
||||
override fun encodeValue(buffer: RegistryFriendlyByteBuf) {
|
||||
val biome = value.biome.unwrapKey().getOrNull()
|
||||
?: ResourceKey.create(Registries.BIOME, ResourceLocation.parse("minecraft:plains"))
|
||||
buffer.writeResourceKey(biome)
|
||||
buffer.writeLong(value.date.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli())
|
||||
buffer.writeInt(value.level)
|
||||
}
|
||||
|
||||
override fun set(
|
||||
pokemon: Pokemon,
|
||||
value: PokemonMetData
|
||||
) {
|
||||
pokemon.metData = value
|
||||
}
|
||||
|
||||
companion object {
|
||||
val ID = cobblemonResource("met_data_update")
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): MetDataUpdatePacket {
|
||||
val pokemon = decodePokemon(buffer)
|
||||
val biomeKey = buffer.readResourceKey(Registries.BIOME)
|
||||
val dateTime = buffer.readLong()
|
||||
val date = Instant.ofEpochMilli(dateTime).atZone(ZoneId.systemDefault()).toLocalDate()
|
||||
val level = buffer.readInt()
|
||||
val biome = buffer.registryAccess().lookupOrThrow(Registries.BIOME).getOrThrow(biomeKey)
|
||||
return MetDataUpdatePacket(pokemon, PokemonMetData(biome, date, level))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -550,6 +550,12 @@ open class Pokemon : ShowdownIdentifiable {
|
||||
onChange(OriginalTrainerUpdatePacket({ this }, value))
|
||||
}
|
||||
|
||||
var metData: PokemonMetData? = null
|
||||
set(value) {
|
||||
field = value
|
||||
value?.let { onChange(MetDataUpdatePacket({ this }, it)) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Cache friendship on trade for OT
|
||||
*/
|
||||
@@ -1527,6 +1533,7 @@ open class Pokemon : ShowdownIdentifiable {
|
||||
this.potentialMarks.clear()
|
||||
this.potentialMarks += other.marks
|
||||
this.markings = other.markings
|
||||
this.metData = other.metData
|
||||
this.recalculateCharacteristic()
|
||||
this.updateAspects()
|
||||
this.refreshOriginalTrainer()
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.cobblemon.mod.common.pokemon
|
||||
|
||||
import com.mojang.serialization.Codec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.core.Holder
|
||||
import net.minecraft.world.level.biome.Biome
|
||||
import java.time.LocalDate
|
||||
|
||||
/**
|
||||
* Stores information about the circumstances of a player's meeting with a [Pokemon]
|
||||
*
|
||||
* @param biome A [Holder] for the [Biome] the [Pokemon] was caught in
|
||||
* @param date A [LocalDate] of the real life date the [Pokemon] was caught
|
||||
* @param level The level the [Pokemon] was when caught
|
||||
*/
|
||||
data class PokemonMetData(
|
||||
val biome: Holder<Biome>,
|
||||
val date: LocalDate,
|
||||
val level: Int
|
||||
) {
|
||||
companion object {
|
||||
private val LOCAL_DATE_CODEC: Codec<LocalDate> = Codec.STRING.xmap(
|
||||
LocalDate::parse,
|
||||
LocalDate::toString
|
||||
)
|
||||
|
||||
val CODEC: Codec<PokemonMetData> = RecordCodecBuilder.create { instance ->
|
||||
instance.group(
|
||||
Biome.CODEC
|
||||
.fieldOf("biome")
|
||||
.forGetter { it.biome },
|
||||
LOCAL_DATE_CODEC
|
||||
.fieldOf("date")
|
||||
.forGetter { it.date },
|
||||
Codec.INT
|
||||
.fieldOf("level")
|
||||
.forGetter { it.level }
|
||||
).apply(instance) { biome, date, level ->
|
||||
PokemonMetData(
|
||||
biome = biome,
|
||||
date = date,
|
||||
level = level
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -86,6 +86,7 @@ object DataKeys {
|
||||
const val POKEMON_ORIGINAL_TRAINER_NAME = "PokemonOriginalTrainerName"
|
||||
const val POKEMON_ORIGINAL_TRAINER_TYPE = "PokemonOriginalTrainerType"
|
||||
const val POKEMON_ORIGINAL_TRAINER_FRIENDSHIP = "PokemonOriginalTrainerFriendship"
|
||||
const val POKEMON_MET_DATA = "PokemonMetData"
|
||||
|
||||
const val POKEMON_PROPERTIES_MOVES = "Moves"
|
||||
const val POKEMON_PROPERTIES_HELDITEM = "HeldItem"
|
||||
|
||||
+13
-9
@@ -8,25 +8,23 @@
|
||||
|
||||
package com.cobblemon.mod.common.util.codec.internal
|
||||
|
||||
import com.cobblemon.mod.common.api.mark.Marks
|
||||
import com.cobblemon.mod.common.api.riding.stats.RidingStat
|
||||
import com.cobblemon.mod.common.client.settings.ServerSettings
|
||||
import com.cobblemon.mod.common.pokemon.OriginalTrainerType
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.PokemonMetData
|
||||
import com.cobblemon.mod.common.util.DataKeys
|
||||
import com.mojang.serialization.Codec
|
||||
import com.mojang.serialization.MapCodec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import java.util.*
|
||||
|
||||
internal data class ClientPokemonP4(
|
||||
val originalTrainerFriendship: Optional<Int>
|
||||
val originalTrainerFriendship: Optional<Int>,
|
||||
val pokemonMetData: Optional<PokemonMetData>
|
||||
) : Partial<Pokemon> {
|
||||
|
||||
override fun into(other: Pokemon): Pokemon {
|
||||
this.originalTrainerFriendship.ifPresent { other.originalTrainerFriendship = it }
|
||||
other.metData = this.pokemonMetData.orElse(null)
|
||||
return other
|
||||
}
|
||||
|
||||
@@ -36,12 +34,18 @@ internal data class ClientPokemonP4(
|
||||
*/
|
||||
internal val CODEC: MapCodec<ClientPokemonP4> = RecordCodecBuilder.mapCodec { instance ->
|
||||
instance.group(
|
||||
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(ClientPokemonP4::originalTrainerFriendship)
|
||||
).apply(instance, ::ClientPokemonP4)
|
||||
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(ClientPokemonP4::originalTrainerFriendship),
|
||||
PokemonMetData.CODEC.optionalFieldOf(DataKeys.POKEMON_MET_DATA).forGetter(ClientPokemonP4::pokemonMetData)
|
||||
).apply(instance) {
|
||||
originalTrainerFriendship, pokemonMetData -> ClientPokemonP4(
|
||||
originalTrainerFriendship, pokemonMetData
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun from(pokemon: Pokemon): ClientPokemonP4 = ClientPokemonP4(
|
||||
Optional.ofNullable(pokemon.originalTrainerFriendship)
|
||||
Optional.ofNullable(pokemon.originalTrainerFriendship),
|
||||
Optional.ofNullable(pokemon.metData)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.util.codec.internal
|
||||
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.PokemonMetData
|
||||
import com.cobblemon.mod.common.util.DataKeys
|
||||
import com.mojang.serialization.Codec
|
||||
import com.mojang.serialization.MapCodec
|
||||
@@ -16,28 +17,32 @@ import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import java.util.*
|
||||
|
||||
internal data class PokemonP4(
|
||||
val originalTrainerFriendship: Optional<Int>
|
||||
val originalTrainerFriendship: Optional<Int>,
|
||||
val pokemonMetData: Optional<PokemonMetData>
|
||||
) : Partial<Pokemon> {
|
||||
|
||||
override fun into(other: Pokemon): Pokemon {
|
||||
this.originalTrainerFriendship.ifPresent { other.originalTrainerFriendship = it }
|
||||
other.refreshOriginalTrainer()
|
||||
other.metData = this.pokemonMetData.orElse(null)
|
||||
return other
|
||||
}
|
||||
|
||||
companion object {
|
||||
internal val CODEC: MapCodec<PokemonP4> = RecordCodecBuilder.mapCodec { instance ->
|
||||
instance.group(
|
||||
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(PokemonP4::originalTrainerFriendship)
|
||||
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(PokemonP4::originalTrainerFriendship),
|
||||
PokemonMetData.CODEC.optionalFieldOf(DataKeys.POKEMON_MET_DATA).forGetter(PokemonP4::pokemonMetData)
|
||||
).apply(instance) {
|
||||
originalTrainerFriendship -> PokemonP4(
|
||||
originalTrainerFriendship
|
||||
originalTrainerFriendship, pokemonMetData -> PokemonP4(
|
||||
originalTrainerFriendship, pokemonMetData
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun from(pokemon: Pokemon): PokemonP4 = PokemonP4(
|
||||
Optional.ofNullable(pokemon.originalTrainerFriendship)
|
||||
Optional.ofNullable(pokemon.originalTrainerFriendship),
|
||||
Optional.ofNullable(pokemon.metData)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1267,6 +1267,8 @@
|
||||
"cobblemon.ui.info.ability": "Ability",
|
||||
"cobblemon.ui.info.experience_points": "Exp. Points",
|
||||
"cobblemon.ui.info.to_next_level": "To Next Lv.",
|
||||
"cobblemon.ui.info.met_data": "Met in %1$s on %2$s/%3$s/%4$s at Lv.%5$s",
|
||||
"cobblemon.ui.info.met_data_unavailable": "Met a long time ago",
|
||||
"cobblemon.ui.trade": "Trade",
|
||||
"cobblemon.trade.expired.sender": "Your request to trade with %1$s has timed out!",
|
||||
"cobblemon.trade.expired.receiver": "The trade request from %1$s has timed out!",
|
||||
|
||||
@@ -6526,7 +6526,7 @@
|
||||
"cobblemon.move.10000000voltthunderbolt": "1000만볼트",
|
||||
"cobblemon.species.unown-x.desc": "고대 문자를 닮은 모습의 포켓몬이다. 먼저 생겨난 것은 문자인가 안농인가. 연구 중이지만 아직도 수수께끼다.",
|
||||
"cobblemon.ui.pokedex.info.form.qwilfish-hisui": "히스이의 모습",
|
||||
"cobblemon.ui.pokedex.info.form.groudon-primal": "원시그란돈",
|
||||
"cobblemon.ui.pokedex.info.form.groudon-primal": "원시회귀",
|
||||
"cobblemon.ui.pokedex.info.form.burmy-sandy": "모래땅도롱",
|
||||
"cobblemon.ui.pokedex.info.form.abomasnow-mega": "메가눈설왕",
|
||||
"cobblemon.species.rotom-frost.desc": "특수한 모터로 움직이는 냉장고에 들어갔다. 냉기를 뿜으며 싸운다.",
|
||||
@@ -6758,7 +6758,7 @@
|
||||
"cobblemon.species.salamence-mega.desc": "앞다리를 껍질 틈에 얹어서 비행 태세를 갖춘다. 복잡한 지형도 고속으로 날아다닌다.",
|
||||
"cobblemon.species.metagross-mega.desc": "이길 수 없다고 판단하면 발톱으로 상대를 붙잡고 대폭발의 카운트를 시작한다.",
|
||||
"cobblemon.species.latios-mega.desc": "본 것이나 생각한 이미지를 상대방에게 영상으로 보여주는 능력을 지녔다. 인간의 말을 이해할 수 있다.",
|
||||
"cobblemon.ui.pokedex.info.form.kyogre-primal": "원시가이오가",
|
||||
"cobblemon.ui.pokedex.info.form.kyogre-primal": "원시회귀",
|
||||
"cobblemon.species.deoxys-attack.desc": "공격적인 형상으로 변화한 테오키스. 다른 모습을 보여 적을 혼란시키는 힘을 가졌다.",
|
||||
"cobblemon.ui.pokedex.info.form.deoxys-speed": "스피드폼",
|
||||
"cobblemon.ui.pokedex.info.form.burmy-trash": "슈레도롱",
|
||||
@@ -9549,5 +9549,125 @@
|
||||
"cobblemon.config.ui.world_spawning_blocklist": "월드별 스폰 차단 목록",
|
||||
"cobblemon.config.ui.world_spawning_blocklist.tooltip": "포켓몬 생성 로직을 비활성화하는 월드입니다.",
|
||||
"advancements.cobblemon.obtain_tm": "기술을 보여줘!",
|
||||
"advancements.cobblemon.obtain_tm.description": "TM을 찾거나 제작하세요"
|
||||
"advancements.cobblemon.obtain_tm.description": "TM을 찾거나 제작하세요",
|
||||
"itemGroup.cobblemon.tm_item": "코블몬: 기술머신",
|
||||
"block.cobblemon.pomohana": "이글이글꽃",
|
||||
"block.cobblemon.pauvillea": "파칙파칙꽃",
|
||||
"block.cobblemon.lobaila": "훌라훌라꽃",
|
||||
"block.cobblemon.wistensu": "하늘하늘꽃",
|
||||
"block.cobblemon.voltaconia": "찌릿꽃",
|
||||
"block.cobblemon.verdroot": "풀빛뿌리",
|
||||
"block.cobblemon.lucibell": "빛방울꽃",
|
||||
"block.cobblemon.mistleaf": "안개잎",
|
||||
"cobblemon.ui.pokedex.info.evolution_tree": "진화 계통",
|
||||
"cobblemon.ui.pokedex.evolution.item_interact.tooltip": "진화하려면 %1$s 필요",
|
||||
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_species": "%1$s와(과) 교환 시 진화",
|
||||
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_any_species": "교환 시 진화",
|
||||
"cobblemon.ui.pokedex.evolution.shedder.tooltip": "남는 몬스터볼과 파티 빈칸도 필요",
|
||||
"cobblemon.ui.pokedex.evolution.or": "또는",
|
||||
"cobblemon.ui.pokedex.evolution.one_of": "다음 중 하나:",
|
||||
"cobblemon.ui.pokedex.requirement.advancement.tooltip": "발전 과제 %1$s 달성 필요",
|
||||
"cobblemon.ui.pokedex.requirement.battle_critical_hits.tooltip": "배틀에서 급소 %1$s회 맞히기",
|
||||
"cobblemon.ui.pokedex.requirement.biome.anticondition.tooltip": "%1$s 바이옴 밖에 있기",
|
||||
"cobblemon.ui.pokedex.requirement.biome.both.tooltip": "%1$s 바이옴 안, %2$s 바이옴 밖에 있기",
|
||||
"cobblemon.ui.pokedex.requirement.biome.tooltip": "%1$s 바이옴에 있기",
|
||||
"cobblemon.ui.pokedex.requirement.blocks_traveled.tooltip": "%1$s블록 이동하기",
|
||||
"cobblemon.ui.pokedex.requirement.damage_taken.tooltip": "배틀에서 기절하지 않고 데미지 %1$s 받기",
|
||||
"cobblemon.ui.pokedex.requirement.defeat.tooltip": "배틀에서 %1$s을(를) 쓰러뜨리기",
|
||||
"cobblemon.ui.pokedex.requirement.friendship.tooltip": "친밀도 %1$s 이상 필요",
|
||||
"cobblemon.ui.pokedex.requirement.has_move.tooltip": "기술 %1$s 배우고 있기",
|
||||
"cobblemon.ui.pokedex.requirement.has_move_type.tooltip": "%1$s 타입 기술 배우고 있기",
|
||||
"cobblemon.ui.pokedex.requirement.held_item.tooltip": "%1$s 지니고 있기",
|
||||
"cobblemon.ui.pokedex.requirement.level.tooltip.min": "레벨 %1$s부터 진화",
|
||||
"cobblemon.ui.pokedex.requirement.level.tooltip.between": "레벨 %1$s~%2$s 사이에 진화",
|
||||
"cobblemon.ui.pokedex.requirement.moon_phase.tooltip": "달 모양이 %1$s일 때 진화",
|
||||
"cobblemon.ui.pokedex.requirement.nature.toxtricity_amped": "§a노력§r, §a용감§r, §a고집§r, §a개구쟁이§r, §a온순§r, §a장난꾸러기§r, §a촐랑§r, §a성급§r, §a명랑§r, §a천진난만§r, §a덜렁§r, §a건방§r, §a변덕§r 성격 중 하나",
|
||||
"cobblemon.ui.pokedex.requirement.nature.toxtricity_low_key": "§a외로움§r, §a대담§r, §a무사태평§r, §a겁쟁이§r, §a성실§r, §a조심§r, §a의젓§r, §a냉정§r, §a수줍음§r, §a차분§r, §a얌전§r, §a신중§r 성격 중 하나",
|
||||
"cobblemon.ui.pokedex.requirement.negate.tooltip": "아님: %1$s",
|
||||
"cobblemon.ui.pokedex.requirement.nickname.malamar": "이름이 §aDinnerbone§r 또는 §aGrumm§r이어야 함",
|
||||
"cobblemon.ui.pokedex.requirement.party_member.anticondition.tooltip": "파티에 %1$s 포켓몬이 없기",
|
||||
"cobblemon.ui.pokedex.requirement.party_member.tooltip": "파티에 %1$s 포켓몬이 있기",
|
||||
"cobblemon.ui.pokedex.requirement.pokemon_properties.tooltip": "조건: %1$s",
|
||||
"cobblemon.ui.pokedex.requirement.properties.and": "%1$s, %2$s",
|
||||
"cobblemon.ui.pokedex.requirement.properties.custom.cocoon_species": "%1$s 고치",
|
||||
"cobblemon.ui.pokedex.requirement.properties.held_item": "%1$s 지닌",
|
||||
"cobblemon.ui.pokedex.requirement.properties.int_feature": "%1$s %2$s",
|
||||
"cobblemon.ui.pokedex.requirement.properties.nature": "%1$s 성격",
|
||||
"cobblemon.ui.pokedex.requirement.properties.nickname": "이름이 %1$s인",
|
||||
"cobblemon.ui.pokedex.requirement.properties.type": "%1$s 타입",
|
||||
"cobblemon.ui.pokedex.requirement.property_range.tooltip": "%1$s이(가) %2$s~%3$s 사이여야 함",
|
||||
"cobblemon.ui.pokedex.requirement.recoil.tooltip": "배틀에서 반동 데미지 %1$s 받기",
|
||||
"cobblemon.ui.pokedex.requirement.stat_compare.tooltip": "%1$s이(가) %2$s보다 높아야 함",
|
||||
"cobblemon.ui.pokedex.requirement.stat_equal.tooltip": "%1$s와(과) %2$s이(가) 같아야 함",
|
||||
"cobblemon.ui.pokedex.requirement.structure.anticondition.tooltip": "%1$s 구조물 밖에 있기",
|
||||
"cobblemon.ui.pokedex.requirement.structure.both.tooltip": "%1$s 구조물 안, %2$s 구조물 밖에 있기",
|
||||
"cobblemon.ui.pokedex.requirement.structure.tooltip": "%1$s 구조물에 있기",
|
||||
"cobblemon.ui.pokedex.requirement.time_range.tooltip": "%1$s에 진화",
|
||||
"cobblemon.ui.pokedex.requirement.use_move.tooltip": "배틀에서 기술 %1$s 사용하기",
|
||||
"cobblemon.ui.pokedex.requirement.weather.tooltip.raining": "비가 올 때 진화",
|
||||
"cobblemon.ui.pokedex.requirement.weather.tooltip.thundering": "뇌우가 칠 때 진화",
|
||||
"cobblemon.ui.moon_phase.full_moon": "보름달",
|
||||
"cobblemon.ui.moon_phase.waning_gibbous": "기우는 볼록달",
|
||||
"cobblemon.ui.moon_phase.third_quarter": "하현달",
|
||||
"cobblemon.ui.moon_phase.waning_crescent": "그믐달",
|
||||
"cobblemon.ui.moon_phase.new_moon": "삭",
|
||||
"cobblemon.ui.moon_phase.waxing_crescent": "초승달",
|
||||
"cobblemon.ui.moon_phase.first_quarter": "상현달",
|
||||
"cobblemon.ui.moon_phase.waxing_gibbous": "차오르는 볼록달",
|
||||
"cobblemon.ui.time_range.any": "언제든",
|
||||
"cobblemon.ui.time_range.day": "낮",
|
||||
"cobblemon.ui.time_range.night": "밤",
|
||||
"cobblemon.ui.time_range.noon": "정오",
|
||||
"cobblemon.ui.time_range.midnight": "자정",
|
||||
"cobblemon.ui.time_range.dawn": "새벽",
|
||||
"cobblemon.ui.time_range.dusk": "해 질 녘",
|
||||
"cobblemon.ui.time_range.twilight": "황혼",
|
||||
"cobblemon.ui.time_range.morning": "아침",
|
||||
"cobblemon.ui.time_range.afternoon": "오후",
|
||||
"cobblemon.ui.time_range.predawn": "동트기 전",
|
||||
"cobblemon.ui.time_range.evening": "저녁",
|
||||
"cobblemon.subtitle.item.bright_powder.use": "반짝가루가 빛남",
|
||||
"cobblemon.config.ui.type_gem_max_connected": "연결된 타입주얼 블록 최대 수",
|
||||
"cobblemon.config.ui.type_gem_min_growth": "타입주얼 최소 성장",
|
||||
"cobblemon.config.ui.type_gem_growth_chance": "타입주얼 성장 확률",
|
||||
"cobblemon.config.ui.type_gem_initial_expansion_cycles": "타입주얼 초기 확장 횟수",
|
||||
"cobblemon.battle.activate.ficklebeam": "%1$s은(는) 전력을 다해 공격한다!",
|
||||
"tag.item.cobblemon.oricorio_flowers": "꽃꿀 꽃",
|
||||
"tag.item.cobblemon.terrain_plants": "필드 식물",
|
||||
"tag.item.cobblemon.tall_flowers": "큰 꽃",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.bergmite_hisuibiome": "히스이",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.bergmite_kalosbiome": "칼로스",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.cubone_alolabiome": "알로라",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.cubone_kantobiome": "관동",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.dartrix_alolabiome": "알로라",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.dartrix_hisuibiome": "히스이",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.dewott_hisuibiome": "히스이",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.dewott_unovabiome": "하나",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.exeggcute_alolabiome": "알로라",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.exeggcute_kantobiome": "관동",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.goomy_hisuibiome": "히스이",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.goomy_kalosbiome": "칼로스",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.koffing_galarbiome": "가라르",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.koffing_kantobiome": "관동",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.mimejr_galarbiome": "가라르",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.mimejr_sinnohbiome": "신오",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.petilil_hisuibiome": "히스이",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.petilil_unovabiome": "하나",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.pikachu_alolabiome": "알로라",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.pikachu_kantobiome": "관동",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.quilava_hisuibiome": "히스이",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.quilava_johtobiome": "성도",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.rufflet_hisuibiome": "히스이",
|
||||
"tag.worldgen.biome.cobblemon.evolution.regional.rufflet_unovabiome": "하나",
|
||||
"cobblemon.ui.pokedex.info.form.vivillon-icy snow": "빙설의 모양",
|
||||
"cobblemon.species.vivillon-icy-snow.desc": "태어난 땅의 기후나 풍토에 영향을 받아 모양이 달라진다. 얼어붙은 땅에서의 모습이다.",
|
||||
"cobblemon.ui.pokedex.info.form.vivillon-high plains": "황야의 모양",
|
||||
"cobblemon.species.vivillon-high-plains.desc": "태어난 땅의 기후나 풍토에 영향을 받아 모양이 달라진다. 비가 적게 내리는 땅에서의 모습이다.",
|
||||
"cobblemon.ui.pokedex.info.form.vivillon-inferno": "지옥의 모양",
|
||||
"cobblemon.species.vivillon-inferno.desc": "살고 있는 장소의 기후나 풍토에 따라 날개의 모양이 다른 포켓몬이다. 화려한 색의 날개 가루를 뿌린다.",
|
||||
"cobblemon.ui.pokedex.info.form.vivillon-void": "공허의 모양",
|
||||
"cobblemon.species.vivillon-void.desc": "살고 있는 장소의 기후나 풍토에 따라 날개의 모양이 다른 포켓몬이다. 화려한 색의 날개 가루를 뿌린다.",
|
||||
"cobblemon.ui.pokedex.info.form.vivillon-forsaken": "망각의 모양",
|
||||
"cobblemon.species.vivillon-forsaken.desc": "살고 있는 장소의 기후나 풍토에 따라 날개의 모양이 다른 포켓몬이다. 화려한 색의 날개 가루를 뿌린다.",
|
||||
"cobblemon.species.minior-red.desc": "겉껍질이 벗겨진 모습. 코어의 색이 다른 이유는 먹은 먹이의 성분이 다르기 때문이다."
|
||||
}
|
||||
|
||||
@@ -9677,5 +9677,6 @@
|
||||
"cobblemon.config.ui.world_spawning_blocklist": "维度生成黑名单",
|
||||
"cobblemon.config.ui.world_spawning_blocklist.tooltip": "禁用宝可梦生成逻辑的维度。",
|
||||
"advancements.cobblemon.obtain_tm": "让我看看你的招式",
|
||||
"advancements.cobblemon.obtain_tm.description": "发现或刻写一个招式学习器"
|
||||
"advancements.cobblemon.obtain_tm.description": "发现或刻写一个招式学习器",
|
||||
"itemGroup.cobblemon.tm_item": "招式学习器"
|
||||
}
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ parchment_version = 2024.07.28@zip
|
||||
java_version = 21
|
||||
|
||||
mod_id=cobblemon
|
||||
mod_version=1.8.4
|
||||
mod_version=1.8.5
|
||||
snapshot=true
|
||||
|
||||
fabric.loom.multiProjectOptimisation=false
|
||||
Reference in New Issue
Block a user