Compare commits

..
Author SHA1 Message Date
Nico MerenqandWeblate 1fa113f5ac Translated using Weblate (Russian)
Currently translated at 84.8% (8137 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-10-18 11:56:30 +00:00
Watuneni iteiteandWeblate 8443b88c16 Translated using Weblate (Japanese)
Currently translated at 99.0% (9500 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-10-16 17:12:33 +00:00
Gustavo PuerariandWeblate b71208299f Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.7% (9276 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_BR/
2026-10-15 18:07:01 +00:00
Watuneni iteiteandWeblate 136b5824b0 Translated using Weblate (Japanese)
Currently translated at 98.7% (9464 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-10-15 18:06:58 +00:00
Watuneni iteiteandWeblate f9189b265f Translated using Weblate (Japanese)
Currently translated at 98.7% (9464 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-10-14 15:27:44 +00:00
Watuneni iteiteandWeblate 21c4d0233d Translated using Weblate (Japanese)
Currently translated at 98.7% (9464 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-10-13 12:09:59 +00:00
64 changed files with 310 additions and 1221 deletions
-9
View File
@@ -21,8 +21,6 @@
### Animation updates for the following Pokémon
### Changes
- Changed the Misc icon in the Campfire Pot Recipe Book to Health Candy
- Moved EXP Candies from the Medicine recipe book category to the Misc category
### Fixes
- Fixed datapacks with item interaction evolutions that don't specify an item crashing the world on load.
@@ -36,16 +34,9 @@
- Fixed conflicts with other mods that would make use of recipe books in certain ways (Farmer's Delight Cooking Pot)
- Fixed Pokémon battles stalling when a sidemod cancels the `THROWN_POKEBALL_HIT` hit event
- Fixed choice feature tab completion in `spawnpokemon/pokegive/pokeedit` commands
- Fixed MoLang that's targeting players intermittedly failing when they have died, needing them to relog
- Fixed all pots of mod on NeoForge
- Fixed party overlay not hiding when player opens the pokedex scanner
- Added compat for AppleSkin
### Developer
- Bumped NeoForge to `21.1.195` to get access to MixinExtras `0.5` and the expressions annotation
- New Platform Event `PLAYER_RESPAWN` which is fired when a player respawns (either through death or returning from the end)
- Platform Events `SERVER_PLAYER_TICK_PRE` and `SERVER_PLAYER_TICK_POST` no longer fire when the player is dead
- it is now tied much closer to the actual entity rather than the player (or their connection)
### Molang & Datapacks
- Fixed `q.pokemon.nature` returning class instance instead of proper string value (`cobblemon:adamant`)
@@ -60,8 +60,6 @@ import com.cobblemon.mod.common.api.storage.pc.PCStore
import com.cobblemon.mod.common.api.storage.pc.link.PCLinkManager
import com.cobblemon.mod.common.api.storage.player.PlayerInstancedDataStoreManager
import com.cobblemon.mod.common.api.storage.player.PlayerInstancedDataStoreTypes
import com.cobblemon.mod.common.api.storage.player.adapter.BadgeMongoBackend
import com.cobblemon.mod.common.api.storage.player.adapter.BadgeNbtBackend
import com.cobblemon.mod.common.api.storage.player.adapter.DexDataMongoBackend
import com.cobblemon.mod.common.api.storage.player.adapter.DexDataNbtBackend
import com.cobblemon.mod.common.api.storage.player.adapter.PlayerDataJsonBackend
@@ -262,9 +260,6 @@ object Cobblemon {
RequestManager.onLogoff(it.player)
serverPlayerStructs.remove(it.player.uuid)
}
PlatformEvents.PLAYER_RESPAWN.subscribe {
serverPlayerStructs.remove(it.player.uuid)
}
PlatformEvents.PLAYER_DEATH.subscribe {
PCLinkManager.removeLink(it.player.uuid)
battleRegistry.getBattleByParticipatingPlayer(it.player)?.stop()
@@ -393,13 +388,10 @@ object Cobblemon {
val tmMoveFactory = CachedPlayerDataStoreFactory(TMMoveNbtBackend())
tmMoveFactory.setup(server)
val badgeFactory = CachedPlayerDataStoreFactory(BadgeNbtBackend())
badgeFactory.setup(server)
playerDataManager.setFactory(generalJsonFactory, PlayerInstancedDataStoreTypes.GENERAL)
playerDataManager.setFactory(pokedexNbtFactory, PlayerInstancedDataStoreTypes.POKEDEX)
playerDataManager.setFactory(tmMoveFactory, PlayerInstancedDataStoreTypes.TM_MOVES)
playerDataManager.setFactory(badgeFactory, PlayerInstancedDataStoreTypes.BADGES)
if (config.storageFormat == "nbt") {
NBTStoreAdapter(pokemonStoreRoot.absolutePath, useNestedFolders = true, folderPerClass = true)
@@ -430,15 +422,10 @@ object Cobblemon {
TMMoveMongoBackend(mongoClient, config.mongoDBDatabaseName, "TMMovesCollection")
)
tmMovesMongoFactory.setup(server)
val badgesMongoFactory = CachedPlayerDataStoreFactory(
BadgeMongoBackend(mongoClient, config.mongoDBDatabaseName, "BadgesCollection")
)
badgesMongoFactory.setup(server)
playerDataManager.setFactory(generalMongoFactory, PlayerInstancedDataStoreTypes.GENERAL)
playerDataManager.setFactory(pokedexMongoFactory, PlayerInstancedDataStoreTypes.POKEDEX)
playerDataManager.setFactory(tmMovesMongoFactory, PlayerInstancedDataStoreTypes.TM_MOVES)
playerDataManager.setFactory(badgesMongoFactory, PlayerInstancedDataStoreTypes.BADGES)
MongoDBStoreAdapter(mongoClient, config.mongoDBDatabaseName)
} catch (e: ClassNotFoundException) {
LOGGER.error("MongoDB driver not found.")
@@ -623,7 +610,6 @@ object Cobblemon {
this.implementation.registerCommandArgument(cobblemonResource("transform_type"), TransformTypeArgumentType::class, SingletonArgumentInfo.contextFree(TransformTypeArgumentType::transformType))
this.implementation.registerCommandArgument(cobblemonResource("model_part"), ModelPartArgumentType::class, SingletonArgumentInfo.contextFree(ModelPartArgumentType::modelPart))
this.implementation.registerCommandArgument(cobblemonResource("tm"), TmArgumentType::class, SingletonArgumentInfo.contextFree(TmArgumentType::tm))
this.implementation.registerCommandArgument(cobblemonResource("badge"), BadgeArgumentType::class, SingletonArgumentInfo.contextFree(BadgeArgumentType::badge))
}
}
@@ -845,35 +845,54 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
@JvmField
val PEP_UP_FLOWER = this.create("pep_up_flower", FlowerBlock(MobEffects.LEVITATION, 10F, BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).noCollission().instabreak().sound(SoundType.GRASS).offsetType(BlockBehaviour.OffsetType.XZ).pushReaction(PushReaction.DESTROY)))
@JvmField
val POTTED_PEP_UP_FLOWER = this.create("potted_pep_up_flower", BlocksInvoker.createFlowerPotBlock(PEP_UP_FLOWER))
@JvmField
val HEARTY_GRAINS = this.create("hearty_grains", HeartyGrainsBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).ignitedByLava().mapColor(MapColor.PLANT).noCollission().randomTicks().instabreak()))
@JvmField
val GALARICA_NUT_BUSH = this.create("galarica_nut_bush", NutBushBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).randomTicks().noCollission().sound(SoundType.SWEET_BERRY_BUSH).pushReaction(PushReaction.DESTROY)))
@JvmField
val POTTED_RED_APRICORN_SAPLING = this.create("potted_red_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(RED_APRICORN_SAPLING))
@JvmField
val POTTED_YELLOW_APRICORN_SAPLING = this.create("potted_yellow_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(YELLOW_APRICORN_SAPLING))
@JvmField
val POTTED_GREEN_APRICORN_SAPLING = this.create("potted_green_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(GREEN_APRICORN_SAPLING))
@JvmField
val POTTED_BLUE_APRICORN_SAPLING = this.create("potted_blue_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(BLUE_APRICORN_SAPLING))
@JvmField
val POTTED_PINK_APRICORN_SAPLING = this.create("potted_pink_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(PINK_APRICORN_SAPLING))
@JvmField
val POTTED_BLACK_APRICORN_SAPLING = this.create("potted_black_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(BLACK_APRICORN_SAPLING))
@JvmField
val POTTED_WHITE_APRICORN_SAPLING = this.create("potted_white_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(WHITE_APRICORN_SAPLING))
@JvmField
val POTTED_SACCHARINE_SAPLING = this.create("potted_saccharine_sapling", BlocksInvoker.createFlowerPotBlock(SACCHARINE_SAPLING))
@JvmField
val RED_MINT_LEAF_LITTER = this.mintLitter("red_mint_leaf_litter", MapColor.COLOR_RED)
@JvmField
val POTTED_RED_MINT = this.flowerPot("potted_red_mint", RED_MINT_LEAF_LITTER)
val POTTED_RED_MINT = this.pottedPlant("potted_red_mint", RED_MINT_LEAF_LITTER)
@JvmField
val BLUE_MINT_LEAF_LITTER = this.mintLitter("blue_mint_leaf_litter", MapColor.COLOR_BLUE)
@JvmField
val POTTED_BLUE_MINT = this.flowerPot("potted_blue_mint", BLUE_MINT_LEAF_LITTER)
val POTTED_BLUE_MINT = this.pottedPlant("potted_blue_mint", BLUE_MINT_LEAF_LITTER)
@JvmField
val CYAN_MINT_LEAF_LITTER = this.mintLitter("cyan_mint_leaf_litter", MapColor.COLOR_CYAN)
@JvmField
val POTTED_CYAN_MINT = this.flowerPot("potted_cyan_mint", CYAN_MINT_LEAF_LITTER)
val POTTED_CYAN_MINT = this.pottedPlant("potted_cyan_mint", CYAN_MINT_LEAF_LITTER)
@JvmField
val PINK_MINT_LEAF_LITTER = this.mintLitter("pink_mint_leaf_litter", MapColor.COLOR_PINK)
@JvmField
val POTTED_PINK_MINT = this.flowerPot("potted_pink_mint", PINK_MINT_LEAF_LITTER)
val POTTED_PINK_MINT = this.pottedPlant("potted_pink_mint", PINK_MINT_LEAF_LITTER)
@JvmField
val GREEN_MINT_LEAF_LITTER = this.mintLitter("green_mint_leaf_litter", MapColor.COLOR_GREEN)
@JvmField
val POTTED_GREEN_MINT = this.flowerPot("potted_green_mint", GREEN_MINT_LEAF_LITTER)
val POTTED_GREEN_MINT = this.pottedPlant("potted_green_mint", GREEN_MINT_LEAF_LITTER)
@JvmField
val WHITE_MINT_LEAF_LITTER = this.mintLitter("white_mint_leaf_litter", MapColor.SNOW)
@JvmField
val POTTED_WHITE_MINT = this.flowerPot("potted_white_mint", WHITE_MINT_LEAF_LITTER)
val POTTED_WHITE_MINT = this.pottedPlant("potted_white_mint", WHITE_MINT_LEAF_LITTER)
@JvmField
val LOBAILA = this.create("lobaila", LobailaFlowerBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).noCollission().instabreak().sound(SoundType.GRASS).offsetType(BlockBehaviour.OffsetType.XZ).ignitedByLava().pushReaction(PushReaction.DESTROY)))
@@ -1085,163 +1104,145 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
//val BINDING_SOIL = this.create("binding_soil", BindingSoilBlock(BlockBehaviour.Properties.of()))
@JvmField
val POTTED_AGUAV_BERRY = this.flowerPot("potted_aguav_berry", AGUAV_BERRY)
val POTTED_AGUAV_BERRY = this.create("potted_aguav_berry", BlocksInvoker.createFlowerPotBlock(AGUAV_BERRY))
@JvmField
val POTTED_APICOT_BERRY = this.flowerPot("potted_apicot_berry", APICOT_BERRY)
val POTTED_APICOT_BERRY = this.create("potted_apicot_berry", BlocksInvoker.createFlowerPotBlock(APICOT_BERRY))
@JvmField
val POTTED_ASPEAR_BERRY = this.flowerPot("potted_aspear_berry", ASPEAR_BERRY)
val POTTED_ASPEAR_BERRY = this.create("potted_aspear_berry", BlocksInvoker.createFlowerPotBlock(ASPEAR_BERRY))
@JvmField
val POTTED_BABIRI_BERRY = this.flowerPot("potted_babiri_berry", BABIRI_BERRY)
val POTTED_BABIRI_BERRY = this.create("potted_babiri_berry", BlocksInvoker.createFlowerPotBlock(BABIRI_BERRY))
@JvmField
val POTTED_BELUE_BERRY = this.flowerPot("potted_belue_berry", BELUE_BERRY)
val POTTED_BELUE_BERRY = this.create("potted_belue_berry", BlocksInvoker.createFlowerPotBlock(BELUE_BERRY))
@JvmField
val POTTED_BLUK_BERRY = this.flowerPot("potted_bluk_berry", BLUK_BERRY)
val POTTED_BLUK_BERRY = this.create("potted_bluk_berry", BlocksInvoker.createFlowerPotBlock(BLUK_BERRY))
@JvmField
val POTTED_CHARTI_BERRY = this.flowerPot("potted_charti_berry", CHARTI_BERRY)
val POTTED_CHARTI_BERRY = this.create("potted_charti_berry", BlocksInvoker.createFlowerPotBlock(CHARTI_BERRY))
@JvmField
val POTTED_CHERI_BERRY = this.flowerPot("potted_cheri_berry", CHERI_BERRY)
val POTTED_CHERI_BERRY = this.create("potted_cheri_berry", BlocksInvoker.createFlowerPotBlock(CHERI_BERRY))
@JvmField
val POTTED_CHESTO_BERRY = this.flowerPot("potted_chesto_berry", CHESTO_BERRY)
val POTTED_CHESTO_BERRY = this.create("potted_chesto_berry", BlocksInvoker.createFlowerPotBlock(CHESTO_BERRY))
@JvmField
val POTTED_CHILAN_BERRY = this.flowerPot("potted_chilan_berry", CHILAN_BERRY)
val POTTED_CHILAN_BERRY = this.create("potted_chilan_berry", BlocksInvoker.createFlowerPotBlock(CHILAN_BERRY))
@JvmField
val POTTED_CHOPLE_BERRY = this.flowerPot("potted_chople_berry", CHOPLE_BERRY)
val POTTED_CHOPLE_BERRY = this.create("potted_chople_berry", BlocksInvoker.createFlowerPotBlock(CHOPLE_BERRY))
@JvmField
val POTTED_COBA_BERRY = this.flowerPot("potted_coba_berry", COBA_BERRY)
val POTTED_COBA_BERRY = this.create("potted_coba_berry", BlocksInvoker.createFlowerPotBlock(COBA_BERRY))
@JvmField
val POTTED_COLBUR_BERRY = this.flowerPot("potted_colbur_berry", COLBUR_BERRY)
val POTTED_COLBUR_BERRY = this.create("potted_colbur_berry", BlocksInvoker.createFlowerPotBlock(COLBUR_BERRY))
@JvmField
val POTTED_CORNN_BERRY = this.flowerPot("potted_cornn_berry", CORNN_BERRY)
val POTTED_CORNN_BERRY = this.create("potted_cornn_berry", BlocksInvoker.createFlowerPotBlock(CORNN_BERRY))
@JvmField
val POTTED_CUSTAP_BERRY = this.flowerPot("potted_custap_berry", CUSTAP_BERRY)
val POTTED_CUSTAP_BERRY = this.create("potted_custap_berry", BlocksInvoker.createFlowerPotBlock(CUSTAP_BERRY))
@JvmField
val POTTED_DURIN_BERRY = this.flowerPot("potted_durin_berry", DURIN_BERRY)
val POTTED_DURIN_BERRY = this.create("potted_durin_berry", BlocksInvoker.createFlowerPotBlock(DURIN_BERRY))
@JvmField
val POTTED_EGGANT_BERRY = this.flowerPot("potted_eggant_berry", EGGANT_BERRY)
val POTTED_EGGANT_BERRY = this.create("potted_eggant_berry", BlocksInvoker.createFlowerPotBlock(EGGANT_BERRY))
@JvmField
val POTTED_ENIGMA_BERRY = this.flowerPot("potted_enigma_berry", ENIGMA_BERRY)
val POTTED_ENIGMA_BERRY = this.create("potted_enigma_berry", BlocksInvoker.createFlowerPotBlock(ENIGMA_BERRY))
@JvmField
val POTTED_FIGY_BERRY = this.flowerPot("potted_figy_berry", FIGY_BERRY)
val POTTED_FIGY_BERRY = this.create("potted_figy_berry", BlocksInvoker.createFlowerPotBlock(FIGY_BERRY))
@JvmField
val POTTED_GANLON_BERRY = this.flowerPot("potted_ganlon_berry", GANLON_BERRY)
val POTTED_GANLON_BERRY = this.create("potted_ganlon_berry", BlocksInvoker.createFlowerPotBlock(GANLON_BERRY))
@JvmField
val POTTED_GREPA_BERRY = this.flowerPot("potted_grepa_berry", GREPA_BERRY)
val POTTED_GREPA_BERRY = this.create("potted_grepa_berry", BlocksInvoker.createFlowerPotBlock(GREPA_BERRY))
@JvmField
val POTTED_HABAN_BERRY = this.flowerPot("potted_haban_berry", HABAN_BERRY)
val POTTED_HABAN_BERRY = this.create("potted_haban_berry", BlocksInvoker.createFlowerPotBlock(HABAN_BERRY))
@JvmField
val POTTED_HONDEW_BERRY = this.flowerPot("potted_hondew_berry", HONDEW_BERRY)
val POTTED_HONDEW_BERRY = this.create("potted_hondew_berry", BlocksInvoker.createFlowerPotBlock(HONDEW_BERRY))
@JvmField
val POTTED_HOPO_BERRY = this.flowerPot("potted_hopo_berry", HOPO_BERRY)
val POTTED_HOPO_BERRY = this.create("potted_hopo_berry", BlocksInvoker.createFlowerPotBlock(HOPO_BERRY))
@JvmField
val POTTED_IAPAPA_BERRY = this.flowerPot("potted_iapapa_berry", IAPAPA_BERRY)
val POTTED_IAPAPA_BERRY = this.create("potted_iapapa_berry", BlocksInvoker.createFlowerPotBlock(IAPAPA_BERRY))
@JvmField
val POTTED_JABOCA_BERRY = this.flowerPot("potted_jaboca_berry", JABOCA_BERRY)
val POTTED_JABOCA_BERRY = this.create("potted_jaboca_berry", BlocksInvoker.createFlowerPotBlock(JABOCA_BERRY))
@JvmField
val POTTED_KASIB_BERRY = this.flowerPot("potted_kasib_berry", KASIB_BERRY)
val POTTED_KASIB_BERRY = this.create("potted_kasib_berry", BlocksInvoker.createFlowerPotBlock(KASIB_BERRY))
@JvmField
val POTTED_KEBIA_BERRY = this.flowerPot("potted_kebia_berry", KEBIA_BERRY)
val POTTED_KEBIA_BERRY = this.create("potted_kebia_berry", BlocksInvoker.createFlowerPotBlock(KEBIA_BERRY))
@JvmField
val POTTED_KEE_BERRY = this.flowerPot("potted_kee_berry", KEE_BERRY)
val POTTED_KEE_BERRY = this.create("potted_kee_berry", BlocksInvoker.createFlowerPotBlock(KEE_BERRY))
@JvmField
val POTTED_KELPSY_BERRY = this.flowerPot("potted_kelpsy_berry", KELPSY_BERRY)
val POTTED_KELPSY_BERRY = this.create("potted_kelpsy_berry", BlocksInvoker.createFlowerPotBlock(KELPSY_BERRY))
@JvmField
val POTTED_LANSAT_BERRY = this.flowerPot("potted_lansat_berry", LANSAT_BERRY)
val POTTED_LANSAT_BERRY = this.create("potted_lansat_berry", BlocksInvoker.createFlowerPotBlock(LANSAT_BERRY))
@JvmField
val POTTED_LEPPA_BERRY = this.flowerPot("potted_leppa_berry", LEPPA_BERRY)
val POTTED_LEPPA_BERRY = this.create("potted_leppa_berry", BlocksInvoker.createFlowerPotBlock(LEPPA_BERRY))
@JvmField
val POTTED_LIECHI_BERRY = this.flowerPot("potted_liechi_berry", LIECHI_BERRY)
val POTTED_LIECHI_BERRY = this.create("potted_liechi_berry", BlocksInvoker.createFlowerPotBlock(LIECHI_BERRY))
@JvmField
val POTTED_LUM_BERRY = this.flowerPot("potted_lum_berry", LUM_BERRY)
val POTTED_LUM_BERRY = this.create("potted_lum_berry", BlocksInvoker.createFlowerPotBlock(LUM_BERRY))
@JvmField
val POTTED_MAGO_BERRY = this.flowerPot("potted_mago_berry", MAGO_BERRY)
val POTTED_MAGO_BERRY = this.create("potted_mago_berry", BlocksInvoker.createFlowerPotBlock(MAGO_BERRY))
@JvmField
val POTTED_MAGOST_BERRY = this.flowerPot("potted_magost_berry", MAGOST_BERRY)
val POTTED_MAGOST_BERRY = this.create("potted_magost_berry", BlocksInvoker.createFlowerPotBlock(MAGOST_BERRY))
@JvmField
val POTTED_MARANGA_BERRY = this.flowerPot("potted_maranga_berry", MARANGA_BERRY)
val POTTED_MARANGA_BERRY = this.create("potted_maranga_berry", BlocksInvoker.createFlowerPotBlock(MARANGA_BERRY))
@JvmField
val POTTED_MICLE_BERRY = this.flowerPot("potted_micle_berry", MICLE_BERRY)
val POTTED_MICLE_BERRY = this.create("potted_micle_berry", BlocksInvoker.createFlowerPotBlock(MICLE_BERRY))
@JvmField
val POTTED_NANAB_BERRY = this.flowerPot("potted_nanab_berry", NANAB_BERRY)
val POTTED_NANAB_BERRY = this.create("potted_nanab_berry", BlocksInvoker.createFlowerPotBlock(NANAB_BERRY))
@JvmField
val POTTED_NOMEL_BERRY = this.flowerPot("potted_nomel_berry", NOMEL_BERRY)
val POTTED_NOMEL_BERRY = this.create("potted_nomel_berry", BlocksInvoker.createFlowerPotBlock(NOMEL_BERRY))
@JvmField
val POTTED_OCCA_BERRY = this.flowerPot("potted_occa_berry", OCCA_BERRY)
val POTTED_OCCA_BERRY = this.create("potted_occa_berry", BlocksInvoker.createFlowerPotBlock(OCCA_BERRY))
@JvmField
val POTTED_ORAN_BERRY = this.flowerPot("potted_oran_berry", ORAN_BERRY)
val POTTED_ORAN_BERRY = this.create("potted_oran_berry", BlocksInvoker.createFlowerPotBlock(ORAN_BERRY))
@JvmField
val POTTED_PAMTRE_BERRY = this.flowerPot("potted_pamtre_berry", PAMTRE_BERRY)
val POTTED_PAMTRE_BERRY = this.create("potted_pamtre_berry", BlocksInvoker.createFlowerPotBlock(PAMTRE_BERRY))
@JvmField
val POTTED_PASSHO_BERRY = this.flowerPot("potted_passho_berry", PASSHO_BERRY)
val POTTED_PASSHO_BERRY = this.create("potted_passho_berry", BlocksInvoker.createFlowerPotBlock(PASSHO_BERRY))
@JvmField
val POTTED_PAYAPA_BERRY = this.flowerPot("potted_payapa_berry", PAYAPA_BERRY)
val POTTED_PAYAPA_BERRY = this.create("potted_payapa_berry", BlocksInvoker.createFlowerPotBlock(PAYAPA_BERRY))
@JvmField
val POTTED_PECHA_BERRY = this.flowerPot("potted_pecha_berry", PECHA_BERRY)
val POTTED_PECHA_BERRY = this.create("potted_pecha_berry", BlocksInvoker.createFlowerPotBlock(PECHA_BERRY))
@JvmField
val POTTED_PERSIM_BERRY = this.flowerPot("potted_persim_berry", PERSIM_BERRY)
val POTTED_PERSIM_BERRY = this.create("potted_persim_berry", BlocksInvoker.createFlowerPotBlock(PERSIM_BERRY))
@JvmField
val POTTED_PETAYA_BERRY = this.flowerPot("potted_petaya_berry", PETAYA_BERRY)
val POTTED_PETAYA_BERRY = this.create("potted_petaya_berry", BlocksInvoker.createFlowerPotBlock(PETAYA_BERRY))
@JvmField
val POTTED_PINAP_BERRY = this.flowerPot("potted_pinap_berry", PINAP_BERRY)
val POTTED_PINAP_BERRY = this.create("potted_pinap_berry", BlocksInvoker.createFlowerPotBlock(PINAP_BERRY))
@JvmField
val POTTED_POMEG_BERRY = this.flowerPot("potted_pomeg_berry", POMEG_BERRY)
val POTTED_POMEG_BERRY = this.create("potted_pomeg_berry", BlocksInvoker.createFlowerPotBlock(POMEG_BERRY))
@JvmField
val POTTED_QUALOT_BERRY = this.flowerPot("potted_qualot_berry", QUALOT_BERRY)
val POTTED_QUALOT_BERRY = this.create("potted_qualot_berry", BlocksInvoker.createFlowerPotBlock(QUALOT_BERRY))
@JvmField
val POTTED_RABUTA_BERRY = this.flowerPot("potted_rabuta_berry", RABUTA_BERRY)
val POTTED_RABUTA_BERRY = this.create("potted_rabuta_berry", BlocksInvoker.createFlowerPotBlock(RABUTA_BERRY))
@JvmField
val POTTED_RAWST_BERRY = this.flowerPot("potted_rawst_berry", RAWST_BERRY)
val POTTED_RAWST_BERRY = this.create("potted_rawst_berry", BlocksInvoker.createFlowerPotBlock(RAWST_BERRY))
@JvmField
val POTTED_RAZZ_BERRY = this.flowerPot("potted_razz_berry", RAZZ_BERRY)
val POTTED_RAZZ_BERRY = this.create("potted_razz_berry", BlocksInvoker.createFlowerPotBlock(RAZZ_BERRY))
@JvmField
val POTTED_RINDO_BERRY = this.flowerPot("potted_rindo_berry", RINDO_BERRY)
val POTTED_RINDO_BERRY = this.create("potted_rindo_berry", BlocksInvoker.createFlowerPotBlock(RINDO_BERRY))
@JvmField
val POTTED_ROSELI_BERRY = this.flowerPot("potted_roseli_berry", ROSELI_BERRY)
val POTTED_ROSELI_BERRY = this.create("potted_roseli_berry", BlocksInvoker.createFlowerPotBlock(ROSELI_BERRY))
@JvmField
val POTTED_ROWAP_BERRY = this.flowerPot("potted_rowap_berry", ROWAP_BERRY)
val POTTED_ROWAP_BERRY = this.create("potted_rowap_berry", BlocksInvoker.createFlowerPotBlock(ROWAP_BERRY))
@JvmField
val POTTED_SALAC_BERRY = this.flowerPot("potted_salac_berry", SALAC_BERRY)
val POTTED_SALAC_BERRY = this.create("potted_salac_berry", BlocksInvoker.createFlowerPotBlock(SALAC_BERRY))
@JvmField
val POTTED_SHUCA_BERRY = this.flowerPot("potted_shuca_berry", SHUCA_BERRY)
val POTTED_SHUCA_BERRY = this.create("potted_shuca_berry", BlocksInvoker.createFlowerPotBlock(SHUCA_BERRY))
@JvmField
val POTTED_SITRUS_BERRY = this.flowerPot("potted_sitrus_berry", SITRUS_BERRY)
val POTTED_SITRUS_BERRY = this.create("potted_sitrus_berry", BlocksInvoker.createFlowerPotBlock(SITRUS_BERRY))
@JvmField
val POTTED_SPELON_BERRY = this.flowerPot("potted_spelon_berry", SPELON_BERRY)
val POTTED_SPELON_BERRY = this.create("potted_spelon_berry", BlocksInvoker.createFlowerPotBlock(SPELON_BERRY))
@JvmField
val POTTED_STARF_BERRY = this.flowerPot("potted_starf_berry", STARF_BERRY)
val POTTED_STARF_BERRY = this.create("potted_starf_berry", BlocksInvoker.createFlowerPotBlock(STARF_BERRY))
@JvmField
val POTTED_TAMATO_BERRY = this.flowerPot("potted_tamato_berry", TAMATO_BERRY)
val POTTED_TAMATO_BERRY = this.create("potted_tamato_berry", BlocksInvoker.createFlowerPotBlock(TAMATO_BERRY))
@JvmField
val POTTED_TANGA_BERRY = this.flowerPot("potted_tanga_berry", TANGA_BERRY)
val POTTED_TANGA_BERRY = this.create("potted_tanga_berry", BlocksInvoker.createFlowerPotBlock(TANGA_BERRY))
@JvmField
val POTTED_TOUGA_BERRY = this.flowerPot("potted_touga_berry", TOUGA_BERRY)
val POTTED_TOUGA_BERRY = this.create("potted_touga_berry", BlocksInvoker.createFlowerPotBlock(TOUGA_BERRY))
@JvmField
val POTTED_WACAN_BERRY = this.flowerPot("potted_wacan_berry", WACAN_BERRY)
val POTTED_WACAN_BERRY = this.create("potted_wacan_berry", BlocksInvoker.createFlowerPotBlock(WACAN_BERRY))
@JvmField
val POTTED_WATMEL_BERRY = this.flowerPot("potted_watmel_berry", WATMEL_BERRY)
val POTTED_WATMEL_BERRY = this.create("potted_watmel_berry", BlocksInvoker.createFlowerPotBlock(WATMEL_BERRY))
@JvmField
val POTTED_WEPEAR_BERRY = this.flowerPot("potted_wepear_berry", WEPEAR_BERRY)
val POTTED_WEPEAR_BERRY = this.create("potted_wepear_berry", BlocksInvoker.createFlowerPotBlock(WEPEAR_BERRY))
@JvmField
val POTTED_WIKI_BERRY = this.flowerPot("potted_wiki_berry", WIKI_BERRY)
val POTTED_WIKI_BERRY = this.create("potted_wiki_berry", BlocksInvoker.createFlowerPotBlock(WIKI_BERRY))
@JvmField
val POTTED_YACHE_BERRY = this.flowerPot("potted_yache_berry", YACHE_BERRY)
@JvmField
val POTTED_PEP_UP_FLOWER = this.flowerPot("potted_pep_up_flower", PEP_UP_FLOWER)
@JvmField
val POTTED_RED_APRICORN_SAPLING = this.flowerPot("potted_red_apricorn_sapling", RED_APRICORN_SAPLING)
@JvmField
val POTTED_YELLOW_APRICORN_SAPLING = this.flowerPot("potted_yellow_apricorn_sapling", YELLOW_APRICORN_SAPLING)
@JvmField
val POTTED_GREEN_APRICORN_SAPLING = this.flowerPot("potted_green_apricorn_sapling", GREEN_APRICORN_SAPLING)
@JvmField
val POTTED_BLUE_APRICORN_SAPLING = this.flowerPot("potted_blue_apricorn_sapling", BLUE_APRICORN_SAPLING)
@JvmField
val POTTED_PINK_APRICORN_SAPLING = this.flowerPot("potted_pink_apricorn_sapling", PINK_APRICORN_SAPLING)
@JvmField
val POTTED_BLACK_APRICORN_SAPLING = this.flowerPot("potted_black_apricorn_sapling", BLACK_APRICORN_SAPLING)
@JvmField
val POTTED_WHITE_APRICORN_SAPLING = this.flowerPot("potted_white_apricorn_sapling", WHITE_APRICORN_SAPLING)
@JvmField
val POTTED_SACCHARINE_SAPLING = this.flowerPot("potted_saccharine_sapling", SACCHARINE_SAPLING)
val POTTED_YACHE_BERRY = this.create("potted_yache_berry", BlocksInvoker.createFlowerPotBlock(YACHE_BERRY))
init {
/**
@@ -1345,16 +1346,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
fun typeGemClusters() = typeGemClusters.toMap()
private fun flowerPot(name: String, flower: Block) = this.create(
name,
FlowerPotBlock(
flower,
BlockBehaviour.Properties.of()
.instabreak()
.noOcclusion()
.pushReaction(PushReaction.DESTROY)
)
)
private fun pottedPlant(name: String, flower: Block) = this.create(name, BlocksInvoker.createFlowerPotBlock(flower))
private fun mintLitter(name: String, color: MapColor) = this.create(
name,
@@ -73,7 +73,6 @@ object CobblemonCommands {
PcTakeCommand.register(dispatcher)
GiveTmCommand.register(dispatcher)
TmCommand.register(dispatcher)
BadgeCommand.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
@@ -432,7 +432,6 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(SpeciesFeatureAssignmentSyncPacket.ID, SpeciesFeatureAssignmentSyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(NaturalMaterialRegistrySyncPacket.ID, NaturalMaterialRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(FossilRegistrySyncPacket.ID, FossilRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(BadgeRegistrySyncPacket.ID, BadgeRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(NPCRegistrySyncPacket.ID, NPCRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(PokeRodRegistrySyncPacket.ID, PokeRodRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(ScriptRegistrySyncPacket.ID, ScriptRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
@@ -1,20 +0,0 @@
package com.cobblemon.mod.common.api.badges
import net.minecraft.resources.ResourceLocation
import net.minecraft.util.StringRepresentable
class Badge(
identifier: ResourceLocation,
val name: String,
val texture: ResourceLocation,
val order: Int
): StringRepresentable {
@Transient
var identifier: ResourceLocation = identifier
internal set
override fun getSerializedName(): String {
return identifier.toString()
}
}
@@ -1,54 +0,0 @@
package com.cobblemon.mod.common.api.badges
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
import com.cobblemon.mod.common.api.storage.player.InstancedPlayerData
import com.cobblemon.mod.common.api.storage.player.PlayerInstancedDataStoreTypes
import com.cobblemon.mod.common.api.storage.player.client.ClientBadgeManager
import com.cobblemon.mod.common.net.messages.client.SetClientPlayerDataPacket
import com.cobblemon.mod.common.util.getPlayer
import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.resources.ResourceLocation
import java.util.UUID
class BadgeManager(
override val uuid: UUID,
val obtainedBadges: MutableSet<ResourceLocation> = mutableSetOf()
) : InstancedPlayerData {
val storeType = PlayerInstancedDataStoreTypes.BADGES
override fun toClientData() = ClientBadgeManager(obtainedBadges.toMutableSet())
fun give(badge: Badge): Boolean {
if (!obtainedBadges.add(badge.identifier)) return false
syncAndSave()
return true
}
fun remove(badge: Badge): Boolean {
if (!obtainedBadges.remove(badge.identifier)) return false
syncAndSave()
return true
}
private fun syncAndSave() {
uuid.getPlayer()?.sendPacket(SetClientPlayerDataPacket(storeType, toClientData()))
Cobblemon.playerDataManager.saveSingle(this, storeType)
}
companion object {
val CODEC: Codec<BadgeManager> = RecordCodecBuilder.create { instance ->
instance.group(
Codec.STRING.xmap(UUID::fromString, UUID::toString)
.fieldOf("uuid")
.forGetter { it.uuid },
Codec.list(ResourceLocation.CODEC)
.xmap({ it.toMutableSet() }, { it.toList() })
.fieldOf("obtainedBadges")
.forGetter { it.obtainedBadges }
).apply(instance, ::BadgeManager)
}
}
}
@@ -1,64 +0,0 @@
package com.cobblemon.mod.common.api.badges
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.data.JsonDataRegistry
import com.cobblemon.mod.common.api.reactive.SimpleObservable
import com.cobblemon.mod.common.net.messages.client.data.BadgeRegistrySyncPacket
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
import com.cobblemon.mod.common.util.cobblemonResource
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.server.packs.PackType
object Badges : JsonDataRegistry<Badge> {
override val id: ResourceLocation = cobblemonResource("badges")
override val type: PackType = PackType.SERVER_DATA
override val observable = SimpleObservable<Badges>()
override val gson: Gson = GsonBuilder()
.disableHtmlEscaping()
.setPrettyPrinting()
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
.create()
override val typeToken: TypeToken<Badge> = TypeToken.get(Badge::class.java)
override val resourcePath: String = "badges"
private val badges = hashMapOf<ResourceLocation, Badge>()
override fun reload(data: Map<ResourceLocation, Badge>) {
this.badges.clear()
data.forEach { (id, badge) ->
try {
badge.identifier = id
this.badges[id] = badge
} catch (e: Exception) {
Cobblemon.LOGGER.error("Skipped loading the {} badge", id, e)
}
}
Cobblemon.LOGGER.info("Loaded {} badges", this.badges.size)
this.observable.emit(this)
}
override fun sync(player: ServerPlayer) {
BadgeRegistrySyncPacket(this.all()).sendToPlayer(player)
}
/**
* Get all loaded [Badge]s.
*/
@JvmStatic
fun all() = this.badges.values.toList()
/**
* Gets a [Badge] by its [ResourceLocation].
* @param identifier The identifier of the badge.
* @return The [Badge], if loaded, otherwise null.
*/
@JvmStatic
fun getByIdentifier(identifier: ResourceLocation): Badge? = this.badges[identifier]
}
@@ -145,8 +145,6 @@ object CobblemonPermissions {
val SPECTATE_BATTLE = this.create("${COMMAND_PREFIX}spectatebattle", PermissionLevel.ALL_COMMANDS)
@JvmStatic
val TECHNICAL_MACHINE = this.create("${COMMAND_PREFIX}technicalmachine", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
@JvmStatic
val BADGE = this.create("${COMMAND_PREFIX}badge", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
@JvmStatic
val SEE_HIDDEN_NPCS = this.create("seehiddennpcs", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
@@ -29,12 +29,8 @@ object CobblemonStats {
@JvmField
val BATTLES_WON: CobblemonStat = CobblemonStat("battles_won")
@JvmField
val PVP_BATTLES_WON: CobblemonStat = CobblemonStat("pvp_battles_won")
@JvmField
val BATTLES_LOST: CobblemonStat = CobblemonStat("battles_lost")
@JvmField
val PVP_BATTLES_LOST: CobblemonStat = CobblemonStat("pvp_battles_lost")
@JvmField
val BATTLES_FLED: CobblemonStat = CobblemonStat("battles_fled")
@JvmField
val BATTLES_TOTAL: CobblemonStat = CobblemonStat("battles_total")
@@ -72,9 +68,7 @@ object CobblemonStats {
stats["evolved"] = EVOLVED
stats["level_up"] = LEVEL_UP
stats["battles_won"] = BATTLES_WON
stats["pvp_battles_won"] = PVP_BATTLES_WON
stats["battles_lost"] = BATTLES_LOST
stats["pvp_battles_lost"] = PVP_BATTLES_LOST
stats["battles_fled"] = BATTLES_FLED
stats["battles_total"] = BATTLES_TOTAL
stats["dex_entries"] = DEX_ENTRIES
@@ -10,7 +10,6 @@ package com.cobblemon.mod.common.api.storage.player
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.Cobblemon.MODID
import com.cobblemon.mod.common.api.badges.BadgeManager
import com.cobblemon.mod.common.api.pokedex.PokedexManager
import com.cobblemon.mod.common.api.scheduling.ScheduledTask
import com.cobblemon.mod.common.api.scheduling.ServerTaskTracker
@@ -77,14 +76,6 @@ open class PlayerInstancedDataStoreManager {
.infiniteIterations()
.tracker(ServerTaskTracker)
.build()
saveTasks[PlayerInstancedDataStoreTypes.BADGES] = ScheduledTask.Builder()
.execute { saveAllOfOneType(PlayerInstancedDataStoreTypes.BADGES) }
.delay(30F)
.interval(120F)
.infiniteIterations()
.tracker(ServerTaskTracker)
.build()
}
open fun get(playerId: UUID, dataType: PlayerInstancedDataStoreType): InstancedPlayerData {
@@ -157,9 +148,4 @@ open class PlayerInstancedDataStoreManager {
}
return data as TMMoveManager
}
fun getBadgeData(player: ServerPlayer): BadgeManager = getBadgeData(player.uuid)
fun getBadgeData(playerId: UUID): BadgeManager =
get(playerId, PlayerInstancedDataStoreTypes.BADGES) as BadgeManager
}
@@ -9,7 +9,6 @@
package com.cobblemon.mod.common.api.storage.player
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.storage.player.client.ClientBadgeManager
import com.cobblemon.mod.common.api.storage.player.client.ClientPokedexManager
import com.cobblemon.mod.common.api.storage.player.client.ClientGeneralPlayerData
import com.cobblemon.mod.common.api.storage.player.client.ClientTMMoveManager
@@ -36,12 +35,6 @@ object PlayerInstancedDataStoreTypes {
ClientTMMoveManager::runAction,
ClientTMMoveManager::runIncremental
))
val BADGES = register(PlayerInstancedDataStoreType(
cobblemonResource("badge_collection"),
ClientBadgeManager::decode,
ClientBadgeManager::runAction,
ClientBadgeManager::runIncremental
))
fun register(type: PlayerInstancedDataStoreType): PlayerInstancedDataStoreType {
Cobblemon.LOGGER.debug("Registering PlayerInstancedDataStoreType: {}", type.id)
@@ -1,38 +0,0 @@
/*
* 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.api.storage.player.adapter
import com.cobblemon.mod.common.api.badges.BadgeManager
import com.cobblemon.mod.common.api.storage.player.PlayerInstancedDataStoreTypes
import com.cobblemon.mod.common.util.adapters.CodecBackedAdapter
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import com.mongodb.client.MongoClient
import java.util.UUID
class BadgeMongoBackend(
mongoClient: MongoClient,
databaseName: String,
collectionName: String
) : MongoBackedPlayerDataStoreBackend<BadgeManager>(
mongoClient,
databaseName,
collectionName,
PlayerInstancedDataStoreTypes.BADGES
) {
override val gson = GsonBuilder()
.registerTypeAdapter(BadgeManager::class.java, CodecBackedAdapter(BadgeManager.CODEC))
.create()
override val classToken = TypeToken.get(BadgeManager::class.java)
override val defaultData = defaultDataFunc
companion object {
val defaultDataFunc = { uuid: UUID -> BadgeManager(uuid) }
}
}
@@ -1,22 +0,0 @@
/*
* 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.api.storage.player.adapter
import com.cobblemon.mod.common.api.badges.BadgeManager
import com.cobblemon.mod.common.api.storage.player.PlayerInstancedDataStoreTypes
import java.util.UUID
class BadgeNbtBackend : NbtBackedPlayerData<BadgeManager>("badges", PlayerInstancedDataStoreTypes.BADGES) {
override val codec = BadgeManager.CODEC
override val defaultData = defaultDataFunc
companion object {
val defaultDataFunc = { uuid: UUID -> BadgeManager(uuid) }
}
}
@@ -52,7 +52,7 @@ abstract class FileBasedPlayerDataStoreBackend<T : InstancedPlayerData>(
val playerFile = filePath(uuid)
val playerFileOld = filePath(uuid, OLD_FILE_EXTENSION)
playerFile.parentFile.mkdirs()
val loadFallback: (Boolean) -> T = { primaryFileCorrupt ->
val loadFallback: () -> T = {
playerFile.delete()
if (playerFileOld.exists() && playerFileOld.length() > 0L) {
try {
@@ -68,9 +68,7 @@ abstract class FileBasedPlayerDataStoreBackend<T : InstancedPlayerData>(
}
}
else {
if (primaryFileCorrupt) {
Cobblemon.LOGGER.error(".old File $subfolder for $uuid is corrupt or missing. Data is lost")
}
Cobblemon.LOGGER.error(".old File $subfolder for $uuid is corrupt or missing. Data is lost")
playerFileOld.delete()
defaultData.invoke(uuid).also(::save)
}
@@ -82,10 +80,10 @@ abstract class FileBasedPlayerDataStoreBackend<T : InstancedPlayerData>(
catch (e: Exception) {
Cobblemon.LOGGER.warn("Failed to load $subfolder for $uuid due to ${e.message}")
Cobblemon.LOGGER.warn(e)
loadFallback(true)
loadFallback()
}
} else {
loadFallback(false)
loadFallback()
}.also { it.initialize() }
}
@@ -1,42 +0,0 @@
package com.cobblemon.mod.common.api.storage.player.client
import com.cobblemon.mod.common.api.storage.player.PlayerInstancedDataStoreTypes
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.net.messages.client.SetClientPlayerDataPacket
import com.cobblemon.mod.common.util.readString
import com.cobblemon.mod.common.util.writeString
import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.resources.ResourceLocation
class ClientBadgeManager(
val obtainedBadges: MutableSet<ResourceLocation>
) : ClientInstancedPlayerData {
override fun encode(buf: RegistryFriendlyByteBuf) {
buf.writeCollection(obtainedBadges) { _, id, -> buf.writeString(id.toString()) }
}
companion object {
fun decode(buf: RegistryFriendlyByteBuf): SetClientPlayerDataPacket {
val badges = buf.readCollection(
{ mutableSetOf<ResourceLocation>() },
{ buf.readString().let(ResourceLocation::tryParse) ?: ResourceLocation("minecraft", "empty") }
)
return SetClientPlayerDataPacket(
PlayerInstancedDataStoreTypes.BADGES,
ClientBadgeManager(badges)
)
}
fun runAction(data: ClientInstancedPlayerData) {
if (data !is ClientBadgeManager) return
CobblemonClient.clientBadgeData = data
}
fun runIncremental(data: ClientInstancedPlayerData) {
if (data !is ClientBadgeManager) return
CobblemonClient.clientBadgeData.obtainedBadges.addAll(data.obtainedBadges)
}
}
}
@@ -17,12 +17,12 @@ import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.CobblemonMenuType
import com.cobblemon.mod.common.api.berry.Berries
import com.cobblemon.mod.common.api.scheduling.ClientTaskTracker
import com.cobblemon.mod.common.api.storage.player.client.ClientBadgeManager
import com.cobblemon.mod.common.api.storage.player.client.ClientGeneralPlayerData
import com.cobblemon.mod.common.api.storage.player.client.ClientPokedexManager
import com.cobblemon.mod.common.api.storage.player.client.ClientTMMoveManager
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
import com.cobblemon.mod.common.block.entity.TintBlockEntity
import com.cobblemon.mod.common.block.sign.CobblemonSignBlock
import com.cobblemon.mod.common.client.battle.ClientBattle
import com.cobblemon.mod.common.client.gui.PartyOverlay
import com.cobblemon.mod.common.client.gui.PartyOverlayDataControl
@@ -101,7 +101,6 @@ object CobblemonClient {
var clientPlayerData = ClientGeneralPlayerData()
var clientPokedexData = ClientPokedexManager(mutableMapOf())
var clientTMMoveData = ClientTMMoveManager(mutableSetOf())
var clientBadgeData = ClientBadgeManager(mutableSetOf())
/** If true then we won't bother them anymore about choosing a starter even if it's a thing they can do. */
var checkedStarterScreen = false
@@ -119,7 +118,6 @@ object CobblemonClient {
teamData = ClientPlayerTeamData()
clientPokedexData = ClientPokedexManager(mutableMapOf())
clientTMMoveData = ClientTMMoveManager(mutableSetOf())
clientBadgeData = ClientBadgeManager(mutableSetOf())
storage.onLogin()
// CobblemonDataProvider.canReload = false
}
@@ -85,7 +85,6 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
if (HidePartyBinding.shouldHide) {
return false
}
return true
}
}
@@ -559,4 +558,4 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
}
}
}
}
}
@@ -1,167 +0,0 @@
package com.cobblemon.mod.common.client.gui.trainercard
import com.cobblemon.mod.common.api.badges.Badge
import com.cobblemon.mod.common.api.gui.blitk
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.gui.ScrollingWidget
import com.cobblemon.mod.common.client.gui.pokedex.renderTooltip
import com.cobblemon.mod.common.util.lang
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent
import net.minecraft.util.FastColor
import net.minecraft.util.Mth
class BadgesScrollingWidget(
x: Int,
y: Int,
width: Int,
height: Int,
private val columns: Int
) : ScrollingWidget<BadgesScrollingWidget.BadgeRow>(
width = width,
height = height,
left = x,
top = y - height,
slotHeight = SLOT_SIZE + SLOT_SPACING
) {
private var tooltip: MutableComponent? = null
private var tooltipX = 0
private var tooltipY = 0
companion object {
const val SLOT_SIZE = 16
const val SLOT_SPACING = 3
const val MAX_VISIBLE_ROWS = 2
}
fun createEntries(badges: List<Badge>) {
val obtainedBadgeList = badges.filter { CobblemonClient.clientBadgeData.obtainedBadges.contains(it.identifier) }
.sortedBy { it.order }
val unobtainedBadgesList = badges.filter { !obtainedBadgeList.contains(it) }
.sortedBy { it.order }
val sortedBadgeList = obtainedBadgeList.plus(unobtainedBadgesList)
sortedBadgeList.chunked(columns).forEach { listChunk ->
addEntry(BadgeRow(this, listChunk))
}
}
private val visibleRows: Int
get() = (height / itemHeight).coerceAtLeast(1)
private fun hasScrollbar(): Boolean = children().size > visibleRows
override fun getRowLeft(): Int = if (hasScrollbar()) left + 1 else left
override fun getScrollbarPosition(): Int = rowLeft + width - 3
override fun renderWidget(context: GuiGraphics, mouseX: Int, mouseY: Int, delta: Float) {
tooltip = null
super.renderWidget(context, mouseX, mouseY, delta)
tooltip?.let { renderTooltip(context, it, tooltipX, tooltipY, delta) }
}
fun setTooltip(text: MutableComponent, mouseX: Int, mouseY: Int) {
if (mouseX in left until left + width && mouseY in this.y until bottom) {
tooltip = text
tooltipX = mouseX + 20
tooltipY = mouseY - 10
}
}
override fun renderScrollbar(context: GuiGraphics, mouseX: Int, mouseY: Int, delta: Float) {
if (hasScrollbar()) {
val xLeft = this.scrollbarPosition
val xRight = xLeft + 3
val barHeight = this.bottom - this.y
var yBottom = ((barHeight * barHeight).toFloat() / this.maxPosition.toFloat()).toInt()
yBottom = Mth.clamp(yBottom, minOf(32, barHeight), maxOf(minOf(32, barHeight), barHeight - 8))
var yTop = scrollAmount.toInt() * (barHeight - yBottom) / this.maxScroll + this.y
if (yTop < this.y) {
yTop = this.y
}
context.fill(xLeft, this.y, xRight, this.bottom, FastColor.ARGB32.color(255, 75, 75, 75))
context.fill(xLeft, yTop, xRight, yTop + yBottom, FastColor.ARGB32.color(255, 141, 141, 141))
}
}
private fun renderEntry(context: GuiGraphics, mouseX: Int, mouseY: Int, index: Int, x: Int, y: Int) {
getEntry(index).renderRow(context, y, x, mouseX, mouseY)
}
override fun renderListItems(context: GuiGraphics, mouseX: Int, mouseY: Int, delta: Float) {
val rowX = rowLeft
for (index in 0 until this.itemCount) {
val rowY = this.getRowTop(index)
val o = this.getRowBottom(index)
if (o >= this.y && rowY <= this.bottom) {
this.renderEntry(context, mouseX, mouseY, index, rowX, rowY)
}
}
}
override fun mouseDragged(mouseX: Double, mouseY: Double, button: Int, dragX: Double, dragY: Double): Boolean =
if (hasScrollbar()) super.mouseDragged(mouseX, mouseY, button, dragX, dragY) else true
override fun mouseScrolled(mouseX: Double, mouseY: Double, scrollX: Double, scrollY: Double): Boolean =
if (hasScrollbar()) super.mouseScrolled(mouseX, mouseY, scrollX, scrollY) else true
class BadgeRow(
val parent: BadgesScrollingWidget,
val badgeList: List<Badge?>
) : Slot<BadgeRow>() {
fun renderRow(context: GuiGraphics, y: Int, x: Int, mouseX: Int, mouseY: Int) {
badgeList.forEachIndexed { index, badge ->
val startPosX = x + ((SLOT_SPACING + SLOT_SIZE) * index)
val startPosY = y + SLOT_SPACING
if (badge != null) {
val obtained = CobblemonClient.clientBadgeData.obtainedBadges.contains(badge.identifier)
blitk(
matrixStack = context.pose(),
texture = badge.texture,
x = startPosX,
y = startPosY,
width = SLOT_SIZE,
height = SLOT_SIZE,
red = if (obtained) 1 else 0,
green = if (obtained) 1 else 0,
blue = if (obtained) 1 else 0
)
if (mouseX in startPosX until startPosX + SLOT_SIZE &&
mouseY in startPosY until startPosY + SLOT_SIZE
) {
parent.setTooltip(
if (obtained) Component.translatable(badge.name) else lang("badge.unobtained"),
mouseX, mouseY
)
}
}
}
}
override fun getNarration(): Component? {
return badgeList.firstOrNull()?.let { Component.translatable(it.name) }
}
override fun render(
guiGraphics: GuiGraphics,
index: Int,
top: Int,
left: Int,
width: Int,
height: Int,
mouseX: Int,
mouseY: Int,
hovering: Boolean,
partialTick: Float
) {}
}
}
@@ -1,221 +0,0 @@
package com.cobblemon.mod.common.client.gui.trainercard
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.badges.Badges
import com.cobblemon.mod.common.api.pokedex.CaughtCount
import com.cobblemon.mod.common.api.stats.CobblemonStats.getStat
import com.cobblemon.mod.common.api.text.text
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
import com.cobblemon.mod.common.client.render.drawScaledText
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.components.Button
import net.minecraft.client.gui.screens.Screen
import net.minecraft.client.gui.screens.inventory.InventoryScreen
import net.minecraft.client.sounds.SoundManager
import net.minecraft.network.chat.Component
import net.minecraft.network.protocol.game.ServerboundClientCommandPacket
import net.minecraft.stats.Stats
import net.minecraft.util.CommonColors
import kotlin.math.ceil
class TrainerCardMenu : Screen(
Component.translatable("cobblemon.ui.trainercard.title")
), CobblemonRenderable {
private var elapsedTicks = 0
private var lastSyncedTimePlayed = 0
private var panelLeft = 0
private var panelTop = 0
private lateinit var badgeScrollList: BadgesScrollingWidget
private lateinit var leftPageArrow: TrainerCardPageArrow
private lateinit var rightPageArrow: TrainerCardPageArrow
private var currentPage = 0
private val maxPages = 3
override fun isPauseScreen(): Boolean = false
override fun init() {
super.init()
elapsedTicks = 0
lastSyncedTimePlayed = getTimePlayed()
// stats need to update when we open the menu, otherwise time played only updates when stats menu is opened
Minecraft.getInstance().connection?.send(
ServerboundClientCommandPacket(ServerboundClientCommandPacket.Action.REQUEST_STATS)
)
val badges = Badges.all().sortedBy { it.order }
val panelWidth = minOf(220, (width - 16).coerceAtLeast(1))
panelLeft = (width - panelWidth) / 2
val leftColumnWidth = panelWidth / 2
val badgeAreaWidth = panelWidth - leftColumnWidth - 8
val columns = ((badgeAreaWidth + BadgesScrollingWidget.SLOT_SPACING) /
(BadgesScrollingWidget.SLOT_SIZE + BadgesScrollingWidget.SLOT_SPACING)).coerceIn(1, 4)
val badgeWidth = columns * BadgesScrollingWidget.SLOT_SIZE +
(columns - 1) * BadgesScrollingWidget.SLOT_SPACING + 4
val rowCount = ceil(badges.size.toDouble() / columns).toInt().coerceAtLeast(1)
val rowHeight = BadgesScrollingWidget.SLOT_SIZE + BadgesScrollingWidget.SLOT_SPACING
val badgeHeight = minOf(rowCount, BadgesScrollingWidget.MAX_VISIBLE_ROWS) * rowHeight
val panelHeight = maxOf(92, badgeHeight + 20)
panelTop = ((height - panelHeight) / 2).coerceAtLeast(8)
badgeScrollList = BadgesScrollingWidget(
x = panelLeft + panelWidth - badgeWidth,
y = panelTop + 10,
width = badgeWidth,
height = badgeHeight,
columns = columns
)
badgeScrollList.createEntries(badges)
addRenderableWidget(badgeScrollList)
leftPageArrow = TrainerCardPageArrow(
buttonX = panelLeft - 10,
buttonY = panelTop,
width = 16,
height = 16,
onPress = {},
parent = this,
isRight = false
)
rightPageArrow = TrainerCardPageArrow(
buttonX = panelLeft + panelWidth + 10,
buttonY = panelTop,
width = 16,
height = 16,
onPress = {},
parent = this,
isRight = true
)
addRenderableWidget(leftPageArrow)
addRenderableWidget(rightPageArrow)
}
override fun tick() {
super.tick()
// make our own live playtime update, otherwise we have to send a packet a second to retrieve the playtime stat
val timePlayed = getTimePlayed()
if (timePlayed != lastSyncedTimePlayed) {
lastSyncedTimePlayed = timePlayed
elapsedTicks = 0
} else { elapsedTicks++ }
}
override fun render(context: GuiGraphics, mouseX: Int, mouseY: Int, partialTick: Float) {
when(currentPage) {
0 -> {
val portraitX = panelLeft
val portraitY = minOf(panelTop + 48, (height - 32).coerceAtLeast(0))
val portraitSize = 30
val statsTextWidth = (badgeScrollList.x - panelLeft - 8).coerceAtLeast(1)
val player = Minecraft.getInstance().player ?: return // unsure of why this would ever not return a player but if you're here maybe it's because it did
val entity = Minecraft.getInstance().level?.getPlayerByUUID(player.uuid) ?: return
context.enableScissor(portraitX, portraitY, portraitX + portraitSize, portraitY + portraitSize)
InventoryScreen.renderEntityInInventoryFollowsMouse(context,
portraitX, portraitY, portraitX + portraitSize, portraitY + portraitSize, 28, 0.5f, mouseX.toFloat(), mouseY.toFloat(),
entity
)
context.disableScissor()
val totalSeconds = (getTimePlayed() + elapsedTicks) / 20
val timePlayed = "%d:%02d:%02d:%02d".format(
totalSeconds / 86_400, // days
totalSeconds % 86_400 / 3_600, // hours
totalSeconds % 3_600 / 60, // minutes
totalSeconds % 60 // seconds
)
drawScaledText(
context = context,
text = lang("ui.trainermenu.timeplayed", timePlayed),
x = panelLeft,
y = panelTop + 4,
maxCharacterWidth = statsTextWidth
)
drawScaledText(
context = context,
text = lang("ui.trainermenu.pokemon_registered",
CobblemonClient.clientPokedexData.getDexCalculatedValue(cobblemonResource("national"), CaughtCount)),
x = panelLeft,
y = panelTop + 14,
maxCharacterWidth = statsTextWidth
)
val playerBattlesWon = player.stats.getValue(Stats.CUSTOM.get(getStat(Cobblemon.statistics.PVP_BATTLES_WON)))
val playerBattlesLost = player.stats.getValue(Stats.CUSTOM.get(getStat(Cobblemon.statistics.PVP_BATTLES_LOST)))
if (playerBattlesWon > 0 || playerBattlesLost > 0) {
drawScaledText(
context = context,
text = lang("ui.trainermenu.battle_stats",
playerBattlesWon,
playerBattlesLost
),
x = panelLeft,
y = panelTop + 24,
maxCharacterWidth = statsTextWidth
)
}
badgeScrollList.render(context, mouseX, mouseY, partialTick)
}
}
drawScaledText(
context = context,
text = Component.literal("$currentPage"),
x = panelLeft - 30,
y = panelTop
)
if (leftPageArrow.shouldExist()) {
leftPageArrow.render(context, mouseX, mouseY, partialTick)
}
if (rightPageArrow.shouldExist()) {
rightPageArrow.render(context, mouseX, mouseY, partialTick)
}
}
private class TrainerCardPageArrow(
buttonX: Int,
buttonY: Int, width: Int, height: Int, onPress: OnPress,
val parent: TrainerCardMenu,
val isRight: Boolean
): Button(
buttonX, buttonY, width, height, "".text(), onPress, DEFAULT_NARRATION
) {
fun shouldExist(): Boolean {
if (isRight && parent.currentPage == parent.maxPages - 1) return false
if (!isRight && parent.currentPage == 0) return false
return true
}
override fun renderWidget(context: GuiGraphics, mouseX: Int, mouseY: Int, partialTick: Float) {
context.fill(x, y, x + width, y + height, CommonColors.WHITE)
}
override fun playDownSound(handler: SoundManager) {
if (shouldExist()) super.playDownSound(handler)
}
override fun onClick(mouseX: Double, mouseY: Double) {
if (!shouldExist()) return
parent.currentPage += if (isRight) 1 else -1
}
}
private fun getTimePlayed(): Int =
Minecraft.getInstance().player?.stats?.getValue(Stats.CUSTOM.get(Stats.PLAY_TIME)) ?: 0
}
@@ -39,7 +39,6 @@ object CobblemonKeyBinds {
val PARTY_OVERLAY_UP = this.queue(UpShiftPartyBinding)
val SEND_OUT_POKEMON = this.queue(PartySendBinding)
val RIDING_FREELOOK = this.queue(RidingFreelookBinding)
val TRAINER_MENU = this.queue(TrainerMenuBinding)
fun register(registrar: (KeyMapping) -> Unit) {
this.keyBinds.forEach(registrar::invoke)
@@ -1,29 +0,0 @@
/*
* 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.client.keybind.keybinds
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.gui.summary.Summary
import com.cobblemon.mod.common.client.gui.trainercard.TrainerCardMenu
import com.cobblemon.mod.common.client.keybind.CobblemonPartyLockedKeyBinding
import com.cobblemon.mod.common.client.keybind.KeybindCategories
import com.mojang.blaze3d.platform.InputConstants
import net.minecraft.client.Minecraft
object TrainerMenuBinding : CobblemonPartyLockedKeyBinding(
"key.cobblemon.trainermenu",
InputConstants.Type.KEYSYM,
InputConstants.KEY_N,
KeybindCategories.COBBLEMON_CATEGORY
) {
override fun onPress() {
Minecraft.getInstance().setScreen(TrainerCardMenu())
}
}
@@ -1,69 +0,0 @@
package com.cobblemon.mod.common.command
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.permission.CobblemonPermissions
import com.cobblemon.mod.common.command.argument.BadgeArgumentType
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
import net.minecraft.commands.arguments.EntityArgument
import net.minecraft.network.chat.Component
import net.minecraft.server.level.ServerPlayer
object BadgeCommand {
private const val NAME = "badge"
private const val GIVE = "give"
private const val REMOVE = "remove"
private const val PLAYER = "player"
fun register(dispatcher: CommandDispatcher<CommandSourceStack>) {
val command =
Commands.literal(NAME)
.permission(CobblemonPermissions.BADGE)
.then(Commands.literal(GIVE)
.then(Commands.argument(PLAYER, EntityArgument.player())
.then(Commands.argument(BADGE, BadgeArgumentType.badge())
.executes { executeGive(it, EntityArgument.getPlayer(it, PLAYER)) }
)
)
)
.then(Commands.literal(REMOVE)
.then(Commands.argument(PLAYER, EntityArgument.player())
.then(Commands.argument(BADGE, BadgeArgumentType.badge())
.executes { executeRemove(it, EntityArgument.getPlayer(it, PLAYER)) }
)
)
)
dispatcher.register(command)
}
private fun executeGive(context: CommandContext<CommandSourceStack>, player: ServerPlayer): Int {
val badge = BadgeArgumentType.getBadge(context, BADGE)
val changed = Cobblemon.playerDataManager.getBadgeData(player).give(badge)
val message = if (changed) {
"Gave ${badge.name} to ${player.name.string}."
} else {
"${player.name.string} already has ${badge.name}."
}
context.source.sendSuccess({ Component.literal(message) }, true)
return Command.SINGLE_SUCCESS
}
private fun executeRemove(context: CommandContext<CommandSourceStack>, player: ServerPlayer): Int {
val badge = BadgeArgumentType.getBadge(context, BADGE)
val changed = Cobblemon.playerDataManager.getBadgeData(player).remove(badge)
val message = if (changed) {
"Removed ${badge} from ${player.name.string}." // TODO move this to lang
} else {
"${player.name.string} does not have ${badge.name}."
}
context.source.sendSuccess({ Component.literal(message) }, true)
return Command.SINGLE_SUCCESS
}
private const val BADGE = "badge"
}
@@ -1,51 +0,0 @@
/*
* 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.command.argument
import com.cobblemon.mod.common.api.badges.Badge
import com.cobblemon.mod.common.api.badges.Badges
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import com.mojang.brigadier.StringReader
import com.mojang.brigadier.arguments.ArgumentType
import com.mojang.brigadier.context.CommandContext
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType
import com.mojang.brigadier.suggestion.Suggestions
import com.mojang.brigadier.suggestion.SuggestionsBuilder
import net.minecraft.commands.SharedSuggestionProvider
import net.minecraft.network.chat.Component
import java.util.concurrent.CompletableFuture
class BadgeArgumentType : ArgumentType<Badge> {
override fun parse(reader: StringReader): Badge {
val identifier = try {
reader.asIdentifierDefaultingNamespace()
} catch (exception: Exception) {
throw SimpleCommandExceptionType(INVALID_BADGE).createWithContext(reader)
}
return Badges.getByIdentifier(identifier)
?: throw SimpleCommandExceptionType(INVALID_BADGE).createWithContext(reader)
}
override fun <S : Any> listSuggestions(
context: CommandContext<S>,
builder: SuggestionsBuilder
): CompletableFuture<Suggestions> {
return SharedSuggestionProvider.suggest(Badges.all().map { it.identifier.toString() }, builder)
}
companion object {
private val INVALID_BADGE = Component.translatable("cobblemon.command.badge.invalid")
fun badge() = BadgeArgumentType()
fun <S> getBadge(context: CommandContext<S>, name: String): Badge =
context.getArgument(name, Badge::class.java)
}
}
@@ -11,7 +11,6 @@ package com.cobblemon.mod.common.data
import com.cobblemon.mod.common.*
import com.cobblemon.mod.common.Cobblemon.LOGGER
import com.cobblemon.mod.common.api.abilities.Abilities
import com.cobblemon.mod.common.api.badges.Badges
import com.cobblemon.mod.common.api.berry.Berries
import com.cobblemon.mod.common.api.cooking.Seasonings
import com.cobblemon.mod.common.api.data.DataProvider
@@ -121,7 +120,6 @@ object CobblemonDataProvider : DataProvider {
this.register(SpawnBaitEffects, reloadable = false)
this.register(CobblemonRideSettings, reloadable = true)
this.register(TechnicalMachines, reloadable = false)
this.register(Badges, reloadable = true)
SpawnBait.Effects.setupEffects()
PlatformEvents.SERVER_PLAYER_LOGOUT.subscribe {
@@ -78,21 +78,10 @@ object StatHandler : EventHandler {
fun onWinBattle(event : BattleVictoryEvent) {
if (!event.wasWildCapture) {
if(event.battle.isPvP) {
event.winners
.flatMap { it.getPlayerUUIDs().mapNotNull(UUID::getPlayer) }
.forEach { player -> player.awardStat(getStat(Cobblemon.statistics.PVP_BATTLES_WON)) }
event.losers
.flatMap { it.getPlayerUUIDs().mapNotNull(UUID::getPlayer) }
.forEach { player -> player.awardStat(getStat(Cobblemon.statistics.PVP_BATTLES_LOST)) }
}
if (event.battle.isPvW) {
event.winners
.flatMap { it.getPlayerUUIDs().mapNotNull(UUID::getPlayer) }
.forEach { player -> player.awardStat(getStat(Cobblemon.statistics.BATTLES_WON)) }
event.losers
.flatMap { it.getPlayerUUIDs().mapNotNull(UUID::getPlayer) }
.forEach { player -> player.awardStat(getStat(Cobblemon.statistics.BATTLES_LOST)) }
}
}
}
@@ -1,47 +0,0 @@
/*
* 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.net.messages.client.data
import com.cobblemon.mod.common.api.badges.Badge
import com.cobblemon.mod.common.api.badges.Badges
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.readIdentifier
import com.cobblemon.mod.common.util.readString
import com.cobblemon.mod.common.util.writeIdentifier
import com.cobblemon.mod.common.util.writeString
import net.minecraft.network.RegistryFriendlyByteBuf
class BadgeRegistrySyncPacket(badges: List<Badge>) : DataRegistrySyncPacket<Badge, BadgeRegistrySyncPacket>(badges) {
companion object {
val ID = cobblemonResource("badges")
fun decode(buffer: RegistryFriendlyByteBuf) = BadgeRegistrySyncPacket(emptyList()).apply { decodeBuffer(buffer) }
}
override val id = ID
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: Badge) {
buffer.writeIdentifier(entry.identifier)
buffer.writeString(entry.name)
buffer.writeResourceLocation(entry.texture)
buffer.writeInt(entry.order)
}
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): Badge {
return Badge(
order = buffer.readInt(),
texture = buffer.readResourceLocation(),
name = buffer.readString(),
identifier = buffer.readIdentifier()
)
}
override fun synchronizeDecoded(entries: Collection<Badge>) {
Badges.reload(entries.associateBy { it.identifier })
}
}
@@ -55,8 +55,6 @@ object PlatformEvents {
@JvmField
val CLIENT_PLAYER_LOGOUT = EventObservable<ClientPlayerEvent.Logout>()
@JvmField
val PLAYER_RESPAWN = EventObservable<ServerPlayerEvent.Respawn>()
@JvmField
val PLAYER_DEATH = CancelableObservable<ServerPlayerEvent.Death>()
@JvmField
val RIGHT_CLICK_BLOCK = CancelableObservable<ServerPlayerEvent.RightClickBlock>()
@@ -50,11 +50,6 @@ interface ServerPlayerEvent {
*/
data class Logout(override val player: ServerPlayer) : ServerPlayerEvent
/**
* Fired when the [player] respawns (either by coming back from the end or dying).
*/
data class Respawn(override val player: ServerPlayer) : ServerPlayerEvent
/**
* Fired when the [player] dies.
* If canceled the death will be prevented but healing is required in order to not be stuck in a loop.
@@ -844,19 +844,6 @@
"cobblemon.fossil.root": "Root",
"cobblemon.fossil.sail": "Sail",
"cobblemon.fossil.skull": "Skull",
"cobblemon.badge.unobtained": "?????",
"cobblemon.badge.awesome_badge": "Awesome Badge",
"cobblemon.badge.awesome_badge2": "Awesome Badge 2",
"cobblemon.badge.dummy_badge": "Dummy Badge",
"cobblemon.badge.dummy_badge2": "Dummy Badge 2",
"cobblemon.badge.funny_badge": "Funny Badge",
"cobblemon.badge.funny_badge2": "Funny Badge 2",
"cobblemon.badge.interesting_badge": "Interesting Badge",
"cobblemon.badge.interesting_badge2": "Interesting Badge 2",
"cobblemon.badge.weird_badge": "Weird Badge",
"cobblemon.badge.weird_badge2": "Weird Badge 2",
"cobblemon.gender.female": "Female",
"cobblemon.gender.male": "Male",
"cobblemon.gender.genderless": "Genderless",
@@ -1212,13 +1199,10 @@
"cobblemon.ui.edit.habitat.validation.min_light": "Min Light must be between 0 and 15.",
"cobblemon.ui.edit.habitat.validation.max_light": "Max Light must be between 0 and 15.",
"cobblemon.ui.pokenav.title": "PokéNav",
"cobblemon.ui.pokenav.narrator.backbutton": "PokéNav button pressed",
"cobblemon.ui.trainermenu.timeplayed": "Time played: %1$s",
"cobblemon.ui.trainermenu.pokemon_registered": "Pokémon registered: %1$s",
"cobblemon.ui.trainermenu.battle_stats": "Win/loss rate: %1$s/%2$s",
"cobblemon.ui.summary.title": "Summary",
"cobblemon.ui.starter.title": "Starter Selection",
"cobblemon.ui.starter.choosebutton": "I choose you!",
@@ -2403,7 +2387,6 @@
"cobblemon.command.takemark": "%1$s was taken from %2$s's %3$s.",
"cobblemon.command.takemark.does_not_have": "%1$s's %2$s does not have a %3$s!",
"cobblemon.command.mark.invalid": "Invalid mark name.",
"cobblemon.command.badge.invalid": "Invalid badge identifier.",
"cobblemon.command.molang.out": "MoLang output: %1$s",
"cobblemon.command.pokeheal.in_battle": "You cannot heal your party while in a battle!",
"cobblemon.command.spawnpokemonfrompool": "A %1$s has spawned in the area.",
@@ -9601,10 +9584,8 @@
"cobblemon.snapshots.warning.dont_show_again_tip": "This setting may be ignored on newer Cobblemon snapshots (e.g. 1.7.0 vs 1.8.0)",
"stat.cobblemon.battles_fled": "Pokémon Battles Fled",
"stat.cobblemon.battles_lost": "Pokémon Battles Lost",
"stat.cobblemon.pvp_battles_lost": "Trainer Battles Lost",
"stat.cobblemon.battles_total": "Pokémon Total Battles",
"stat.cobblemon.battles_won": "Pokémon Battles Won",
"stat.cobblemon.pvp_battles_won": "Trainer Battles Won",
"stat.cobblemon.captured": "Pokémon Captured",
"stat.cobblemon.dex_entries": "Pokémon Pokédex Entries",
"stat.cobblemon.eggs_collected": "Pokémon Eggs Collected",
@@ -855,7 +855,7 @@
"advancements.cobblemon.obtain_berry.description": "地表に育ち多くの用途を持つ、きのみを手に入れる",
"advancements.cobblemon.obtain_mutated_berry": "想定外の結果",
"advancements.cobblemon.obtain_mutated_berry.description": "違う種類のきのみの木を隣り合わせに植えて突然変異を目撃する",
"advancements.cobblemon.obtain_all_berries": "もぎもぎフルーツ",
"advancements.cobblemon.obtain_all_berries": "もぎってナッツ",
"advancements.cobblemon.obtain_all_berries.description": "Cobblemonに登場する全てのきのみを集める",
"advancements.cobblemon.use_pasture": "みんなのポケモン牧場",
"advancements.cobblemon.use_pasture.description": "ぼくじょうブロックを作りポケモンを放し飼いにする",
@@ -6219,7 +6219,7 @@
"cobblemon.egg_group.water_2": "水中②",
"cobblemon.egg_group.ditto": "メタモン",
"cobblemon.egg_group.dragon": "ドラゴン",
"cobblemon.egg_group.undiscovered": "タマゴ未発見",
"cobblemon.egg_group.undiscovered": "未発見",
"cobblemon.trade.canceled.sender": "%1$s との交換リクエストをキャンセルしました。",
"cobblemon.trade.canceled.receiver": "%1$s が交換リクエストをキャンセルしました...",
"cobblemon.trade.sent": "%1$s との交換をリクエストしました。",
@@ -6981,7 +6981,7 @@
"cobblemon.mark.ribbon_contest_sinnoh_tough_3.desc": "スーパーコンテスト たくましさ部門 ウルトラランク 優勝!",
"cobblemon.mark.ribbon_contest_sinnoh_tough_4": "パワフルリボンマスター",
"cobblemon.mark.ribbon_contest_super_master_beauty": "うつくしさマスターリボン",
"cobblemon.mark.ribbon_contest_super_master_beauty.title": "とうじきれいだった %1$s",
"cobblemon.mark.ribbon_contest_super_master_beauty.title": "とうじからきれいな %1$s",
"cobblemon.mark.ribbon_contest_super_master_beauty.desc": "コンテストで うつくしさを 発揮した ポケモンに 贈られる 記念リボン",
"cobblemon.mark.ribbon_contest_super_master_cleverness": "かしこさマスターリボン",
"cobblemon.mark.ribbon_contest_super_master_cleverness.title": "てんさいとよばれた %1$s",
@@ -7002,7 +7002,7 @@
"cobblemon.mark.ribbon_contest_super_master_coolness": "かっこよさマスターリボン",
"cobblemon.mark.ribbon_contest_super_master_cuteness.desc": "コンテストで かわいさを 発揮した ポケモンに 贈られる 記念リボン",
"cobblemon.mark.ribbon_contest_super_master_toughness": "たくましさマスターリボン",
"cobblemon.mark.ribbon_contest_super_master_toughness.title": "ムキムキの %1$s",
"cobblemon.mark.ribbon_contest_super_master_toughness.title": "むかしからムキムキの %1$s",
"cobblemon.mark.ribbon_contest_super_master_toughness.desc": "コンテストで たくましさを 発揮した ポケモンに 贈られる 記念リボン",
"cobblemon.mark.ribbon_contest_super_star": "コンテストスターリボン",
"cobblemon.mark.ribbon_contest_super_star.title": "でんせつてきスターの %1$s",
@@ -9243,7 +9243,7 @@
"cobblemon.ui.moves.learnset.tm.discovered": "発見済み",
"cobblemon.ui.moves.level": "レベルアップ",
"cobblemon.ui.moves.egg": "タマゴ技",
"cobblemon.ui.moves.tm": "わざマシン",
"cobblemon.ui.moves.tm": "わざマシン",
"cobblemon.ui.tm_machine.can_learn": "覚えられる",
"cobblemon.ui.tm_machine.cannot_learn": "覚えられない",
"cobblemon.ui.tm_machine.learned": "覚えている",
@@ -9596,5 +9596,42 @@
"cobblemon.config.ui.world_spawning_blocklist": "ワールドごとのスポーンブロックリスト",
"cobblemon.config.ui.world_spawning_blocklist.tooltip": "ポケモンの出現ロジックを無効にするワールド。",
"advancements.cobblemon.obtain_tm": "Show Me Your Moves!",
"advancements.cobblemon.obtain_tm.description": "わざマシンを見つけるか、印刷する"
"advancements.cobblemon.obtain_tm.description": "わざマシンを見つけるか、印刷する",
"itemGroup.cobblemon.tm_item": "Cobblemon:わざマシン",
"block.cobblemon.wistensu": "フジブヨウ",
"block.cobblemon.lobaila": "ミゾグレン",
"block.cobblemon.pauvillea": "フラビリア",
"block.cobblemon.pomohana": "ポンノハナ",
"block.cobblemon.voltaconia": "ボルトコニア",
"block.cobblemon.verdroot": "ミノルート",
"block.cobblemon.lucibell": "サイヴェル",
"block.cobblemon.mistleaf": "ミストリーフ",
"cobblemon.ui.pokedex.info.evolution_tree": "進化の流れ",
"cobblemon.ui.pokedex.evolution.item_interact.tooltip": "%1$sが必要",
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_species": "%1$sとのポケモン交換で進化",
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_any_species": "ポケモン交換で進化",
"cobblemon.ui.pokedex.evolution.shedder.tooltip": "予備のモンスターボールと手持ちの空きが必要",
"cobblemon.ui.pokedex.evolution.or": "または",
"cobblemon.ui.pokedex.evolution.one_of": "以下のいずれか:",
"cobblemon.ui.pokedex.requirement.advancement.tooltip": "プレイヤーが進捗 %1$sを達成している必要あり",
"cobblemon.ui.pokedex.requirement.battle_critical_hits.tooltip": "バトルで%1$s回急所に当てる",
"cobblemon.ui.pokedex.requirement.biome.anticondition.tooltip": "%1$sバイオームでは進化出来ない",
"cobblemon.ui.pokedex.requirement.biome.both.tooltip": "%2$sを除いた%1$sバイオームでのみ進化",
"cobblemon.ui.pokedex.requirement.biome.tooltip": "%1$sバイオームでのみ進化",
"cobblemon.ui.pokedex.requirement.blocks_traveled.tooltip": "%1$sブロック分旅をする",
"cobblemon.ui.pokedex.requirement.damage_taken.tooltip": "バトルで倒れず%1$sダメージ受ける",
"cobblemon.ui.pokedex.requirement.defeat.tooltip": "進化するためにはバトルで%1$sを倒す",
"cobblemon.ui.pokedex.requirement.friendship.tooltip": "なかよし度%1$sが必要",
"cobblemon.ui.pokedex.requirement.has_move.tooltip": "%1$sを覚える必要がある",
"cobblemon.ui.pokedex.requirement.has_move_type.tooltip": "%1$sタイプの技を覚えておく必要がある",
"cobblemon.ui.pokedex.requirement.held_item.tooltip": "%1$sを持っている必要がある",
"cobblemon.ui.pokedex.requirement.level.tooltip.min": "レベル%1$sから進化",
"cobblemon.ui.pokedex.requirement.party_member.tooltip": "レベルが%1$sから%2$sの間で進化",
"cobblemon.ui.pokedex.requirement.pokemon_properties.tooltip": "%1$sでなければいけない",
"cobblemon.ui.pokedex.requirement.properties.and": "%1$s と %2$s",
"cobblemon.ui.pokedex.requirement.level.tooltip.between": "レベルが%1$sから%2$sの間で進化",
"cobblemon.ui.pokedex.requirement.moon_phase.tooltip": "月の満ち欠けが%1$sでなければいけない",
"cobblemon.ui.pokedex.requirement.nature.toxtricity_amped": "性格が§aがんばりや§r、 §aゆうかん§r、 §aいじっぱり§r、 §aやんちゃ§r、 §aすなお§r、 §aわんぱく§r、 §aのうてんき§r、 §aせっかち§r、 §aようき§r、 §aむじゃき§r、 §aうっかりや§r、 §aなまいき§r、 §aきまぐれ§rのどれか",
"cobblemon.ui.pokedex.requirement.nature.toxtricity_low_key": "性格が§aさみしがり§r、 §aずぶとい§r、 §aのんき§r、 §aおくびょう§r、 §aまじめ§r、 §aひかえめ§r、 §aおっとり§r、 §aれいせい§r、 §aてれや§r、 §aおだやか§r、 §a\tおとなしい§r、 §aしんちょう§rのどれか",
"cobblemon.ui.pokedex.requirement.nickname.malamar": "ニックネームを§aDinnerbone§rか§aGrumm§rにする"
}
@@ -9413,5 +9413,114 @@
"cobblemon.ui.pokedex.info.form.tatsugiri-stretchymega": "Mega Tatsugiri Forma Estendida",
"cobblemon.species.tatsugiri-stretchymega.desc": "Usando a energia da Mega Evolução, cria um prato onde repousar, permitindo com que se mova com mobilidade total até mesmo pelo ar.",
"cobblemon.ui.pokedex.info.form.baxcalibur-mega": "Mega Baxcalibur",
"cobblemon.species.baxcalibur-mega.desc": "A lâmina dorsal de Baxcalibur ficou ainda maior graças à Mega Evolução. Esse Pokémon dispara feixes do cabo localizado em seu peito."
"cobblemon.species.baxcalibur-mega.desc": "A lâmina dorsal de Baxcalibur ficou ainda maior graças à Mega Evolução. Esse Pokémon dispara feixes do cabo localizado em seu peito.",
"itemGroup.cobblemon.tm_item": "Cobblemon: Máquinas Técnicas",
"block.cobblemon.pomohana": "Pomohana",
"block.cobblemon.pauvillea": "Pa'uvillea",
"block.cobblemon.lobaila": "Lobaila",
"block.cobblemon.wistensu": "Wistensu",
"block.cobblemon.voltaconia": "Voltaconia",
"block.cobblemon.verdroot": "Verdroot",
"block.cobblemon.lucibell": "Lucibell",
"block.cobblemon.mistleaf": "Mistleaf",
"cobblemon.ui.pokedex.info.evolution_tree": "Árvore Evolutiva",
"cobblemon.ui.pokedex.evolution.item_interact.tooltip": "Precisa do item %1$s para evoluir",
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_species": "Evolui quando trocado segurando %1$s",
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_any_species": "Evolui quando trocado",
"cobblemon.ui.pokedex.evolution.shedder.tooltip": "Também requer uma Pokébola extra e um espaço vazio na equipe",
"cobblemon.ui.pokedex.evolution.or": "OU",
"cobblemon.ui.pokedex.evolution.one_of": "Um de:",
"cobblemon.ui.pokedex.requirement.advancement.tooltip": "Jogador precisa ter a conquista %1$s",
"cobblemon.ui.pokedex.requirement.battle_critical_hits.tooltip": "Precisa acertar %1$s acertos críticos em batalha",
"cobblemon.ui.pokedex.requirement.biome.anticondition.tooltip": "Não pode estar no bioma %1$s",
"cobblemon.ui.pokedex.requirement.biome.both.tooltip": "Precisa estar no bioma %1$s e não no bioma %2$s",
"cobblemon.ui.pokedex.requirement.biome.tooltip": "Precisa estar no bioma %1$s",
"cobblemon.ui.pokedex.requirement.blocks_traveled.tooltip": "Precisa viajar %1$s blocos",
"cobblemon.ui.pokedex.requirement.damage_taken.tooltip": "Precisa receber %1$s de dano em uma batalha sem desmaiar",
"cobblemon.ui.pokedex.requirement.defeat.tooltip": "Precisa derrotar %1$s em batalha para evoluir",
"cobblemon.ui.pokedex.requirement.friendship.tooltip": "Requer no mínimo %1$s de amizade",
"cobblemon.ui.pokedex.requirement.has_move.tooltip": "Precisa conhecer o movimento %1$s",
"cobblemon.ui.pokedex.requirement.has_move_type.tooltip": "Precisa conhecer um movimento do tipo %1$s",
"cobblemon.ui.pokedex.requirement.held_item.tooltip": "Precisa estar segurando %1$s",
"cobblemon.ui.pokedex.requirement.level.tooltip.min": "Evolui ao ultrapassar o nível %1$s",
"cobblemon.ui.pokedex.requirement.level.tooltip.between": "Evoluiu entre os níveis %1$s e %2$s",
"cobblemon.ui.pokedex.requirement.moon_phase.tooltip": "Precisa evoluir na fase %1$s da lua",
"cobblemon.ui.pokedex.requirement.nature.toxtricity_amped": "Precisa ter a natureza §aDestemida§r, §aValente§r, §aRígida§r, §aTeimosa§r, §aDócil§r, §aInquieta§r, §aRelaxada§r, §aApressada§r, §aAlegre§r, §aInguênua§r, §aImprudente§r, §aAtrevida§r, ou §aPeculiar§r",
"cobblemon.ui.pokedex.requirement.nature.toxtricity_low_key": "Precisa ter a natureza §aSolitária§r, §aCorajosa§r, §aDescontraída§r, §aTímida§r, §aSéria§r, §aModesta§r, §aMansa§r, §aQuieta§r, §aAtrapalhada§r, §aCalma§r, §aGentil§r, ou §aCuidadosa§r",
"cobblemon.ui.pokedex.requirement.negate.tooltip": "Não: %1$s",
"cobblemon.ui.pokedex.requirement.nickname.malamar": "Precisa se chamar §aDinnerbone§r ou §aGrumm§r",
"cobblemon.ui.pokedex.requirement.party_member.anticondition.tooltip": "Equipe não pode ter um Pokémon com %1$s",
"cobblemon.ui.pokedex.requirement.party_member.tooltip": "Equipe precisa ter um Pokémon com %1$s",
"cobblemon.ui.pokedex.requirement.pokemon_properties.tooltip": "Precisa estar %1$s",
"cobblemon.ui.pokedex.requirement.properties.and": "%1$s e %2$s",
"cobblemon.ui.pokedex.requirement.properties.custom.cocoon_species": "Casulo %1$s",
"cobblemon.ui.pokedex.requirement.properties.held_item": "Segurando %1$s",
"cobblemon.ui.pokedex.requirement.properties.int_feature": "%1$s %2$s",
"cobblemon.ui.pokedex.requirement.properties.nature": "Natureza %1$s",
"cobblemon.ui.pokedex.requirement.properties.nickname": "Nomeado %1$s",
"cobblemon.ui.pokedex.requirement.properties.type": "Tipo %1$s",
"cobblemon.ui.pokedex.requirement.property_range.tooltip": "Requer %1$s entre %2$s e %3$s",
"cobblemon.ui.pokedex.requirement.recoil.tooltip": "Precisa sofrer %1$s unidades de recuo em batalha",
"cobblemon.ui.pokedex.requirement.stat_compare.tooltip": "Precisa ter seu %1$s acima de %2$s",
"cobblemon.ui.pokedex.requirement.stat_equal.tooltip": "Precisa ter seu %1$s igual ao seu %2$s",
"cobblemon.ui.pokedex.requirement.structure.anticondition.tooltip": "Não pode estar na estrutura %1$s",
"cobblemon.ui.pokedex.requirement.structure.both.tooltip": "Precisa estar na estrutura %1$s e não na estrutura %2$s",
"cobblemon.ui.pokedex.requirement.structure.tooltip": "Precisa estar na estrutura %1$s",
"cobblemon.ui.pokedex.requirement.time_range.tooltip": "Precisa evoluir durante %1$s",
"cobblemon.ui.pokedex.requirement.use_move.tooltip": "Precisa usar o movimento %1$s em batalha",
"cobblemon.ui.pokedex.requirement.weather.tooltip.raining": "Precisa estar na chuva para evoluir",
"cobblemon.ui.pokedex.requirement.weather.tooltip.thundering": "Precisa estar em uma tempestade para evoluir",
"cobblemon.ui.moon_phase.full_moon": "Lua Cheia",
"cobblemon.ui.moon_phase.waning_gibbous": "Crescente Gibosa",
"cobblemon.ui.moon_phase.third_quarter": "Quarto Crescente",
"cobblemon.ui.moon_phase.waning_crescent": "Crescente",
"cobblemon.ui.moon_phase.new_moon": "Lua Nova",
"cobblemon.ui.moon_phase.waxing_crescent": "Minguante",
"cobblemon.ui.moon_phase.first_quarter": "Quarto Minguante",
"cobblemon.ui.moon_phase.waxing_gibbous": "Minguante Gibosa",
"cobblemon.ui.time_range.any": "Qualquer",
"cobblemon.ui.time_range.day": "Dia",
"cobblemon.ui.time_range.night": "Noite",
"cobblemon.ui.time_range.noon": "Meio-dia",
"cobblemon.ui.time_range.midnight": "Meia-noite",
"cobblemon.ui.time_range.dawn": "Alvorecer",
"cobblemon.ui.time_range.dusk": "Entardecer",
"cobblemon.ui.time_range.twilight": "Crepúsculo",
"cobblemon.ui.time_range.morning": "Manhã",
"cobblemon.ui.time_range.afternoon": "Tarde",
"cobblemon.ui.time_range.predawn": "Pré-amanhecer",
"cobblemon.ui.time_range.evening": "Tardinha",
"cobblemon.subtitle.item.bright_powder.use": "Pó Brilhante ilumina",
"cobblemon.config.ui.type_gem_max_connected": "Máximo de Blocos de Gema de Tipo Conectados",
"cobblemon.config.ui.type_gem_min_growth": "Mínimo de Crescimento de Gema de Tipo",
"cobblemon.config.ui.type_gem_growth_chance": "Chance de Crescimento de Gema de Tipo",
"cobblemon.config.ui.type_gem_initial_expansion_cycles": "Cíclos de Expansão Iniciais de Gemas de Tipo",
"cobblemon.battle.activate.ficklebeam": "%1$s vai com tudo neste próximo ataque!",
"tag.item.cobblemon.oricorio_flowers": "Flores de Néctar",
"tag.item.cobblemon.terrain_plants": "Plantas de Terreno",
"tag.item.cobblemon.tall_flowers": "Flores Altas",
"tag.worldgen.biome.cobblemon.evolution.regional.bergmite_hisuibiome": "Hisuiano",
"tag.worldgen.biome.cobblemon.evolution.regional.bergmite_kalosbiome": "Kalosiano",
"tag.worldgen.biome.cobblemon.evolution.regional.cubone_alolabiome": "Alolano",
"tag.worldgen.biome.cobblemon.evolution.regional.cubone_kantobiome": "Kantoniano",
"tag.worldgen.biome.cobblemon.evolution.regional.dartrix_alolabiome": "Alolano",
"tag.worldgen.biome.cobblemon.evolution.regional.dartrix_hisuibiome": "Hisuiano",
"tag.worldgen.biome.cobblemon.evolution.regional.dewott_hisuibiome": "Hisuiano",
"tag.worldgen.biome.cobblemon.evolution.regional.dewott_unovabiome": "Unovano",
"tag.worldgen.biome.cobblemon.evolution.regional.exeggcute_alolabiome": "Alolano",
"tag.worldgen.biome.cobblemon.evolution.regional.exeggcute_kantobiome": "Kantoniano",
"tag.worldgen.biome.cobblemon.evolution.regional.goomy_hisuibiome": "Hisuiano",
"tag.worldgen.biome.cobblemon.evolution.regional.goomy_kalosbiome": "Kalosiano",
"tag.worldgen.biome.cobblemon.evolution.regional.koffing_galarbiome": "Galariano",
"tag.worldgen.biome.cobblemon.evolution.regional.koffing_kantobiome": "Kantoniano",
"tag.worldgen.biome.cobblemon.evolution.regional.mimejr_galarbiome": "Galariano",
"tag.worldgen.biome.cobblemon.evolution.regional.mimejr_sinnohbiome": "Sinnohano",
"tag.worldgen.biome.cobblemon.evolution.regional.petilil_hisuibiome": "Hisuiano",
"tag.worldgen.biome.cobblemon.evolution.regional.petilil_unovabiome": "Unovano",
"tag.worldgen.biome.cobblemon.evolution.regional.pikachu_alolabiome": "Alolano",
"tag.worldgen.biome.cobblemon.evolution.regional.pikachu_kantobiome": "Kantoniano",
"tag.worldgen.biome.cobblemon.evolution.regional.quilava_hisuibiome": "Hisuiano",
"tag.worldgen.biome.cobblemon.evolution.regional.quilava_johtobiome": "Johtoniano",
"tag.worldgen.biome.cobblemon.evolution.regional.rufflet_hisuibiome": "Hisuiano",
"tag.worldgen.biome.cobblemon.evolution.regional.rufflet_unovabiome": "Unovano"
}
@@ -9021,5 +9021,34 @@
"cobblemon.config.ui.world_spawning_blocklist.tooltip": "Миры, в которых отключается принцип появления покемонов.",
"advancements.cobblemon.obtain_tm.description": "Найдите или напечатайте ТМ",
"cobblemon.species.victreebel-mega.desc": "В результате Мега эволюции объём кислоты у этого покемона увеличился, заполняя весь его рот. Если он не будет осторожен, кислота переполнится и выльется наружу.",
"cobblemon.ui.pokedex.info.form.victreebel-mega": "Мега Виктрибелл"
"cobblemon.ui.pokedex.info.form.victreebel-mega": "Мега Виктрибелл",
"itemGroup.cobblemon.tm_item": "Технические машины",
"block.cobblemon.pomohana": "Помохана",
"block.cobblemon.pauvillea": "Па'увилия",
"block.cobblemon.lobaila": "Лобалия",
"block.cobblemon.wistensu": "Вистенсу",
"block.cobblemon.voltaconia": "Вольтакония",
"block.cobblemon.verdroot": "Вердрут",
"block.cobblemon.lucibell": "Люсибель",
"block.cobblemon.mistleaf": "Мистлиф",
"cobblemon.ui.pokedex.info.evolution_tree": "Древо эволюции",
"cobblemon.ui.pokedex.evolution.item_interact.tooltip": "Требуется %1$s для эволюции",
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_species": "Эволюционирует при обмене с %1$s",
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_any_species": "Эволюционирует при обмене",
"cobblemon.ui.pokedex.evolution.shedder.tooltip": "Также требует запасной покебол и свободное место в команде",
"cobblemon.ui.pokedex.evolution.or": "ИЛИ",
"cobblemon.ui.pokedex.evolution.one_of": "Один из:",
"cobblemon.ui.pokedex.requirement.advancement.tooltip": "У игрока должно быть достижение %1$s",
"cobblemon.ui.pokedex.requirement.battle_critical_hits.tooltip": "Должен попасть %1$s критическими ударами в битве",
"cobblemon.ui.pokedex.requirement.biome.anticondition.tooltip": "Не должен быть в %1$s биоме",
"cobblemon.ui.pokedex.requirement.biome.both.tooltip": "Должен быть в %1$s биоме и не в %2$s биоме",
"cobblemon.ui.pokedex.requirement.biome.tooltip": "Должен быть в %1$s биоме",
"cobblemon.ui.pokedex.requirement.blocks_traveled.tooltip": "Должен пройти %1$s блоков",
"cobblemon.ui.pokedex.requirement.damage_taken.tooltip": "Должен получить %1$s урона в битве без поражения",
"cobblemon.ui.pokedex.requirement.defeat.tooltip": "Должен победить против %1$s в битве для эволюции",
"cobblemon.ui.pokedex.requirement.friendship.tooltip": "Требует как минимум %1$s дружбы",
"cobblemon.ui.pokedex.requirement.has_move.tooltip": "Должен знать приём %1$s",
"cobblemon.ui.pokedex.requirement.has_move_type.tooltip": "Должен знать приём %1$s типа",
"cobblemon.ui.pokedex.requirement.held_item.tooltip": "Должен удерживать %1$s",
"cobblemon.ui.pokedex.requirement.level.tooltip.min": "Эволюционирует начиная с %1$s уровня"
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.awesome_badge",
"texture": "cobblemon:textures/gui/mark/mark_alpha.png",
"order": 2
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.awesome_badge2",
"texture": "cobblemon:textures/gui/mark/mark_alpha.png",
"order": 6
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.dummy_badge",
"texture": "cobblemon:textures/gui/mark/mark_gourmand.png",
"order": 1
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.dummy_badge",
"texture": "cobblemon:textures/gui/mark/mark_gourmand.png",
"order": 7
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.funny_badge",
"texture": "cobblemon:textures/gui/mark/mark_destiny.png",
"order": 5
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.funny_badge",
"texture": "cobblemon:textures/gui/mark/mark_destiny.png",
"order": 8
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.interesting_badge",
"texture": "cobblemon:textures/gui/mark/mark_fishing.png",
"order": 4
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.interesting_badge",
"texture": "cobblemon:textures/gui/mark/mark_fishing.png",
"order": 9
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.weird_badge",
"texture": "cobblemon:textures/gui/mark/mark_curry.png",
"order": 3
}
@@ -1,5 +0,0 @@
{
"name": "cobblemon.badge.weird_badge",
"texture": "cobblemon:textures/gui/mark/mark_curry.png",
"order": 10
}
@@ -1,6 +1,6 @@
{
"type": "cobblemon:cooking_pot_shapeless",
"category": "misc",
"category": "medicines",
"ingredients": [
{
"item": "cobblemon:exp_candy_m"
@@ -1,6 +1,6 @@
{
"type": "cobblemon:cooking_pot_shapeless",
"category": "misc",
"category": "medicines",
"ingredients": [
{
"item": "cobblemon:exp_candy_s"
@@ -1,6 +1,6 @@
{
"type": "cobblemon:cooking_pot_shapeless",
"category": "misc",
"category": "medicines",
"ingredients": [
{
"item": "cobblemon:exp_candy_xs"
@@ -1,6 +1,6 @@
{
"type": "cobblemon:cooking_pot_shapeless",
"category": "misc",
"category": "medicines",
"ingredients": [
{
"item": "cobblemon:exp_candy_l"
@@ -1,6 +1,6 @@
{
"type": "cobblemon:cooking_pot_shapeless",
"category": "misc",
"category": "medicines",
"ingredients": [
{
"item": "minecraft:sculk"
-3
View File
@@ -85,9 +85,6 @@ dependencies {
minecraftServerLibraries(libs.icu4j)
// AppleSkin stores api under `api` classifier in their coordinates
// Because of that, we cannot just add it to integrations bundle
modCompileOnly(variantOf(libs.appleskin.api.fabric) { classifier("api") })
}
publishing {
@@ -11,22 +11,27 @@ package com.cobblemon.mod.fabric.mixin;
import com.cobblemon.mod.common.platform.events.PlatformEvents;
import com.cobblemon.mod.common.platform.events.ServerPlayerTickEvent;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ServerPlayer.class)
public class ServerPlayerMixin {
@Mixin(Player.class)
public class PlayerMixin {
@Inject(method = "tick", at = @At("HEAD"))
private void onPreTick(CallbackInfo ci) {
ServerPlayer player = (ServerPlayer)(Object)this;
PlatformEvents.SERVER_PLAYER_TICK_PRE.emit(new ServerPlayerTickEvent.Pre(player));
Player player = (Player)(Object)this;
if (player instanceof ServerPlayer) {
PlatformEvents.SERVER_PLAYER_TICK_PRE.emit(new ServerPlayerTickEvent.Pre((ServerPlayer)player));
}
}
@Inject(method = "tick", at = @At("TAIL"))
private void onPostTick(CallbackInfo ci) {
ServerPlayer player = (ServerPlayer)(Object)this;
PlatformEvents.SERVER_PLAYER_TICK_POST.emit(new ServerPlayerTickEvent.Post(player));
Player player = (Player)(Object)this;
if (player instanceof ServerPlayer) {
PlatformEvents.SERVER_PLAYER_TICK_POST.emit(new ServerPlayerTickEvent.Post((ServerPlayer)player));
}
}
}
@@ -56,7 +56,7 @@ public class RecipeBookCategoriesMixin {
types.add(cobblemon$createCategory("COBBLEMON_COOKING_POT_FOODS", $VALUES.length + 1, new ItemStack(CobblemonItems.LEEK_AND_POTATO_STEW)));
types.add(cobblemon$createCategory("COBBLEMON_COOKING_POT_MEDICINES", $VALUES.length + 2, new ItemStack(CobblemonItems.POTION)));
types.add(cobblemon$createCategory("COBBLEMON_COOKING_POT_COMPLEX_DISHES", $VALUES.length + 3, new ItemStack(CobblemonItems.APRIJUICE_RED)));
types.add(cobblemon$createCategory("COBBLEMON_COOKING_POT_MISC", $VALUES.length + 4, new ItemStack(CobblemonItems.HEALTH_CANDY)));
types.add(cobblemon$createCategory("COBBLEMON_COOKING_POT_MISC", $VALUES.length + 4, new ItemStack(CobblemonItems.PROTEIN)));
$VALUES = types.toArray(RecipeBookCategories[]::new);
}
@@ -37,7 +37,6 @@ import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback
import net.fabricmc.fabric.api.entity.event.v1.EntitySleepEvents
import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents
import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents
import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents
import net.fabricmc.fabric.api.event.player.UseBlockCallback
@@ -176,7 +175,6 @@ object CobblemonFabric : CobblemonImplementation {
ServerPlayConnectionEvents.DISCONNECT.register { handler, server ->
if (!server.isStopped) server.executeIfPossible { PlatformEvents.SERVER_PLAYER_LOGOUT.post(ServerPlayerEvent.Logout(handler.player)) }
}
ServerPlayerEvents.AFTER_RESPAWN.register { oldPlayer, newPlayer, alive -> PlatformEvents.PLAYER_RESPAWN.post(ServerPlayerEvent.Respawn(newPlayer)) }
ServerLivingEntityEvents.ALLOW_DEATH.register { entity, _, _ ->
if (entity is ServerPlayer) {
PlatformEvents.PLAYER_DEATH.postThen(
@@ -1,28 +0,0 @@
/*
* 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.fabric.client.integration.appleskin
import com.cobblemon.mod.common.client.CobblemonClient
import squeek.appleskin.api.AppleSkinApi
import squeek.appleskin.api.event.HUDOverlayEvent
class AppleSkinClientEventHandler: AppleSkinApi {
override fun registerEvents() {
HUDOverlayEvent.Exhaustion.EVENT.register(::checkIsScanning)
HUDOverlayEvent.Saturation.EVENT.register(::checkIsScanning)
HUDOverlayEvent.HealthRestored.EVENT.register(::checkIsScanning)
HUDOverlayEvent.HungerRestored.EVENT.register(::checkIsScanning)
}
private fun checkIsScanning(e: HUDOverlayEvent) {
if (CobblemonClient.pokedexUsageContext.scanningGuiOpen) {
e.isCanceled = true
}
}
}
@@ -33,9 +33,6 @@
],
"modmenu": [
"com.cobblemon.mod.fabric.client.integration.modmenu.CobblemonModMenu"
],
"appleskin": [
"com.cobblemon.mod.fabric.client.integration.appleskin.AppleSkinClientEventHandler"
]
},
"mixins": [
@@ -15,7 +15,7 @@
"EntityMixin",
"FabricBrewingStandMenuMixin",
"FabricSoundEngineMixin",
"ServerPlayerMixin",
"PlayerMixin",
"RecipeBookSettingsMixin",
"RecipeBookTypeMixin",
"ServerEntityMixin"
@@ -37,9 +37,6 @@ repositories {
//JEI
maven("https://maven.blamejared.com/")
maven("https://maven.parchmentmc.org")
// AppleSkin
maven("https://maven.ryanliptak.com/")
}
license {
-3
View File
@@ -16,7 +16,6 @@ moddev = "1.0.11"
# Common
molang = "1.1.20"
jei-api = "19.22.1.316"
appleskin-api = "mc1.21-3.0.5"
# Graal
graal = "22.3.0"
@@ -86,7 +85,6 @@ jei-fabric = { group = "mezz.jei", name = "jei-1.21.1-fabric", version.ref = "je
fabric-debugutils = { group = "maven.modrinth", name = "debugutils", version.ref = "debugutils-fabric"}
mod-menu = { group = "com.terraformersmc", name = "modmenu", version.ref = "mod-menu" }
c2me-fabric = { group = "maven.modrinth", name = "c2me-fabric", version.ref = "c2me-fabric" }
appleskin-api-fabric = { group = "squeek.appleskin", name = "appleskin-fabric", version.ref = "appleskin-api" }
# NeoForge
neoforge-api = { group = "net.neoforged", name = "neoforge", version.ref = "neoforge" }
@@ -94,7 +92,6 @@ neo-kotlin-forge = { group = "thedarkcolour", name = "kotlinforforge-neoforge",
neoforge-debugutils = { group = "maven.modrinth", name = "debugutils", version.ref = "debugutils-forge"}
jei-neoforge = { group = "mezz.jei", name = "jei-1.21.1-neoforge", version.ref = "jei-api"}
c2me-neoforge = { group = "maven.modrinth", name = "c2me-neoforge", version.ref = "c2me-neoforge" }
appleskin-api-neoforge = { group = "squeek.appleskin", name = "appleskin-neoforge", version.ref = "appleskin-api" }
# Data Storage
mongo-driver-core = { group = "org.mongodb", name = "mongodb-driver-core", version.ref = "mongo" }
-3
View File
@@ -68,9 +68,6 @@ dependencies {
bundle(it)
}
// AppleSkin stores api under `api` classifier in their coordinates
// Because of that, we cannot just add it to integrations bundle
modCompileOnly(variantOf(libs.appleskin.api.neoforge) { classifier("api") })
}
tasks {
@@ -34,5 +34,5 @@ object CobblemonEnumExtensions {
Supplier<List<ItemStack>> { listOf(ItemStack(CobblemonItems.APRIJUICE_RED)) as List<ItemStack> })
@JvmField
val COOKING_POT_MISC = EnumProxy(RecipeBookCategories::class.java,
Supplier<List<ItemStack>> { listOf(ItemStack(CobblemonItems.HEALTH_CANDY)) as List<ItemStack> })
Supplier<List<ItemStack>> { listOf(ItemStack(CobblemonItems.PROTEIN)) as List<ItemStack> })
}
@@ -22,7 +22,6 @@ import com.cobblemon.mod.common.item.group.CobblemonItemGroups
import com.cobblemon.mod.common.loot.LootInjector
import com.cobblemon.mod.common.particle.CobblemonParticles
import com.cobblemon.mod.common.sherds.CobblemonSherds
import com.cobblemon.mod.common.util.adapters.RegistryAccessResolver
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.didSleep
import com.cobblemon.mod.common.world.CobblemonStructures
@@ -40,6 +39,7 @@ import com.mojang.brigadier.arguments.ArgumentType
import net.minecraft.commands.synchronization.ArgumentTypeInfo
import net.minecraft.commands.synchronization.ArgumentTypeInfos
import net.minecraft.core.HolderLookup
import net.minecraft.core.RegistryAccess
import net.minecraft.core.registries.Registries
import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation
@@ -63,8 +63,6 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.GameRules
import net.minecraft.world.level.ItemLike
import net.minecraft.world.level.biome.Biome
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.FlowerPotBlock
import net.minecraft.world.level.levelgen.GenerationStep
import net.minecraft.world.level.levelgen.placement.PlacedFeature
import net.neoforged.api.distmarker.Dist
@@ -288,26 +286,7 @@ class CobblemonNeoForge : CobblemonImplementation {
override fun registerBlocks() {
MOD_BUS.addListener<RegisterEvent> { event ->
event.register(CobblemonBlocks.resourceKey) { helper ->
CobblemonBlocks.register { identifier, block ->
if (block !is FlowerPotBlock) helper.register(identifier, block)
}
}
}
MOD_BUS.addListener<RegisterEvent>(EventPriority.LOW) { event ->
// Register the pots after registering main blocks to solve race condition when pottable blocks are still not registered
event.register(CobblemonBlocks.resourceKey) { helper ->
CobblemonBlocks.register { identifier, block ->
if (block is FlowerPotBlock) {
helper.register(identifier, block)
val pottedIdentifier = RegistryAccessResolver.getAccess()
.registryOrThrow(Registries.BLOCK)
.getKeyOrNull(block.potted)!!
(Blocks.FLOWER_POT as FlowerPotBlock).addPlant(pottedIdentifier) { block }
}
}
CobblemonBlocks.register { identifier, block -> helper.register(identifier, block) }
}
}
}
@@ -26,7 +26,6 @@ import com.cobblemon.mod.common.item.PokedexItem
import com.cobblemon.mod.common.particle.CobblemonParticles
import com.cobblemon.mod.common.particle.SnowstormParticleType
import com.cobblemon.mod.common.util.isUsingPokedex
import com.cobblemon.mod.neoforge.client.integration.appleskin.AppleSkinClientEventHandler
import java.util.concurrent.CompletableFuture
import java.util.function.Supplier
import net.minecraft.client.Minecraft
@@ -93,9 +92,7 @@ object CobblemonNeoForgeClient : CobblemonClientImplementation {
event.enqueueWork {
CobblemonClient.initialize(this)
CobblemonModelPredicateRegistry.registerPredicates()
this.attemptClientModCompat()
}
NeoForgeClientPlatformEventHandler.register()
val modContainer = ModList.get().getModContainerById(Cobblemon.MODID).get()
@@ -236,10 +233,4 @@ object CobblemonNeoForgeClient : CobblemonClientImplementation {
}
}
}
private fun attemptClientModCompat() {
if (Cobblemon.implementation.isModInstalled("appleskin")) {
AppleSkinClientEventHandler.register()
}
}
}
@@ -8,13 +8,11 @@
package com.cobblemon.mod.neoforge.client
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.platform.events.ClientEntityEvent
import com.cobblemon.mod.common.platform.events.ClientPlayerEvent
import com.cobblemon.mod.common.platform.events.ClientTickEvent
import com.cobblemon.mod.common.platform.events.PlatformEvents
import com.cobblemon.mod.common.platform.events.RenderEvent
import com.cobblemon.mod.neoforge.client.integration.appleskin.AppleSkinClientEventHandler
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.ClientLevel
import net.neoforged.api.distmarker.Dist
@@ -1,27 +0,0 @@
/*
* 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.neoforge.client.integration.appleskin
import com.cobblemon.mod.common.client.CobblemonClient
import net.neoforged.bus.api.SubscribeEvent
import net.neoforged.neoforge.common.NeoForge
import squeek.appleskin.api.event.HUDOverlayEvent
object AppleSkinClientEventHandler {
fun register() {
NeoForge.EVENT_BUS.register(this)
}
@SubscribeEvent
fun onHudLayerEvent(e: HUDOverlayEvent) {
if (CobblemonClient.pokedexUsageContext.scanningGuiOpen) {
e.isCanceled = true
}
}
}
@@ -24,7 +24,7 @@ import net.neoforged.neoforge.event.server.ServerAboutToStartEvent
import net.neoforged.neoforge.event.server.ServerStartedEvent
import net.neoforged.neoforge.event.server.ServerStoppedEvent
import net.neoforged.neoforge.event.server.ServerStoppingEvent
import net.neoforged.neoforge.event.tick.EntityTickEvent
import net.neoforged.neoforge.event.tick.PlayerTickEvent
object NeoForgePlatformEventHandler {
@@ -53,14 +53,14 @@ object NeoForgePlatformEventHandler {
}
@SubscribeEvent
fun prePlayerTick(e: EntityTickEvent.Pre) {
fun prePlayerTick(e: PlayerTickEvent.Pre) {
if (e.entity is ServerPlayer) {
PlatformEvents.SERVER_PLAYER_TICK_PRE.post(ServerPlayerTickEvent.Pre(e.entity as ServerPlayer))
}
}
@SubscribeEvent
fun postPlayerTick(e: EntityTickEvent.Post) {
fun postPlayerTick(e: PlayerTickEvent.Post) {
if (e.entity is ServerPlayer) {
PlatformEvents.SERVER_PLAYER_TICK_POST.post(ServerPlayerTickEvent.Post(e.entity as ServerPlayer))
}
@@ -98,12 +98,6 @@ object NeoForgePlatformEventHandler {
)
}
@SubscribeEvent
fun onRespawn(e: PlayerEvent.PlayerRespawnEvent) {
val player = e.entity as? ServerPlayer ?: return
PlatformEvents.PLAYER_RESPAWN.post(ServerPlayerEvent.Respawn(player))
}
@SubscribeEvent
fun onRightClickBlock(e: PlayerInteractEvent.RightClickBlock) {
val player = e.entity as? ServerPlayer ?: return