Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
6679476
Build only the Forge 26.3 jar for beta.4
jaymar921 Oct 30, 2026
8fa29d6
Add the crash spin rates for shot down aircraft
jaymar921 Oct 30, 2026
a18abcb
Test the crash spin direction and rates
jaymar921 Oct 30, 2026
bb4d7fd
Hand custom render pipelines to Iris by reflection
jaymar921 Oct 30, 2026
789de22
Assign the glow pipelines to Iris shader programs
jaymar921 Oct 30, 2026
0e25450
Add the vehicles.infiniteFuel server setting
jaymar921 Oct 30, 2026
a3d458c
Bump the network protocol to 7
jaymar921 Oct 30, 2026
1792e4d
Add night vision crew actions
jaymar921 Oct 30, 2026
824502d
Add the fuel can
jaymar921 Oct 30, 2026
a492200
Add the wrench
jaymar921 Oct 30, 2026
3c8db6c
Add the parachute entity
jaymar921 Oct 30, 2026
80d24cb
Add the parachute item
jaymar921 Oct 30, 2026
3c6dcaa
Register the parachute entity
jaymar921 Oct 30, 2026
8302d10
Register the fuel can, wrench and parachute
jaymar921 Oct 30, 2026
85664f9
Add the equipment creative tab
jaymar921 Oct 30, 2026
259546b
Add fuel, repair, night vision, ejection parachutes and the crash spi…
jaymar921 Oct 30, 2026
cd24be1
Render parachutes from the imported models
jaymar921 Oct 30, 2026
b0ecc50
Add the crew member's zoom and night vision state
jaymar921 Oct 30, 2026
a20106d
Add the night vision key and note zoom on the fold key
jaymar921 Oct 30, 2026
3c676bb
Zoom through sights and switch night vision from the crew keys
jaymar921 Oct 30, 2026
768839f
Feed fuel, low fuel and camera values to the HUD
jaymar921 Oct 30, 2026
cc28168
Register the parachute renderer, the zoom hook and Iris setup
jaymar921 Oct 30, 2026
2ce725a
Apply the zoom to the field of view on Forge
jaymar921 Oct 30, 2026
c4bc040
Add the fuel can recipe
jaymar921 Oct 30, 2026
c99ae7c
Add the wrench recipe
jaymar921 Oct 30, 2026
59dcc35
Add the parachute recipe
jaymar921 Oct 30, 2026
d0162e1
Name the night vision key, the equipment tab and the parachute
jaymar921 Oct 30, 2026
d4cf6c1
Translate the night vision key, the equipment tab and the parachute
jaymar921 Oct 30, 2026
46105f6
Describe phase 8 so far under Unreleased
jaymar921 Oct 30, 2026
62c953d
Document fuel, equipment, zoom and night vision for players
jaymar921 Oct 30, 2026
1971326
Make equipment phase 8 and move 1.20.1 to phase 11
jaymar921 Oct 30, 2026
44d602a
Add the phase 8 checklist
jaymar921 Oct 30, 2026
69def99
Describe the crash spin, fuel, equipment, camera and Iris support
jaymar921 Oct 30, 2026
d8db634
Note the Forge-only platform list during betas 4 to 6
jaymar921 Oct 30, 2026
740bac0
Interpolate the parachute on clients so a slow descent is smooth
jaymar921 Oct 30, 2026
8b42eca
Stop rounds where they hit on clients and sync who fired them
jaymar921 Oct 30, 2026
ec31181
Hide rounds and their glow once they have hit
jaymar921 Oct 30, 2026
bb4fd5d
Collide vehicles by their whole hull
jaymar921 Oct 30, 2026
71b680e
Outline the hull boxes with F3+B
jaymar921 Oct 30, 2026
be4212c
Note hull collisions and the round fix in the changelog
jaymar921 Oct 30, 2026
f040d8b
Add hull box and collision checks to the phase 8 checklist
jaymar921 Oct 30, 2026
69d25d9
Describe hull collisions and client side round hits
jaymar921 Oct 30, 2026
34e5961
Generate hit boxes for model parts the BoundingBox lines leave out
jaymar921 Oct 30, 2026
86d32a1
Test the generated hit boxes, including the MD-90 tail fin
jaymar921 Oct 30, 2026
2ec7e4e
Keep the generated hit boxes next to the listed ones
jaymar921 Oct 30, 2026
3b8303f
Fill each vehicle's hull from its model when the content loads
jaymar921 Oct 30, 2026
b5134f9
Use the generated hull boxes and cook off heavy aircraft in three blasts
jaymar921 Oct 30, 2026
6eee157
Outline generated hull boxes in amber
jaymar921 Oct 30, 2026
4f1d522
Note the generated hull and the heavy aircraft cook-off
jaymar921 Oct 30, 2026
b38a9b8
Add checks for the generated hull and the heavy aircraft cook-off
jaymar921 Oct 30, 2026
32edbcd
Describe how the hull is filled from the model
jaymar921 Oct 30, 2026
8b8dd7e
Add a phase 8 screenshot of the MD-90 hull boxes
jaymar921 Oct 30, 2026
b86ebc8
Add a phase 8 screenshot of the EC665 hull boxes
jaymar921 Oct 30, 2026
089e4a7
Add a phase 8 screenshot of an SA-2 locking onto a plane
jaymar921 Oct 30, 2026
0af056f
Add a phase 8 screenshot of the SA-2 hitting the plane
jaymar921 Oct 30, 2026
fa6fe90
Add a phase 8 screenshot of the plane spiralling down
jaymar921 Oct 30, 2026
f27faf9
Add a phase 8 screenshot of the plane crash
jaymar921 Oct 30, 2026
fa86d3f
Show the phase 8 screenshots in the README
jaymar921 Oct 30, 2026
d1d2fb1
Release the changelog section as 1.1.0-beta.4
jaymar921 Oct 30, 2026
eaa9ecf
Mark phase 8 as released in beta.4 and move the open equipment to pha…
jaymar921 Oct 30, 2026
ce880fd
Note that betas 4 to 7 build only the Forge 26.3 jar
jaymar921 Oct 30, 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
62 changes: 62 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,66 @@ 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.4] - 2026-10-30

