forked from mirrors/cobblemon
feat: add new trigger for advancement + example in docs
This commit is contained in:
@@ -10,6 +10,8 @@
|
|||||||
- Added TM Machine
|
- Added TM Machine
|
||||||
- Added Deepslate Core Block
|
- Added Deepslate Core Block
|
||||||
- Added /givetm Command
|
- 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 Move Dex to Pokedex
|
||||||
- Added the Habitat Block, a spawner block for servers and adventure maps that controls spawning in an area.
|
- 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
|
- Added Disk Rack for storing disks and being an audio sequencer for Noteblocks
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ object CobblemonCriteria : PlatformRegistry<Registry<CriterionTrigger<*>>, Resou
|
|||||||
@JvmField
|
@JvmField
|
||||||
val CATCH_SHINY_POKEMON = this.create("catch_shiny_pokemon", SimpleCriterionTrigger(CountableCriterion.CODEC))
|
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
|
@JvmField
|
||||||
val EGG_COLLECT = this.create("eggs_collected", SimpleCriterionTrigger(CountableCriterion.CODEC))
|
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))
|
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 registry = BuiltInRegistries.TRIGGER_TYPES
|
||||||
override val resourceKey = Registries.TRIGGER_TYPE
|
override val resourceKey = Registries.TRIGGER_TYPE
|
||||||
}
|
}
|
||||||
+50
@@ -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
|
||||||
|
}
|
||||||
+12
@@ -33,8 +33,12 @@ class PlayerAdvancementData {
|
|||||||
private set
|
private set
|
||||||
var totalShinyCaptureCount: Int = 0
|
var totalShinyCaptureCount: Int = 0
|
||||||
private set
|
private set
|
||||||
|
var totalAlphaCaptureCount: Int = 0
|
||||||
|
private set
|
||||||
var totalTradedCount: Int = 0
|
var totalTradedCount: Int = 0
|
||||||
private set
|
private set
|
||||||
|
var totalTMLearnedCount: Int = 0
|
||||||
|
private set
|
||||||
|
|
||||||
private var totalTypeCaptureCounts = mutableMapOf<String, Int>()
|
private var totalTypeCaptureCounts = mutableMapOf<String, Int>()
|
||||||
private var totalDefeatedCounts = mutableMapOf<ResourceLocation, Int>()
|
private var totalDefeatedCounts = mutableMapOf<ResourceLocation, Int>()
|
||||||
@@ -81,6 +85,14 @@ class PlayerAdvancementData {
|
|||||||
totalTradedCount++
|
totalTradedCount++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun updateTotalAlphaCaptureCount() {
|
||||||
|
totalAlphaCaptureCount++
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updateTotalTMLearnedCount(amount: Int = 1) {
|
||||||
|
totalTMLearnedCount += amount
|
||||||
|
}
|
||||||
|
|
||||||
fun getTotalTypeCaptureCount(type: ElementalType): Int {
|
fun getTotalTypeCaptureCount(type: ElementalType): Int {
|
||||||
if (!totalTypeCaptureCounts.containsKey(key = type.showdownId)) {
|
if (!totalTypeCaptureCounts.containsKey(key = type.showdownId)) {
|
||||||
totalTypeCaptureCounts[type.showdownId] = 0
|
totalTypeCaptureCounts[type.showdownId] = 0
|
||||||
|
|||||||
@@ -9,6 +9,11 @@
|
|||||||
package com.cobblemon.mod.common.api.tms
|
package com.cobblemon.mod.common.api.tms
|
||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
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.moves.MoveTemplate
|
||||||
import com.cobblemon.mod.common.api.scheduling.ScheduledTask
|
import com.cobblemon.mod.common.api.scheduling.ScheduledTask
|
||||||
import com.cobblemon.mod.common.api.scheduling.ServerTaskTracker
|
import com.cobblemon.mod.common.api.scheduling.ServerTaskTracker
|
||||||
@@ -112,6 +117,22 @@ class TMMoveManager(
|
|||||||
syncClient(newLearnedTms.toSet())
|
syncClient(newLearnedTms.toSet())
|
||||||
sendTMToast(newLearnedTms)
|
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
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,11 @@ object AdvancementHandler : EventHandler {
|
|||||||
advancementData.updateTotalShinyCaptureCount()
|
advancementData.updateTotalShinyCaptureCount()
|
||||||
CobblemonCriteria.CATCH_SHINY_POKEMON.trigger(event.player, CountableContext(advancementData.totalShinyCaptureCount))
|
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)
|
CobblemonCriteria.COLLECT_ASPECT.trigger(event.player, advancementData.aspectsCollected)
|
||||||
Cobblemon.playerDataManager.saveSingle(playerData, PlayerInstancedDataStoreTypes.GENERAL)
|
Cobblemon.playerDataManager.saveSingle(playerData, PlayerInstancedDataStoreTypes.GENERAL)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user