Compare commits

...
@@ -58,6 +58,7 @@ import com.cobblemon.mod.common.api.reactive.Observable
import com.cobblemon.mod.common.api.reactive.SettableObservable
import com.cobblemon.mod.common.api.reactive.SimpleObservable
import com.cobblemon.mod.common.api.scheduling.afterOnServer
import com.cobblemon.mod.common.api.storage.InvalidSpeciesException
import com.cobblemon.mod.common.api.storage.StoreCoordinates
import com.cobblemon.mod.common.api.storage.party.NPCPartyStore
import com.cobblemon.mod.common.api.storage.party.PlayerPartyStore
@@ -109,6 +110,7 @@ import com.cobblemon.mod.common.util.lang
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.startWith
import com.cobblemon.mod.common.util.toBlockPos
import com.google.gson.JsonObject
import com.mojang.datafixers.util.Pair
@@ -134,6 +136,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
@@ -154,6 +157,7 @@ import net.minecraft.world.level.block.WitherRoseBlock
import net.minecraft.world.phys.Vec3
import kotlin.math.*
import net.minecraft.util.Mth
import java.util.regex.Pattern
enum class OriginalTrainerType : StringRepresentable {
NONE, PLAYER, NPC;
@@ -1653,11 +1657,29 @@ open class Pokemon : ShowdownIdentifiable {
internal val SHEDINJA = cobblemonResource("shedinja")
fun loadFromNBT(registryAccess: RegistryAccess, compound: CompoundTag): Pokemon {
return this.loadFrom(registryAccess.createSerializationContext(NbtOps.INSTANCE), compound).orThrow.first
val result = this.loadFrom(registryAccess.createSerializationContext(NbtOps.INSTANCE), compound)
result.error().ifPresent {
if (it.message().startsWith("No species for ID")) {
val matcher = Pattern.compile("[a-z0-9_.-]:[a-z0-9/._-]").matcher(it.message())
matcher.find()
throw InvalidSpeciesException(ResourceLocation.parse(matcher.group(0)))
}
}
return result.orThrow.first
}
fun loadFromJSON(registryAccess: RegistryAccess, json: JsonObject): Pokemon {
return this.loadFrom(registryAccess.createSerializationContext(JsonOps.INSTANCE), json).orThrow.first
val result = this.loadFrom(registryAccess.createSerializationContext(JsonOps.INSTANCE), json)
result.error().ifPresent {
if (it.message().startsWith("No species for ID")) {
val matcher = Pattern.compile("[a-z0-9_.-]:[a-z0-9/._-]").matcher(it.message())
matcher.find()
throw InvalidSpeciesException(ResourceLocation.parse(matcher.group(0)))
}
}
return result.orThrow.first
}
private fun <T> loadFrom(ops: DynamicOps<T>, data: T): DataResult<Pair<Pokemon, T>> {