Phase 8 of the road to 1.1.0: fuel, the first equipment carried over from phase 4, hit boxes that
cover the whole vehicle, and crash spins. Betas are not uploaded to CurseForge. From this beta on,
betas ship one jar, Forge for Minecraft 26.3; the other loaders and 1.21.1 come back for 1.1.0.
Worlds from 1.1.0-beta.3 load as before. Players and servers need the same version, since the
network protocol changed.

### Added

- Fuel. Vehicles with a `MaxFuel` burn their `FuelConsumption` while the throttle is open, and the
engine winds down when the tank runs dry. The HUD's `fuel` and `low_fuel` values are live, so the
original fuel gauges and low fuel warnings work. Fuel trucks top up every vehicle within their
`FuelSupplyRange`. Server config `vehicles.infiniteFuel` turns fuel use off.
- The fuel can (`mcheli:fuel`): right-click a vehicle to pour in up to 100 units, right-click in
the air with coal or charcoal in the inventory to fill it again. The original poured it through
the vehicle's inventory screen, which is not ported yet.
- The wrench (`mcheli:wrench`): right-click a vehicle to repair 10 hit points, once a second; with
Shift it switches the vehicle to its next paint scheme.
- The parachute (`mcheli:parachute`): use it in mid-air to float down, hold W to glide forward.
- An Equipment creative tab for the three, and the original's crafting recipes for them. Their
icons and names come from the imported content, like the vehicles'.
- Zoom: through a camera, a gunner sight, gunner mode or a UAV, Z doubles the zoom up to the
vehicle's `CameraZoom` and then goes back to 1x. Elsewhere Z still folds wings and hatches, as in
the original. The HUD's `cam_zoom` follows it.
- Night vision on K for vehicles with `EnableNightVision`. The HUD's `cam_mode` follows it.
- Vehicles collide with each other by their whole hull (the `BoundingBox` lines), not just the
small box at their feet: a vehicle cannot drive or fly into another one, a helicopter can set
down on top of a parked truck, and ramming uses the same boxes for crash damage. Vehicles that
can be loaded onto each other's racks still pass through, so they can drive onto the rack.
- Hit boxes for the parts a vehicle's `BoundingBox` lines leave out, such as the MD-90's tail fin,
made from its model when the content loads: every one-block cell of the model's surface that no
listed box covers becomes part of the hull. Rotor blades and propellers are left out. Vehicles
without any `BoundingBox` line (the MH-6, the R44 and others) get a hull this way too.
- With F3+B on, the hull boxes are outlined next to the main box: the definition's in cyan, the
generated ones in amber.
- Heavy aircraft (`MaxFuel` of 3000 or more: the MD-90, C-5, E-767, B-29, B-2A, AC-130, US-2 and
H8K) go up in three blasts like a destroyed boat, when wrecked on the ground or when their wreck
crashes. Only a hull in the water sinks afterwards.
- Crash spin: a shot down plane or jet rolls into a nose-down spiral, and a helicopter spins up
faster than before with some wobble, until it is close to the ground. The direction comes from
the entity, so everyone sees the same spin.

