Skip to content

Commit

Permalink
1.0.32
Browse files Browse the repository at this point in the history
Added COOP Mode
Added /cobbledex collection command
Added better translation for damage multipliers
Updated catch and shiny icons
  • Loading branch information
Rafacasari committed Jul 1, 2024
1 parent 57a0397 commit afae2e5
Show file tree
Hide file tree
Showing 15 changed files with 510 additions and 43 deletions.
58 changes: 52 additions & 6 deletions common/src/main/kotlin/com/rafacasari/mod/cobbledex/Cobbledex.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import com.cobblemon.mod.common.api.text.onHover
import com.cobblemon.mod.common.platform.events.PlatformEvents
import com.cobblemon.mod.common.platform.events.ServerPlayerEvent
import com.cobblemon.mod.common.pokemon.FormData
import com.cobblemon.mod.common.util.server
import com.rafacasari.mod.cobbledex.api.CobbledexCoopDiscovery
import com.rafacasari.mod.cobbledex.api.CobbledexDiscovery
import com.rafacasari.mod.cobbledex.api.classes.DiscoveryRegister
import com.rafacasari.mod.cobbledex.client.gui.CobbledexCollectionGUI
Expand All @@ -23,10 +25,13 @@ import com.rafacasari.mod.cobbledex.network.client.packets.ReceiveCollectionData
import com.rafacasari.mod.cobbledex.utils.MiscUtils.cobbledexTextTranslation
import com.rafacasari.mod.cobbledex.utils.MiscUtils.logInfo
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.text.Text
import net.minecraft.util.Formatting
import net.minecraft.util.WorldSavePath
import java.io.File
import java.io.FileReader
import java.io.FileWriter
import java.nio.file.Paths

