feat: add new trigger for advancement + example in docs

This commit is contained in:
terrainwax
2026-04-26 05:34:56 +02:00
parent be439dfc24
commit 643b43d8bc
11 changed files with 220 additions and 0 deletions
+2
View File
@@ -10,6 +10,8 @@
- Added TM Machine
- Added Deepslate Core Block
- Added /givetm Command
- Added advancement triggers for learning TMs: `cobblemon:has_learn_specific_tm` (per-TM), `cobblemon:has_learn_all_tm` (all TMs learned), and `cobblemon:tms_learned` (count-based), backed by a new `totalTMLearnedCount` on player advancement data.
- Added `cobblemon:catch_alpha_pokemon` advancement trigger and `totalAlphaCaptureCount` tracking for capturing Alpha Pokémon.
- Added Move Dex to Pokedex
- Added the Habitat Block, a spawner block for servers and adventure maps that controls spawning in an area.
- Added Disk Rack for storing disks and being an audio sequencer for Noteblocks
@@ -32,6 +32,9 @@ object CobblemonCriteria : PlatformRegistry<Registry<CriterionTrigger<*>>, Resou
@JvmField
val CATCH_SHINY_POKEMON = this.create("catch_shiny_pokemon", SimpleCriterionTrigger(CountableCriterion.CODEC))
@JvmField
val CATCH_ALPHA_POKEMON = this.create("catch_alpha_pokemon", SimpleCriterionTrigger(CountableCriterion.CODEC))
@JvmField
val EGG_COLLECT = this.create("eggs_collected", SimpleCriterionTrigger(CountableCriterion.CODEC))
@@ -80,6 +83,15 @@ object CobblemonCriteria : PlatformRegistry<Registry<CriterionTrigger<*>>, Resou
val RIDING_STAT_BOOST = this.create("riding_stat_boost", SimpleCriterionTrigger(RidingStatBoostCriterion.CODEC))
@JvmField
val LEARN_TM = this.create("has_learn_specific_tm", SimpleCriterionTrigger(LearnTMCriterion.CODEC))
@JvmField
val LEARN_ALL_TM = this.create("has_learn_all_tm", SimpleCriterionTrigger(LearnAllTMCriterion.CODEC))
@JvmField
val LEARN_TM_COUNT = this.create("tms_learned", SimpleCriterionTrigger(CountableCriterion.CODEC))
override val registry = BuiltInRegistries.TRIGGER_TYPES
override val resourceKey = Registries.TRIGGER_TYPE
}
@@ -0,0 +1,50 @@
/*
* 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.advancement.criterion
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.advancements.critereon.EntityPredicate
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import java.util.Optional
class LearnTMContext(val tm: ResourceLocation)
class LearnTMCriterion(
playerCtx: Optional<ContextAwarePredicate>,
val tm: String
) : SimpleCriterionCondition<LearnTMContext>(playerCtx) {
companion object {
val CODEC: Codec<LearnTMCriterion> = RecordCodecBuilder.create { it.group(
EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(LearnTMCriterion::playerCtx),
Codec.STRING.optionalFieldOf("tm", "any").forGetter(LearnTMCriterion::tm)
).apply(it, ::LearnTMCriterion) }
}
override fun matches(player: ServerPlayer, context: LearnTMContext): Boolean {
return tm == "any" || context.tm == tm.asIdentifierDefaultingNamespace()
}
}
class LearnAllTMContext
class LearnAllTMCriterion(
playerCtx: Optional<ContextAwarePredicate>
) : SimpleCriterionCondition<LearnAllTMContext>(playerCtx) {
companion object {
val CODEC: Codec<LearnAllTMCriterion> = RecordCodecBuilder.create { it.group(
EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(LearnAllTMCriterion::playerCtx)
).apply(it, ::LearnAllTMCriterion) }
}
override fun matches(player: ServerPlayer, context: LearnAllTMContext) = true
}
@@ -33,8 +33,12 @@ class PlayerAdvancementData {
private set
var totalShinyCaptureCount: Int = 0
private set
var totalAlphaCaptureCount: Int = 0
private set
var totalTradedCount: Int = 0
private set
var totalTMLearnedCount: Int = 0
private set
private var totalTypeCaptureCounts = mutableMapOf<String, Int>()
private var totalDefeatedCounts = mutableMapOf<ResourceLocation, Int>()
@@ -81,6 +85,14 @@ class PlayerAdvancementData {
totalTradedCount++
}
fun updateTotalAlphaCaptureCount() {
totalAlphaCaptureCount++
}
fun updateTotalTMLearnedCount(amount: Int = 1) {
totalTMLearnedCount += amount
}
fun getTotalTypeCaptureCount(type: ElementalType): Int {
if (!totalTypeCaptureCounts.containsKey(key = type.showdownId)) {
totalTypeCaptureCounts[type.showdownId] = 0
@@ -9,6 +9,11 @@
package com.cobblemon.mod.common.api.tms
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.advancement.CobblemonCriteria
import com.cobblemon.mod.common.advancement.criterion.CountableContext
import com.cobblemon.mod.common.advancement.criterion.LearnAllTMContext
import com.cobblemon.mod.common.advancement.criterion.LearnTMContext
import com.cobblemon.mod.common.api.moves.MoveTemplate
import com.cobblemon.mod.common.api.scheduling.ScheduledTask
import com.cobblemon.mod.common.api.scheduling.ServerTaskTracker
@@ -112,6 +117,22 @@ class TMMoveManager(
syncClient(newLearnedTms.toSet())
sendTMToast(newLearnedTms)
val player = uuid.getPlayer()
if (player != null) {
val playerData = Cobblemon.playerDataManager.getGenericData(player)
val advancementData = playerData.advancementData
advancementData.updateTotalTMLearnedCount(newLearnedTms.size)
Cobblemon.playerDataManager.saveSingle(playerData, PlayerInstancedDataStoreTypes.GENERAL)
for (tmId in newLearnedTms) {
CobblemonCriteria.LEARN_TM.trigger(player, LearnTMContext(tmId))
}
CobblemonCriteria.LEARN_TM_COUNT.trigger(player, CountableContext(advancementData.totalTMLearnedCount))
if (learnedTMs.containsAll(TechnicalMachines.tmMap.keys)) {
CobblemonCriteria.LEARN_ALL_TM.trigger(player, LearnAllTMContext())
}
}
return true
}
@@ -61,6 +61,11 @@ object AdvancementHandler : EventHandler {
advancementData.updateTotalShinyCaptureCount()
CobblemonCriteria.CATCH_SHINY_POKEMON.trigger(event.player, CountableContext(advancementData.totalShinyCaptureCount))
}
if (event.pokemon.isAlpha)
{
advancementData.updateTotalAlphaCaptureCount()
CobblemonCriteria.CATCH_ALPHA_POKEMON.trigger(event.player, CountableContext(advancementData.totalAlphaCaptureCount))
}
CobblemonCriteria.COLLECT_ASPECT.trigger(event.player, advancementData.aspectsCollected)
Cobblemon.playerDataManager.saveSingle(playerData, PlayerInstancedDataStoreTypes.GENERAL)
}
+27
View File
@@ -0,0 +1,27 @@
{
"display": {
"icon": {
"id": "cobblemon:pokemon_model",
"components": {
"cobblemon:pokemon_item": {"species":"cobblemon:rattata","aspects":["alpha"]}
}
},
"title": {
"translate": "advancements.cobblemon.first_alpha_catch"
},
"description": {
"translate": "advancements.cobblemon.first_alpha_catch.description"
},
"frame": "challenge"
},
"parent": "cobblemon:first_catch",
"criteria": {
"catch": {
"trigger": "cobblemon:catch_alpha_pokemon",
"conditions": {
"count": 1
}
}
},
"sends_telemetry_event": false
}
+22
View File
@@ -0,0 +1,22 @@
{
"display": {
"icon": {
"id": "cobblemon:technical_machine"
},
"title": {
"translate": "advancements.cobblemon.learn_all_tms"
},
"description": {
"translate": "advancements.cobblemon.learn_all_tms.description"
},
"frame": "challenge"
},
"parent": "cobblemon:learn_ten_tms",
"criteria": {
"learn_all_tms": {
"trigger": "cobblemon:has_learn_all_tm",
"conditions": {}
}
},
"sends_telemetry_event": false
}
+23
View File
@@ -0,0 +1,23 @@
{
"display": {
"icon": {
"id": "cobblemon:technical_machine"
},
"title": {
"translate": "advancements.cobblemon.learn_first_tm"
},
"description": {
"translate": "advancements.cobblemon.learn_first_tm.description"
}
},
"parent": "cobblemon:first_catch",
"criteria": {
"learn_tm": {
"trigger": "cobblemon:has_learn_specific_tm",
"conditions": {
"tm": "any"
}
}
},
"sends_telemetry_event": false
}
+23
View File
@@ -0,0 +1,23 @@
{
"display": {
"icon": {
"id": "cobblemon:technical_machine"
},
"title": {
"translate": "advancements.cobblemon.learn_ten_tms"
},
"description": {
"translate": "advancements.cobblemon.learn_ten_tms.description"
}
},
"parent": "cobblemon:learn_first_tm",
"criteria": {
"learn_tms": {
"trigger": "cobblemon:tms_learned",
"conditions": {
"count": 10
}
}
},
"sends_telemetry_event": false
}
@@ -0,0 +1,23 @@
{
"display": {
"icon": {
"id": "cobblemon:technical_machine"
},
"title": {
"translate": "advancements.cobblemon.learn_vacuum_wave_tm"
},
"description": {
"translate": "advancements.cobblemon.learn_vacuum_wave_tm.description"
}
},
"parent": "cobblemon:learn_first_tm",
"criteria": {
"learn_tm": {
"trigger": "cobblemon:has_learn_specific_tm",
"conditions": {
"tm": "cobblemon:vacuumwave"
}
}
},
"sends_telemetry_event": false
}