Skip to content

Commit 893e990

Browse files
committed
Adopt target-qualified NeoForge 1.21.11 version
1 parent 7568ca7 commit 893e990

6 files changed

Lines changed: 213 additions & 4 deletions

File tree

‎CHANGELOG.txt‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
Version 4.0.6
1+
Version 4.0.6.121112
22

3+
* Adopt target-qualified four-component versions so Minecraft and loader compatibility can be identified from the mod version.
34
* Preserve generated worlds made with Mineralogy 1.10, 1.12, or 5.x by reading their saved mod metadata and exact legacy configuration before creating the OreSpawn world profile.
45
* Write human-readable, idempotent upgrade reports for legacy OreSpawn and Mineralogy imports while retaining source files and existing chunks unchanged.
56
* Audit automated runtime logs and dynamic-fluid generation so logged worldgen failures cannot pass merely because the process exits normally.

‎docs/AGENTS.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ Use the focused guides for implementation details:
1212
- [BIOMES.md](BIOMES.md) and [DIMENSIONS.md](DIMENSIONS.md) for world integration;
1313
- [TEMPLATES.md](TEMPLATES.md) for selectable world styles;
1414
- [CONFIGURATION.md](CONFIGURATION.md) for configuration behavior;
15+
- [VERSIONS.md](VERSIONS.md) for the shared four-component target-qualified
16+
versioning and branch-release convention;
1517
- [README.md](README.md) for schemas, examples, and the complete documentation index.

