Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
222 commits
Select commit Hold shift + click to select a range
a520342
Move ContentRegistry into the common module
jaymar921 Oct 29, 2026
7b3ae69
Move Definition into the common module
jaymar921 Oct 29, 2026
16fbe75
Move DefinitionReader into the common module
jaymar921 Oct 29, 2026
0461cdc
Move DefinitionValues into the common module
jaymar921 Oct 29, 2026
f3cd56a
Move InvalidDefinitionException into the common module
jaymar921 Oct 29, 2026
c69887e
Move LegacyImporter into the common module
jaymar921 Oct 29, 2026
0f3b2bf
Move Vector3 into the common module
jaymar921 Oct 29, 2026
963b256
Move AircraftDefinition into the common module
jaymar921 Oct 29, 2026
cacb666
Move BoundingBoxDefinition into the common module
jaymar921 Oct 29, 2026
e32f158
Move CameraPosition into the common module
jaymar921 Oct 29, 2026
ef04dba
Move HelicopterDefinition into the common module
jaymar921 Oct 29, 2026
4fea197
Move PlaneDefinition into the common module
jaymar921 Oct 29, 2026
d0be219
Move RackDefinition into the common module
jaymar921 Oct 29, 2026
e33539e
Move RideRack into the common module
jaymar921 Oct 29, 2026
8d6117d
Move RotorDefinition into the common module
jaymar921 Oct 29, 2026
0dfa3cd
Move SeatDefinition into the common module
jaymar921 Oct 29, 2026
660a771
Move TankDefinition into the common module
jaymar921 Oct 29, 2026
fd49fbd
Move VehicleDefinition into the common module
jaymar921 Oct 29, 2026
7d9c6ab
Move WeaponGroup into the common module
jaymar921 Oct 29, 2026
3178b8f
Move WeaponMount into the common module
jaymar921 Oct 29, 2026
2230a17
Move CameraPart into the common module
jaymar921 Oct 29, 2026
b4c52d4
Move CrawlerTrack into the common module
jaymar921 Oct 29, 2026
eccf424
Move LandingGearPart into the common module
jaymar921 Oct 29, 2026
3832f34
Move MovingPart into the common module
jaymar921 Oct 29, 2026
25a6ce9
Move PropellerPart into the common module
jaymar921 Oct 29, 2026
8afbd78
Move RotatingPart into the common module
jaymar921 Oct 29, 2026
6fc8da3
Move ThrottlePart into the common module
jaymar921 Oct 29, 2026
a414e6e
Move TrackRoller into the common module
jaymar921 Oct 29, 2026
48cec89
Move VehiclePart into the common module
jaymar921 Oct 29, 2026
82c09b9
Move WeaponBayPart into the common module
jaymar921 Oct 29, 2026
f5ac320
Move WeaponPart into the common module
jaymar921 Oct 29, 2026
d367310
Move WheelPart into the common module
jaymar921 Oct 29, 2026
91ce384
Move WingPart into the common module
jaymar921 Oct 29, 2026
a2a032a
Move InvalidRecipeException into the common module
jaymar921 Oct 29, 2026
92e3f47
Move LegacyItems into the common module
jaymar921 Oct 29, 2026
3b1c3f7
Move LegacyRecipe into the common module
jaymar921 Oct 29, 2026
5943e71
Move Cartridge into the common module
jaymar921 Oct 29, 2026
057fd0c
Move MuzzleFlash into the common module
jaymar921 Oct 29, 2026
ba6e4b2
Move RoundItem into the common module
jaymar921 Oct 29, 2026
d63ad21
Move WeaponColor into the common module
jaymar921 Oct 29, 2026
38574bb
Move WeaponDefinition into the common module
jaymar921 Oct 29, 2026
6867500
Move WeaponType into the common module
jaymar921 Oct 29, 2026
693d81b
Move Expression into the common module
jaymar921 Oct 29, 2026
1dcab3d
Move HudCommand into the common module
jaymar921 Oct 29, 2026
4a5871b
Move HudFormatException into the common module
jaymar921 Oct 29, 2026
640933b
Move HudScript into the common module
jaymar921 Oct 29, 2026
a07203b
Move HudVariable into the common module
jaymar921 Oct 29, 2026
27e32e7
Move TextArg into the common module
jaymar921 Oct 29, 2026
0de4875
Move Mesh into the common module
jaymar921 Oct 29, 2026
6145afa
Move MeshGroup into the common module
jaymar921 Oct 29, 2026
0bc10fe
Move MeshLoader into the common module
jaymar921 Oct 29, 2026
1c51115
Move ModelFormatException into the common module
jaymar921 Oct 29, 2026
534f395
Move MqoLoader into the common module
jaymar921 Oct 29, 2026
b2ed78e
Move ObjLoader into the common module
jaymar921 Oct 29, 2026
d086ac0
Move TriangleBuilder into the common module
jaymar921 Oct 29, 2026
93df8a4
Move AircraftRotation into the common module
jaymar921 Oct 29, 2026
15c55da
Move GroundImpact into the common module
jaymar921 Oct 29, 2026
dc84f39
Move the lang file en_us.json into the common module
jaymar921 Oct 29, 2026
19128de
Move the lang file ja_jp.json into the common module
jaymar921 Oct 29, 2026
1dd52ec
Move TestResources into the common module
jaymar921 Oct 29, 2026
aab4fc6
Move HelicopterDefinitionTest into the common module
jaymar921 Oct 29, 2026
16db792
Move LegacyImporterTest into the common module
jaymar921 Oct 29, 2026
cda1b06
Move RecipeDataTest into the common module
jaymar921 Oct 29, 2026
ce4de41
Move VehicleKindsTest into the common module
jaymar921 Oct 29, 2026
b47aeea
Move WeaponDefinitionTest into the common module
jaymar921 Oct 29, 2026
25bc227
Move ExpressionTest into the common module
jaymar921 Oct 29, 2026
f7a600a
Move HudScriptTest into the common module
jaymar921 Oct 29, 2026
1d68bbe
Move MeshLoaderTest into the common module
jaymar921 Oct 29, 2026
a9f91b7
Move PartModelTest into the common module
jaymar921 Oct 29, 2026
44c650c
Move AircraftRotationTest into the common module
jaymar921 Oct 29, 2026
451efb4
Move GroundImpactTest into the common module
jaymar921 Oct 29, 2026
5b1b32a
Move the Forge build script into the forge-26.3 module
jaymar921 Oct 29, 2026
ff2ec7e
Move LegacyContent into the forge-26.3 module
jaymar921 Oct 29, 2026
abd4eed
Move MCHeli into the forge-26.3 module
jaymar921 Oct 29, 2026
c9ed791
Move ModSounds into the forge-26.3 module
jaymar921 Oct 29, 2026
1e8a396
Move ClientSetup into the forge-26.3 module
jaymar921 Oct 29, 2026
e49ee97
Move CrewController into the forge-26.3 module
jaymar921 Oct 29, 2026
81283b7
Move KeyBindings into the forge-26.3 module
jaymar921 Oct 29, 2026
4c367bb
Move VehiclePicker into the forge-26.3 module
jaymar921 Oct 29, 2026
5234dce
Move WeaponController into the forge-26.3 module
jaymar921 Oct 29, 2026
1d5642f
Move WeaponHud into the forge-26.3 module
jaymar921 Oct 29, 2026
26a134a
Move HudCanvas into the forge-26.3 module
jaymar921 Oct 29, 2026
efd2a80
Move HudRenderer into the forge-26.3 module
jaymar921 Oct 29, 2026
3e348ff
Move HudScripts into the forge-26.3 module
jaymar921 Oct 29, 2026
e134c60
Move HudState into the forge-26.3 module
jaymar921 Oct 29, 2026
894e988
Move A10Renderer into the forge-26.3 module
jaymar921 Oct 29, 2026
5dc3570
Move AircraftRenderState into the forge-26.3 module
jaymar921 Oct 29, 2026
3257e75
Move AircraftRenderer into the forge-26.3 module
jaymar921 Oct 29, 2026
7181297
Move GlassSplit into the forge-26.3 module
jaymar921 Oct 29, 2026
1c973e1
Move MeshCache into the forge-26.3 module
jaymar921 Oct 29, 2026
27853bc
Move MeshRenderer into the forge-26.3 module
jaymar921 Oct 29, 2026
cbef5ca
Move PartRenderer into the forge-26.3 module
jaymar921 Oct 29, 2026
149ff94
Move ProjectileRenderer into the forge-26.3 module
jaymar921 Oct 29, 2026
a60920b
Move RiderPose into the forge-26.3 module
jaymar921 Oct 29, 2026
41aadca
Move EngineSound into the forge-26.3 module
jaymar921 Oct 29, 2026
8bca910
Move EngineSoundPlayer into the forge-26.3 module
jaymar921 Oct 29, 2026
cb773b6
Move AircraftEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
973feb1
Move AnimationState into the forge-26.3 module
jaymar921 Oct 29, 2026
9e2bff8
Move ClientAccess into the forge-26.3 module
jaymar921 Oct 29, 2026
2f5524b
Move EngineSoundSource into the forge-26.3 module
jaymar921 Oct 29, 2026
c3f8853
Move GroundVehicleEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
40dbd06
Move HelicopterEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
6494bfb
Move PartState into the forge-26.3 module
jaymar921 Oct 29, 2026
b7f87a4
Move PlaneEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
3c080f6
Move TankEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
fb2b27d
Move TerrainFollower into the forge-26.3 module
jaymar921 Oct 29, 2026
fcf3c5c
Move A10Entity into the forge-26.3 module
jaymar921 Oct 29, 2026
87ccdc2
Move AAMissileEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
f806cad
Move ASMissileEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
7822b8f
Move ATMissileEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
0b0316a
Move BombEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
8c36c4f
Move BulletEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
fa2345f
Move DispensedItemEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
7c0d062
Move FlareEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
1ce2580
Move MarkerRocketEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
2effc87
Move ProjectileEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
6940338
Move RocketEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
5b3584d
Move TorpedoEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
9f8c9dd
Move TvMissileEntity into the forge-26.3 module
jaymar921 Oct 29, 2026
2a240f5
Move AircraftItem into the forge-26.3 module
jaymar921 Oct 29, 2026
021e84f
Move BoardVehiclePacket into the forge-26.3 module
jaymar921 Oct 29, 2026
5c78194
Move CrewActionPacket into the forge-26.3 module
jaymar921 Oct 29, 2026
a8fd6a8
Move ExplosionEffectPacket into the forge-26.3 module
jaymar921 Oct 29, 2026
2eabced
Move FireWeaponPacket into the forge-26.3 module
jaymar921 Oct 29, 2026
1f8c136
Move LockWarningPacket into the forge-26.3 module
jaymar921 Oct 29, 2026
ce00943
Move ModNetwork into the forge-26.3 module
jaymar921 Oct 29, 2026
c9254ff
Move PilotStatePacket into the forge-26.3 module
jaymar921 Oct 29, 2026
bd0edd0
Move WeaponStatePacket into the forge-26.3 module
jaymar921 Oct 29, 2026
5cdd5d8
Move ModCreativeTabs into the forge-26.3 module
jaymar921 Oct 29, 2026
a4ad89e
Move ModEntities into the forge-26.3 module
jaymar921 Oct 29, 2026
9c2b8db
Move ModItems into the forge-26.3 module
jaymar921 Oct 29, 2026
2368351
Move ModRecipes into the forge-26.3 module
jaymar921 Oct 29, 2026
a8a0837
Move Combat into the forge-26.3 module
jaymar921 Oct 29, 2026
e21e170
Move ExplosionEffect into the forge-26.3 module
jaymar921 Oct 29, 2026
6e64344
Move Explosions into the forge-26.3 module
jaymar921 Oct 29, 2026
8ff4843
Move FlareDispenser into the forge-26.3 module
jaymar921 Oct 29, 2026
a8c4d34
Move Guidance into the forge-26.3 module
jaymar921 Oct 29, 2026
1e9f4df
Move LegacyItems into the forge-26.3 module
jaymar921 Oct 29, 2026
36c7c4e
Move ModDamageTypes into the forge-26.3 module
jaymar921 Oct 29, 2026
6e44b3d
Move Resupply into the forge-26.3 module
jaymar921 Oct 29, 2026
585737c
Move ServerFiring into the forge-26.3 module
jaymar921 Oct 29, 2026
d605530
Move Shot into the forge-26.3 module
jaymar921 Oct 29, 2026
3156da3
Move VehicleWeapons into the forge-26.3 module
jaymar921 Oct 29, 2026
75abaed
Move WeaponSet into the forge-26.3 module
jaymar921 Oct 29, 2026
b5c1f76
Move mods into the forge-26.3 module
jaymar921 Oct 29, 2026
3f2a199
Move the damage_type file bullet.json into the forge-26.3 module
jaymar921 Oct 29, 2026
426fbfc
Move the damage_type file is_projectile.json into the forge-26.3 module
jaymar921 Oct 29, 2026
96f3179
Move pack into the forge-26.3 module
jaymar921 Oct 29, 2026
3c010f8
Include the common module and the platform modules listed in gradle.p…
jaymar921 Oct 29, 2026
18b5e79
Move version-specific properties to the platform module and set 1.1.0…
jaymar921 Oct 29, 2026
1166765
Add a root build that gathers one jar per Minecraft version into buil…
jaymar921 Oct 29, 2026
ee27cc1
Build and test the common module without Minecraft on the classpath
jaymar921 Oct 29, 2026
5f14cbe
Add the Minecraft, Forge and Java versions of the forge-26.3 module
jaymar921 Oct 29, 2026
cdae72e
Compile the common sources into the forge-26.3 jar and ship the gener…
jaymar921 Oct 29, 2026
8642dac
Declare AircraftRotation in the physics package and make wrap public
jaymar921 Oct 29, 2026
aa14a87
Declare GroundImpact in the physics package and make its API public
jaymar921 Oct 29, 2026
6c0f9ba
Declare AircraftRotationTest in the physics package
jaymar921 Oct 29, 2026
0efb609
Declare GroundImpactTest in the physics package
jaymar921 Oct 29, 2026
31cae41
Let ContentRegistry add, replace and reload definitions while the gam…
jaymar921 Oct 29, 2026
6a1d5b5
Craft the generic vehicle items and match vehicle ingredients by comp…
jaymar921 Oct 29, 2026
58c7ebc
Bump the importer format so existing installs regenerate their recipes
jaymar921 Oct 29, 2026
b70e932
Test that the common sources use nothing from Minecraft or a loader
jaymar921 Oct 29, 2026
42e258e
Test adding, replacing and reloading definitions at runtime
jaymar921 Oct 29, 2026
64e06b1
Expect generic vehicle results and the AH-6 vehicle ingredient in rec…
jaymar921 Oct 29, 2026
b82c6c4
Add English names for the generic items, the command and the placemen…
jaymar921 Oct 29, 2026
8551839
Add Japanese names for the generic vehicle items
jaymar921 Oct 29, 2026
9bdfa97
Add the mcheli:vehicle data component
jaymar921 Oct 29, 2026
962e4c8
Turn AircraftItem into one item per kind that reads its vehicle from …
jaymar921 Oct 29, 2026
d7f1c58
Keep the 1.0.0 vehicle items and convert them in a player's inventory
jaymar921 Oct 29, 2026
fea3e93
Add an ingredient that matches one vehicle
jaymar921 Oct 29, 2026
15ee98d
Register one item per vehicle kind plus the 1.0.0 items
jaymar921 Oct 29, 2026
0809c66
Build the creative tabs from the live content registry
jaymar921 Oct 29, 2026
1667dc7
Register the vehicle ingredient serializer
jaymar921 Oct 29, 2026
228fd70
Add a fallback item model for the generic helicopter item
jaymar921 Oct 29, 2026
0f3b5b6
Add a fallback item model for the generic plane item
jaymar921 Oct 29, 2026
3a80a20
Add a fallback item model for the generic tank item
jaymar921 Oct 29, 2026
7091abb
Add a fallback item model for the generic ground vehicle item
jaymar921 Oct 29, 2026
38d8280
Add the server config
jaymar921 Oct 29, 2026
a98a174
Respect the server config for block damage and fires
jaymar921 Oct 29, 2026
b3c0735
Pick up reloaded definitions, apply the damage factor and drop generi…
jaymar921 Oct 29, 2026
4e39da7
Import AircraftRotation from the physics package
jaymar921 Oct 29, 2026
a933cf2
Import AircraftRotation from the physics package
jaymar921 Oct 29, 2026
509a7c5
Import GroundImpact from the physics package
jaymar921 Oct 29, 2026
a0da4a7
Import AircraftRotation from the physics package
jaymar921 Oct 29, 2026
3f514bd
Import AircraftRotation from the physics package
jaymar921 Oct 29, 2026
c50a771
Import AircraftRotation from the physics package
jaymar921 Oct 29, 2026
caa5d05
Let the client hook into content reloads through ClientAccess
jaymar921 Oct 29, 2026
92a47eb
Add the packet telling clients the content was reloaded
jaymar921 Oct 29, 2026
27c4751
Register the content reload packet and add sendToAll
jaymar921 Oct 29, 2026
8669d63
Add the server side of the content reload
jaymar921 Oct 29, 2026
418ee86
Add runtime textures, models and sounds that need no resource reload
jaymar921 Oct 29, 2026
c07a68d
Stream sounds from runtime asset folders when no pack defines them
jaymar921 Oct 29, 2026
d34dd28
Let engine loops stream from runtime asset folders
jaymar921 Oct 29, 2026
72afe92
Load models through RuntimeAssets and allow clearing the cache on reload
jaymar921 Oct 29, 2026
ccb521d
Read texture alpha through RuntimeAssets
jaymar921 Oct 29, 2026
7c3a332
Bind vehicle textures through RuntimeAssets
jaymar921 Oct 29, 2026
4717e31
Add the client side of the content reload
jaymar921 Oct 29, 2026
3de3951
Install the content reload hook on the client
jaymar921 Oct 29, 2026
98faaba
Add the /mcheli command
jaymar921 Oct 29, 2026
02d429a
Register the server config, data component and /mcheli command
jaymar921 Oct 29, 2026
7007d6a
Move the old import aside and retry the swap so Windows file locks ca…
jaymar921 Oct 29, 2026
3008845
Upload every platform jar and every module's test reports from CI
jaymar921 Oct 29, 2026
6593dba
Attach one jar per Minecraft version to the release
jaymar921 Oct 29, 2026
a940c01
Document the /mcheli command, the server config and the new build output
jaymar921 Oct 29, 2026
7b7dced
Add the 1.1.0-beta.1 changes under Unreleased
jaymar921 Oct 29, 2026
ad6ba30
Describe the module split, runtime registry, vehicle items, reload an…
jaymar921 Oct 29, 2026
bb8b200
Document the common and platform modules and the multi-jar release
jaymar921 Oct 29, 2026
5747419
Mark the phase 5 work as done and in testing
jaymar921 Oct 29, 2026
2e9165b
Add the phase 5 checklist and update build paths
jaymar921 Oct 29, 2026
e3d5af1
Float vehicles as high as the original by lowering the waterline samp…
jaymar921 Oct 29, 2026
8e21a28
Note the floating vehicle height fix
jaymar921 Oct 29, 2026
6debbfc
Let static mounts aim with the gunner, and cook off boats destroyed o…
jaymar921 Oct 29, 2026
aa7d9c3
Fire static launchers and guns where the gunner looks unless the weap…
jaymar921 Oct 29, 2026
eecd5cd
Face the vehicle along the user's view while a weapon that aims with …
jaymar921 Oct 29, 2026
a142396
Note the boat cook-off and the static launcher aiming fix
jaymar921 Oct 29, 2026
e9b6531
Sink cooked-off boats slowly, stern first and listing, instead of dro…
jaymar921 Oct 29, 2026
08bdae4
Describe the slow sinking of cooked-off boats
jaymar921 Oct 29, 2026
58da7a4
Add a screenshot of a patrol boat cooking off after a torpedo hit
jaymar921 Oct 29, 2026
d0308e9
Add a screenshot of the sunken patrol boat wreck
jaymar921 Oct 29, 2026
4e6769a
Show the patrol boat cook-off and wreck in the README screenshots
jaymar921 Oct 29, 2026
0acd1ab
Release the changelog section as 1.1.0-beta.1
jaymar921 Oct 29, 2026
09794f5
Mark phase 5 as released in beta.1
jaymar921 Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ jobs:
- uses: actions/upload-artifact@v4
with:
name: mcheli-${{ github.sha }}
path: build/libs/*.jar
path: build/release/*.jar
if-no-files-found: error
retention-days: 14

- uses: actions/upload-artifact@v4
if: failure()
with:
name: test-reports
path: build/reports/tests/
path: "*/build/reports/tests/"
3 changes: 2 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ jobs:
if [ "${{ steps.version.outputs.prerelease }}" = "true" ]; then
flags+=(--prerelease)
fi
gh release create "$GITHUB_REF_NAME" build/libs/*.jar \
# One jar per Minecraft version, gathered by the releaseJars task.
gh release create "$GITHUB_REF_NAME" build/release/*.jar \
--title "MCHeli Rework ${{ steps.version.outputs.version }}" \
--notes-file release-notes.md \
"${flags[@]}"
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,53 @@ All notable changes to this project are documented here. The format follows
[Semantic Versioning](https://semver.org/). Pre-releases (`1.0.0-alpha.N`) mark the phases on the
way to 1.0.0; see [docs/ROADMAP.md](docs/ROADMAP.md).

## [1.1.0-beta.1] - 2026-10-29

Phase 5 of the road to 1.1.0: the groundwork that content packs, older Minecraft versions and
the vehicle workshop build on. Betas are not uploaded to CurseForge; download them from the GitHub
releases. Worlds from 1.0.0 load with their vehicles and items.

### Added

- `/mcheli` shows where the vehicles were loaded from and how many there are; `/mcheli list
[helicopter|plane|tank|vehicle]` lists them.
- `/mcheli give <players> <vehicle> [count]` for operators, with the vehicle names suggested.
- `/mcheli reload` for operators: reads the vehicle and weapon definitions again without
restarting. Vehicles already in the world switch to the new values on the spot and keep their
ammunition; models and textures edited on disk show up straight away, without F3 + T.
- Server config, `serverconfig/mcheli-server.toml` in each world: whether explosions break blocks
and start fires, a damage multiplier for vehicles, infinite ammunition, and a list of vehicles
that cannot be placed. Edits apply while the server runs.
- Boats destroyed on the water (by a torpedo or anything else) cook off: three explosions with
fireballs within about five seconds, the first from the fuel, the second from the ammunition
still aboard, the last and biggest sized by the fuel load like a crash. Then the burning wreck
slowly goes under, stern first and listing, and settles on the bottom.
- Content can now bring textures, models and sounds while the game runs, without a resource
reload. Nothing uses this yet beyond `/mcheli reload`; content packs (beta.2) will.

### Changed

- Vehicle items: there is now one item per vehicle kind (Helicopter, Plane, Tank, Ground Vehicle)
that remembers which vehicle it places, instead of one item per vehicle. They look and are named
as before. Items from 1.0.0 still work and turn into the new ones as soon as they are in a
player's inventory; items in chests change when taken out. To give one by command, use
`/mcheli give` (plain `/give mcheli:ah-64` no longer exists for new items).
- The imported content is converted again on the first start, since the crafting recipes now
make the new items. This takes a few seconds, once.
- The source is split into a version-free `common` module and a module per Minecraft version
(`forge-26.3` for now), and a release attaches one jar per Minecraft version. Nothing changes for
players.

### Fixed

- Boats and other floating vehicles sat about a third of a block too deep, so the Zodiac was
almost under water. They now float as high as in the original.
- Static launchers and guns that turn with the gunner's view, such as the Type 93 and Mk 32
torpedo tubes, only fired straight ahead. They fire where the gunner looks again.
- On Windows, converting the content again could fail with "access denied" when another program
had the old `mcheli/imported` folder open, leaving the game without vehicles until the next
start. The old folder is now moved aside first, and the swap is retried.

## [1.0.0] - 2026-10-28

First release. Everything from the alpha and beta versions, shipped as a code-only jar. The
Expand Down Expand Up @@ -317,4 +364,5 @@ Phase 1: foundation and flyable helicopters.
- Free look moved from Left Ctrl to Left Alt, because Left Ctrl is now the vanilla sprint key.
- Roll damping runs per tick instead of per frame, so handling no longer depends on frame rate.

[1.1.0-beta.1]: https://github.com/JnH-Projects/MCHeli-Rework-Forge/releases/tag/v1.1.0-beta.1
[1.0.0]: https://github.com/JnH-Projects/MCHeli-Rework-Forge/releases/tag/v1.0.0
33 changes: 31 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ Phase 4 clips (click a picture to open the video):

## Screenshots

Phase 5 in a development build (`1.1.0-beta.1`): a patrol boat hit by a torpedo cooks off and
sinks.

| | |
|---|---|
| ![A patrol boat exploding on a river after a torpedo hit, burning debris arcing over the shore](docs/images/phase-5/patrol-boat-cook-off.png) | ![The wreck of the patrol boat resting on the riverbed, listing and still smoking](docs/images/phase-5/patrol-boat-wreck.png) |
| Torpedo hit: fuel and ammunition cook off in three blasts | The wreck settles on the bottom, still smoking |

Phase 4 in a development build: the original's scripted HUDs, pilot gunner mode and lock-on.

| | |
Expand Down Expand Up @@ -196,6 +204,26 @@ Each seat fires the weapons its vehicle assigns to it; the pilot also fires a gu
while that seat has no player. Creative players have unlimited ammunition. A small readout at the
bottom right shows hit points, the weapon, ammunition, reload, heat, lock and flares.

## Commands and server settings

| Command | Who | What it does |
|---------|-----|--------------|
| `/mcheli` | everyone | Where the vehicles were loaded from, and how many of each kind |
| `/mcheli list [helicopter\|plane\|tank\|vehicle]` | everyone | The loaded vehicles by name |
| `/mcheli give <players> <vehicle> [count]` | operators | Hands out vehicles, for example `/mcheli give @s ah-64` |
| `/mcheli reload` | operators | Reads the vehicle and weapon files again without a restart |

Each world has `serverconfig/mcheli-server.toml` (created on first start, edits apply while the
server runs):

| Setting | Default | Meaning |
|---------|---------|---------|
| `explosions.breakBlocks` | `true` | Weapons and crashes break blocks (the `mobGriefing` rule applies too) |
| `explosions.startFires` | `true` | Incendiary weapons and crashes start fires |
| `vehicles.damageFactor` | `1.0` | Multiplies the damage vehicles take; `0.5` makes them twice as tough |
| `vehicles.disabled` | `[]` | Vehicles that cannot be placed, by name, such as `["ah-64", "f-35b"]` |
| `weapons.infiniteAmmo` | `false` | Vehicle weapons never run out of ammunition |

## Documentation

* [Changelog](CHANGELOG.md)
Expand All @@ -212,7 +240,8 @@ bottom right shows hit points, the weapon, ammunition, reload, heat, lock and fl
./gradlew build
```

The jar ends up in `build/libs`. Java 25 is required; Gradle downloads one automatically if it is
not installed. `./gradlew runClient` and `runServer` import the content from
The jars, one per Minecraft version, end up in `build/release`. Java 25 is required; Gradle
downloads one automatically if it is not installed. `./gradlew :forge-26.3:runClient` and
`:forge-26.3:runServer` import the content from
`Mod/MC1.7.10_mcheli_1.0.3.zip`, which you have to download yourself. See
[DEVELOPMENT.md](docs/DEVELOPMENT.md) for details.
110 changes: 11 additions & 99 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,106 +1,18 @@
plugins {
id 'java'
id 'idea'
id 'eclipse'
id 'net.minecraftforge.gradle' version '[7.0.17,8)'
id 'base'
id 'net.minecraftforge.gradle' version '[7.0.17,8)' apply false
}

version = mod_version
group = mod_group
def platforms = providers.gradleProperty('platforms').get().split(',').collect { it.trim() }

base {
archivesName = "mcheli-${minecraft_version}"
// One jar per Minecraft version, gathered in one folder for the release workflow.
def releaseJars = tasks.register('releaseJars', Sync) {
group = 'build'
description = 'Collects the jar of every platform module into build/release.'
platforms.each { platform -> from(project(":$platform").tasks.named('jar')) }
into layout.buildDirectory.dir('release')
}

// Minecraft 26.x ships Java 25 to players, so the mod targets it as well.
java.toolchain.languageVersion = JavaLanguageVersion.of(25)

// The original MCHeli 1.0.3 download. Players supply their own copy; development runs and the
// import test use this one (git-ignored, see docs/DEVELOPMENT.md).
def legacyZip = file('Mod/MC1.7.10_mcheli_1.0.3.zip').absolutePath

minecraft {
runs {
configureEach {
workingDir = layout.projectDirectory.dir('run')
systemProperty 'eventbus.api.strictRuntimeChecks', 'true'
systemProperty 'mcheli.legacyZip', legacyZip
}

register('client')

register('server') {
args '--nogui'
}
}
}

repositories {
minecraft.mavenizer(it)
maven fg.forgeMaven
maven fg.minecraftLibsMaven
mavenCentral()
}

dependencies {
implementation minecraft.dependency("net.minecraftforge:forge:${minecraft_version}-${forge_version}")
annotationProcessor "net.minecraftforge:eventbus-validator:${eventbus_version}"

testImplementation platform("org.junit:junit-bom:${junit_version}")
testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
options.compilerArgs.addAll(['-Xlint:deprecation', '-Xlint:unchecked'])
}

tasks.named('test', Test) {
useJUnitPlatform()
systemProperty 'mcheli.resources', file('src/main/resources').absolutePath
// The content tests import the original zip once into build/legacy-content (TestResources)
// and are skipped where the zip is absent, such as on CI.
systemProperty 'mcheli.legacyZip', legacyZip
systemProperty 'mcheli.testContent', layout.buildDirectory.dir('legacy-content').get().asFile.absolutePath
}

def expandProps = [
mod_id : mod_id,
mod_name : mod_name,
mod_version : version,
mod_authors : mod_authors,
mod_license : mod_license,
minecraft_version_range: minecraft_version_range,
forge_version_range : forge_version_range,
loader_version_range : loader_version_range,
]

tasks.named('processResources', ProcessResources) {
inputs.properties(expandProps)
filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) {
expand expandProps
}
}

tasks.named('jar', Jar) {
// EMB4's content is never redistributed: players import it from their own copy of the original
// zip (LegacyContent). The repository no longer holds it, but the jar is packed from
// build/sourceSets/main, which can still have copies from older builds and from the IDE.
exclude { FileTreeElement element ->
String path = element.relativePath.pathString
!element.directory && path.startsWith('assets/mcheli/') && !path.startsWith('assets/mcheli/lang/')
}
exclude 'data/mcheli/recipe/**'
includeEmptyDirs = false
manifest {
attributes([
'Specification-Title' : mod_id,
'Specification-Vendor' : 'JnH Projects',
'Specification-Version' : '1',
'Implementation-Title' : mod_name,
'Implementation-Version': version,
'Implementation-Vendor' : 'JnH Projects',
])
}
tasks.named('build') {
dependsOn releaseJars
}
48 changes: 48 additions & 0 deletions common/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
plugins {
id 'java-library'
}

version = mod_version
group = mod_group

// The platform modules compile these sources again with their own toolchain. Building them on
// their own here, with no Minecraft or loader on the classpath, is what keeps them version-free.
java.toolchain.languageVersion = JavaLanguageVersion.of(25)

repositories {
// Minecraft's library mirror has everything the game ships; Maven Central is the fallback.
maven { url = 'https://libraries.minecraft.net/' }
mavenCentral()
}

dependencies {
// Provided at runtime by Minecraft on every supported version.
compileOnly "org.slf4j:slf4j-api:${slf4j_version}"
compileOnly "org.jspecify:jspecify:${jspecify_version}"
compileOnly "org.joml:joml:${joml_version}"

testImplementation "org.slf4j:slf4j-api:${slf4j_version}"
testImplementation "org.jspecify:jspecify:${jspecify_version}"
testImplementation "org.joml:joml:${joml_version}"
testImplementation platform("org.junit:junit-bom:${junit_version}")
testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
options.compilerArgs.addAll(['-Xlint:deprecation', '-Xlint:unchecked'])
}

// The original MCHeli 1.0.3 download, kept by developers in Mod/ (git-ignored, see docs/DEVELOPMENT.md).
def legacyZip = rootProject.file('Mod/MC1.7.10_mcheli_1.0.3.zip').absolutePath

tasks.named('test', Test) {
useJUnitPlatform()
systemProperty 'mcheli.resources', file('src/main/resources').absolutePath
systemProperty 'mcheli.commonSources', file('src/main/java').absolutePath
// The content tests import the original zip once into build/legacy-content (TestResources)
// and are skipped where the zip is absent, such as on CI.
systemProperty 'mcheli.legacyZip', legacyZip
systemProperty 'mcheli.testContent', layout.buildDirectory.dir('legacy-content').get().asFile.absolutePath
}
Loading
Loading