Tags
Creators
Details
Licensed Apache-2.0
Published last month
Updated 2 days ago
All versions
1.3.0+26.x
Release
WyWF 1.3.0+26.xlast month 69
Compatibility
Minecraft: Java Edition
26.2
26.1.x
Platform
Fabric
Supported environments
Singleplayer only
Changes
Added
onlymodifier (only,just,single,только,лишь,одна): accept seeds with exactly one instance of the structure within range. Example:only desert pyramid— exactly one pyramid within ~500 blocks.betweenmodifier (between,mid,middle,от,между,диапазон): structure must be within a specific distance range. Examples:village between 500 to 800,500..800 village,деревня от 500 до 800. Supports separators..,to,do,до.some Ncount:somenow accepts an explicit count. Example:some 4 village— at least 4 villages within ~320 blocks.some village(no number) defaults to at least 2.- Modifier display in search log: Terms now show modifier details:
some 4 minecraft:village,between 500..800 minecraft:village_plains. - Mod Menu + YACL config screen: settings are now accessible via Mod Menu
(config button). Uses YACL for a beautiful categorized UI with sliders,
dropdowns, and toggles. Both Mod Menu and YACL are optional — the mod
works without them (settings via
config/wywf.json). Available settings: query language, thread mode, scan radii, sample step, candidate count, stop-at-first toggle, sort-by-distance toggle. - "Did you mean?" with consonant-skeleton matching: when the query contains misspelled words, the mod suggests corrections by matching consonant skeletons (e.g. "mnsn" → "mansion", "vllg" → "village", "dsert" → "desert"). Shows ALL corrections at once. Works even when ALL words are misspelled.
- ExclusionZone enforcement: structure placements now respect vanilla exclusion zones — a structure whose placement is blocked by a nearby structure from another set is correctly rejected.
- Spawn block prediction improvement: spawn block scanning now covers ±2 chunks (32 blocks) around the origin, matching vanilla's spawn search area, instead of only the origin chunk.
- Sort candidates by distance: when ON, the final candidate is chosen by distance to the nearest structure (closest first), rather than randomly. Default: OFF. Toggle in Mod Menu → Search.
- Time limit: maximum search time before stopping. Default: 30 minutes, minimum: 5 minutes. When reached, a dialog asks whether to use the best candidate found, double the limits and search more, or cancel.
- Max seeds to check: hard limit on seeds evaluated. Default: 10,000,000, minimum: 1,000,000. When reached, same dialog as time limit. Both limits enforce minimums — inputting a lower value snaps to the minimum.
- Implicit biome for structures: when a structure has a unique natural biome and the query doesn't specify one, the biome is auto-added (mansion → dark_forest, desert_pyramid → desert, swamp_hut → swamp, ocean_monument → ocean, village_desert → desert, village_plains → plains, village_taiga → taiga, village_savanna → savanna, village_snowy → snowy_plains, etc.).
- Reverse variant mapping: structure variants (village_desert, village_plains, etc.) now resolve back to their base structure (village) for placement checks. Without this, the prefilter couldn't find the structure in StructureSets and discarded ALL seeds.
Changed
- Distance constants tuned:
near: 200 blocks (was default radius).in: 64 blocks.far: 500–1000 blocks (was ~1000–2000).some: 320 blocks scan radius.only: 500 blocks scan radius.
- NEVER prefilter removed. The structure placement prefilter for
neverwas too aggressive for common structures (villages, etc.) — it mathematically could never reject within the search radius. Full validation handlesnevercorrectly without a prefilter. - SOME/ONLY re-scan uses biome-aware
positions()(not placement-only). BETWEEN still usespositionsPlacementOnly().
Fixed
- NEVER false positives:
never plains villagepreviously accepted seeds with a village within range. Reverted tofirstPositionPlacementOnlywhich correctly resolves structure variants (e.g.village_plains→ all village placements viaminecraft:villageStructure key). - SOME re-scan radius:
structureScanRadiusChunksfor SOME returned the fullsearchRadiusChunks(40 chunks / 640 blocks) instead ofchunks(SOME_BLOCKS)(20 chunks / 320 blocks). Villages at 668+ blocks were incorrectly shown forsome 4 village. - BETWEEN parsing: trailing
500 to 800after a term (likevillage 500 to 800) was not attached. Now retroactively applied to the last term at end-of-loop. - BETWEEN re-scan display: positions outside
[betweenMin, betweenMax]were shown. Now filtered correctly. evalBiomeTermDirectstep: ONLY/BETWEEN biome cases now useeffectiveStep(quartY)for correct underground biome sampling.evalBiomeTermDirectBETWEEN biome bug: now usesBiomeField.nearestDistanceBlocks(key, betweenMin, betweenMax)for correct range matching.splitBetweenWordhelper: handles single-word BETWEEN patterns (500..800,500до800,500to800,500do800).- Thread safety: structure cache race condition.
SeedValidator.structureCacheinner maps were plainHashMapshared across multiple search threads — could causeConcurrentModificationExceptionor corrupted data during concurrent reads. Changed toConcurrentHashMap. - Thread safety:
WorldContext.sampler()non-volatile lazy init. Multiple threads could see a partially-constructedClimate.Samplerobject. Addedvolatile. stopReasonnot reset between searches. If search A finished with a stop reason (e.g. "time limit reached"), search B's completion handler would show the wrong reason. Now cleared instart().- Duplicate implicit biomes.
addImplicitBiomescould add the same biome multiple times if two structures mapped to the same biome (e.g. "ocean monument ocean ruins" → two ocean biome terms). Now tracks already-added biomes. - Dangling modifier applied to wrong word. "near xyz village" — the NEAR modifier was intended for "xyz" (which was ignored), but was incorrectly applied to "village". Now modifiers are reset when a word is ignored.
- All threads named the same. Worker threads were all named
"WYWF-Search-{count}", making them indistinguishable in thread dumps. Now uses anAtomicIntegercounter. - Progress counter drift in linear (biome-only) search.
SearchWorker.runLineardid not incrementglobalSeedCursoron error, causing the progress display to undercount checked seeds.runSplitalready did this correctly. - Duplicate synonym warnings. Removed duplicate structure entries
(
desert_pyramid,jungle_pyramid,swamp_hut,igloo,monument) that shared synonyms with generic entries and caused first-wins warnings at startup. Unique synonyms from removed duplicates were merged into the generic entries. Village variant entries (village_plains, etc.) kept for compound binding. woodlandsynonym conflict. Removed "woodland" from mansion synonyms — it was already claimed by the forest biome entry.- MC lang parser warning. Moved synonym data files from
lang/todata/(assets/wywf/data/en_us.json,ru_ru.json) to prevent Minecraft's resource loader from attempting to parse them as language files (which expected string values, not arrays). UpdatedKeywordDictionaryloader paths. - Empty query handling.
SeedSearcher.start()now firesonFoundwith aSearchResult(primaryDescription=null)when all terms are filtered out (e.g. unsupported biomes/structures for the MC version), instead of silently never completing — the UI no longer gets stuck on "Preparing...". The null description routes toSearchLimitReachedScreeninstead of trying to create a world with seed 0. - Text rendering on MC 26.x.
GuiGraphicsExtractor.text()andcenteredText()checkARGB.alpha(color) == 0and skip the draw. All UI text colors now use0xFFFFFFFF(with alpha byte) instead of0xFFFFFF, which was silently dropped.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:PfzoepP4:uej3IryW"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:PfzoepP4:uej3IryW"
}