### Changed

- Ejection seats come down on a parachute instead of with slow falling.
- Vehicles are placed with a full tank (the original placed them empty, to be filled from the
inventory screen), and vehicles saved by earlier versions load with a full tank.
- The Z key is called "Zoom / Fold Wings / Hatch" in the controls.

### Fixed

- Rounds no longer seem to fly through a vehicle they hit. The server always counted the hit on
the hull, but the client kept drawing the round until the server removed it; it now stops and
disappears where it struck. Clients also learn who fired, so a round never stops on its own
vehicle.
- With an Iris shader pack, tracers, rocket motors, flares and explosion glows no longer turn into
long purple and teal lines running to the horizon. The glow pipelines are now handed to Iris,
which draws them with its emissive entity and translucent particle programs.

## [1.1.0-beta.3] - 2026-10-30

Phase 7 of the road to 1.1.0: the mod on NeoForge and Fabric as well as Forge, and on Minecraft
Expand Down Expand Up @@ -455,6 +515,8 @@ 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.4]: https://github.com/JnH-Projects/MCHeli-Rework-Forge/releases/tag/v1.1.0-beta.4
[1.1.0-beta.3]: https://github.com/JnH-Projects/MCHeli-Rework-Forge/releases/tag/v1.1.0-beta.3
[1.1.0-beta.2]: https://github.com/JnH-Projects/MCHeli-Rework-Forge/releases/tag/v1.1.0-beta.2
[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
30 changes: 28 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,18 @@ Phase 4 clips (click a picture to open the video):

## Screenshots

Phase 8 in a development build (`1.1.0-beta.4`): hit boxes that cover the whole vehicle, and shot
down planes that spiral in.

| | |
|---|---|
| ![The MD-90 with F3+B on: cyan boxes from its definition along the fuselage and wings, amber boxes from its model filling the nose, fin and tail](docs/images/phase-8/md-90-hull-boxes.png) | ![An EC665 Tiger seen from above with F3+B on, its hull covered in amber and cyan boxes and none in the rotor disc](docs/images/phase-8/ec665-hull-boxes.png) |
| The MD-90's hull: the definition's boxes (cyan) and the ones made from its model (amber) | The EC665's hull; the rotor disc stays clear |
| ![The S-75 sight with an SA-2 selected, locked onto a plane overhead](docs/images/phase-8/sa-2-lock-on-plane.png) | ![The SA-2 bursting on the plane in a cloud of smoke and debris](docs/images/phase-8/sa-2-hits-plane.png) |
| An S-75 locks onto a plane | The SA-2 bursts on it |
| ![Burning debris trailing down from the sky behind the plane as it spirals towards the ground](docs/images/phase-8/plane-crash-spin.png) | ![The wreck exploding on the ground in a desert village, debris arcing out](docs/images/phase-8/plane-crash-site.png) |
| The plane rolls into a nose-down spiral | It goes up where it comes down |

Phase 6 in a development build (`1.1.0-beta.2`): night glow. Tracers, rocket motors, flares and
explosions light up the dark, and a wreck keeps burning until it disappears.

Expand Down Expand Up @@ -163,7 +175,7 @@ and configs are the same files on all three. Do not open a 26.3 world in 1.21.1.

## Controls

Take a vehicle from one of the four MCHeli creative tabs (helicopters, planes, tanks and cars,
Take a vehicle from one of the MCHeli creative tabs (helicopters, planes, tanks and cars,
ground vehicles), right-click a block to place it, and right-click anywhere on the vehicle to
board. The first player aboard is the pilot; a closed canopy opens on the first click and closes once the pilot
is in. Every key below can be rebound under Controls, category MCHeli.
Expand Down Expand Up @@ -193,7 +205,7 @@ to climb.
| W / S | Throttle up / down; full throttle is needed to climb |
| A / D | Roll in the air, steer on the ground |
| B | Landing gear up / down (it also comes down by itself near the ground) |
| Z | Fold or sweep the wings, or open the hatch |
| Z | Fold or sweep the wings, or open the hatch. Through a sight, zoom instead. |
| V | VTOL mode, for planes that have it |
| Space, twice | Eject, for planes with ejection seats |

Expand All @@ -215,6 +227,8 @@ to climb.
| R | Move to the next free seat |
| J | Load nearby vehicles onto your racks, or drive onto a carrier's rack |
| U | Unload the last vehicle from your racks, or leave the carrier |
| Z | Through a camera, gunner sight or gunner mode: zoom (2x, 4x and so on up to the vehicle's limit, then back) |
| K | Night vision on and off, in vehicles that have it |
| Shift | Leave the vehicle |

**Weapons**
Expand All @@ -231,6 +245,17 @@ 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.

**Fuel and equipment**

Vehicles burn fuel while the throttle is open; the HUD shows the tank and warns below 10%. With
an empty tank the engine winds down. Refuel with the **fuel can** from the Equipment tab:
right-click a vehicle to pour in up to 100 units, and right-click in the air with coal or
charcoal in your inventory to fill the can again. A fuel truck tops up every vehicle around it.
The **wrench** repairs 10 hit points per click, once a second; with Shift it switches the
vehicle's paint. The **parachute** opens when used in mid-air; hold W to glide forward.
Ejection seats come down on a parachute of their own. All three are crafted with the original's
recipes.

## Commands and server settings

| Command | Who | What it does |
Expand All @@ -250,6 +275,7 @@ server runs):
| `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"]` |
| `vehicles.infiniteFuel` | `false` | Vehicles never run out of fuel |
| `weapons.infiniteAmmo` | `false` | Vehicle weapons never run out of ammunition |
| `packs.allowList` | `[]` | Content packs the server loads, by id; empty loads all of them |
| `packs.maxPackSize` | `8` | Largest content pack the server loads and sends to players, in MB |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@
import com.jnhprojects.mcheli.content.pack.ContentSource;
import com.jnhprojects.mcheli.content.pack.PackProblem;
import com.jnhprojects.mcheli.content.weapon.WeaponDefinition;
import com.jnhprojects.mcheli.model.HullFill;
import com.jnhprojects.mcheli.model.MeshLoader;
import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
Expand Down Expand Up @@ -91,6 +94,9 @@ public static ContentRegistry load(List<ContentSource> sources) {

/** Collects definitions across sources; one per {@link #load(List)} call. */
private static final class Loader {
/** The client tries the same formats in the same order. */
private static final String[] MODEL_EXTENSIONS = {".mqo", ".obj"};

private final Map<String, WeaponDefinition> weapons = new LinkedHashMap<>();
private final Map<String, AircraftDefinition> vehicles = new LinkedHashMap<>();
private final Map<String, Set<String>> unhandled = new TreeMap<>();
Expand Down Expand Up @@ -135,11 +141,35 @@ <T extends Definition> void folder(ContentSource source, String folder, Function
if (result.isValid()) {
T def = result.definition();
def.setPack(source.pack());
if (def instanceof AircraftDefinition vehicle) {
fillHull(source, vehicle);
}
sink.accept(def);
}
}
}

/**
* Reads the vehicle's model from the same source, as the client will, and fills the gaps
* its {@code BoundingBox} lines leave (see {@link HullFill}). Server and client build the
* same boxes from the same file, so hits agree. A missing or broken model only means no
* extra boxes; the client reports it when it draws the vehicle.
*/
private static void fillHull(ContentSource source, AircraftDefinition def) {
for (String extension : MODEL_EXTENSIONS) {
Path file = source.assets().resolve("models").resolve(def.folder()).resolve(def.name() + extension);
if (!Files.isRegularFile(file)) {
continue;
}
try (InputStream in = Files.newInputStream(file)) {
def.setGeneratedBoxes(HullFill.fill(MeshLoader.load(file.getFileName().toString(), in).groups(), def.boundingBoxes));
} catch (IOException | RuntimeException e) {
LOGGER.debug("{}: no hull boxes from {}: {}", source.pack(), file, e.toString());
}
return;
}
}

void weapon(WeaponDefinition weapon) {
replaced(weapons.put(weapon.name(), weapon), weapon, WeaponDefinition.FOLDER);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.jnhprojects.mcheli.content.aircraft.part.WeaponBayPart;
import com.jnhprojects.mcheli.content.aircraft.part.WeaponPart;
import com.jnhprojects.mcheli.content.aircraft.part.WheelPart;
import org.jspecify.annotations.Nullable;

import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -86,6 +87,13 @@ public abstract class AircraftDefinition extends Definition {
public boolean canRotateOnGround = true;
public boolean enableBack;
public final List<BoundingBoxDefinition> boundingBoxes = new ArrayList<>();
/**
* Not from the file: boxes for the parts of the model the {@code BoundingBox} lines leave out,
* made by {@link com.jnhprojects.mcheli.model.HullFill} when the content loads. Empty without a
* model.
*/
private List<BoundingBoxDefinition> generatedBoxes = List.of();
private @Nullable List<BoundingBoxDefinition> hull;
public float markerWidth = 2.0F;
public float markerHeight = 1.0F;

Expand Down Expand Up @@ -191,6 +199,27 @@ protected AircraftDefinition(String name) {
/** Asset folder for this kind, for example {@code helicopters}. */
public abstract String folder();

public List<BoundingBoxDefinition> generatedBoxes() {
return generatedBoxes;
}

public void setGeneratedBoxes(List<BoundingBoxDefinition> boxes) {
generatedBoxes = List.copyOf(boxes);
hull = null;
}

/** Every hit box besides the main one: the {@code BoundingBox} lines, then the generated boxes. */
public List<BoundingBoxDefinition> hull() {
List<BoundingBoxDefinition> h = hull;
if (h == null) {
List<BoundingBoxDefinition> all = new ArrayList<>(boundingBoxes);
all.addAll(generatedBoxes);
h = List.copyOf(all);
hull = h;
}
return h;
}

/** HUD used for a seat that the definition did not configure. */
protected abstract String defaultHud(int seatIndex);

Expand Down
Loading
Loading