‎docs/VERSIONS.md‎

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
# Mod Versioning Policy
2+
3+
This document defines how versions are assigned to MMD mods and how an exact
4+
Minecraft and loader target is encoded in a release version.
5+
6+
## Version format
7+
8+
Mod versions use four numeric components:
9+
10+
```text
11+
Major.Minor.Bug.Target
12+
```
13+
14+
The first three components describe the functional release. For example,
15+
OreSpawn `4.0.6` means major version 4, minor version 0, and bug revision 6.
16+
17+
The fourth component identifies the Minecraft and loader target. A complete
18+
release version such as `4.0.6.120061` therefore identifies both the OreSpawn
19+
4.0.6 feature set and its Minecraft 1.20.6 Forge build.
20+
21+
This is an expanded, Maven-compatible versioning convention. It is not strict
22+
Semantic Versioning 2.0, which defines exactly three numeric core components.
23+
24+
When the Major or Minor component increases, the functional components to its
25+
right reset to zero. The Target component is then appended for the build being
26+
released. For example:
27+
28+
```text
29+
4.0.6.120061 -> 4.1.0.120061
30+
4.1.3.120061 -> 5.0.0.120061
31+
```
32+
33+
## Target component
34+
35+
The Target component is deterministic and is not another feature or bug
36+
sequence number.
37+
38+
To calculate it:
39+
40+
1. Normalize the Minecraft version to `major.minor.patch`, using zero when the
41+
patch component is omitted.
42+
2. Concatenate the Minecraft major number without padding, the minor number as
43+
two digits, the patch number as two digits, and the one-digit loader code.
44+
3. Use loader code `1` for Forge and `2` for NeoForge.
45+
46+
The component can be decoded from right to left: one loader digit, two patch
47+
digits, two minor digits, and all remaining digits for the Minecraft major
48+
version.
49+
50+
Examples:
51+
52+
| Minecraft | Loader | Target | Full OreSpawn 4.0.6 version |
53+
| --- | --- | ---: | --- |
54+
| 1.13.2 | Forge | `113021` | `4.0.6.113021` |
55+
| 1.20.6 | Forge | `120061` | `4.0.6.120061` |
56+
| 1.21.11 | Forge | `121111` | `4.0.6.121111` |
57+
| 1.21.11 | NeoForge | `121112` | `4.0.6.121112` |
58+
| 26.1.2 | Forge | `2601021` | `4.0.6.2601021` |
59+
| 26.1.2 | NeoForge | `2601022` | `4.0.6.2601022` |
60+
| 26.2 | Forge | `2602001` | `4.0.6.2602001` |
61+
| 26.2 | NeoForge | `2602002` | `4.0.6.2602002` |
62+
63+
Historical MMD releases may also have four numeric components but may have used
64+
the fourth component differently. This policy applies prospectively; it does
65+
not reinterpret an old release number.
66+
67+
## Major version
68+
69+
Increase the **Major** number for a large-scale change, paradigm shift, or
70+
breaking change that moves the mod forward in a fundamental way.
71+
72+
Examples include:
73+
74+
- Mineralogy 6 no longer containing its own world generation engine, unlike
75+
Mineralogy 5.
76+
- OreSpawn 4 gaining a complete terrain generation engine, including strata,
77+
unlike OreSpawn 3.
78+
79+
Compatibility adaptations required to support another Minecraft or loader
80+
version do not by themselves require a major version increase when the mod's
81+
supported behaviour and public contracts remain equivalent.
82+
83+
## Minor version
84+
85+
Increase the **Minor** number for a new feature or a significant change to
86+
existing behaviour that does not justify a new major generation.
87+
88+
Examples include:
89+
90+
- adding a new player-usable block or other substantial feature;
91+
- substantially overhauling a world-generation engine;
92+
- making a significant fix or adjustment that materially changes how a major
93+
part of the mod behaves.
94+
95+
## Bug version
96+
97+
Increase the **Bug** number for a bug fix or a very small feature that does not
98+
materially change the mod's design.
99+
100+
Examples include:
101+
102+
- correcting a generation defect;
103+
- fixing a user interface or compatibility problem;
104+
- adding or correcting a language file translation;
105+
- making a small documentation or configuration improvement that warrants a
106+
release.
107+
108+
This component is sometimes called the patch number in other versioning
109+
systems. MMD uses the name **Bug** to make its intended purpose explicit.
110+
111+
## Ports to new Minecraft versions
112+
113+
Porting a mod to a new Minecraft version does not automatically change the
114+
functional `Major.Minor.Bug` version. Functionally equivalent ports share those
115+
first three components, while their complete versions have different Target
116+
components.
117+
118+
For example:
119+
120+
```text
121+
Minecraft 1.21.11 / Forge / OreSpawn 4.0.6.121111
122+
Minecraft 1.21.11 / NeoForge / OreSpawn 4.0.6.121112
123+
Minecraft 26.1.2 / Forge / OreSpawn 4.0.6.2601021
124+
Minecraft 26.1.2 / NeoForge / OreSpawn 4.0.6.2601022
125+
Minecraft 26.2 / Forge / OreSpawn 4.0.6.2602001
126+
Minecraft 26.2 / NeoForge / OreSpawn 4.0.6.2602002
127+
```
128+
129+
Target-specific implementation details may differ internally where Minecraft
130+
or its mod loader requires them. Those adaptations do not change the functional
131+
version when users and integrations receive the same supported behaviour.
132+
133+
If a port also introduces a feature or fix that changes the functional release,
134+
the first three components must be assessed using the Major, Minor, and Bug
135+
rules above. The Target component always identifies the build's actual
136+
Minecraft and loader target.
137+
138+
## Branch-specific fixes and skipped numbers
139+
140+
Functional version numbers are allocated across the mod as a whole and must
141+
not be reused for unrelated change sets on different Minecraft branches. The
142+
same `Major.Minor.Bug` may be shared by functionally equivalent ports.
143+
144+
If a released branch receives a bug fix that other branches do not require,
145+
only the affected branch's Bug number is incremented. For example, Forge
146+
1.13.2 may move from `4.0.6.113021` to `4.0.7.113021` while unaffected branches
147+
remain on their target-qualified 4.0.6 versions.
148+
149+
If a different branch later receives a separate fix, it uses the next unused
150+
Bug number, such as `4.0.8`, even if the `4.0.7` fix was not applicable to it.
151+
A branch may therefore legitimately skip functional version numbers.
152+
153+
This provides three useful guarantees:
154+
155+
1. A functional version is not used to describe two unrelated change sets.
156+
2. A higher functional version identifies a later change in the mod's release
157+
history.
158+
3. The Target component identifies the exact Minecraft and loader build without
159+
overloading the functional version.
160+
161+
A higher functional version on another Minecraft branch does **not**
162+
necessarily mean it contains every lower-numbered branch-specific fix. Some
163+
fixes are relevant only to a particular Minecraft or loader implementation.
164+
165+
## Dependency ranges
166+
167+
Dependencies should normally express the compatible functional release range.
168+
For example, Maven-style range `[4.0.6,5.0.0)` deliberately accepts all
169+
target-qualified OreSpawn 4.0.6 builds while excluding OreSpawn 5.
170+
171+
Consumers must still declare their supported Minecraft version and loader in
172+
their own metadata. The Target component makes that compatibility visible; it
173+
does not replace loader-level compatibility checks.
174+
175+
## Release and pull-request documentation
176+
177+
Because maintained branches can legitimately contain different fixes, the
178+
version number alone is not a substitute for release notes.
179+
180+
Every release and pull request should state:
181+
182+
- the Minecraft version and loader it targets;
183+
- the complete four-component version and its functional `Major.Minor.Bug`;
184+
- the features and fixes actually included;
185+
- any fixes from nearby versions that are not applicable to that branch;
186+
- whether the change is functionally equivalent to another maintained branch;
187+
- any migration, compatibility, or configuration considerations for users.
188+
189+
## Decision summary
190+
191+
When assigning a version, ask the following questions in order:
192+
193+
1. Is this a fundamental or breaking new generation of the mod? Increase
194+
**Major**.
195+
2. Is this a substantial feature or significant behavioural overhaul? Increase
196+
**Minor**.
197+
3. Is this a bug fix or very small feature? Increase **Bug**, using the next
198+
unused number across the mod.
199+
4. Is this only a functionally equivalent Minecraft or loader port? Keep the
200+
existing `Major.Minor.Bug`.
201+
5. Calculate and append the Target component for the exact Minecraft and loader
202+
build.
203+
204+
The objective is to make versions useful to players, pack developers, mod
205+
integrators, release automation, and support teams while allowing each
206+
maintained Minecraft branch to receive only the changes it actually needs.

