Compare commits

...
Author SHA1 Message Date
MeAlam1 674ade41b1 Cleanup 2026-10-14 22:04:59 +02:00
MeAlam1 0c5d228a11 Broken, but something 2026-10-14 19:07:04 +02:00
MeAlam1 5831cb30d3 Merge branch 'main' into wheres-that-pokemon 2026-10-14 12:46:41 +02:00
MeAlam1 5cb933f555 Empty GUI 2026-10-14 12:46:35 +02:00
MeAlam1 2505d51744 Added the Blank Items 2026-09-28 16:29:45 +02:00
20 changed files with 462 additions and 1 deletions
@@ -23,6 +23,7 @@ import com.cobblemon.mod.common.block.MintBlock
import com.cobblemon.mod.common.block.MintBlock.MintType
import com.cobblemon.mod.common.block.campfirepot.CampfirePotColor
import com.cobblemon.mod.common.client.pokedex.PokedexType
import com.cobblemon.mod.common.client.pokeradar.PokeRadarType
import com.cobblemon.mod.common.entity.boat.CobblemonBoatType
import com.cobblemon.mod.common.item.*
import com.cobblemon.mod.common.item.armor.CobblemonArmorTrims
@@ -188,6 +189,22 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
val POKEDEX_BLACK = pokedexItem(PokedexType.BLACK)
@JvmField
val POKEDEX_WHITE = pokedexItem(PokedexType.WHITE)
val pokeradars = mutableListOf<PokeRadarItem>()
@JvmField
val POKERADAR_RED = pokeradarItem(PokeRadarType.RED)
@JvmField
val POKERADAR_YELLOW = pokeradarItem(PokeRadarType.YELLOW)
@JvmField
val POKERADAR_GREEN = pokeradarItem(PokeRadarType.GREEN)
@JvmField
val POKERADAR_BLUE = pokeradarItem(PokeRadarType.BLUE)
@JvmField
val POKERADAR_PINK = pokeradarItem(PokeRadarType.PINK)
@JvmField
val POKERADAR_BLACK = pokeradarItem(PokeRadarType.BLACK)
@JvmField
val POKERADAR_WHITE = pokeradarItem(PokeRadarType.WHITE)
val campfire_pots = mutableListOf<CampfirePotItem>()
@JvmField
@@ -1611,6 +1628,12 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
return item
}
private fun pokeradarItem(type: PokeRadarType): PokeRadarItem {
val item = create("poke_radar_${type.name.lowercase()}", PokeRadarItem(type))
pokeradars.add(item)
return item
}
private fun wearableItem(name: String, heldItemRemappedName: String? = null): CobblemonItem = create(
name,
WearableHatItem(name).also {
@@ -49,6 +49,7 @@ import com.cobblemon.mod.common.client.net.pokedex.ServerConfirmedRegisterHandle
import com.cobblemon.mod.common.client.net.pokemon.update.ClientboundSeatAssignmentPacketHandler
import com.cobblemon.mod.common.client.net.pokemon.update.ClientboundUpdateRidingStateHandler
import com.cobblemon.mod.common.client.net.pokemon.update.PokemonUpdatePacketHandler
import com.cobblemon.mod.common.client.net.pokeradar.PokeRadarScanResultHandler
import com.cobblemon.mod.common.client.net.riding.ClientboundUpdateDriverInputHandler
import com.cobblemon.mod.common.client.net.settings.OpenCobblemonConfigEditorHandler
import com.cobblemon.mod.common.client.net.settings.ServerSettingsPacketHandler
@@ -107,6 +108,7 @@ import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.Add
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.ClearEvolutionsPacket
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.ClientboundSeatAssignmentPacket
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.RemoveEvolutionPacket
import com.cobblemon.mod.common.net.messages.client.pokeradar.PokeRadarScanResultPacket
import com.cobblemon.mod.common.net.messages.client.settings.OpenCobblemonConfigScreenPacket
import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacket
import com.cobblemon.mod.common.net.messages.client.sound.UnvalidatedPlaySoundS2CPacket
@@ -194,6 +196,8 @@ import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetItemHidden
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetMarkingsPacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetNicknamePacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.evolution.AcceptEvolutionPacket
import com.cobblemon.mod.common.net.messages.server.pokeradar.PokeRadarScanPacket
import com.cobblemon.mod.common.net.messages.server.pokeradar.PokeRadarTeleportPacket
import com.cobblemon.mod.common.net.messages.server.riding.DismountPokemonPacket
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdateDriverInputPacket
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdatePassengerPositionPacket
@@ -252,6 +256,8 @@ import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetActiveMarkH
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetItemHiddenHandler
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetMarkingsHandler
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetNicknameHandler
import com.cobblemon.mod.common.net.serverhandling.pokeradar.PokeRadarScanHandler
import com.cobblemon.mod.common.net.serverhandling.pokeradar.PokeRadarTeleportHandler
import com.cobblemon.mod.common.net.serverhandling.riding.DismountPokemonPacketHandler
import com.cobblemon.mod.common.net.serverhandling.riding.DriverInputPacketHandler
import com.cobblemon.mod.common.net.serverhandling.riding.ServerboundUpdatePassengerPositionHandler
@@ -512,6 +518,9 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(ClientboundUpdateDriverInputPacket.ID, ClientboundUpdateDriverInputPacket::decode, ClientboundUpdateDriverInputHandler))
list.add(PacketRegisterInfo(ClientboundSeatAssignmentPacket.ID, ClientboundSeatAssignmentPacket::decode, ClientboundSeatAssignmentPacketHandler))
// Poke Radar
list.add(PacketRegisterInfo(PokeRadarScanResultPacket.ID, PokeRadarScanResultPacket::decode, PokeRadarScanResultHandler))
// Habitat blocks
list.add(PacketRegisterInfo(OpenHabitatBlockEditorPacket.ID, OpenHabitatBlockEditorPacket::decode, OpenHabitatBlockEditorHandler))
@@ -647,7 +656,11 @@ object CobblemonNetwork {
// Habitat blocks
list.add(PacketRegisterInfo(SaveHabitatBlockSettingsPacket.ID, SaveHabitatBlockSettingsPacket::decode, SaveHabitatBlockSettingsHandler))
// Debug / cheats
// Poke Radar
list.add(PacketRegisterInfo(PokeRadarScanPacket.ID, PokeRadarScanPacket::decode, PokeRadarScanHandler))
list.add(PacketRegisterInfo(PokeRadarTeleportPacket.ID, PokeRadarTeleportPacket::decode, PokeRadarTeleportHandler))
// Debug / cheats
list.add(PacketRegisterInfo(RequestOpenRidingStatsDebugGUIPacket.ID, RequestOpenRidingStatsDebugGUIPacket::decode, RequestOpenRidingStatsDebugGUIHandler))
@@ -0,0 +1,7 @@
package com.cobblemon.mod.common.client.gui.pokeradar
import com.cobblemon.mod.common.client.pokeradar.PokeRadarType
class NavGUI(
override val type: PokeRadarType,
) : PokeRadarGUI(type)
@@ -0,0 +1,22 @@
package com.cobblemon.mod.common.client.gui.pokeradar
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
import com.cobblemon.mod.common.client.pokeradar.PokeRadarType
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.screens.Screen
import net.minecraft.network.chat.Component
open class PokeRadarGUI(
open val type: PokeRadarType,
) : Screen(Component.translatable("cobblemon.ui.poke_radar.title")), CobblemonRenderable {
companion object {
// TODO: For now always opens Radar Page, later need persistant storage and open the last opened page
fun open(type: PokeRadarType) {
val mc = Minecraft.getInstance()
val screen = RadarGUI(type)
mc.setScreen(screen)
}
}
}
@@ -0,0 +1,136 @@
package com.cobblemon.mod.common.client.gui.pokeradar
import com.cobblemon.mod.common.client.pokeradar.PokeRadarScanResults
import com.cobblemon.mod.common.client.pokeradar.PokeRadarType
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.net.messages.server.pokeradar.PokeRadarScanPacket
import com.cobblemon.mod.common.net.messages.server.pokeradar.PokeRadarTeleportPacket
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.components.Button
import net.minecraft.core.BlockPos
import net.minecraft.network.chat.Component
import net.minecraft.util.Mth
class RadarGUI(
override val type: PokeRadarType,
private val initialPage: Int = 0
) : PokeRadarGUI(type) {
private val rowsPerPage = 10
private val rowHeight = 18
private val listWidth = 300
private val tpButtonWidth = 28
private var page = initialPage
override fun init() {
PokeRadarScanPacket().sendToServer()
rebuild()
super.init()
}
fun onResultsReceived() {
page = 0
rebuild()
}
private fun rebuild() {
clearWidgets()
addRenderableWidget(
Button.builder(Component.literal("<")) { changePage(-1) }
.bounds(width / 2 - 60, height - 28, 40, 20)
.build()
)
addRenderableWidget(
Button.builder(Component.literal(">")) { changePage(1) }
.bounds(width / 2 + 20, height - 28, 40, 20)
.build()
)
val entries = PokeRadarScanResults.entries
if (entries.isEmpty()) return
val totalPages = maxOf(1, (entries.size + rowsPerPage - 1) / rowsPerPage)
page = Mth.clamp(page, 0, totalPages - 1)
val listLeft = width / 2 - listWidth / 2
val listTop = 30
val start = page * rowsPerPage
val end = Mth.clamp(start + rowsPerPage, 0, entries.size)
for (i in start until end) {
val entry = entries[i]
val level = Minecraft.getInstance().level ?: return
val entity = entry.entityId?.let { level.getEntity(it) } as? PokemonEntity
val currentPos: BlockPos? = entity?.blockPosition()
val rowY = listTop + (i - start) * rowHeight
addRenderableWidget(
Button.builder(Component.literal("TP")) {
PokeRadarTeleportPacket(
currentPos ?: Minecraft.getInstance().player?.blockPosition()
).sendToServer()
Minecraft.getInstance().setScreen(null)
}
.bounds(listLeft + listWidth - tpButtonWidth - 2, rowY, tpButtonWidth, rowHeight - 2)
.build()
)
}
}
private fun changePage(delta: Int) {
val totalPages = maxOf(1, (PokeRadarScanResults.entries.size + rowsPerPage - 1) / rowsPerPage)
page = Mth.clamp(page + delta, 0, totalPages - 1)
rebuild()
}
override fun render(g: GuiGraphics, mouseX: Int, mouseY: Int, partialTick: Float) {
super.render(g, mouseX, mouseY, partialTick)
val entries = PokeRadarScanResults.entries
val listLeft = width / 2 - listWidth / 2
val listTop = 30
g.drawCenteredString(font, "PokeRadar Scan (${entries.size})", width / 2, 12, 0xFFFFFF)
if (entries.isEmpty()) {
g.drawCenteredString(font, "No results", width / 2, height / 2, 0xAAAAAA)
return
}
val totalPages = maxOf(1, (entries.size + rowsPerPage - 1) / rowsPerPage)
val start = page * rowsPerPage
val end = Mth.clamp(start + rowsPerPage, 0, entries.size)
val textRight = listLeft + listWidth - tpButtonWidth - 6
for (i in start until end) {
val entry = entries[i]
val level = Minecraft.getInstance().level ?: return
val entity = entry.entityId?.let { level.getEntity(it) } as? PokemonEntity
val pos: BlockPos? = entity?.blockPosition()
val rowY = listTop + (i - start) * rowHeight
val hovered = mouseX in listLeft..textRight && mouseY in rowY..(rowY + rowHeight - 2)
g.fill(
listLeft, rowY, listLeft + listWidth, rowY + rowHeight - 2,
if (hovered) 0x80FFFFFF.toInt() else 0x40000000
)
val name = entry.pokemon?.species ?: "?"
val levelText = entry.pokemon?.level?.let { "$it" } ?: "?"
val text = "$name $levelText (${pos?.x}, ${pos?.y}, ${pos?.z})"
g.drawString(font, text, listLeft + 4, rowY + 4, 0xFFFFFF)
}
g.drawCenteredString(
font,
"Page ${page + 1} / $totalPages",
width / 2,
height - 40,
0xFFFFFF
)
}
}
@@ -0,0 +1,7 @@
package com.cobblemon.mod.common.client.gui.pokeradar
import com.cobblemon.mod.common.client.pokeradar.PokeRadarType
class TrackingGUI(
override val type: PokeRadarType,
) : PokeRadarGUI(type)
@@ -0,0 +1,17 @@
package com.cobblemon.mod.common.client.net.pokeradar
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
import com.cobblemon.mod.common.client.gui.pokeradar.RadarGUI
import com.cobblemon.mod.common.client.pokeradar.PokeRadarScanResults
import com.cobblemon.mod.common.net.messages.client.pokeradar.PokeRadarScanResultPacket
import net.minecraft.client.Minecraft
object PokeRadarScanResultHandler : ClientNetworkPacketHandler<PokeRadarScanResultPacket> {
override fun handle(
packet: PokeRadarScanResultPacket,
client: Minecraft
) {
PokeRadarScanResults.entries = packet.entries
(client.screen as? RadarGUI)?.onResultsReceived()
}
}
@@ -0,0 +1,7 @@
package com.cobblemon.mod.common.client.pokeradar
import com.cobblemon.mod.common.pokeradar.SpawnCheckEntryData
object PokeRadarScanResults {
var entries: List<SpawnCheckEntryData> = emptyList()
}
@@ -0,0 +1,23 @@
package com.cobblemon.mod.common.client.pokeradar
import com.cobblemon.mod.common.util.cobblemonResource
/**
* Defines the available Poké Radar variants and their resource locations.
*
* @author MeAlam
* @since 1.0.0
*/
enum class PokeRadarType {
BLACK,
BLUE,
GREEN,
PINK,
RED,
WHITE,
YELLOW;
fun getTexturePath() = cobblemonResource("textures/gui/pokedex/pokedex_base_${this.name.lowercase()}.png")
fun getItemModelPath(additionalState: String? = null) = cobblemonResource("item/pokedex_${this.name.lowercase()}_model${if (additionalState != null) "_$additionalState" else ""}")
fun getItemSpritePath() = cobblemonResource("pokedex_${this.name.lowercase()}")
}
@@ -407,6 +407,9 @@ class CobblemonConfig {
@CobblemonConfigField(Category.World, lang = "type_gem_tick_chance", SERVER)
var typeGemTickChance = 1.0f
@CobblemonConfigField(Category.Spawning, lang = "poke_radar_cooldown", SERVER)
var pokeRadarCooldown = 1.0f
fun clone(): CobblemonConfig {
val newConfig = CobblemonConfig()
CobblemonConfig::class.memberProperties.forEach { property ->
@@ -0,0 +1,20 @@
package com.cobblemon.mod.common.item
import com.cobblemon.mod.common.client.gui.pokeradar.PokeRadarGUI
import com.cobblemon.mod.common.client.pokeradar.PokeRadarType
import net.minecraft.client.player.LocalPlayer
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
class PokeRadarItem(val type: PokeRadarType) : CobblemonItem(Properties().stacksTo(1)) {
override fun use(level: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder<ItemStack?>? {
if (level.isClientSide && player is LocalPlayer) {
PokeRadarGUI.open(type)
}
return super.use(level, player, usedHand)
}
}
@@ -945,6 +945,7 @@ object CobblemonItemGroups {
CobblemonItems.pokeBalls.forEach(entries::accept)
CobblemonItems.pokeRods.forEach(entries::accept)
CobblemonItems.pokedexes.forEach(entries::accept)
CobblemonItems.pokeradars.forEach(entries::accept)
}
private fun blocksInjections(injector: Injector) {
@@ -0,0 +1,28 @@
package com.cobblemon.mod.common.net.messages.client.pokeradar
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.pokeradar.SpawnCheckEntry
import com.cobblemon.mod.common.pokeradar.SpawnCheckEntryData
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class PokeRadarScanResultPacket(
val entries: List<SpawnCheckEntryData>
) : NetworkPacket<PokeRadarScanResultPacket> {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeVarInt(entries.size)
entries.forEach { it.encode(buffer) }
}
companion object {
val ID = cobblemonResource("poke_radar_scan_result")
fun decode(buffer: RegistryFriendlyByteBuf): PokeRadarScanResultPacket {
val size = buffer.readVarInt()
val entries = ArrayList<SpawnCheckEntryData>(size)
repeat(size) { entries.add(SpawnCheckEntryData.decode(buffer)) }
return PokeRadarScanResultPacket(entries)
}
}
}
@@ -0,0 +1,16 @@
package com.cobblemon.mod.common.net.messages.server.pokeradar
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class PokeRadarScanPacket : NetworkPacket<PokeRadarScanPacket> {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
}
companion object {
val ID = cobblemonResource("poke_radar_scan")
fun decode(buffer: RegistryFriendlyByteBuf) = PokeRadarScanPacket()
}
}
@@ -0,0 +1,18 @@
package com.cobblemon.mod.common.net.messages.server.pokeradar
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.core.BlockPos
import net.minecraft.network.RegistryFriendlyByteBuf
class PokeRadarTeleportPacket(val pos: BlockPos? = BlockPos.ZERO) : NetworkPacket<PokeRadarTeleportPacket> {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeBlockPos(pos ?: BlockPos.ZERO)
}
companion object {
val ID = cobblemonResource("poke_radar_teleport")
fun decode(buffer: RegistryFriendlyByteBuf) = PokeRadarTeleportPacket(buffer.readBlockPos())
}
}
@@ -0,0 +1,19 @@
package com.cobblemon.mod.common.net.serverhandling.pokeradar
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
import com.cobblemon.mod.common.net.messages.client.pokeradar.PokeRadarScanResultPacket
import com.cobblemon.mod.common.net.messages.server.pokeradar.PokeRadarScanPacket
import com.cobblemon.mod.common.pokeradar.SpawnCheckEntry
import com.cobblemon.mod.common.pokeradar.SpawnExtensions
import net.minecraft.server.MinecraftServer
import net.minecraft.server.level.ServerPlayer
object PokeRadarScanHandler : ServerNetworkPacketHandler<PokeRadarScanPacket> {
override fun handle(packet: PokeRadarScanPacket, server: MinecraftServer, player: ServerPlayer) {
val radius = 16
val entries = SpawnExtensions.scanPokemonInRadius(player = player, radius = radius, cube = false)
PokeRadarScanResultPacket(SpawnCheckEntry.toData(entries)).sendToPlayer(player)
}
}
@@ -0,0 +1,17 @@
package com.cobblemon.mod.common.net.serverhandling.pokeradar
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
import com.cobblemon.mod.common.net.messages.server.pokeradar.PokeRadarTeleportPacket
import net.minecraft.server.MinecraftServer
import net.minecraft.server.level.ServerPlayer
// TODO: Add Operator Check
object PokeRadarTeleportHandler : ServerNetworkPacketHandler<PokeRadarTeleportPacket> {
override fun handle(packet: PokeRadarTeleportPacket, server: MinecraftServer, player: ServerPlayer) {
player.teleportTo(
packet.pos?.x?.plus(0.5) ?: 0.0,
packet.pos?.y?.toDouble() ?: 0.0,
packet.pos?.z?.plus(0.5) ?: 0.0
)
}
}
@@ -0,0 +1,40 @@
package com.cobblemon.mod.common.pokeradar
import com.cobblemon.mod.common.api.net.Encodable
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import net.minecraft.core.BlockPos
import net.minecraft.network.RegistryFriendlyByteBuf
data class SpawnCheckEntryData(
val pokemon: PokemonProperties?,
val entityId: Int? = null
) : Encodable {
override fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeNullable(pokemon) { buf, p -> buf.writeUtf(p.asString()) }
buffer.writeNullable(entityId) { buf, id -> buf.writeVarInt(id) }
}
companion object {
fun decode(buffer: RegistryFriendlyByteBuf): SpawnCheckEntryData {
val pokemon = buffer.readNullable { PokemonProperties.parse(it.readUtf()) }
val entityId = buffer.readNullable { it.readVarInt() }
return SpawnCheckEntryData(pokemon, entityId)
}
}
}
data class SpawnCheckEntry(
val pokemon: PokemonProperties?,
val entityId: Int? = null
) {
companion object {
fun toData(entries: List<SpawnCheckEntry>): List<SpawnCheckEntryData> =
entries.map { it.toData() }
}
fun toData() = SpawnCheckEntryData(
pokemon = pokemon,
entityId = entityId
)
}
@@ -0,0 +1,36 @@
package com.cobblemon.mod.common.pokeradar
import com.cobblemon.mod.common.Cobblemon.config
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import net.minecraft.server.level.ServerLevel
import net.minecraft.server.level.ServerPlayer
object SpawnExtensions {
private const val BLOCKS_PER_CHUNK = 16
fun scanPokemonInRadius(
player: ServerPlayer,
radius: Int,
cube: Boolean = false,
maxDistance: Double = (radius * BLOCKS_PER_CHUNK).toDouble()
): List<SpawnCheckEntry> {
val world: ServerLevel = player.serverLevel()
val radiusInBlocks = (radius * BLOCKS_PER_CHUNK).toDouble()
val verticalRadius = if (cube) radiusInBlocks else config.spawningZoneHeight / 2.0
val box = player.boundingBox.inflate(radiusInBlocks, verticalRadius, radiusInBlocks)
val origin = player.position()
return world.getEntitiesOfClass(PokemonEntity::class.java, box) { entity ->
entity.isAlive &&
entity.pokemon.isWild() &&
(maxDistance <= 0 || entity.position().distanceTo(origin) <= maxDistance)
}.map { entity ->
SpawnCheckEntry(
pokemon = PokemonProperties.parse(entity.pokemon.species.resourceIdentifier.toString()),
entityId = entity.id
)
}
}
}
@@ -89,6 +89,13 @@
"item.cobblemon.pokedex_red": "Pokédex",
"item.cobblemon.pokedex_white": "Pokédex",
"item.cobblemon.pokedex_yellow": "Pokédex",
"item.cobblemon.poke_radar_black": "Poké Radar",
"item.cobblemon.poke_radar_blue": "Poké Radar",
"item.cobblemon.poke_radar_green": "Poké Radar",
"item.cobblemon.poke_radar_pink": "Poké Radar",
"item.cobblemon.poke_radar_red": "Poké Radar",
"item.cobblemon.poke_radar_white": "Poké Radar",
"item.cobblemon.poke_radar_yellow": "Poké Radar",
"item.cobblemon.npc_editor": "NPC's Trainer Card",
"item.cobblemon.link_cable": "Link Cable",
"item.cobblemon.link_cable.tooltip": "Allows a Pokémon to evolve that would require trading",
@@ -2689,6 +2696,7 @@
"cobblemon.config.ui.type_gem_min_growth": "Min Type Gem Growth",
"cobblemon.config.ui.type_gem_growth_chance": "Type Gem Growth Chance",
"cobblemon.config.ui.type_gem_initial_expansion_cycles": "Type Gem Initial Expansion Cycles",
"cobblemon.config.ui.poke_radar_cooldown": "Poké Radar Cooldown",
"cobblemon.config.ui.starters": "Starters",
"advancements.cobblemon.root": "The World of Cobblemon!",
"advancements.cobblemon.root.description": "Choose a starter Pokémon and set out on a new adventure",