mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-20 14:16:26 -04:00
Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
674ade41b1 | ||
|
|
0c5d228a11 | ||
|
|
5831cb30d3 | ||
|
|
5cb933f555 | ||
|
|
2505d51744 |
@@ -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)
|
||||
+17
@@ -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()
|
||||
}
|
||||
}
|
||||
+7
@@ -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) {
|
||||
|
||||
+28
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
+16
@@ -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()
|
||||
}
|
||||
}
|
||||
+18
@@ -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())
|
||||
}
|
||||
}
|
||||
+19
@@ -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)
|
||||
}
|
||||
}
|
||||
+17
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user