diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d96bb03e7..8ef8ebc496 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,11 +15,14 @@ - White Herb - Negative Effect Cleanse - Milk - Effect Cleanse - Moomoo Milk - Effect Cleanse +- Added `label` as an alternate key to the `tag` property. ### Changes - Ride sounds have been separated into stereo for passengers and mono for other players. Riding will now sound more spacious. +- Added a new config option, `Enable In-Flight Dismounting` (default: off), which lets you dismount while riding a Pokémon in the air. ### Fixes +- Fixed an issue in the OmniPathNodeMaker/Navigation that prevented Combees from pathing into and out of Saccharine leaves. - Fixed orientation not getting reset after crashing while flying and getting back on the Pokémon. - Fixed Furfrou not being trimmable on NeoForge. - Fixed shiny Pokémon not respecting the silent flag on spawn. @@ -36,6 +39,7 @@ - Fixed Soothe Bell not being properly tagged as a held item. - Fixed Mint Leaves not being usable for filling the Resurrection Machine. - Added Saccharine Boats and Saccharine Boat with Chests to relevant boat tags. +- Fixed the `run_script` Molang function to not fail if the environment's context is null. ### Developer - Changed the `owner` parameter in the `OwnerQueryRequirement` interface from `ServerPlayer` to `Player`. This method is now also called on the client to verify whether a Pokémon interaction succeeded, so make sure to update your implementations to handle both server and client contexts. diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/Cobblemon.kt b/common/src/main/kotlin/com/cobblemon/mod/common/Cobblemon.kt index 9ae4dd7fc3..62d02300bc 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/Cobblemon.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/Cobblemon.kt @@ -91,7 +91,7 @@ import com.cobblemon.mod.common.pokemon.feature.SlowpokeTailRegrowthSpeciesFeatu import com.cobblemon.mod.common.pokemon.feature.TagSeasonResolver import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager import com.cobblemon.mod.common.pokemon.properties.* -import com.cobblemon.mod.common.pokemon.properties.tags.PokemonFlagProperty +import com.cobblemon.mod.common.pokemon.properties.LabelProperty import com.cobblemon.mod.common.pokemon.stat.CobblemonStatProvider import com.cobblemon.mod.common.starter.CobblemonStarterHandler import com.cobblemon.mod.common.util.* @@ -316,7 +316,7 @@ object Cobblemon { CustomPokemonProperty.register(UncatchableProperty) CustomPokemonProperty.register(BattleCloneProperty) - CustomPokemonProperty.register(PokemonFlagProperty) + CustomPokemonProperty.register(LabelProperty) CustomPokemonProperty.register(HiddenAbilityPropertyType) CustomPokemonProperty.register(AspectPropertyType) CustomPokemonProperty.register(UnaspectPropertyType) diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/api/molang/MoLangFunctions.kt b/common/src/main/kotlin/com/cobblemon/mod/common/api/molang/MoLangFunctions.kt index b61556b143..e7fdcddc61 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/api/molang/MoLangFunctions.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/api/molang/MoLangFunctions.kt @@ -311,7 +311,7 @@ object MoLangFunctions { runtime.environment.variable = params.environment.variable val args = params.params.subList(1, params.params.size) runtime.environment.context = ContextStruct( - params.environment.context.map + args.mapIndexed { index, value -> "arg_${index + 1}" to value }.toMap() + (params.environment.context?.map ?: emptyMap()) + args.mapIndexed { index, value -> "arg_${index + 1}" to value }.toMap() ) val script = params.getString(0).asIdentifierDefaultingNamespace() // store the args in the diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/ChoiceSpeciesFeatureProvider.kt b/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/ChoiceSpeciesFeatureProvider.kt index 3de46981cb..fd93db10fd 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/ChoiceSpeciesFeatureProvider.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/ChoiceSpeciesFeatureProvider.kt @@ -80,7 +80,9 @@ open class ChoiceSpeciesFeatureProvider( internal constructor(): this(emptyList()) - override fun get(pokemon: Pokemon) = pokemon.getFeature(keys.first()) + override fun get(pokemon: Pokemon): StringSpeciesFeature? { + return pokemon.features.filterIsInstance().find { it.name in keys } + } override fun invoke(pokemon: Pokemon): StringSpeciesFeature? { val existing = get(pokemon) @@ -101,15 +103,15 @@ open class ChoiceSpeciesFeatureProvider( } override fun invoke(nbt: CompoundTag): StringSpeciesFeature? { - return if (nbt.contains(keys.first())) { - StringSpeciesFeature(keys.first(), "").also { it.loadFromNBT(nbt) } - } else null + val key = keys.find { nbt.contains(it) } + if (key == null) return null + return StringSpeciesFeature(key, "").also { it.loadFromNBT(nbt) } } override fun invoke(json: JsonObject): StringSpeciesFeature? { - return if (json.has(keys.first())) { - StringSpeciesFeature(keys.first(), "").also { it.loadFromJSON(json) } - } else null + val key = keys.find { json.has(it) } + if (key == null) return null + return StringSpeciesFeature(key, "").also { it.loadFromJSON(json) } } override fun fromString(value: String?): StringSpeciesFeature? { @@ -131,7 +133,7 @@ open class ChoiceSpeciesFeatureProvider( override fun provide(properties: PokemonProperties): Set { return if (isAspect) { - val feature = properties.customProperties.filterIsInstance().find { it.name == keys.first() } + val feature = properties.customProperties.filterIsInstance().find { it.name in keys } if (feature != null) { setOf(getAspect(feature)) } else { diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/FlagSpeciesFeature.kt b/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/FlagSpeciesFeature.kt index c4c4e71e0c..8cd398489c 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/FlagSpeciesFeature.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/FlagSpeciesFeature.kt @@ -132,7 +132,9 @@ class FlagSpeciesFeatureProvider : SynchronizedSpeciesFeatureProvider(keys.first()) + override fun get(pokemon: Pokemon): FlagSpeciesFeature? { + return pokemon.features.filterIsInstance().find { it.name in keys } + } override fun invoke(pokemon: Pokemon): FlagSpeciesFeature? { return get(pokemon) @@ -144,15 +146,15 @@ class FlagSpeciesFeatureProvider : SynchronizedSpeciesFeatureProvider { - return if (isAspect && pokemon.getFeature(keys.first())?.enabled == true) { - setOf(keys.first()) + return if (isAspect) { + val feature = pokemon.features.filterIsInstance().find { it.name in keys } + if (feature != null && feature.enabled) { + setOf(keys.first()) + } else { + emptySet() + } } else { emptySet() } } override fun provide(properties: PokemonProperties): Set { - return if (isAspect && properties.customProperties.filterIsInstance().find { it.name == keys.first() }?.enabled == true) { - setOf(keys.first()) + return if (isAspect) { + val feature = properties.customProperties.filterIsInstance().find { it.name in keys } + if (feature != null && feature.enabled) { + setOf(keys.first()) + } else { + emptySet() + } } else { emptySet() } diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/IntSpeciesFeature.kt b/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/IntSpeciesFeature.kt index f5e634b054..d97a8236b8 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/IntSpeciesFeature.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/api/pokemon/feature/IntSpeciesFeature.kt @@ -142,19 +142,15 @@ class IntSpeciesFeatureProvider : SynchronizedSpeciesFeatureProvider().find { it.name in keys } diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/client/keybind/keybinds/PartySendBinding.kt b/common/src/main/kotlin/com/cobblemon/mod/common/client/keybind/keybinds/PartySendBinding.kt index d871cb412e..26647b4229 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/client/keybind/keybinds/PartySendBinding.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/client/keybind/keybinds/PartySendBinding.kt @@ -143,18 +143,18 @@ object PartySendBinding : CobblemonBlockingKeyBinding( } private fun canAttemptDismount(player: LocalPlayer, selectedPartyPokemon: Pokemon?): Boolean { - if (player.vehicle !is PokemonEntity) return false - val vehicle = player.vehicle as PokemonEntity - if (player != vehicle.controllingPassenger) { - return true - } + val vehicle = player.vehicle as? PokemonEntity ?: return false + + if (player != vehicle.controllingPassenger) return true + val isAirRide = vehicle.ridingController?.context?.style == RidingStyle.AIR val hasLandRide = vehicle.rideProp.behaviours?.get(RidingStyle.LAND) != null - return if (isAirRide && hasLandRide) { - false - } else { - vehicle.pokemon.uuid == selectedPartyPokemon?.uuid + + if (!Cobblemon.config.enableInFlightDismounting && isAirRide && hasLandRide) { + return false } + + return vehicle.pokemon.uuid == selectedPartyPokemon?.uuid } private fun isRidingPokemon(player: LocalPlayer, ignoreControlling: Boolean = false): Boolean { diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/config/CobblemonConfig.kt b/common/src/main/kotlin/com/cobblemon/mod/common/config/CobblemonConfig.kt index 3fbf46a8bc..71b32e573f 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/config/CobblemonConfig.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/config/CobblemonConfig.kt @@ -362,6 +362,9 @@ class CobblemonConfig { @CobblemonConfigField(Category.Riding, lang = "remember_riding_camera", CLIENT) var rememberRidingCamera = false + @CobblemonConfigField(Category.Riding, lang = "enable_in_flight_dismounting", CLIENT) + var enableInFlightDismounting = false + @CobblemonConfigField(Category.Debug, lang = "enable_debug_keys", CLIENT) var enableDebugKeys = false diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/entity/ai/OmniPathNavigation.kt b/common/src/main/kotlin/com/cobblemon/mod/common/entity/ai/OmniPathNavigation.kt index 1e60e7c204..6a7a58c454 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/entity/ai/OmniPathNavigation.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/entity/ai/OmniPathNavigation.kt @@ -269,9 +269,6 @@ class OmniPathNavigation(val world: Level, val entity: Mob) : GroundPathNavigati // If we can fly and we're airborne, return the current Y position return vec.y } - if (world.getBlockState(blockPos).block == CobblemonBlocks.SACCHARINE_LEAVES && pather.canPathThroughSaccLeaves()) { - return vec.y + 0.5 - } return if ((canFloat()) && blockGetter.getFluidState(blockPos).`is`(FluidTags.WATER)) vec.y + 0.5 else super.getGroundY(vec) } diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/net/serverhandling/riding/DismountPokemonPacketHandler.kt b/common/src/main/kotlin/com/cobblemon/mod/common/net/serverhandling/riding/DismountPokemonPacketHandler.kt index 9f6a0f30f4..ec04d286ff 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/net/serverhandling/riding/DismountPokemonPacketHandler.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/net/serverhandling/riding/DismountPokemonPacketHandler.kt @@ -9,6 +9,7 @@ package com.cobblemon.mod.common.net.serverhandling.riding import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler +import com.cobblemon.mod.common.api.riding.RidingStyle import com.cobblemon.mod.common.entity.pokemon.PokemonEntity import com.cobblemon.mod.common.net.messages.server.riding.DismountPokemonPacket import net.minecraft.server.MinecraftServer @@ -25,12 +26,16 @@ object DismountPokemonPacketHandler : ServerNetworkPacketHandler { - - private const val KEY = "tag" - - override val keys = setOf(KEY) +object LabelProperty : CustomPokemonPropertyType { + override val keys = setOf("label", "tag") override val needsKey = true - override fun fromString(value: String?) = if (value == null) null else StringProperty(KEY, value, { _, _ -> }, { pokemon, underlyingValue -> pokemon.hasLabels(underlyingValue) }) + override fun fromString(value: String?) = if (value == null) null else StringProperty(keys.first(), value, { _, _ -> }, { pokemon, underlyingValue -> pokemon.hasLabels(underlyingValue) }) override fun examples() = emptySet() } \ No newline at end of file diff --git a/common/src/main/resources/assets/cobblemon/lang/en_us.json b/common/src/main/resources/assets/cobblemon/lang/en_us.json index 7e252e71c2..d9015b8d99 100644 --- a/common/src/main/resources/assets/cobblemon/lang/en_us.json +++ b/common/src/main/resources/assets/cobblemon/lang/en_us.json @@ -2637,6 +2637,8 @@ "cobblemon.config.ui.infinite_ride_stamina.tooltip": "Whether rideable Pokémon have infinite stamina.", "cobblemon.config.ui.remember_riding_camera": "Remember Riding Camera", "cobblemon.config.ui.remember_riding_camera.tooltip": "Whether the camera mode will automatically switch to the last used camera mode when mounting a rideable Pokémon.", + "cobblemon.config.ui.enable_in_flight_dismounting": "Enable In-Flight Dismounting", + "cobblemon.config.ui.enable_in_flight_dismounting.tooltip": "Allows players to dismount while riding a Pokémon in the air. When disabled, dismounting is only possible while on the ground.", "cobblemon.config.ui.allow_starter_on_join": "Allow Starter on Join", "cobblemon.config.ui.prompt_starter_once_only": "Prompt Starter Once Only", diff --git a/common/src/main/resources/assets/cobblemon/models/item/pokemon_model.json b/common/src/main/resources/assets/cobblemon/models/item/pokemon_model.json index 7e811ccd83..35421e69d1 100644 --- a/common/src/main/resources/assets/cobblemon/models/item/pokemon_model.json +++ b/common/src/main/resources/assets/cobblemon/models/item/pokemon_model.json @@ -1,4 +1,7 @@ { "parent": "minecraft:builtin/entity", - "gui_light": "side" + "gui_light": "side", + "textures": { + "particle": "cobblemon:item/poke_balls/cherish_ball" + } } \ No newline at end of file