Responding to this ridiculous post to pay it forward for the people who have helped me (CW and Aren). Can't answer everything though...
I think this would allow me to deal with AI-driven avatars as well, but my question is, where do I put that logic, as tnetserver does not seem to simulate a world?
Do I run a unity client in a VM with some kind of account with special permissions on tnet?
Run AI logic on the channel host's client. This includes spawning things that you only want spawned once.
if(TNManager.isHosting) // AI logic
How does the lobby work?
The server's lobby keeps a list of available server instances. You open a server instance and connect to the lobby server simultaneously.
/// <summary>
/// Start a local game server and connect to a remote lobby server.
/// </summary>
static public bool Start (int tcpPort, int udpPort, string fileName, Type type, IPEndPoint remoteLobby, bool openPort = true)
To make a list available to clients, you will have to build a lobby UI that keeps track of the available server instances. Based on this post, you may as well buy the Starlink package. It has everything you need to get a lobby up and running relatively quickly. I purchased it and it's working out well for me.
Can it redirect to another IP?
The lobby can contain multiple server 'buttons' that allow you to connect to the server of your choice.
Can the lobby server instruct the client whom to connect to next already, or do I have to write additional classes for tnet server to deal with routing?
AFAIK you will have to keep track of whatever metrics determine which server is next to allow players, and then you would have to send a function to the clients that tells them which IP to connect to when they're ready to connect. (assuming you don't have a server buttons lobby).
To keep with the idea of server authority, I'll be writing the input scripts separately from the scripts actually pulling the strings inside the spawned avatar, syncing input frequently -- but what is the best practice to sync the avatar's state? Do I sync the character controller somehow? The animator? The 'shadow spine' should be enough for player controlled characters in first person along with syncing some animation booleans of which state they're in (such as reloading a weapon); but there's also a dead state where the player is a disembodied camera that can wander for a while before respawning, leaving the avatar behind as a ragdoll. At a high level, what are the tnet functions I'd be doing for handling player characters like this?
Go through all of the source code of the included tutorials. Multiple times if you have to. Everything you need to know for these questions is available in the examples.
What about entering a vehicle? What's the best practice to reparent a player avatar as a child of the vehicle? With unet this proved extremely hard because initially I had it set up so players and vehicles both had networkidentities.
Add TNObject script to any objects you want to play with over the network. Remote function calls and remote creation calls will probably be enough to get this done.
I haven't yet started the conversion over to TNET3 so I'm trying to figure out the recommended way to do things before diving in and wasting a whole bunch of time spinning my wheels.
Connect to a LAN server. Connect to a remove server. Create a server instance with a PC. Now that you know how to do those... Each server instance can contain any number of channels. Channels can be created within the instance on the fly. In order to create a new channel, the client must already be connected to a server instance. Each channel has a host (TNManager.isHosting) and that's how you decide who runs AI. Go through the examples 100x so you completely understand RFCs and RCCs in this system. They are amazingly simple once you understand them.
The channel system seems like it will work pretty well for my large terrain, splitting areas of concern up and allowing the use of multiple scenes in unity (since punching a hole in a terrain's so hard, I made a crummy model of an railway entrance with a barred gate, jiggling the lock will trigger the scene+channel change, I imagine) but I'm not exactly understanding a good strategy towards growing even bigger. As players do their thing, resources will spawn, things will be crafted, and lots and lots of data has to be stored.
Two questions to ask yourself: "Do I want the data stored locally on their PC or the server?" and "Why not try looking into datanodes?"
This post really looks like you're getting baked out of your mind, coming up with a thousand ideas at once, and then praying that there's a solution out there that will take care of all this shit at once. You need to write a design document and stick to it. This is insanity.