mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-29 13:28:54 -04:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e48e492392 | ||
|
|
1f93994eba | ||
|
|
5210121b3d | ||
|
|
bacc482bf0 | ||
|
|
edb3f906f8 | ||
|
|
4171bf341b |
No files matched your search
+2
-2
@@ -1,8 +1,8 @@
|
||||
# Changelog
|
||||
## [1.8.x (MONTH xth, 2026)](#1-8-x)
|
||||
## [1.8.5 (MONTH xth, 2026)](#1-8-5)
|
||||
|
||||
### Additions
|
||||
- You can now view the biome, level, and date you caught a Pokémon.
|
||||
- Added the `healersSetSpawn` gamerule. When enabled, using a healing machine will set your spawnpoint.
|
||||
|
||||
### Changes
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.api.riding.RidingStyle;
|
||||
import com.cobblemon.mod.common.api.spawning.spawner.PlayerSpawner;
|
||||
import com.cobblemon.mod.common.api.spawning.spawner.PlayerSpawnerFactory;
|
||||
import com.cobblemon.mod.common.api.stats.CobblemonStats;
|
||||
import com.cobblemon.mod.common.block.HealingMachineBlock;
|
||||
import com.cobblemon.mod.common.duck.ServerLevelDuck;
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules;
|
||||
@@ -22,10 +23,14 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
@@ -33,6 +38,9 @@ import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@Mixin(ServerPlayer.class)
|
||||
public abstract class ServerPlayerMixin implements PlayerSpawnerAccessor {
|
||||
@@ -142,4 +150,17 @@ public abstract class ServerPlayerMixin implements PlayerSpawnerAccessor {
|
||||
((ServerLevelDuck) this.serverLevel()).cobblemon$getLevelResourceLocation()
|
||||
);
|
||||
}
|
||||
|
||||
@Inject(
|
||||
method = "findRespawnAndUseSpawnBlock(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;FZZ)Ljava/util/Optional;",
|
||||
at = @At(value = "HEAD"),
|
||||
cancellable = true
|
||||
)
|
||||
private static void cobblemon$useHealthStationAsRespawn(ServerLevel level, BlockPos pos, float angle, boolean forced, boolean keepInventory, CallbackInfoReturnable<Optional<ServerPlayer.RespawnPosAngle>> cir) {
|
||||
BlockState state = level.getBlockState(pos);
|
||||
Block block = state.getBlock();
|
||||
if (block instanceof HealingMachineBlock && HealingMachineBlock.Companion.canSetSpawn(level)) {
|
||||
cir.setReturnValue(HealingMachineBlock.Companion.findStandUpPosition(EntityType.PLAYER, level, pos).map((vec3) -> ServerPlayer.RespawnPosAngle.of(vec3, pos)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -344,7 +344,6 @@ 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()))
|
||||
|
||||
@@ -24,6 +24,7 @@ import net.minecraft.network.chat.Component
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.InteractionResult
|
||||
import net.minecraft.world.entity.EntityType
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.Item
|
||||
@@ -31,13 +32,9 @@ import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.TooltipFlag
|
||||
import net.minecraft.world.item.context.BlockPlaceContext
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.CollisionGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.BaseEntityBlock
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock
|
||||
import net.minecraft.world.level.block.Mirror
|
||||
import net.minecraft.world.level.block.RenderShape
|
||||
import net.minecraft.world.level.block.Rotation
|
||||
import net.minecraft.world.level.block.*
|
||||
import net.minecraft.world.level.block.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.entity.BlockEntityTicker
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
@@ -48,9 +45,11 @@ import net.minecraft.world.level.block.state.properties.IntegerProperty
|
||||
import net.minecraft.world.level.block.state.properties.Property
|
||||
import net.minecraft.world.level.pathfinder.PathComputationType
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
import java.util.Optional
|
||||
|
||||
@Suppress("DEPRECATED", "OVERRIDE_DEPRECATION")
|
||||
class HealingMachineBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
@@ -79,6 +78,14 @@ class HealingMachineBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
const val MAX_CHARGE_LEVEL = 5
|
||||
val CHARGE_LEVEL: IntegerProperty = IntegerProperty.create("charge", 0, MAX_CHARGE_LEVEL + 1)
|
||||
val NATURAL: BooleanProperty = BooleanProperty.create("natural")
|
||||
|
||||
fun canSetSpawn(level: Level): Boolean {
|
||||
return level.gameRules.getBoolean(CobblemonGameRules.HEALER_SET_SPAWN)
|
||||
}
|
||||
|
||||
fun findStandUpPosition(entityType: EntityType<*>, level: CollisionGetter, pos: BlockPos): Optional<Vec3> {
|
||||
return RespawnAnchorBlock.findStandUpPosition(entityType, level, pos) // Exists if we ever want to make something more custom, but anchor block logic should suffice
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
@@ -158,7 +165,12 @@ class HealingMachineBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
}
|
||||
val party = serverPlayerEntity.party()
|
||||
val pc = serverPlayerEntity.pc()
|
||||
val healPC = player.level().gameRules.getBoolean(CobblemonGameRules.HEALERS_HEAL_PC);
|
||||
val healPC = player.level().gameRules.getBoolean(CobblemonGameRules.HEALERS_HEAL_PC)
|
||||
|
||||
// Do spawnpoint stuff
|
||||
if (canSetSpawn(world)) {
|
||||
player.setRespawnPosition(world.dimension(), blockPos, player.yRot, false, true)
|
||||
}
|
||||
|
||||
if (party.none() && (!healPC || pc.none())) {
|
||||
player.sendSystemMessage(lang("healingmachine.nopokemon").red(), true)
|
||||
@@ -183,6 +195,7 @@ class HealingMachineBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
player.sendSystemMessage(lang("healingmachine.notenoughcharge", "${((neededCharge/party.count())*100f).toInt()}%").red(), true)
|
||||
}
|
||||
party.forEach { it.tryRecallWithAnimation() }
|
||||
|
||||
return InteractionResult.CONSUME
|
||||
}
|
||||
|
||||
|
||||
-32
@@ -13,7 +13,6 @@ 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
|
||||
@@ -28,7 +27,6 @@ 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,
|
||||
@@ -47,25 +45,6 @@ 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
|
||||
@@ -184,17 +163,6 @@ 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
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* 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
|
||||
}
|
||||
}
|
||||
+7
-67
@@ -6,59 +6,23 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.gui.summary
|
||||
package com.cobblemon.mod.common.client.gui.summary.widgets.screens.moves
|
||||
|
||||
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 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(
|
||||
class MoveDescriptionScrollList(
|
||||
private val listX: Int,
|
||||
private val listY: Int,
|
||||
height: Int,
|
||||
width: Int,
|
||||
slotHeight: Int
|
||||
) : ObjectSelectionList<ScrollableTextBoxEntry>(
|
||||
) : ObjectSelectionList<MoveDescriptionEntry>(
|
||||
Minecraft.getInstance(),
|
||||
width, // width
|
||||
height, // height
|
||||
60, // width
|
||||
30, // height
|
||||
0, // top
|
||||
slotHeight
|
||||
), CobblemonRenderable {
|
||||
@@ -74,31 +38,8 @@ class ScrollableTextBox(
|
||||
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,
|
||||
@@ -138,7 +79,7 @@ class ScrollableTextBox(
|
||||
&& mouseY < bottom
|
||||
}
|
||||
|
||||
fun setText(moveDescription: MutableComponent) {
|
||||
fun setMoveDescription(moveDescription: MutableComponent) {
|
||||
clearEntries()
|
||||
val splitWidth = 100
|
||||
val text = moveDescription.string
|
||||
@@ -162,8 +103,7 @@ class ScrollableTextBox(
|
||||
}
|
||||
|
||||
for (part in splitText) {
|
||||
addEntry(ScrollableTextBoxEntry(Component.literal(part)))
|
||||
addEntry(MoveDescriptionEntry(Component.literal(part)))
|
||||
}
|
||||
scrollAmount = 0.0
|
||||
}
|
||||
}
|
||||
+3
-6
@@ -13,7 +13,6 @@ 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
|
||||
@@ -71,11 +70,9 @@ class MovesWidget(
|
||||
addWidget(it)
|
||||
}
|
||||
|
||||
private var descriptionScrollList = ScrollableTextBox(
|
||||
x + 68,
|
||||
private var descriptionScrollList = MoveDescriptionScrollList(
|
||||
x + 69,
|
||||
y + 113,
|
||||
30,
|
||||
61,
|
||||
5
|
||||
)
|
||||
|
||||
@@ -218,7 +215,7 @@ class MovesWidget(
|
||||
|
||||
fun selectMove(move: Move?) {
|
||||
selectedMove = if (selectedMove == move || move == null) null else move
|
||||
descriptionScrollList.setText(selectedMove?.description ?: "".text())
|
||||
descriptionScrollList.setMoveDescription(selectedMove?.description ?: "".text())
|
||||
}
|
||||
|
||||
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
||||
|
||||
-10
@@ -47,7 +47,6 @@ 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.*
|
||||
@@ -75,9 +74,6 @@ 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 {
|
||||
@@ -364,12 +360,6 @@ 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
@@ -1,44 +0,0 @@
|
||||
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,12 +550,6 @@ 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
|
||||
*/
|
||||
@@ -1533,7 +1527,6 @@ 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()
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
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,7 +86,6 @@ 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"
|
||||
|
||||
+9
-13
@@ -8,23 +8,25 @@
|
||||
|
||||
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 pokemonMetData: Optional<PokemonMetData>
|
||||
val originalTrainerFriendship: Optional<Int>
|
||||
) : Partial<Pokemon> {
|
||||
|
||||
override fun into(other: Pokemon): Pokemon {
|
||||
this.originalTrainerFriendship.ifPresent { other.originalTrainerFriendship = it }
|
||||
other.metData = this.pokemonMetData.orElse(null)
|
||||
return other
|
||||
}
|
||||
|
||||
@@ -34,18 +36,12 @@ 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),
|
||||
PokemonMetData.CODEC.optionalFieldOf(DataKeys.POKEMON_MET_DATA).forGetter(ClientPokemonP4::pokemonMetData)
|
||||
).apply(instance) {
|
||||
originalTrainerFriendship, pokemonMetData -> ClientPokemonP4(
|
||||
originalTrainerFriendship, pokemonMetData
|
||||
)
|
||||
}
|
||||
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(ClientPokemonP4::originalTrainerFriendship)
|
||||
).apply(instance, ::ClientPokemonP4)
|
||||
}
|
||||
|
||||
internal fun from(pokemon: Pokemon): ClientPokemonP4 = ClientPokemonP4(
|
||||
Optional.ofNullable(pokemon.originalTrainerFriendship),
|
||||
Optional.ofNullable(pokemon.metData)
|
||||
Optional.ofNullable(pokemon.originalTrainerFriendship)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,6 @@
|
||||
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
|
||||
@@ -17,32 +16,28 @@ import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import java.util.*
|
||||
|
||||
internal data class PokemonP4(
|
||||
val originalTrainerFriendship: Optional<Int>,
|
||||
val pokemonMetData: Optional<PokemonMetData>
|
||||
val originalTrainerFriendship: Optional<Int>
|
||||
) : 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),
|
||||
PokemonMetData.CODEC.optionalFieldOf(DataKeys.POKEMON_MET_DATA).forGetter(PokemonP4::pokemonMetData)
|
||||
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(PokemonP4::originalTrainerFriendship)
|
||||
).apply(instance) {
|
||||
originalTrainerFriendship, pokemonMetData -> PokemonP4(
|
||||
originalTrainerFriendship, pokemonMetData
|
||||
originalTrainerFriendship -> PokemonP4(
|
||||
originalTrainerFriendship
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun from(pokemon: Pokemon): PokemonP4 = PokemonP4(
|
||||
Optional.ofNullable(pokemon.originalTrainerFriendship),
|
||||
Optional.ofNullable(pokemon.metData)
|
||||
Optional.ofNullable(pokemon.originalTrainerFriendship)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -27,5 +27,7 @@ object CobblemonGameRules {
|
||||
@JvmField
|
||||
val HEALERS_HEAL_PC: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("healersHealPC", GameRules.Category.MISC, BooleanRuleInvoker.`cobblemon$create`(false))
|
||||
@JvmField
|
||||
val HEALER_SET_SPAWN: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("healersSetSpawn", GameRules.Category.MISC, BooleanRuleInvoker.`cobblemon$create`(false))
|
||||
@JvmField
|
||||
val DO_POKEMON_PREDATION: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("doPokemonPredation", GameRules.Category.MOBS, BooleanRuleInvoker.`cobblemon$create`(true))
|
||||
}
|
||||
@@ -1267,8 +1267,6 @@
|
||||
"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!",
|
||||
|
||||
@@ -157,4 +157,6 @@ transitive-accessible method net/minecraft/client/model/HumanoidModel setupAttac
|
||||
transitive-accessible method net/minecraft/client/model/HumanoidModel poseRightArm (Lnet/minecraft/world/entity/LivingEntity;)V
|
||||
transitive-accessible method net/minecraft/client/model/HumanoidModel poseLeftArm (Lnet/minecraft/world/entity/LivingEntity;)V
|
||||
|
||||
transitive-accessible method net/minecraft/world/level/block/BaseEntityBlock createTickerHelper (Lnet/minecraft/world/level/block/entity/BlockEntityType;Lnet/minecraft/world/level/block/entity/BlockEntityType;Lnet/minecraft/world/level/block/entity/BlockEntityTicker;)Lnet/minecraft/world/level/block/entity/BlockEntityTicker;
|
||||
transitive-accessible method net/minecraft/world/level/block/BaseEntityBlock createTickerHelper (Lnet/minecraft/world/level/block/entity/BlockEntityType;Lnet/minecraft/world/level/block/entity/BlockEntityType;Lnet/minecraft/world/level/block/entity/BlockEntityTicker;)Lnet/minecraft/world/level/block/entity/BlockEntityTicker;
|
||||
|
||||
transitive-accessible class net/minecraft/server/level/ServerPlayer$RespawnPosAngle
|
||||
Reference in new issue
Block a user