Compare commits

..
7 Commits
Author SHA1 Message Date
Polymeta 570805fdf1 Merge branch 'structure-tags-for-spawning' into 'main'
Structure Spawn Tags

See merge request cable-mc/cobblemon!2508
2026-10-25 16:53:38 +00:00
dhi_holo ddecb08bc7 Edit is_illager_structure.json 2026-10-26 00:21:36 +10:00
Hiroku 4d7cfcdf61 Added q.target_fainted to MoveInstruction 2026-10-25 11:11:52 +10:00
Hiroku e56dd6ef64 snap it back on 2026-10-25 10:43:01 +10:00
dhi_holo b5ac54cd16 Tweaks to prepare for Scrapes 2026-10-21 14:22:17 +10:00
dhi_holo dc703e67f7 Merge branch 'main' into structure-tags-for-spawning 2026-10-21 14:01:10 +10:00
dhi_holo 8e1fcc6f14 Structure Spawn Tags
Feel free to rename, delete, or rework any of these, it's moreso just setting the groundwork

`spawns/is_aquatic_monument` - Ocean Monuments and related structures
`spawns/is_aquatic_ruins` - Ocean Ruins and similar structures
`spawns/is_civilization` - Village and Towns tag, for anything that should spawn at any kind of village/town
`spawns/is_desert_monument` - Desert Pyramids and Temples
`spawns/is_dungeon` - Modded tag, the idea is things of the Stronghold *vibe*, but not being literal strongholds
`spawns/is_end_structure` - End Cities and related structures
`spawns/is_graveyard` - Modded tag, graveyards and crypts
`spawns/is_igloo` - just the vanilla igloo, it's me just wanting stuff in tags where it isn't yet so if some addon wants to give igloos another place they can
`spawns/is_illager_outpost` - small settlements for illagers, such as campsites and other small watchtower-like things
`spawns/is_illager_structure` - Bigger illager structures, the mansion, manors, stuff that has a sense of "infrastructure" I suppose
`spawns/is_jungle_monument` - Jungle Temples and Pyramids
`spawns/is_nether_structure` - is a structure of the Nether
`spawns/is_piglin_structure` - is a structure specifically inhabited by Piglins. Can be used to either add stuff specifically around Piglins, or to prevent things around them
`spawns/is_ruins` - Taking what we have as ruins and just applying that logic to other mods
`spawns/is_shipwreck` - not sure if we use this for spawns, but if we do this can be hooked into, if not then this could be deleted, no hassle, just felt like a logical thing to include. Is related to "surface" shipwrecks, not things like the coves
`spawns/is_witch_structure` - witch structures, like huts, villages, etc. Also added any structures that force black cat spawning, as that's used to reference to witches in the vanilla tags

Mods used within the tags so far:
https://modrinth.com/mod/dungeons-and-taverns (`nova_structures`)
A lot of https://modrinth.com/organization/nuVP8uUG mods (the Yung structure ones, usually starts as `better` and then the structure name)
https://modrinth.com/mod/enderscape
https://modrinth.com/mod/aquamirae
https://modrinth.com/mod/terralith
Will continue to investigate mods to add to these
2026-10-14 17:54:34 +10:00
29 changed files with 448 additions and 169 deletions
+10 -89
View File
@@ -1,107 +1,28 @@
# 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.
### 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.
- 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:
+107
View File
@@ -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
@@ -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())
@@ -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"
]
}
}
@@ -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
}
]
}
@@ -0,0 +1,13 @@
{
"values": [
"minecraft:desert_pyramid",
{
"id": "#nova_structures:desert_ruins",
"required": false
},
{
"id": "#betterdeserttemples:desert_temple",
"required": false
}
]
}
@@ -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
}
]
}
@@ -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
}
]
}
@@ -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"
]
}
@@ -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
}
]
}
@@ -0,0 +1,11 @@
{
"values": [
"#cobblemon:spawns/is_illager_outpost",
"#cobblemon:spawns/is_witch_structure",
"minecraft:mansion",
{
"id": "#nova_structures:illager_structures",
"required": false
}
]
}
@@ -0,0 +1,13 @@
{
"values": [
"minecraft:jungle_pyramid",
{
"id": "#nova_structures:jungle_ruins",
"required": false
},
{
"id": "#betterjungletemples:better_jungle_temples",
"required": false
}
]
}
@@ -0,0 +1,5 @@
{
"values": [
"#minecraft:mineshaft"
]
}
@@ -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
}
]
}
@@ -0,0 +1,13 @@
{
"values": [
"minecraft:monument",
{
"id": "#nova_structures:trident_trial_monument",
"required": false
},
{
"id": "#betteroceanmonuments:better_ocean_monuments",
"required": false
}
]
}
@@ -0,0 +1,5 @@
{
"values": [
"#minecraft:ocean_ruin"
]
}
@@ -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
}
]
}
@@ -0,0 +1,10 @@
{
"values": [
"#minecraft:shipwreck",
"#cobblemon:fishing_boat",
{
"id": "aquamirae:shipwreck",
"required": false
}
]
}
@@ -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
View File
@@ -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