forked from mirrors/cobblemon
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75908c9f0c | ||
|
|
dde9c47cd6 | ||
|
|
d8eb63b74f | ||
|
|
ba7d23d1e2 | ||
|
|
ecae1dce56 | ||
|
|
d66154bf62 |
@@ -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
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+42
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user