Compare commits

...
Author SHA1 Message Date
Tyzillion 75908c9f0c Updated Branch to latest main and got marks working. 2024-11-30 00:04:42 -05:00
Tyzillion dde9c47cd6 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into marks_and_memories 2024-11-30 00:02:22 -05:00
Tyzillion d8eb63b74f Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into marks_and_memories
# Conflicts:
#	common/src/main/kotlin/com/cobblemon/mod/common/CobblemonNetwork.kt
#	common/src/main/kotlin/com/cobblemon/mod/common/battles/pokemon/BattlePokemon.kt
#	common/src/main/kotlin/com/cobblemon/mod/common/command/TestCommand.kt
#	common/src/main/kotlin/com/cobblemon/mod/common/data/CobblemonDataProvider.kt
#	common/src/main/kotlin/com/cobblemon/mod/common/pokemon/Pokemon.kt
#	common/src/main/kotlin/com/cobblemon/mod/common/util/DataKeys.kt
#	common/src/main/resources/assets/cobblemon/lang/en_us.json
2024-11-28 23:32:20 -05:00
Lily ba7d23d1e2 remove name field cuz it's not needed 2024-02-22 19:24:17 -05:00
Lily ecae1dce56 implemented pokemon marks 2024-02-22 13:10:55 -05:00
Lily d66154bf62 started on marks/memories 2024-02-21 18:24:29 -05:00
18 changed files with 237 additions and 17 deletions
@@ -60,6 +60,8 @@ import com.cobblemon.mod.common.net.messages.client.callback.OpenMoveCallbackPac
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyCallbackPacket
import com.cobblemon.mod.common.net.messages.client.callback.OpenPartyMoveCallbackPacket
import com.cobblemon.mod.common.net.messages.client.data.*
import com.cobblemon.mod.common.net.messages.client.data.PropertiesCompletionRegistrySyncPacket
import com.cobblemon.mod.common.net.messages.client.data.UnlockReloadPacket
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueClosedPacket
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueOpenedPacket
import com.cobblemon.mod.common.net.messages.client.effect.RunPosableMoLangPacket
@@ -306,6 +308,8 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(PokedexDexSyncPacket.ID, PokedexDexSyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(DexEntrySyncPacket.ID, DexEntrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(FishingBaitRegistrySyncPacket.ID, FishingBaitRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(MarksRegistrySyncPacket.ID, MarksRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
// Effects
list.add(PacketRegisterInfo(SpawnSnowstormParticlePacket.ID, SpawnSnowstormParticlePacket::decode, SpawnSnowstormParticleHandler))
@@ -19,6 +19,8 @@ import com.cobblemon.mod.common.api.events.pokemon.ShinyChanceCalculationEvent
import com.cobblemon.mod.common.api.moves.Moves
import com.cobblemon.mod.common.api.pokeball.PokeBalls
import com.cobblemon.mod.common.api.pokemon.aspect.AspectProvider
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMark
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMarks
import com.cobblemon.mod.common.api.pokemon.stats.Stats
import com.cobblemon.mod.common.api.pokemon.status.Statuses
import com.cobblemon.mod.common.api.properties.CustomPokemonProperty
@@ -640,6 +642,7 @@ open class PokemonProperties {
val custom = ListTag()
customProperties.map { StringTag.valueOf(it.asString()) }.forEach { custom.add(it) }
nbt.put(DataKeys.POKEMON_PROPERTIES_CUSTOM, custom)
return nbt
}
@@ -672,6 +675,7 @@ open class PokemonProperties {
// This is kinda gross
custom.forEach { customProperties.addAll(parse(it.asString).customProperties) }
updateAspects()
return this
}
@@ -737,6 +741,7 @@ open class PokemonProperties {
// This is still kinda gross
custom?.forEach { customProperties.addAll(parse(it.asString).customProperties) }
updateAspects()
return this
}
@@ -0,0 +1,17 @@
package com.cobblemon.mod.common.api.pokemon.marks
import com.bedrockk.molang.runtime.MoLangRuntime
import com.cobblemon.mod.common.api.multiblock.condition.OrCondition
import net.minecraft.resources.ResourceLocation
class PokemonMark(
id: ResourceLocation,
val title: String,
val description: String,
val icon: ResourceLocation,
val chance: Float = 1.0f
) {
@Transient
var identifier = id
internal set
}
@@ -0,0 +1,49 @@
package com.cobblemon.mod.common.api.pokemon.marks
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.data.JsonDataRegistry
import com.cobblemon.mod.common.api.reactive.SimpleObservable
import com.cobblemon.mod.common.net.messages.client.data.MarksRegistrySyncPacket
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
import com.cobblemon.mod.common.util.cobblemonResource
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.server.packs.PackType
object PokemonMarks: JsonDataRegistry<PokemonMark> {
override val id = cobblemonResource("marks")
override val type = PackType.SERVER_DATA
override val observable = SimpleObservable<PokemonMarks>()
override val gson = GsonBuilder()
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
.create()
override val typeToken = TypeToken.get(PokemonMark::class.java)
override val resourcePath = "marks"
val marks = hashMapOf<ResourceLocation, PokemonMark>()
override fun reload(data: Map<ResourceLocation, PokemonMark>) {
this.marks.clear()
data.forEach { id, mark ->
try {
mark.identifier = id
this.marks[id] = mark
} catch(e: Exception) {
Cobblemon.LOGGER.error("Failed to load mark: {}", id, e)
}
}
Cobblemon.LOGGER.info("Loaded {} marks", this.marks.size)
this.observable.emit(this)
}
override fun sync(player: ServerPlayer) {
MarksRegistrySyncPacket(all()).sendToPlayer(player)
}
fun all() = this.marks.values.toList()
}
@@ -52,7 +52,7 @@ open class PartyStore(override val uuid: UUID) : PokemonStore<PartyPosition>() {
override fun iterator() = slots.filterNotNull().iterator()
/** Gets the Pokémon at the specified slot. It will return null if the slot is empty or the given slot is out of bounds. */
fun get(slot: Int) = slot.takeIf { it < slots.size && it >= 0 }?.let { slots[it] }
operator fun get(slot: Int) = slot.takeIf { it < slots.size && it >= 0 }?.let { slots[it] }
override operator fun get(position: PartyPosition) = get(position.slot)
/** Sets the Pokémon at the specified slot. */
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.moves.MoveSet
import com.cobblemon.mod.common.api.pokemon.helditem.HeldItemManager
import com.cobblemon.mod.common.api.pokemon.helditem.HeldItemProvider
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMarks
import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.battles.actor.MultiPokemonBattleActor
import com.cobblemon.mod.common.battles.actor.PokemonBattleActor
@@ -24,6 +25,8 @@ import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.properties.BattleCloneProperty
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
import com.cobblemon.mod.common.util.battleLang
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang
import java.util.UUID
import net.minecraft.network.chat.MutableComponent
@@ -82,7 +85,7 @@ open class BattlePokemon(
* The [HeldItemManager] backing this [BattlePokemon].
*/
val heldItemManager: HeldItemManager by lazy { HeldItemProvider.provide(this) }
val contextManager = ContextManager()
open fun getName(): MutableComponent {
@@ -91,6 +94,14 @@ open class BattlePokemon(
displayPokemon.getDisplayName()
} else {
battleLang("owned_pokemon", actor.getName(), displayPokemon.getDisplayName())
// val mark = effectedPokemon.selectedMark
val mark = PokemonMarks.marks[cobblemonResource("resurrected")]
if (mark != null) {
return lang(mark.title, effectedPokemon.getDisplayName())
} else {
battleLang("owned_pokemon", actor.getName(), effectedPokemon.getDisplayName())
}
}
}
@@ -224,7 +224,7 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
drawScaledText(
context = context,
text = pokemon.getDisplayName(),
text = pokemon.getDisplayNameNoTitle(),
x = panelX + selectedOffsetX + 2.5F,
y = indexY + 25,
scale = SCALE
@@ -242,7 +242,7 @@ class PCGUI(
drawScaledText(
context = context,
font = CobblemonResources.DEFAULT_LARGE,
text = pokemon.getDisplayName().bold(),
text = pokemon.getDisplayNameNoTitle().bold(),
x = x + 12,
y = y + 11.5,
shadow = true
@@ -52,7 +52,7 @@ class NicknameEntryWidget(
this.updateNickname(pokemonName)
}
}
value = pokemon.getDisplayName().string
value = pokemon.getDisplayNameNoTitle().string
}
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
@@ -166,7 +166,7 @@ class PartySlotWidget(
drawScaledText(
context = context,
text = slotPokemon.getDisplayName(),
text = slotPokemon.getDisplayNameNoTitle(),
x = x + 4,
y = y + 20,
scale = halfScale
@@ -9,10 +9,15 @@
package com.cobblemon.mod.common.command
import com.cobblemon.mod.common.api.permission.CobblemonPermissions
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMarks
import com.cobblemon.mod.common.api.text.red
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.command.argument.PokemonPropertiesArgumentType
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.alias
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.commandLang
import com.cobblemon.mod.common.util.permission
import com.cobblemon.mod.common.util.toBlockPos
@@ -25,6 +30,7 @@ import net.minecraft.commands.Commands.argument
import net.minecraft.commands.Commands.literal
import net.minecraft.commands.arguments.coordinates.Vec3Argument
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.phys.Vec3
import net.minecraft.world.level.Level
@@ -71,6 +77,8 @@ object SpawnPokemon {
throw NO_SPECIES_EXCEPTION.create()
}
val pokemonEntity = properties.createEntity(world)
println("${pokemonEntity.pokemon.marks}")
pokemonEntity.moveTo(pos.x, pos.y, pos.z, pokemonEntity.yRot, pokemonEntity.xRot)
pokemonEntity.entityData.set(PokemonEntity.SPAWN_DIRECTION, pokemonEntity.random.nextFloat() * 360F)
if (world.addFreshEntity(pokemonEntity)) {
@@ -16,6 +16,8 @@ import com.cobblemon.mod.common.api.abilities.Abilities
import com.cobblemon.mod.common.api.item.ability.AbilityChanger
import com.cobblemon.mod.common.api.npc.NPCClasses
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMark
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMarks
import com.cobblemon.mod.common.api.scheduling.ServerTaskTracker
import com.cobblemon.mod.common.api.scheduling.taskBuilder
import com.cobblemon.mod.common.api.text.green
@@ -38,41 +40,68 @@ import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.mojang.brigadier.Command
import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.arguments.StringArgumentType
import com.mojang.brigadier.context.CommandContext
import com.mojang.brigadier.suggestion.SuggestionProvider
import com.mojang.brigadier.suggestion.Suggestions
import com.mojang.brigadier.suggestion.SuggestionsBuilder
import net.minecraft.commands.CommandSourceStack
import net.minecraft.commands.Commands
import net.minecraft.server.level.ServerPlayer
import net.minecraft.network.chat.Component
import net.minecraft.world.phys.AABB
import com.mojang.serialization.JsonOps
import com.sun.jdi.connect.Connector
import net.minecraft.commands.SharedSuggestionProvider
import net.minecraft.commands.arguments.ResourceLocationArgument
import net.minecraft.resources.ResourceLocation
import java.io.File
import java.io.PrintWriter
import java.util.concurrent.CompletableFuture
import kotlin.collections.get
import kotlin.comparisons.then
import kotlin.text.get
@Suppress("unused")
object TestCommand {
private val MARK_SUGGESTIONS: SuggestionProvider<CommandSourceStack> = SuggestionProvider { context, builder ->
suggestMarks(builder)
}
fun register(dispatcher: CommandDispatcher<CommandSourceStack>) {
val command = Commands.literal("testcommand")
.requires { it.hasPermission(4) }
.executes(::execute)
.then(Commands.argument("mark", ResourceLocationArgument.id())
.suggests(MARK_SUGGESTIONS)
.executes(::execute))
dispatcher.register(command)
}
private fun suggestMarks(builder: SuggestionsBuilder): CompletableFuture<Suggestions> {
return SharedSuggestionProvider.suggest(PokemonMarks.marks.keys.map { it.toString() }, builder)
}
@Suppress("SameReturnValue")
private fun execute(context: CommandContext<CommandSourceStack>): Int {
if (context.source.entity !is ServerPlayer) {
return Command.SINGLE_SUCCESS
}
val player = context.source.playerOrException
val mark: PokemonMark = PokemonMarks.marks[ResourceLocationArgument.getId(context, "mark")]!!
player.party()[0]!!.marks.add(mark)
try {
//this.testCodecOutput(context)
val player = context.source.entity as ServerPlayer
player.party().forEach { it.currentHealth = it.hp / 2 }
val npc = NPCEntity(player.level())
npc.setPos(player.x, player.y, player.z)
npc.npc = NPCClasses.getByName("standard")!!
npc.initialize(50)
player.level().addFreshEntity(npc)
// val player = context.source.entity as ServerPlayer
// player.party().forEach { it.currentHealth = it.hp / 2 }
// val npc = NPCEntity(player.level())
// npc.setPos(player.x, player.y, player.z)
// npc.npc = NPCClasses.getByName("standard")!!
// npc.initialize(50)
// player.level().addFreshEntity(npc)
// val evolutionEntity = GenericBedrockEntity(world = player.level())
// evolutionEntity.apply {
// category = cobblemonResource("evolution")
@@ -36,6 +36,7 @@ import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
import com.cobblemon.mod.common.api.pokemon.feature.GlobalSpeciesFeatures
import com.cobblemon.mod.common.api.pokemon.feature.SpeciesFeatureAssignments
import com.cobblemon.mod.common.api.pokemon.feature.SpeciesFeatures
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMarks
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
import com.cobblemon.mod.common.api.spawning.CobblemonSpawnPools
import com.cobblemon.mod.common.api.spawning.CobblemonSpawnRules
@@ -91,6 +92,7 @@ object CobblemonDataProvider : DataProvider {
this.register(DexEntryAdditions)
this.register(Dexes)
this.register(DexAdditions)
this.register(PokemonMarks)
CobblemonSpawnPools.load()
this.register(PokeRods)
@@ -0,0 +1,42 @@
package com.cobblemon.mod.common.net.messages.client.data
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMark
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMarks
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.readIdentifier
import com.cobblemon.mod.common.util.readString
import com.cobblemon.mod.common.util.writeIdentifier
import com.cobblemon.mod.common.util.writeString
import net.minecraft.network.RegistryFriendlyByteBuf
class MarksRegistrySyncPacket(marks: List<PokemonMark>): DataRegistrySyncPacket<PokemonMark, MarksRegistrySyncPacket>(marks) {
companion object {
val ID = cobblemonResource("marks")
fun decode(buffer: RegistryFriendlyByteBuf) = MarksRegistrySyncPacket(emptyList()).apply { decodeBuffer(buffer) }
}
override val id = ID
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: PokemonMark) {
buffer.writeIdentifier(entry.identifier)
buffer.writeIdentifier(entry.icon)
buffer.writeString(entry.title)
buffer.writeString(entry.description)
buffer.writeFloat(entry.chance)
}
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): PokemonMark {
return PokemonMark(
id = buffer.readIdentifier(),
icon = buffer.readIdentifier(),
title = buffer.readString(),
description = buffer.readString(),
chance = buffer.readFloat()
)
}
override fun synchronizeDecoded(entries: Collection<PokemonMark>) {
PokemonMarks.reload(entries.associateBy { it.identifier })
}
}
@@ -48,6 +48,8 @@ import com.cobblemon.mod.common.api.pokemon.feature.SynchronizedSpeciesFeature
import com.cobblemon.mod.common.api.pokemon.feature.SynchronizedSpeciesFeatureProvider
import com.cobblemon.mod.common.api.pokemon.friendship.FriendshipMutationCalculator
import com.cobblemon.mod.common.api.pokemon.labels.CobblemonPokemonLabels
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMark
import com.cobblemon.mod.common.api.pokemon.marks.PokemonMarks
import com.cobblemon.mod.common.api.pokemon.moves.LearnsetQuery
import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.api.pokemon.stats.Stats
@@ -64,6 +66,7 @@ import com.cobblemon.mod.common.api.types.ElementalType
import com.cobblemon.mod.common.api.types.ElementalTypes
import com.cobblemon.mod.common.api.types.tera.TeraType
import com.cobblemon.mod.common.api.types.tera.TeraTypes
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.config.CobblemonConfig
import com.cobblemon.mod.common.datafixer.CobblemonSchemas
import com.cobblemon.mod.common.datafixer.CobblemonTypeReferences
@@ -105,6 +108,7 @@ import com.cobblemon.mod.common.util.playSoundServer
import com.cobblemon.mod.common.util.server
import com.cobblemon.mod.common.util.setPositionSafely
import com.cobblemon.mod.common.util.toBlockPos
import com.google.gson.JsonArray
import com.google.gson.JsonObject
import com.mojang.datafixers.util.Pair
import com.mojang.serialization.Codec
@@ -122,6 +126,7 @@ import kotlin.random.Random
import net.minecraft.core.BlockPos
import net.minecraft.core.RegistryAccess
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.ListTag
import net.minecraft.nbt.NbtOps
import net.minecraft.nbt.StringTag
import net.minecraft.network.RegistryFriendlyByteBuf
@@ -129,6 +134,7 @@ import net.minecraft.network.chat.MutableComponent
import net.minecraft.network.chat.contents.PlainTextContents
import net.minecraft.network.codec.ByteBufCodecs
import net.minecraft.network.codec.StreamCodec
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerLevel
import net.minecraft.server.level.ServerPlayer
import net.minecraft.tags.FluidTags
@@ -147,6 +153,8 @@ import net.minecraft.world.level.block.MagmaBlock
import net.minecraft.world.level.block.SweetBerryBushBlock
import net.minecraft.world.level.block.WitherRoseBlock
import net.minecraft.world.phys.Vec3
import kotlin.collections.get
import kotlin.toString
enum class OriginalTrainerType : StringRepresentable {
NONE, PLAYER, NPC;
@@ -228,7 +236,14 @@ open class Pokemon : ShowdownIdentifiable {
_nickname.emit(value)
}
fun getDisplayName(): MutableComponent = nickname?.copy()?.takeIf { it.contents != PlainTextContents.EMPTY } ?: species.translatedName.copy()
fun getDisplayName(mark: PokemonMark? = selectedMark): MutableComponent =
if (mark != null) {
nickname?.copy()?.takeIf { it.contents != PlainTextContents.EMPTY }?.append(" ")?.append(lang(mark.title)) ?: species.translatedName.copy().append(" ").append(lang(mark.title))
} else {
nickname?.copy()?.takeIf { it.contents != PlainTextContents.EMPTY } ?: species.translatedName.copy()
}
fun getDisplayNameNoTitle() = nickname?.copy()?.takeIf { it.contents != PlainTextContents.EMPTY } ?: species.translatedName.copy()
var level = 1
set(value) {
@@ -426,6 +441,8 @@ open class Pokemon : ShowdownIdentifiable {
_originalTrainerName.emit(value)
}
val marks = mutableListOf<PokemonMark>()
var selectedMark: PokemonMark? = PokemonMarks.marks[cobblemonResource("resurrected")]
/**
* All moves that the Pokémon has, at some point, known. This is to allow players to
@@ -916,22 +933,45 @@ open class Pokemon : ShowdownIdentifiable {
fun removeHeldItem(): ItemStack = this.swapHeldItem(ItemStack.EMPTY)
fun saveToNBT(registryAccess: RegistryAccess, nbt: CompoundTag = CompoundTag()): CompoundTag {
val markList = marks.map { it.identifier.toString() }.map { StringTag.valueOf(it) }
nbt.put(DataKeys.POKEMON_MARKS, ListTag().also { it.addAll(markList) })
if (selectedMark != null) {
nbt.put(DataKeys.SELECTED_MARK, StringTag.valueOf(selectedMark!!.identifier.toString()))
}
return this.saveTo(registryAccess.createSerializationContext(NbtOps.INSTANCE), nbt).orThrow as CompoundTag
}
fun loadFromNBT(registryAccess: RegistryAccess, nbt: CompoundTag): Pokemon {
this.loadFrom(registryAccess.createSerializationContext(NbtOps.INSTANCE), nbt)
val markList = nbt.get(DataKeys.POKEMON_MARKS) as ListTag
markList.forEach { PokemonMarks.marks[ResourceLocation.tryParse(it.asString)]?.let { it1 -> this.marks.add(it1) } }
if (nbt.contains(DataKeys.SELECTED_MARK)) {
val markOrNull = PokemonMarks.marks[ResourceLocation.tryParse(nbt.getString(DataKeys.SELECTED_MARK))]
if (markOrNull != null) selectedMark = markOrNull
}
return this
}
fun saveToJSON(registryAccess: RegistryAccess, json: JsonObject = JsonObject()): JsonObject {
val ops = registryAccess.createSerializationContext(JsonOps.INSTANCE)
val marksList = JsonArray()
marks.forEach { marksList.add(it.identifier.toString()) }
json.add(DataKeys.POKEMON_MARKS, marksList)
if (selectedMark != null) json.addProperty(DataKeys.SELECTED_MARK, selectedMark!!.identifier.toString())
return this.saveTo(ops, json).orThrow as JsonObject
}
fun loadFromJSON(registryAccess: RegistryAccess, json: JsonObject): Pokemon {
val ops = registryAccess.createSerializationContext(JsonOps.INSTANCE)
this.loadFrom(ops, json)
json.getAsJsonArray(DataKeys.POKEMON_MARKS).forEach {
val markId = ResourceLocation.tryParse(it.asString)
if (markId != null && PokemonMarks.marks[markId] != null) this.marks.add(PokemonMarks.marks[markId]!!)
}
if (json.has(DataKeys.SELECTED_MARK)) {
val markOrNull = PokemonMarks.marks[ResourceLocation.tryParse(json.get(DataKeys.SELECTED_MARK).toString())]
if (markOrNull != null) selectedMark = markOrNull
}
return this
}
@@ -69,6 +69,9 @@ object DataKeys {
const val POKEMON_ORIGINAL_TRAINER = "PokemonOriginalTrainer"
const val POKEMON_ORIGINAL_TRAINER_TYPE = "PokemonOriginalTrainerType"
const val POKEMON_MARKS = "Marks"
const val SELECTED_MARK = "CurrentMark"
const val POKEMON_PROPERTIES_MOVES = "Moves"
const val POKEMON_PROPERTIES_HELDITEM = "HeldItem"
@@ -442,7 +442,7 @@
"item.cobblemon.relic_coin": "Relic Coin",
"block.cobblemon.relic_coin_pouch": "Relic Coin Pouch",
"block.cobblemon.relic_coin_sack": "Relic Coin Sack",
"item.cobblemon.automaton_armor_trim_smithing_template": "Smithing Template",
"trim_pattern.cobblemon.automaton": "Automaton Armor Trim",
@@ -465,6 +465,8 @@
"cobblemon.fossil.sail": "Sail",
"cobblemon.fossil.skull": "Skull",
"cobblemon.marks.resurrected": "Resurrected",
"cobblemon.marks.resurrected.title": "%s the Resurrected",
"cobblemon.gender.female": "Female",
"cobblemon.gender.male": "Male",
"cobblemon.gender.genderless": "Genderless",
@@ -6635,5 +6637,6 @@
"cobblemon.ability.zenmode": "Zen Mode",
"cobblemon.ability.zenmode.desc": "Changes the Pokémon's shape when HP is half or less.",
"cobblemon.ability.zerotohero": "Zero to Hero",
"cobblemon.ability.zerotohero.desc": "The Pokémon transforms into its Hero Form when it switches out."
"cobblemon.ability.zerotohero.desc": "The Pokémon transforms into its Hero Form when it switches out.",
"cobblemon.marks.resurrected.title": "The Resurrected"
}
@@ -0,0 +1,7 @@
{
"id": "cobblemon:resurrected",
"title": "marks.resurrected.title",
"description": "cobblemon:marks.resurrected.description",
"icon": "cobblemon:textures/gui/icons/marks/resurrected",
"chance": 1.0
}