‎gradle.properties‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ mod_name=MMD OreSpawn
3030
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
3131
mod_license=LGPL-2.1
3232
# The mod version. See https://semver.org/
33-
mod_version=4.0.6
33+
mod_version=4.0.6.121112
3434
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
3535
# This should match the base package used for the mod sources.
3636
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html

‎src/main/java/zone/moddev/mc/orespawn/worldgen/LegacyConfigMigrator.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ private static void writeReport(Path config, List<String> lines) {
358358

359359
private static void writeUpgradeReport(Path config, int imported, List<String> detail) {
360360
List<String> lines = new ArrayList<>();
361-
lines.add("OreSpawn 4.0.6 Upgrade Report");
361+
lines.add("OreSpawn 4.0.6.121112 Upgrade Report");
362362
lines.add("================================");
363363
lines.add("");
364364
lines.add("RESULT: Legacy OreSpawn settings were imported into the OS4 profile.");

‎src/main/java/zone/moddev/mc/orespawn/worldgen/LegacyMineralogyProfileMigration.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ private static void writeUpgradeReport(Path worldRoot, Path configPath,
205205
Path report = worldRoot.resolve("serverconfig/orespawn-upgrade-report.txt");
206206
List<String> missing = missingBlocks(igneous, metamorphic, sedimentary);
207207
List<String> lines = new ArrayList<>();
208-
lines.add("OreSpawn 4.0.6 Upgrade Report");
208+
lines.add("OreSpawn 4.0.6.121112 Upgrade Report");
209209
lines.add("================================");
210210
lines.add("");
211211
lines.add("RESULT: Existing Mineralogy " + identity.version + " world detected.");

0 commit comments

Comments
 (0)