object Cobbledex {
private lateinit var config: CobbledexConfig
Expand All @@ -48,10 +53,12 @@ object Cobbledex {
implementation.registerItems()
loadConfig()

PlatformEvents.SERVER_STARTED.subscribe { _ ->
PlatformEvents.SERVER_STARTED.subscribe { serverEvent ->
logInfo("Server initialized...")

PlayerDataExtensionRegistry.register(CobbledexDiscovery.NAME_KEY, CobbledexDiscovery::class.java)
val serverPath = serverEvent.server.getSavePath(WorldSavePath.ROOT).toAbsolutePath()
CobbledexCoopDiscovery.load(Paths.get(serverPath.toString(), "cobbledex-coop.json").toString())

if (!eventsCreated) {
CobblemonEvents.STARTER_CHOSEN.subscribe(Priority.LOW) {
Expand All @@ -74,6 +81,18 @@ object Cobbledex {
registerPlayerDiscovery(player, it.pokemon.form, it.pokemon.shiny, DiscoveryRegister.RegisterType.CAUGHT)
}

CobblemonEvents.TRADE_COMPLETED.subscribe(Priority.LOW) {
serverEvent.server.playerManager.getPlayer(it.tradeParticipant1.uuid)?.let { player ->
val pokemon = it.tradeParticipant2Pokemon
registerPlayerDiscovery(player, pokemon.form, pokemon.shiny, DiscoveryRegister.RegisterType.CAUGHT)
}

serverEvent.server.playerManager.getPlayer(it.tradeParticipant2.uuid)?.let { player ->
val pokemon = it.tradeParticipant1Pokemon
registerPlayerDiscovery(player, pokemon.form, pokemon.shiny, DiscoveryRegister.RegisterType.CAUGHT)
}
}

// This should prevent events from being added more than once
eventsCreated = true
}
Expand All @@ -89,10 +108,18 @@ object Cobbledex {
}

PlatformEvents.SERVER_PLAYER_LOGIN.subscribe { login: ServerPlayerEvent.Login ->
if (config.CoopMode) {
val discoveryData = CobbledexCoopDiscovery.getDiscovery()
if (discoveryData != null) {
ReceiveCollectionDataPacket(discoveryData.registers).sendToPlayer(login.player)
}
}
else {
val cobbledexData = CobbledexDiscovery.getPlayerData(login.player)
val registers = cobbledexData.registers
ReceiveCollectionDataPacket(registers).sendToPlayer(login.player)
}

val cobbledexData = CobbledexDiscovery.getPlayerData(login.player)
val registers = cobbledexData.registers
ReceiveCollectionDataPacket(registers).sendToPlayer(login.player)
getConfig().syncPlayer(login.player)
}
}
Expand All @@ -110,9 +137,28 @@ object Cobbledex {
if (formData == null)
return ActionResult.PASS

if(CobbledexDiscovery.addOrUpdatePlayer(player, formData, isShiny, type) { newEntry ->
val isANewDiscovery = CobbledexDiscovery.addOrUpdatePlayer(player, formData, isShiny, type) { newEntry ->
AddToCollectionPacket(formData, newEntry).sendToPlayer(player)
}) {
}

val isANewCoopDiscovery = CobbledexCoopDiscovery.addOrUpdateCoop(formData, isShiny, type) { newEntry ->
if (config.CoopMode)
AddToCollectionPacket(formData, newEntry).sendToAllPlayers()
}

if(isANewCoopDiscovery && config.CoopMode) {
val translation = cobbledexTextTranslation("new_pokemon_discovered_coop", Text.literal(player.gameProfile.name).bold(), formData.species.translatedName.bold().formatted(Formatting.GREEN).onClick {
OpenCobbledexPacket(formData).sendToPlayer(it)
}.onHover(cobbledexTextTranslation("click_to_open_cobbledex")))

server()?.let { server ->
server.playerManager.playerList.forEach { serverPlayer ->
serverPlayer.sendMessage(translation)
}
}
}

if(isANewDiscovery && !config.CoopMode) {
val translation = cobbledexTextTranslation("new_pokemon_discovered", formData.species.translatedName.bold().formatted(Formatting.GREEN).onClick {
OpenCobbledexPacket(formData).sendToPlayer(it)
}.onHover(cobbledexTextTranslation("click_to_open_cobbledex")))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import net.minecraft.server.network.ServerPlayerEntity

class CobbledexConfig : IEncodable {

var CoopMode = false
var GiveCobbledexItemOnStarterChosen = true

var HowToFind_IsEnabled = true
Expand Down Expand Up @@ -36,6 +37,8 @@ class CobbledexConfig : IEncodable {
fun decode(reader: PacketByteBuf) : CobbledexConfig {
val config = CobbledexConfig()

config.CoopMode = reader.readBoolean()

config.HowToFind_IsEnabled = reader.readBoolean()
config.HowToFind_NeedSeen = reader.readBoolean()
config.HowToFind_NeedCatch = reader.readBoolean()
Expand Down Expand Up @@ -67,6 +70,8 @@ class CobbledexConfig : IEncodable {
}

override fun encode(buffer: PacketByteBuf) {
buffer.writeBoolean(CoopMode)

buffer.writeBoolean(HowToFind_IsEnabled)
buffer.writeBoolean(HowToFind_NeedSeen)
buffer.writeBoolean(HowToFind_NeedCatch)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
package com.rafacasari.mod.cobbledex.api

import com.cobblemon.mod.common.pokemon.FormData
import com.google.gson.GsonBuilder
import com.rafacasari.mod.cobbledex.api.classes.DiscoveryRegister
import com.rafacasari.mod.cobbledex.utils.MiscUtils.logDebug
import com.rafacasari.mod.cobbledex.utils.MiscUtils.logError
import com.rafacasari.mod.cobbledex.utils.MiscUtils.logInfo
import com.rafacasari.mod.cobbledex.utils.MiscUtils.logWarn
import java.io.File
import java.io.FileReader
import java.io.FileWriter

class CobbledexCoopDiscovery(val registers: MutableMap<String, MutableMap<String, DiscoveryRegister>> = mutableMapOf()) {
companion object {
private val GSON = GsonBuilder()
.disableHtmlEscaping()
.setPrettyPrinting()
.create()

private var isInitialized: Boolean =false
private lateinit var discovery: CobbledexCoopDiscovery

private lateinit var filePath: String
fun getDiscovery() : CobbledexCoopDiscovery?
{
if (!isInitialized)
logWarn("Called getDiscovery before initialization")

return if (this::discovery.isInitialized) discovery else null
}

fun load(path: String) {
if (isInitialized) {
logWarn("CobbledexCoopDiscovery.load was called twice!")
return
}

isInitialized = true
filePath = path

logInfo("Loading CobbledexCoopDiscovery at \"${filePath}\"...")
val configFile = File(path)
configFile.parentFile.mkdirs()

if (configFile.exists()) {
try {
val fileReader = FileReader(configFile)
discovery = GSON.fromJson(fileReader, CobbledexCoopDiscovery::class.java)
fileReader.close()
} catch (error: Exception) {
logError("COOP Cobbledex Discovery failed to load, using default file instead!")
discovery = CobbledexCoopDiscovery()
error.printStackTrace()
}
} else {
discovery = CobbledexCoopDiscovery()
}

this.save()
}

fun save() {
if (!isInitialized)
{
logWarn("Tried to save CobbledexCoopDiscovery without loading it first")
return
}

if (!this::filePath.isInitialized)
{
logWarn("Tried to save CobbledexCoopDiscovery without filePath being initialized")
return
}

val discoveryRegister = getDiscovery()
if (discoveryRegister == null) {
logWarn("Tried to save CobbledexCoopDiscovery but discover variable was null (or not initialized)")
return
}

logDebug("Saving ${discoveryRegister.registers.size} entries to $filePath")
try {
val fileWriter = FileWriter(File(filePath))
GSON.toJson(discoveryRegister, fileWriter)
fileWriter.flush()
fileWriter.close()
} catch (exception: Exception) {
logError("Failed to save the CobbledexCoopDiscovery! Stack trace:")
exception.printStackTrace()
}
}

fun addOrUpdateWithoutSaving(speciesShowdownId: String, formOnlyShowdownId: String, isShiny: Boolean, status: DiscoveryRegister.RegisterType, update: ((DiscoveryRegister) -> Unit)? = null): Boolean {
val data = getDiscovery()

var returnValue = false
if (data != null) returnValue = data.addOrUpdate(speciesShowdownId, formOnlyShowdownId, isShiny, status, update)

return returnValue
}

fun addOrUpdateCoop(speciesShowdownId: String, formOnlyShowdownId: String, isShiny: Boolean, status: DiscoveryRegister.RegisterType, update: ((DiscoveryRegister) -> Unit)? = null): Boolean {
val returnValue = addOrUpdateWithoutSaving(speciesShowdownId, formOnlyShowdownId, isShiny, status, update)

// Save :D
save()
return returnValue
}

fun addOrUpdateCoopWithoutSaving(form: FormData, isShiny: Boolean, status: DiscoveryRegister.RegisterType, update: ((DiscoveryRegister) -> Unit)? = null): Boolean {
return addOrUpdateWithoutSaving(form.species.showdownId(), form.formOnlyShowdownId(), isShiny, status, update)
}

fun addOrUpdateCoop(form: FormData, isShiny: Boolean, status: DiscoveryRegister.RegisterType, update: ((DiscoveryRegister) -> Unit)? = null): Boolean {
return addOrUpdateCoop(form.species.showdownId(), form.formOnlyShowdownId(), isShiny, status, update)
}
}

private fun getRegister(showdownId: String): MutableMap<String, DiscoveryRegister>? {
return registers[showdownId]
}

// addOrUpdate(showdownId, onlyFormShowdownId)
// Returns if it is a new entry (meaning that should display a message in chat)
//
fun addOrUpdate(species: String, form: String, isShiny: Boolean, status: DiscoveryRegister.RegisterType, update: ((DiscoveryRegister) -> Unit)?): Boolean {
val currentRegister = getRegister(species)

val discoverTimestamp = System.currentTimeMillis()
val caughtTimestamp = if(status == DiscoveryRegister.RegisterType.CAUGHT) discoverTimestamp else null

if (currentRegister != null) {
val formRegister = currentRegister[form]
if (formRegister != null) {
// Update only if needed
if (!formRegister.isShiny && isShiny)
formRegister.isShiny = true

// Update only if needed
if (formRegister.status == DiscoveryRegister.RegisterType.SEEN && status == DiscoveryRegister.RegisterType.CAUGHT) {
formRegister.status = DiscoveryRegister.RegisterType.CAUGHT
formRegister.caughtTimestamp = caughtTimestamp
}

update?.invoke(formRegister)
return false
} else {
// New form
val newRegister = DiscoveryRegister(isShiny, status, discoverTimestamp, caughtTimestamp)
currentRegister[form] = newRegister
update?.invoke(newRegister)
return true
}
} else {
// New pokemon
val newRegister = DiscoveryRegister(isShiny, status, discoverTimestamp, caughtTimestamp)
registers[species] = mutableMapOf(form to newRegister)
update?.invoke(newRegister)
return true
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class CobbledexDiscovery(val registers: MutableMap<String, MutableMap<String, Di
return registers[showdownId]
}

fun addOrUpdate(species: String, form: String, isShiny: Boolean, status: DiscoveryRegister.RegisterType, update: ((DiscoveryRegister) -> Unit)?): Boolean {
fun addOrUpdate(species: String, form: String, isShiny: Boolean, status: DiscoveryRegister.RegisterType, update: ((DiscoveryRegister) -> Unit)? = null): Boolean {
val currentRegister = getRegister(species)

val discoverTimestamp = System.currentTimeMillis()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,10 @@ class CobbledexCollectionGUI : Screen(cobbledexTextTranslation("cobbledex")) {
}

searchWidget.text = lastSearch

this.addDrawableChild(searchWidget)

setInitialFocus(searchWidget)

addDrawableChild(ImageButton(DOUBLE_LEFT_ARROW, 14, 11, x + 170, y + 175) {
currentPage = 1
})
Expand Down Expand Up @@ -331,10 +332,10 @@ class CobbledexCollectionGUI : Screen(cobbledexTextTranslation("cobbledex")) {
blitk(
matrixStack = matrices,
texture = CAUGHT_ICON,
x = (entryX + ENTRY_SIZE - (11 * SCALE) - 1F) / SCALE,
y = (entryY + 1F) / SCALE,
width = 11,
height = 11,
x = (entryX + ENTRY_SIZE - (11 * SCALE) - 1f) / SCALE,
y = (entryY + 0.5F) / SCALE,
width = 12,
height = 12,
scale = SCALE,
alpha = 0.75f
)
Expand All @@ -343,11 +344,11 @@ class CobbledexCollectionGUI : Screen(cobbledexTextTranslation("cobbledex")) {
blitk(
matrixStack = matrices,
texture = SHINY_ICON,
x = (entryX + ENTRY_SIZE - (11 * SCALE) - 1F) / SCALE,
y = (entryY + ENTRY_SIZE - (11 * SCALE) - 1) / SCALE,
width = 11,
height = 11,
scale = SCALE
x = (entryX + ENTRY_SIZE - (14 * SCALE) - 0.5F) / SCALE,
y = (entryY + ENTRY_SIZE - (14 * SCALE) - 0.5F) / SCALE,
width = 14,
height = 14,
scale = SCALE, alpha = 0.75f
)
}

Expand Down
Loading

0 comments on commit afae2e5

Please sign in to comment.