mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-26 00:56:28 -04:00
Compare commits
13
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
384b496d76 | ||
|
|
c9d148ec9c | ||
|
|
e611bf4a77 | ||
|
|
8093822140 | ||
|
|
f695ec15f9 | ||
|
|
1f6c791ce6 | ||
|
|
570805fdf1 | ||
|
|
ddecb08bc7 | ||
|
|
4d7cfcdf61 | ||
|
|
e56dd6ef64 | ||
|
|
b5ac54cd16 | ||
|
|
dc703e67f7 | ||
|
|
8e1fcc6f14 |
+14
-89
@@ -1,107 +1,32 @@
|
||||
# Changelog
|
||||
## [1.8.3 (October 25th, 2026)](#1-8-3)
|
||||
## [1.8.x (MONTH xth, 2026)](#1-8-x)
|
||||
|
||||
### Additions
|
||||
- Added compatability with AppleSkin.
|
||||
|
||||
### New Rideable Pokémon
|
||||
- Vikavolt
|
||||
- Fearow
|
||||
### New rideable Pokémon
|
||||
|
||||
### Particles
|
||||
## New Move Animations
|
||||
- Water Shuriken
|
||||
### Pokémon Added
|
||||
|
||||
### Cries added/updated for the following Pokémon
|
||||
- Hoppip
|
||||
- Skiploom
|
||||
- Jumpluff
|
||||
- Houndour
|
||||
- Houndoom
|
||||
- Wurmple
|
||||
- Silcoon
|
||||
- Beautifly
|
||||
- Cascoon
|
||||
- Dustox
|
||||
- Surskit
|
||||
- Masquerain
|
||||
- Torkoal
|
||||
- Starly
|
||||
- Staravia
|
||||
- Staraptor
|
||||
- Combee
|
||||
- Vespiquen
|
||||
- Dusknoir
|
||||
- Helioptile
|
||||
- Heliolisk
|
||||
- Grubbin
|
||||
- Charjabug
|
||||
- Vikavolt
|
||||
- Applin (updated)
|
||||
- Flapple (updated)
|
||||
- Appletun
|
||||
- Runerigus
|
||||
- Dipplin
|
||||
### Model updates for the following Pokémon
|
||||
|
||||
### Animation updates for the following Pokémon
|
||||
- Vikavolt
|
||||
- Magby
|
||||
- Magmar
|
||||
- Ninetales (+ Alolan)
|
||||
- Spearow
|
||||
- Fearow
|
||||
- Squawkabilly
|
||||
- Mudkip
|
||||
- Marshtomp
|
||||
- Swampert
|
||||
|
||||
### 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.
|
||||
- Removed Dynamic Lights data from the Magmarizer item for consistency with the block.
|
||||
- Added `doPokemonPredation` game rule, which controls aggressiveness of Pokémon with the `hate_entity` brain task defined.
|
||||
- Added `predation_chance` server config value, which controls the possibility of attacking the hated entity found in `hate_entity` brain tasks.
|
||||
- Prehistoric Eroded Pillar generates slightly more frequently.
|
||||
- Togekiss was changed from a jet-style mount to bird-style.
|
||||
- Reworked spawn presets and added structure tags for spawns
|
||||
|
||||
### Fixes
|
||||
- Fixed datapacks with item interaction evolutions that don't specify an item crashing the world on load.
|
||||
- Fixed the Pokédex evolution tree crashing when a datapack's dex entry is missing an evolution's form.
|
||||
- Fixed the Pokédex evolution tree crashing with a stack overflow on evolutions that loop back on themselves.
|
||||
- Fixed the Pokédex evolution tree crashing when looking at a dex that is not part of the "National Dex" aggregate.
|
||||
- Fixed some display names in the Pokédex evolution tree having unintended font colours.
|
||||
- Fixed evolution trees not building properly when a Pokémon has several Pokédex entries for different regions.
|
||||
- Fixed form-changing evolutions sometimes resolving to the source form in the Pokédex evolution tree.
|
||||
- Broken datapack evolutions are now logged and skipped in the Pokédex evolution tree instead of crashing.
|
||||
- Fixed the `alpha` property having no tab completion in commands such as `/pokespawn`, `/pokegive` and `/pokeedit`, and added the missing `dmax_level`, `gmax_factor` and `tradable` aliases to tab completion.
|
||||
- Fixed friendship booster items not being recognised as such.
|
||||
- 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, requiring them to relog.
|
||||
- Fixed a NeoForge bug where none of the Cobblemon plants/berries could be placed into pots.
|
||||
- Fixed party overlay not hiding when the player opens the Pokédex scanner.
|
||||
- Fixed `hate_entity` task focusing on its own entity, therefore enabling deadly warfare between Zangoose and Seviper.
|
||||
- Prehistoric Frozen Pond, Prehistoric Frozen Spike, and Prehistoric Lush Den now actually generate (oops).
|
||||
- Fixed Frogadier floating in its `battle_idle` animation.
|
||||
- Fixed absence or incorrect mergers in spawning conditions, causing the max height/depth of conditions to use the min value instead.
|
||||
- Added stricter riding checks on server side to prevent possible packet forgery when a player tries to ride Pokémon.
|
||||
- Fixed Pokémon cries and animation sounds played from GUIs, such as the starter selection screen and the Pokédex, being tied to the Master volume slider instead of Friendly Creatures.
|
||||
- Fixed Archeops T-posing during its `air_cry` animation.
|
||||
- Fixed blank Cooking Pot recipe book entries and missing tabs on Fabric.
|
||||
- Fixed Minior's "Shields Down" ability not working as intended
|
||||
- Fixed size error with ceiling attached Orb hitbox
|
||||
|
||||
### 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`).
|
||||
- Fixed `q.entity.is_looking_at` result being always `1` for whatever entity passed as the target parameter.
|
||||
- Added hate chance optional parameter to `hate_entity` task. `1.0` will make an entity always attack the target.
|
||||
- Added `q.target_fainted` function to move action effects that checks if any opponents fainted from the move.
|
||||
|
||||
### Particles
|
||||
|
||||
#### New Move Animations
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
- Russian
|
||||
- Japanese
|
||||
- Brazilian Portuguese
|
||||
- Updated translations for:
|
||||
@@ -0,0 +1,107 @@
|
||||
# Changelog
|
||||
## [1.8.3 (October 25th, 2026)](#1-8-3)
|
||||
|
||||
### Additions
|
||||
- Added compatability with AppleSkin.
|
||||
|
||||
### New Rideable Pokémon
|
||||
- Vikavolt
|
||||
- Fearow
|
||||
|
||||
### Particles
|
||||
## New Move Animations
|
||||
- Water Shuriken
|
||||
|
||||
### Cries added/updated for the following Pokémon
|
||||
- Hoppip
|
||||
- Skiploom
|
||||
- Jumpluff
|
||||
- Houndour
|
||||
- Houndoom
|
||||
- Wurmple
|
||||
- Silcoon
|
||||
- Beautifly
|
||||
- Cascoon
|
||||
- Dustox
|
||||
- Surskit
|
||||
- Masquerain
|
||||
- Torkoal
|
||||
- Starly
|
||||
- Staravia
|
||||
- Staraptor
|
||||
- Combee
|
||||
- Vespiquen
|
||||
- Dusknoir
|
||||
- Helioptile
|
||||
- Heliolisk
|
||||
- Grubbin
|
||||
- Charjabug
|
||||
- Vikavolt
|
||||
- Applin (updated)
|
||||
- Flapple (updated)
|
||||
- Appletun
|
||||
- Runerigus
|
||||
- Dipplin
|
||||
|
||||
### Animation updates for the following Pokémon
|
||||
- Vikavolt
|
||||
- Magby
|
||||
- Magmar
|
||||
- Ninetales (+ Alolan)
|
||||
- Spearow
|
||||
- Fearow
|
||||
- Squawkabilly
|
||||
- Mudkip
|
||||
- Marshtomp
|
||||
- Swampert
|
||||
|
||||
### 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.
|
||||
- Removed Dynamic Lights data from the Magmarizer item for consistency with the block.
|
||||
- Added `doPokemonPredation` game rule, which controls aggressiveness of Pokémon with the `hate_entity` brain task defined.
|
||||
- Added `predation_chance` server config value, which controls the possibility of attacking the hated entity found in `hate_entity` brain tasks.
|
||||
- Prehistoric Eroded Pillar generates slightly more frequently.
|
||||
- Togekiss was changed from a jet-style mount to bird-style.
|
||||
|
||||
### Fixes
|
||||
- Fixed datapacks with item interaction evolutions that don't specify an item crashing the world on load.
|
||||
- Fixed the Pokédex evolution tree crashing when a datapack's dex entry is missing an evolution's form.
|
||||
- Fixed the Pokédex evolution tree crashing with a stack overflow on evolutions that loop back on themselves.
|
||||
- Fixed the Pokédex evolution tree crashing when looking at a dex that is not part of the "National Dex" aggregate.
|
||||
- Fixed some display names in the Pokédex evolution tree having unintended font colours.
|
||||
- Fixed evolution trees not building properly when a Pokémon has several Pokédex entries for different regions.
|
||||
- Fixed form-changing evolutions sometimes resolving to the source form in the Pokédex evolution tree.
|
||||
- Broken datapack evolutions are now logged and skipped in the Pokédex evolution tree instead of crashing.
|
||||
- Fixed the `alpha` property having no tab completion in commands such as `/pokespawn`, `/pokegive` and `/pokeedit`, and added the missing `dmax_level`, `gmax_factor` and `tradable` aliases to tab completion.
|
||||
- Fixed friendship booster items not being recognised as such.
|
||||
- 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, requiring them to relog.
|
||||
- Fixed a NeoForge bug where none of the Cobblemon plants/berries could be placed into pots.
|
||||
- Fixed party overlay not hiding when the player opens the Pokédex scanner.
|
||||
- Fixed `hate_entity` task focusing on its own entity, therefore enabling deadly warfare between Zangoose and Seviper.
|
||||
- Prehistoric Frozen Pond, Prehistoric Frozen Spike, and Prehistoric Lush Den now actually generate (oops).
|
||||
- Fixed Frogadier floating in its `battle_idle` animation.
|
||||
- Fixed absence or incorrect mergers in spawning conditions, causing the max height/depth of conditions to use the min value instead.
|
||||
- Added stricter riding checks on server side to prevent possible packet forgery when a player tries to ride Pokémon.
|
||||
- Fixed Pokémon cries and animation sounds played from GUIs, such as the starter selection screen and the Pokédex, being tied to the Master volume slider instead of Friendly Creatures.
|
||||
- Fixed Archeops T-posing during its `air_cry` animation.
|
||||
|
||||
### 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`).
|
||||
- Fixed `q.entity.is_looking_at` result being always `1` for whatever entity passed as the target parameter.
|
||||
- Added hate chance optional parameter to `hate_entity` task. `1.0` will make an entity always attack the target.
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
- Russian
|
||||
- Japanese
|
||||
- Brazilian Portuguese
|
||||
+1
-1
@@ -69,7 +69,7 @@ public abstract class ClientRecipeBookMixin {
|
||||
value = "INVOKE",
|
||||
target = "Lcom/google/common/collect/ImmutableMap;copyOf(Ljava/util/Map;)Lcom/google/common/collect/ImmutableMap;"
|
||||
))
|
||||
private void addCustomAggregateCategories(Iterable<RecipeHolder<?>> recipes, RegistryAccess registryAccess, CallbackInfo ci, @Local(name = "map2") Map<RecipeBookCategories, List<RecipeCollection>> map2) {
|
||||
private void addCustomAggregateCategories(Iterable<RecipeHolder<?>> recipes, RegistryAccess registryAccess, CallbackInfo ci, @Local(ordinal = 1) Map<RecipeBookCategories, List<RecipeCollection>> map2) {
|
||||
CobblemonRecipeCategories.Companion.getCustomAggregateCategories().forEach((recipeBookCategories, list) -> map2.put(recipeBookCategories, (List) list.stream().flatMap((recipeBookCategoriesx) -> ((List) map2.getOrDefault(recipeBookCategoriesx, ImmutableList.of())).stream()).collect(ImmutableList.toImmutableList())));
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -20,14 +20,14 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||
|
||||
@Mixin(RecipeBookComponent.class)
|
||||
public class RecipeBookComponentMixin {
|
||||
@Definition(id = "recipeBookCategories", local = @Local(name = "recipeBookCategories"))
|
||||
@Definition(id = "recipeBookCategories", local = @Local(type = RecipeBookCategories.class))
|
||||
@Definition(id = "FURNACE_SEARCH", field = "Lnet/minecraft/client/RecipeBookCategories;FURNACE_SEARCH:Lnet/minecraft/client/RecipeBookCategories;")
|
||||
@Expression("recipeBookCategories != FURNACE_SEARCH")
|
||||
@ModifyExpressionValue(
|
||||
method = "updateTabs",
|
||||
at = @At(value = "MIXINEXTRAS:EXPRESSION")
|
||||
)
|
||||
private boolean notCookingPotSearch(boolean original, @Local(name = "recipeBookCategories") RecipeBookCategories recipeBookCategories) {
|
||||
private boolean notCookingPotSearch(boolean original, @Local RecipeBookCategories recipeBookCategories) {
|
||||
return original && recipeBookCategories != CobblemonRecipeCategories.COOKING_POT_SEARCH.toVanillaCategory();
|
||||
}
|
||||
}
|
||||
@@ -239,6 +239,10 @@ open class PokemonBattle(
|
||||
}
|
||||
|
||||
fun writeShowdownAction(vararg messages: String) {
|
||||
if (messages.any { it.contains("\n") || it.contains("\r") }) {
|
||||
LOGGER.warn("Refusing to forward Showdown action with an embedded line break for battle {}: {}", battleId, messages.joinToString(" | "))
|
||||
return
|
||||
}
|
||||
log(messages.joinToString("\n"))
|
||||
ShowdownService.service.send(battleId, messages.toList().toTypedArray())
|
||||
}
|
||||
|
||||
@@ -117,6 +117,9 @@ abstract class ShowdownActionResponse(val type: ShowdownActionResponseType) {
|
||||
|
||||
data class MoveActionResponse(var moveName: String, var targetPnx: String? = null, var gimmickID: String? = null): ShowdownActionResponse(ShowdownActionResponseType.MOVE) {
|
||||
override fun isValid(activeBattlePokemon: ActiveBattlePokemon, showdownMoveSet: ShowdownMoveset?, forceSwitch: Boolean): Boolean {
|
||||
// Ensure that the gimmick ID the player is sending is valid
|
||||
gimmickID?.let { if (it !in VALID_GIMMICK_IDS) return false }
|
||||
|
||||
if (forceSwitch || showdownMoveSet == null) {
|
||||
return false
|
||||
}
|
||||
@@ -168,6 +171,10 @@ data class MoveActionResponse(var moveName: String, var targetPnx: String? = nul
|
||||
gimmickID = buffer.readNullable { buffer.readString() }
|
||||
return this
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val VALID_GIMMICK_IDS = ShowdownMoveset.Gimmick.entries.map { it.id }.toSet()
|
||||
}
|
||||
}
|
||||
|
||||
data class HealItemActionResponse(var item: String) : ShowdownActionResponse(ShowdownActionResponseType.FORCE_PASS) {
|
||||
@@ -183,7 +190,8 @@ data class HealItemActionResponse(var item: String) : ShowdownActionResponse(Sho
|
||||
}
|
||||
|
||||
override fun isValid(activeBattlePokemon: ActiveBattlePokemon, showdownMoveSet: ShowdownMoveset?, forceSwitch: Boolean): Boolean {
|
||||
return !forceSwitch
|
||||
// Previously checked for !forceSwitch, excepts in the case of a forceSwitch, this couldn't legally be sent anyway.
|
||||
return false
|
||||
}
|
||||
|
||||
override fun toShowdownString(activeBattlePokemon: ActiveBattlePokemon, showdownMoveSet: ShowdownMoveset?): String {
|
||||
|
||||
+11
-2
@@ -37,7 +37,6 @@ import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||
import com.cobblemon.mod.common.util.battleLang
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import java.util.concurrent.CompletableFuture
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
|
||||
/**
|
||||
* Format: |move|POKEMON|MOVE|TARGET
|
||||
@@ -77,7 +76,7 @@ class MoveInstruction(
|
||||
val pokemonName = userPokemon.getName()
|
||||
ShowdownInterpreter.lastCauser[battle.battleId] = message
|
||||
// For Spread targets the message data only gives the pnx strings. So we can't know what pokemon are actually targeted until the previous messages have been interpreted
|
||||
val spreadTargetPokemon = spreadTargets.map { battle.activePokemon.firstOrNull() { poke -> poke.getPNX() == it }?.battlePokemon }
|
||||
val spreadTargetPokemon = spreadTargets.map { battle.activePokemon.firstOrNull { poke -> poke.getPNX() == it }?.battlePokemon }
|
||||
|
||||
val targetPokemonEntity = targetPokemon?.entity
|
||||
if (targetPokemonEntity != null) {
|
||||
@@ -137,10 +136,20 @@ class MoveInstruction(
|
||||
|
||||
val subsequentInstructions = instructionSet.findInstructionsCausedBy(this)
|
||||
val missedTargets = subsequentInstructions.filterIsInstance<MissInstruction>().mapNotNull { it.target }
|
||||
val faintedTargets = subsequentInstructions.filterIsInstance<FaintInstruction>().map { it.faintingPokemon }
|
||||
val failed = subsequentInstructions.any { it is FailInstruction }
|
||||
val failedTargets = subsequentInstructions.filterIsInstance<FailInstruction>().mapNotNull { it.target }
|
||||
val hitCountInstruction = subsequentInstructions.filterIsInstance<HitCountInstruction>().firstOrNull()
|
||||
|
||||
runtime.environment.query.addFunction("target_fainted") { params ->
|
||||
if (params.params.size == 0) {
|
||||
return@addFunction DoubleValue(faintedTargets.isNotEmpty())
|
||||
} else {
|
||||
val entityUUID = params.getString(0)
|
||||
return@addFunction DoubleValue(faintedTargets.any { it.entity?.stringUUID == entityUUID })
|
||||
}
|
||||
}
|
||||
|
||||
runtime.environment.query.addFunction("missed") { params ->
|
||||
if (params.params.size == 0) {
|
||||
return@addFunction DoubleValue(missedTargets.isNotEmpty())
|
||||
|
||||
@@ -30,7 +30,7 @@ class OrbBlock(properties: Properties) : SixFaceRotationalBlock(properties) {
|
||||
|
||||
val FLOOR_NORTH = Shapes.box(0.3125, 0.0, 0.3125, 0.6875, 0.375, 0.6875)
|
||||
val WALL_NORTH = Shapes.box(0.3125, 0.3125, 0.625, 0.6875, 0.6875, 1.0)
|
||||
val CEILING_NORTH = Shapes.box(0.3125, 0.625, 0.375, 0.6875, 1.0, 0.6875)
|
||||
val CEILING_NORTH = Shapes.box(0.3125, 0.625, 0.3125, 0.6875, 1.0, 0.6875)
|
||||
}
|
||||
|
||||
init {
|
||||
|
||||
+24
@@ -8,9 +8,12 @@
|
||||
|
||||
package com.cobblemon.mod.common.net.serverhandling.battle
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.api.text.red
|
||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||
import com.cobblemon.mod.common.battles.HealItemActionResponse
|
||||
import com.cobblemon.mod.common.battles.MoveActionResponse
|
||||
import com.cobblemon.mod.common.exception.IllegalActionChoiceException
|
||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMakeChoicePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleQueueRequestPacket
|
||||
@@ -25,6 +28,27 @@ object BattleSelectActionsHandler : ServerNetworkPacketHandler<BattleSelectActio
|
||||
if (!actor.mustChoose) {
|
||||
return
|
||||
}
|
||||
|
||||
// Battle command injection attempt detection
|
||||
packet.showdownActionResponses.asSequence()
|
||||
.flatMap {
|
||||
when (it) {
|
||||
is MoveActionResponse -> sequenceOf(it.moveName, it.targetPnx, it.gimmickID)
|
||||
is HealItemActionResponse -> sequenceOf(it.item)
|
||||
else -> emptySequence()
|
||||
}
|
||||
}
|
||||
.filterNotNull()
|
||||
.firstOrNull { field -> field.any(Char::isISOControl) }
|
||||
?.let {
|
||||
// Escapes control chars as \uXXXX to prevent forging logs.
|
||||
val printable = it.replace(Regex("\\p{Cc}")) { "\\u%04x".format(it.value[0].code) }
|
||||
Cobblemon.LOGGER.warn("Blocked battle command injection from ${player.name.string}: $printable")
|
||||
actor.sendUpdate(BattleQueueRequestPacket(actor.request!!))
|
||||
actor.sendUpdate(BattleMakeChoicePacket())
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
actor.setActionResponses(packet.showdownActionResponses)
|
||||
} catch (e: IllegalActionChoiceException) {
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"showdownVersion": 18
|
||||
"showdownVersion": 19
|
||||
}
|
||||
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"condition": {
|
||||
"minY": 62,
|
||||
"minY": 48,
|
||||
"neededBaseBlocks": [
|
||||
"minecraft:sandstone"
|
||||
],
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"condition": {
|
||||
"structures": [
|
||||
"minecraft:end_city"
|
||||
],
|
||||
"neededBaseBlocks": [
|
||||
"minecraft:end_stone_bricks",
|
||||
"minecraft:purpur_block",
|
||||
"minecraft:purpur_pillar"
|
||||
],
|
||||
"neededNearbyBlocks": [
|
||||
"#cobblemon:end_city_blocks"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"condition": {
|
||||
"structures": [
|
||||
"minecraft:pillager_outpost",
|
||||
"minecraft:swamp_hut",
|
||||
"minecraft:mansion"
|
||||
],
|
||||
"minY": 62
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"condition": {
|
||||
"minY": 62,
|
||||
"minY": 48,
|
||||
"neededBaseBlocks": [
|
||||
"minecraft:cobblestone",
|
||||
"minecraft:mossy_cobblestone"
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"condition": {
|
||||
"structures": [
|
||||
"minecraft:bastion_remnant",
|
||||
"minecraft:fortress"
|
||||
],
|
||||
"neededBaseBlocks": [
|
||||
"minecraft:chiseled_polished_blackstone",
|
||||
"minecraft:cracked_polished_blackstone_bricks",
|
||||
"minecraft:gilded_blackstone",
|
||||
"minecraft:nether_bricks",
|
||||
"minecraft:polished_basalt",
|
||||
"minecraft:polished_blackstone_bricks"
|
||||
],
|
||||
"neededNearbyBlocks": [
|
||||
"#cobblemon:nether_structure_blocks"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"condition": {
|
||||
"structures": [
|
||||
"minecraft:monument"
|
||||
],
|
||||
"maxY": 62
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"condition": {
|
||||
"structures": [
|
||||
"#minecraft:ocean_ruin"
|
||||
],
|
||||
"maxY": 62,
|
||||
"neededNearbyBlocks": [
|
||||
"#cobblemon:ocean_ruin_blocks"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"condition": {
|
||||
"structures": [
|
||||
"minecraft:pillager_outpost"
|
||||
],
|
||||
"minY": 62,
|
||||
"neededNearbyBlocks": [
|
||||
"#cobblemon:pillager_outpost_blocks"
|
||||
]
|
||||
}
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"values": [
|
||||
"#minecraft:village",
|
||||
{
|
||||
"id": "nova_structures:village_birch",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:village_jungle",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:village_swamp",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "#terralith:fortified_villages",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"values": [
|
||||
"minecraft:desert_pyramid",
|
||||
{
|
||||
"id": "#nova_structures:desert_ruins",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "#betterdeserttemples:desert_temple",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"values": [
|
||||
{
|
||||
"id": "nova_structures:bunker",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:creeping_crypt",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:undead_crypt",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "#betterdungeons:better_dungeons",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"values": [
|
||||
"minecraft:end_city",
|
||||
{
|
||||
"id": "#nova_structures:end_castle",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:creeping_crypt",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "enderscape:end_city",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"values": [
|
||||
{
|
||||
"id": "nova_structures:remnant_graveyard",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_birch_graveyard",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:creeping_crypt",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:undead_crypt",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"values": [
|
||||
"minecraft:igloo"
|
||||
]
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"values": [
|
||||
"minecraft:pillager_outpost",
|
||||
{
|
||||
"id": "nova_structures:illager_camp",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:tavern_dark_oak",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:well_dark_oak",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:firewatch_tower_dark_oak",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"values": [
|
||||
"#cobblemon:spawns/is_illager_outpost",
|
||||
"#cobblemon:spawns/is_witch_structure",
|
||||
"minecraft:mansion",
|
||||
{
|
||||
"id": "#nova_structures:illager_structures",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"values": [
|
||||
"minecraft:jungle_pyramid",
|
||||
{
|
||||
"id": "#nova_structures:jungle_ruins",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "#betterjungletemples:better_jungle_temples",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"values": [
|
||||
"#minecraft:mineshaft"
|
||||
]
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"values": [
|
||||
"#cobblemon:spawns/is_piglin_structure",
|
||||
"minecraft:fortress",
|
||||
{
|
||||
"id": "#nova_structures:nether_skeleton_structures",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "#betterfortresses:better_fortresses",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"values": [
|
||||
"minecraft:monument",
|
||||
{
|
||||
"id": "#nova_structures:trident_trial_monument",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "#betteroceanmonuments:better_ocean_monuments",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"values": [
|
||||
"#minecraft:ocean_ruin"
|
||||
]
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"values": [
|
||||
"minecraft:bastion_remnant",
|
||||
{
|
||||
"id": "#nova_structures:piglin_structures",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"values": [
|
||||
"#cobblemon:ruin",
|
||||
{
|
||||
"id": "nova_structures:remnant_bee_keeper",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_big_remnant",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_big_remnant_2",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_big_remnant_3",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_medium_remnant",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_medium_remnant_2",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_bridge_remnant",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_bunny_base",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_desert_remnant",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_forest_smith",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_miner_hut",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_ruin_farmer",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_ruin_smith",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_sawmill",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_school_remnant",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_taiga_castle",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_zombie_horse_ranch",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_classic_village",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "#nova_structures:ruin_town",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:wild_ruin",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"values": [
|
||||
"#minecraft:shipwreck",
|
||||
"#cobblemon:fishing_boat",
|
||||
{
|
||||
"id": "aquamirae:shipwreck",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"values": [
|
||||
"minecraft:swamp_hut",
|
||||
"#minecraft:cats_spawn_as_black",
|
||||
{
|
||||
"id": "#nova_structures:witch_villa",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:tavern_mangrove",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:tavern_swamp",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:village_swamp",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:firewatch_tower_swamp",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "nova_structures:remnant_ominous_shop",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "betterwitchhuts:witch_hut",
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+2
-2
@@ -14,7 +14,7 @@ parchment_version = 2024.07.28@zip
|
||||
java_version = 21
|
||||
|
||||
mod_id=cobblemon
|
||||
mod_version=1.8.3
|
||||
snapshot=false
|
||||
mod_version=1.8.4
|
||||
snapshot=true
|
||||
|
||||
fabric.loom.multiProjectOptimisation=false
|
||||
Reference in New Issue
Block a user