Compare commits

...
11 changed files with 65 additions and 7 deletions
+2
View File
@@ -410,6 +410,8 @@
- Added `q.has_argument_at(<index>, [argument_value])` MoLang function to several battle-related action effect contexts.
- Added `q.hit_count` MoLang function to move action effect contexts.
- Added `is_included`, `to_lower`, `to_upper`, and `string_length` as available Molang functions.
- Fixed a crash that would occur during battles if the opponent wild Pokémon species comes from a namespace other than cobblemon
- Fixed `clientActions` inside Dialogue pages being executed twice
## [1.6.1 (January 26th, 2025)](#1-6-1)
@@ -71,6 +71,7 @@ object CobblemonCommands {
MarkGiveAllCommand.register(dispatcher)
PcSearchCommand.register(dispatcher)
PcTakeCommand.register(dispatcher)
ValidateTeamCommand.register(dispatcher)
// Possibly lock down registration if and only if under dev environment or running in an environment
// with a certain system environment variable set
@@ -143,6 +143,8 @@ object CobblemonPermissions {
val CHANGE_BOX_COUNT = this.create("${COMMAND_PREFIX}boxcount", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
@JvmStatic
val SPECTATE_BATTLE = this.create("${COMMAND_PREFIX}spectatebattle", PermissionLevel.ALL_COMMANDS)
@JvmStatic
val VALIDATE_TEAM = this.create("${COMMAND_PREFIX}validateteam", PermissionLevel.ALL_COMMANDS)
@JvmStatic
val SEE_HIDDEN_NPCS = this.create("seehiddennpcs", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
@@ -57,7 +57,7 @@ data class BattleFormat(
val GEN_9_SINGLES = BattleFormat(
battleType = BattleTypes.SINGLES,
ruleSet = mutableSetOf(BattleRules.OBTAINABLE, BattleRules.PAST, BattleRules.UNOBTAINABLE)
ruleSet = mutableSetOf("Standard NatDex")
)
val GEN_9_DOUBLES = BattleFormat(
@@ -121,6 +121,8 @@ object BattleRegistry {
packedTeamBuilder.append("${if (pk.dmaxLevel < 10) pk.dmaxLevel else ""},")
// Teratype
packedTeamBuilder.append("${pokemon.effectedPokemon.teraType.name},")
// Original nature
packedTeamBuilder.append("${pk.nature.name.path},")
team.add(packedTeamBuilder.toString())
}
@@ -34,8 +34,9 @@ interface ShowdownService {
fun resetRegistryData(type: String)
fun resetAllRegistries()
fun indicateSpeciesInitialized() {}
fun validateTeam(packedTeam: String, format: String = "cobblemon") {}
companion object {
val service: ShowdownService by lazy { GraalShowdownService() }
val service: ShowdownService by lazy { SocketShowdownService() }
}
}
@@ -167,6 +167,11 @@ class GraalShowdownService : ShowdownService {
func.execute()
}
override fun validateTeam(packedTeam: String, format: String) {
val func = this.context.getBindings("js").getMember("validateTeam")
func.execute(packedTeam, format).asString()
}
private fun sendToShowdown(battleId: UUID, messages: Array<String>) {
sendBattleMessageFunction.execute(battleId.toString(), messages)
}
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.battles.runner.socket
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.abilities.AbilityTemplate
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
import com.cobblemon.mod.common.battles.ShowdownInterpreter
@@ -141,6 +142,17 @@ class SocketShowdownService(val host: String = "localhost", val port: Int = 1846
acknowledge()
}
override fun validateTeam(packedTeam: String, format: String) {
writer.write(">validator $packedTeam $format")
writer.flush()
val response = readMessage()
val jsonarray = gson.fromJson(response, JsonArray::class.java)
for (i in 0 until jsonarray.size()) {
val msg = jsonarray[i].asString
Cobblemon.LOGGER.error(msg)
}
}
fun acknowledge(ifFails: () -> Unit = {}) {
writer.flush()
val ack = CharArray(3)
@@ -17,6 +17,7 @@ import com.cobblemon.mod.common.battles.ForcePassActionResponse
import com.cobblemon.mod.common.battles.PassActionResponse
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.net.messages.server.battle.BattleSelectActionsPacket
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import java.util.UUID
class ClientBattle(
@@ -32,11 +33,10 @@ class ClientBattle(
set(value) {
field = value
if (value != null) {
val wildMonProps = value.activePokemon[0].battlePokemon?.properties
wildMonProps?.let {props ->
val wildSpecies = PokemonSpecies.getByName(props.species!!)!!
val wildMonSpecies = value.activePokemon[0].battlePokemon?.properties?.species?.asIdentifierDefaultingNamespace()
knowledge = wildMonSpecies?.let {
//FIXME: Better knowledge checking based on aspects/form and such
knowledge = CobblemonClient.clientPokedexData.getKnowledgeForSpecies(wildSpecies.resourceIdentifier)
CobblemonClient.clientPokedexData.getKnowledgeForSpecies(it)
} ?: PokedexEntryProgress.NONE
}
else {
@@ -240,7 +240,6 @@ class DialogueScreen(var dialogueDTO: DialogueDTO) : Screen("gui.dialogue".asTra
}
this.dialogueStartTick = minecraft!!.player!!.tickCount
dialogueDTO.currentPageDTO.clientActions.flatMap(String::asExpressions).resolve(runtime)
}
var gibberIndex = 0
@@ -0,0 +1,34 @@
package com.cobblemon.mod.common.command
import com.cobblemon.mod.common.api.permission.CobblemonPermissions
import com.cobblemon.mod.common.battles.BattleFormat
import com.cobblemon.mod.common.battles.BattleRegistry.packTeam
import com.cobblemon.mod.common.battles.runner.ShowdownService
import com.cobblemon.mod.common.util.party
import com.cobblemon.mod.common.util.permission
import com.mojang.brigadier.Command
import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.context.CommandContext
import net.minecraft.commands.CommandSourceStack
import net.minecraft.commands.Commands
object ValidateTeamCommand {
fun register(dispatcher: CommandDispatcher<CommandSourceStack>) {
val command = Commands.literal("validateteam")
.permission(CobblemonPermissions.VALIDATE_TEAM)
// TODO format argument
.executes(::execute)
dispatcher.register(command)
}
private fun execute(context: CommandContext<CommandSourceStack>): Int {
try {
val packedTeam = context.source.playerOrException.party().toBattleTeam().packTeam()
ShowdownService.service.validateTeam(packedTeam, BattleFormat.GEN_9_SINGLES.toFormatJSON())
} catch (e: Exception) {
e.printStackTrace()
}
return Command.SINGLE_SUCCESS
}
}