This is an idea that's been stuck in my mind for a while now, so I figured I'd make this thread to get it out. Perhaps this will go somewhere, perhaps it will not, but at the very least I'll have given this idea space somewhere that isn't my brain.
Transporting things around in Minecraft has, in my opinion (keyword being opinion, here!), always been either relatively boring, inconvenient, or limited.
On the boring end of the spectrum are pipes and conveyor belts. These are, admittedly, great at transporting things from one place to another, but they're also… quite boring, in my opinion. They're not particularly pretty, definitely more utility-focused.
The limited options, meanwhile, are things like vanilla minecarts or hoppers. They can get stuff done, sure, but the things they get done are either very simple or need to be incredibly complicated. And finally, the inconvenient options; mods like Traincraft, Immersive Railroading, and anything else that adds big, pretty transport systems. Sure, they look incredibly good, but their size makes it hard to use them in survival mode and across short distances.
So here's my idea, designed solely around what I think looks good/sounds cool, and totally stolen from other games (Yes, this is basically OpenTTD in Minecraft. Yes, I think it would be cool); Trains (with room for other modes of transport later).
Now, you may be thinking "But wait, you just said that big trains are inconvenient?". This is correct, but I'm not talking about big trains, I'm talking about tiny trains. Small enough to fit in gaps that are 1 or 2 blocks tall, on tracks that fit in 1 block wide gaps - perhaps even two tracks per block. So give me a chance to explain before thinking thoughts I think you'd be thinking, take the time to listen to my ideas that I totally have not stolen from other games.
At the core of this concept, for now, is the miniature train. These are small things, running on equally small tracks, transporting cargos in carriages using the Rule of Cool™ to explain why such small things can carry such big loads. Detailed information in the spoiler below
To start, you need tracks to run your trains on. Vanilla minecart tracks won't work; they're too wide to fit anything without it looking weirdly tall, so a special type of tracks is needed. Made at a special crafting station using iron (or, if provided by a mod, steel can be used to provide more track pieces for the same amount of ingots put in). These track pieces come in various shapes and sizes, from boring straight tiles to sloped tiles (going up half a block at a time sounds good to me), curved tiles, diagonal tiles, switches, etc.
But just tracks alone isn't enough; you need three more things; stations to load and unload trains, signals to keep your trains from crashing into each other, and a depot to build your trains. Let's start with the depot.
The depot is the core of your railway network, as this is where you buy your trains. That's right; buy, not build. Every player would have a 'wallet' that tracks how much money they have - this is not an item you can lose, but rather something that's just tracked as you play. There are three ways to obtain money: trading in gold/emeralds/diamonds/etc at a special Market, transporting cargo other players pay you to transport (more on that later) and transporting a special 'passengers' cargo from randomly-generating 'towns' (again, more on that later).
Once you have money, you can go to a depot, and put together your train, spending money on locomotives and attaching wagons to them. Once you've put together your train, you use a special tool to give them a schedule. A schedule tells your train what to do, and you can either just mark two stations (one for loading, one for unloading) and let the train figure out the path to take on it's own, or you mark out the exact path you want it to take. Once you've created your schedule, you press a 'go' button, and your train will head on it's way! Or, at least, it will try to.
The first thing a train will do is check if there is a path to it's destination, not accounting for obstacles on the way like other trains. It just wants to know if it can get to it's destination. If it cannot, it will throw an error and not even leave the depot. If it can, it will then try and find the shortest path to it's destination - again ignoring obstacles - before trying to reserve a path to it's destination, or to the first signal it finds on the shortest path to it's destination, before heading on it's way, re-reserving a path at each signal it comes across in case a faster route becomes available (like due to another train getting out of the way).
This is why signals come in handy. If you have just one train on one railway, you never need to worry about it being able to reserve a path or not. If you have multiple trains, one will reserve a path, and the others will not be able to travel across it. Signals allow a train to reserve multiple, shorter paths instead of one long one, allowing a more densely-packed network.
Next up, the stations. These are an equally important part of your network, and serve as an alternative to using hoppers and such. Stations can be built next to 'platform' track tiles. When a train arrives at a platform in it's schedule, it will stop there until it has either unloaded all it's cargo - if given an 'unload' order - or loaded all cargo it can carry of the type it's been configured to carry (can be as specific as 'gold ingots' or as generic as 'blocks') from station tiles or hoppers connected to the platform tiles. Station tiles, therefore, simply function as massive chests that multiple trains can access at once, but they also serve three special functions.
One, they allow trains to 'flip' 180 degrees to head back the way they came.
Two, other players are able to put in 'waybills' into a special 'trade hub' part of the station (trade hubs belong to the player who placed them, but can be inspected by anyone to see what kind of waybills there are). These are a collection of items, a destination, and a monetary sum. These can function in two ways (for these examples, A is the person creating the waybill, B is the person providing the transport).
Function one has A put in a destination, up to a small chest worth of items, and a sum of money, then put this bundle in a station. If Player B has a train set to 'waybill pickup' arriving at this station, with the waybill's destination set as 'unload', the train will load the contents of this waybill, then unload them as a 'delivery' at the 'trade hub' of the destination station. Only once the delivery is completed is money withdrawn from A's wallet and provided to B's wallet.
Function two has A put in a sum of money and a list of items they want. If B has a train set to 'waybill delivery' arriving at this station, carrying the desired items, then the train will unload them as a 'delivery' at the 'trade hub' of this station, before the money is withdrawn from A's wallet and added to B's wallet.
The third special function of the stations rely on special 'town' structures. If a 'town' block is next to a station, it will generate a special 'passengers' cargo, at a rate dependent on how many 'house' blocks there are nearby. Passengers will board the first train that is set to carry them that has room for them, and will disembark at the next station that also has a ' town' block connected to it, providing the player transporting them with money depending on how far they travelled (as the crow flies) and how quickly the journey was made.
So yeah, that's my idea. It's complicated, and I'd need other people's help to make this an actual thing, but I managed to write out my ideas for other people to read, so I'm happy (If there are people interested in helping make this a reality who actually CAN help make this a reality for Forge, preferably 1.16.5, please let me know!).
Tl;dr: use tiny trains instead of pipes or big trains to transport stuff from your mine to your base, or let other players pay you to transport their stuff, or just make a pretty railway network that fits within a reasonable amount of space.
More detailed info for mod devs:
To start with, tracks. They'd either be made in a special workbench - the 'Track Forge', where you can select what 'shape' you want (switch, straight, curve, etc) and then spend resources to craft them, or you make a special tool that can change what shape you build on the fly, spending metal as you go (similiar to what Immersive Railroading) does. Ideally the tracks would be 3D models, which I'll make sure to provide, along with any other 3D models. Each block can only have one track on it, similar to regular MC tracks, so no need to worry about complicated 'two tracks per tile' things.
Next up, trains. Trains are built from a special 'depot' track piece, where you can put together 'consists' by first buying a locomotive and then carriages. Ideally, the UI would be a little like OpenTTD's buymenu (but without a lot of the excess stuff we won't need), since it's reasonably simple, but if you have a better idea then go right ahead. The main important part is that you can custom-build your trains as you see fit.
Trains and Wagons should be 3D Models, but they can be simple rectangles at first. I'll see about providing better 3D models later on.
Locomotives and wagons have their own stats, ideally read from .json files so they can be easily customized through resource packs in the future, here's what I've been thinking they should get so far:
Cost (not used in Phase A): How much money this locomotive costs to buy. Should be a number
Speed: How fast this train can go at maximum speed. Should be a number
Capacity: How many item slots this locomotive has for carrying things. Should be a number
Carrytype: What kind of things this locomotive can carry. Should be an array, and can accept either specific things (like minecraft:coal), forge oredict tags, or 'blocks'/'items'/'liquids'.
Model: Name of the .obj file that holds the train's 3D Model
Idle SFX: Name of the soundfile that gets played while the train is not moving.
Whistle SFX: Name of the soundfile that gets played when the train 'whistles' - happens when leaving a station, or passes a 'whistle' signal/sign.
Slow-Speed SFX: Name of the soundfile that gets played when the train is moving at less than 40% of it's maximum speed.
Medium-Speed SFX: Name of the soundfile that gets played when the train is moving at less than 60% of it's maximum speed.
High-Speed SFX: Name of the soundfile that gets played when the train is moving at 60% or more of it's maximum speed.
Cost (not used in Phase A): How much money this wagon costs to buy. Should be a number
Speed: How fast this wagon can go at maximum speed. Should be a number
Capacity: How many item slots this wagon has for carrying things. Should be a number
Carrytype: What kind of things this wagon can carry. Should be an array, and can accept either specific things (like minecraft:coal), forge oredict tags, or 'blocks'/'items'/'liquids'.
Model: Name of the .obj file that holds the wagon's 3D Model
Of course, with trains should come pathfinding and such, as mentioned in the thread.
Signals come in two types, and are either crafted from another special workbench - the 'Trackside Workbench' or with another special tool, similar to tracks. These can also be used to make other trackside things, listed below:
- Path Signal: When a train comes in contact with a Path Signal, they try to reserve a path to the next signal on their route, or to their destination itself, whichever comes first. If they can reserve a path that does not cross any reserved tiles or other trains, they 'lock' their reservation (so no other train can claim it) and begin driving. If not, they stop. Path Signals only apply if a train approaches from the side the signal is facing.
- One-Way Path Signal: Similar to a regular Path Signal, but trains are not allowed to pass it from the rear.
- Whistle Sign: A very simple trackside feature. If a train passes it from the direction it is facing, it will play the whistle sound effect.
- Speed Sign: A special sign that can be interacted with to set a speed. If a train passes it from the direction it is facing, it will only be allowed to travel at the indicated speed or it's maximum speed, whichever is lower. If the set speed is 0, then the train is allowed to move at maximum speed again.
Next up are orders. To give a train orders, you right click on it to open a special menu. This shows you what the train is currently doing (stopped, waiting for signal, loading, unloading, travelling at X speed), and has a few buttons: Start/Stop, Show Inventory, and Configure Orders. Clicking the 'Configure Orders' button gives you a special item that allows you to set a train's orders. Right-clicking on a station allows you to tell the train to 'load', 'unload', or simply 'wait', and right-clicking on the track allows you to add specific locations the train needs to go to on it's way to it's destination. Once done, you right-click the train with the item to assign the orders to the train.
Without orders, a train is not allowed to move. With orders, it will try to navigate to the next point in it's orders list. Once it reaches there, it either stops if there's nothing else in the order list, or moves on to the next order (after loading/unloading if it's a station).
Stations, meanwhile, should function as mentioned in the thread. Platform tiles allow trains to stop and unload their cargo into connected station tiles, or load it from connected station tiles, which can then be manipulated via hoppers and such.
Phase B and beyond:
Once this all is made functional, Phase B and beyond can begin. From this point onwards, things are a little less fleshed-out, but I have several ideas for features that might be neat to include at some point, which I'll list below. We can decide once Phase A is done which features should go in B, which in C, which in a hypothetical D, and which are just not possible.
Feature ideas, with the headers being in descending order of importance to me:
Features I would really like to have:
- Money. Can be initially gained from selling certain items at a 'market'. Players have a virtual wallet that keeps track of their money. Money can be converted into items in the form of coins, which can be converted back into money.
- Waybills. Allow players to make orders for other players to fulfil in exchange for money.
- Support for resource packs. Allow players to make their own resource packs to add trains like in Immersive Railroading.
- Multipart Vehicles. Add three fields to a train's .json file: 'Next Part', 'Buyable' and 'Can connect'. 'Buyable' indicates whether or not this vehicle should show up on it's own. 'Can connect' indicates whether or not other locomotives/wagons are allowed to come behind this vehicle. 'Next Part' indicates that, once this locomotive/engine is bought, the player also automatically gets the locomotive/wagon named under 'Next Part' (and any vehicles it mentions). These cannot be decoupled, and allow things like steam locomotives with mandatory tenders.
Features that would be nice to have:
- Players being able to ride trains. Probably move their camera down and make their model invisible so they can ride through small tunnels.
- A config option to allow trains to require fuel (defaults to off), which would add the following:
The .json file for locomotives gets two added fields:Fuel: There are several options here. 'Wood' would allow anything forge counts as wood as fuel, 'Coal' would allow it to use anything forge counts as coal as fuel, 'Diesel' would allow it to use petrol and such as fuel. 'Power' would allow it to draw on a supply of Fe from Immersive Engineering and such as fuel.
Burntime: How long a vehicle can last on one unit of it's fuel. If a vehicle runs out of fuel, it stops, and will have to be manually refuelled by a player.
Locomotives can get their fuel by taking it from a special type of block that can be connected to stations, and is stored within a separate inventory, accessible from the right-click menu. If a train runs on fe, it instead drains power from the tracks directly. A player can place a 'powerstation' next to a station or tracks, and supply it with fe. All connected tracks then share that power supply and trains can drain from it as they go.
Features that would be cool to have:
- Players being able to 'control' trains by riding the front locomotive.
- Trains being able to couple and uncouple wagons on the go in some way?
- Different railtypes. Adds a field to the .json of locomotive and wagons that is an array of valid 'railtypes' (Standard Gauge, Narrow Gauge, Electrified, 3rd Rail, etc). Vehicles can only be built from depots connected to valid railtypes, and vehicles can never enter track tiles of an invalid railtype, to the point where they are prevented from pathing onto there.
Features that would be neat to have:
- Randomly generating 'cities' that can be connected with stations. They generate 'passengers' that generate money when delivered to other stations.
- Maybe some way to give weights to cargo and pulling strength to locomotives? Might be too complicated.