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 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
|
||||
}
|
||||
+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
|
||||
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)
|
||||
}
|
||||
|
||||
@@ -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