| name | create-simulated-aeronautics-mod |
| description | Expertise in the Create Simulated Project — a NeoForge Minecraft mod suite adding physics-based contraptions including planes, airships, cars, and land vehicles built on the Create mod framework. |
| triggers | ["add physics contraptions to my minecraft mod","create aeronautics neoforge mod","build a flying machine with create simulated","how to use create simulated project","physics based vehicles in minecraft java","assemble a plane or airship in create mod","create offroad land vehicle mod","propeller hot air balloon create aeronautics"] |
Create Simulated Project (Aeronautics)
Skill by ara.so — Daily 2026 Skills collection.
What Is This Project?
The Simulated Project is a suite of NeoForge Minecraft mods that extend the Create mod with real-time physics-based contraptions. It consists of three interconnected mods:
| Mod | Purpose |
|---|
| Create Simulated | Core assembly system, redstone components, physics interaction API |
| Create Aeronautics | Flying contraptions — propellers, hot air, levitation rocks |
| Create Offroad | Land vehicles — wheels, suspension, terrain traversal |
Physics simulation is powered by Sable, a custom rigid-body physics engine built for Minecraft contraptions.
Installation (Player/Server)
Modrinth (Recommended)
- Download from modrinth.com/project/create-aeronautics
- Place the JAR(s) in your
mods/ folder alongside dependencies
Required Dependencies
- NeoForge (matching the mod's target Minecraft version)
- Create mod (matching version)
- Sable physics library
Recommended Launcher
Use Modrinth App or Prism Launcher for dependency resolution.
Developer Setup (Building from Source)
Clone & Build
git clone https://github.com/Creators-of-Aeronautics/Simulated-Project.git
cd Simulated-Project
./gradlew build
Run in Dev Environment
./gradlew runClient
./gradlew runServer
./gradlew genIntellijRuns
Project Structure
Simulated-Project/
├── simulated/ # Core mod — assembly, physics API
├── aeronautics/ # Flying contraptions submod
├── offroad/ # Land vehicle submod
├── common/ # Shared utilities across submods
└── build.gradle # Multi-project Gradle build
Core Concepts
1. Simulated Contraptions
Unlike vanilla Create contraptions (which move block-by-block along tracks), Simulated contraptions are assembled into physics objects with:
- Mass derived from block composition
- Moment of inertia for rotation
- Forces applied by thrusters, propellers, wheels
2. Assembly
Players assemble a contraption using a designated assembly block (similar to Create's mechanical bearing). Once assembled, the structure becomes a rigid physics body managed by Sable.
3. Force Providers
Blocks that apply forces to assembled contraptions:
PropellerBlock — directional thrust (Aeronautics)
HotAirBlock — upward buoyancy (Aeronautics)
LevitationRockBlock — magical lift (Aeronautics)
WheelBlock — ground traction and propulsion (Offroad)
Key API — Create Simulated Core
Registering a Custom Force Provider
import com.simulated.api.force.IForceProvider;
import com.simulated.api.contraption.SimulatedContraption;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import org.joml.Vector3f;
public class MyThrusterBlock extends Block implements IForceProvider {
public MyThrusterBlock(Properties properties) {
super(properties);
}
@Override
public Vector3f getForce(SimulatedContraption contraption, BlockPos localPos, Level level) {
float thrustMagnitude = 500.0f;
return new Vector3f(0, 0, thrustMagnitude);
}
@Override
public Vector3f getTorque(SimulatedContraption contraption, BlockPos localPos, Level level) {
return new Vector3f(0, 0, 0);
}
}
Registering Your Block with NeoForge
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredRegister;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.level.block.Block;
import net.neoforged.neoforge.registries.DeferredHolder;
public class MyModBlocks {
public static final DeferredRegister<Block> BLOCKS =
DeferredRegister.create(BuiltInRegistries.BLOCK, "mymod");
public static final DeferredHolder<Block, MyThrusterBlock> MY_THRUSTER =
BLOCKS.register("my_thruster", () -> new MyThrusterBlock(
Block.Properties.of().strength(2.0f)
));
public static void register(IEventBus eventBus) {
BLOCKS.register(eventBus);
}
}
Accessing a SimulatedContraption at Runtime
import com.simulated.api.contraption.SimulatedContraption;
import com.simulated.api.contraption.SimulatedContraptionHandler;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
public class ContraptionUtils {
public static SimulatedContraption getRiddenContraption(Entity entity) {
return SimulatedContraptionHandler.getContraptionForEntity(entity);
}
public static void applyImpulse(SimulatedContraption contraption, Vec3 impulse) {
contraption.getPhysicsBody().applyImpulse(
new org.joml.Vector3f(
(float) impulse.x,
(float) impulse.y,
(float) impulse.z
)
);
}
}
Listening to Contraption Assembly Events
import com.simulated.api.event.ContraptionAssembleEvent;
import com.simulated.api.event.ContraptionDisassembleEvent;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
@EventBusSubscriber(modid = "mymod")
public class ContraptionEventHandler {
@SubscribeEvent
public static void onAssemble(ContraptionAssembleEvent event) {
SimulatedContraption contraption = event.getContraption();
float customMass = contraption.getMass() * 0.8f;
contraption.setMassOverride(customMass);
System.out.println("Contraption assembled with " +
contraption.getBlocks().size() + " blocks.");
}
@SubscribeEvent
public static void onDisassemble(ContraptionDisassembleEvent event) {
MyContraptionData.remove(event.getContraption().getId());
}
}
Aeronautics — Flight Mechanics
Propeller Configuration (In-Game)
Propellers are directional. Place them facing the direction you want thrust:
- Facing down → upward lift
- Facing back → forward thrust
- Speed (RPM) fed by Create's rotational network controls thrust magnitude
Hot Air Balloon
- Place Balloon Canvas blocks in a dome shape above a heat source
- Connect a Blaze Burner below the opening
- Assemble — the trapped hot air provides buoyancy proportional to enclosed volume
Levitation Rock
- Rare ore providing passive vertical lift
- Useful for lighter-than-air vessels needing no fuel
Flight Control Pattern
public class FlightControllerBlockEntity extends BlockEntity {
public FlightControllerBlockEntity(BlockPos pos, BlockState state) {
super(MyModBlockEntities.FLIGHT_CONTROLLER.get(), pos, state);
}
public void applyPitchInput(SimulatedContraption contraption, float pitchDelta) {
org.joml.Vector3f torque = new org.joml.Vector3f(pitchDelta * 100f, 0, 0);
contraption.getPhysicsBody().applyTorqueImpulse(torque);
}
}
Offroad — Land Vehicles
Wheel Setup
- Place Wheel blocks at the four corners of your vehicle chassis
- Each wheel needs rotational input from Create's shaft network
- Assemble the contraption — wheels automatically detect ground contact
Suspension
Wheels simulate suspension travel. Stiffer suspensions use more rigid Create structural blocks near the wheel mounts.
Steering
Connect Create's Rotation Speed Controller to front wheels to implement steering differentials.
Configuration
Config files generate in config/ on first run:
[physics]
simulationRate = 20
maxContraptionSize = 2048
contraptionCollision = true
[aeronautics]
propellerForceScale = 1.0
hotAirBuoyancyScale = 1.0
[offroad]
wheelTraction = 0.85
maxVehicleSpeed = 40.0
Localization / Translations
The project uses Crowdin for community translations.
Adding a New Language
- Join the Crowdin project
- Translate strings in the web UI
- Translations are automatically pulled into the repo
Adding Keys Programmatically
{
"block.mymod.my_thruster": "Hyperdrive Thruster",
"block.mymod.my_thruster.tooltip": "Applies directional thrust to assembled contraptions.",
"mymod.contraption.overloaded": "Contraption mass exceeds safe limits!"
}
Common Patterns
Pattern 1: Fuel-Gated Thrust
@Override
public Vector3f getForce(SimulatedContraption contraption, BlockPos localPos, Level level) {
BlockEntity adjacent = level.getBlockEntity(localPos.above());
if (adjacent instanceof net.minecraft.world.level.block.entity.ChestBlockEntity chest) {
boolean hasFuel = !chest.isEmpty();
if (hasFuel) {
return new Vector3f(0, 0, 800.0f);
}
}
return new Vector3f(0, 0, 0);
}
Pattern 2: Speed-Based Thrust Scaling
@Override
public Vector3f getForce(SimulatedContraption contraption, BlockPos localPos, Level level) {
float rpm = contraption.getRotationalSpeedAt(localPos);
float thrust = rpm * 2.5f;
return new Vector3f(0, 0, Math.min(thrust, 2000.0f));
}
Pattern 3: Custom Physics Data per Contraption
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class MyContraptionData {
private static final Map<UUID, Float> fuelLevels = new HashMap<>();
public static float getFuel(UUID contraptionId) {
return fuelLevels.getOrDefault(contraptionId, 100.0f);
}
public static void consumeFuel(UUID contraptionId, float amount) {
float current = getFuel(contraptionId);
fuelLevels.put(contraptionId, Math.max(0, current - amount));
}
public static void remove(UUID contraptionId) {
fuelLevels.remove(contraptionId);
}
}
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|
| Contraption won't assemble | Missing dependency mod (Create, Sable) | Verify all deps in mods/ |
| Vehicle sinks through floor | Wheel blocks not receiving rotation | Check shaft connections |
| Extreme jitter / vibration | Too many conflicting force providers | Balance thrust/lift forces; reduce propellerForceScale in config |
| Crash on assembly | Block count exceeds maxContraptionSize | Increase limit in config or reduce vehicle size |
| Translations not showing | Wrong lang file path | Ensure assets/<modid>/lang/en_us.json path is correct |
| Physics desync on multiplayer | High server TPS drop | Lower simulationRate or reduce contraption count |
ClassNotFoundException on IForceProvider | API jar not in classpath | Add simulated-api to build.gradle dependencies |
Dependency Setup in build.gradle
dependencies {
// NeoForge
implementation "net.neoforged:neoforge:${neoforge_version}"
// Create mod (via cursemaven or modrinth maven)
implementation fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:slim") {
transitive = false
}
// Create Simulated API (once published to maven)
implementation "com.aeronautics:simulated-api:${simulated_version}"
}
Community & Support