Hello everyone!

I'm in the midst of developing a low-poly 3D MMORPG ⚔️ and have successfully tackled various elements like networking, multiplayer functionality, and database management. However, I've hit a stumbling block with one aspect of my game's design that currently feels a bit makeshift, and I'd love your insights on a more elegant solution.

My game features diverse environments, such as wilderness areas, urban settings, interiors of buildings, and dungeons. Players can transition between these areas through specific teleportation points. For example, stepping into a crypt's entrance will transport the player to the dungeon's starting point. On the server side, I've structured the map as a single extensive scene tree with all potential locations pre-loaded and spaced out to prevent visibility from one to another, reminiscent of how Ultima Online managed its map.

However, this approach presents three significant challenges:

  • Performance is a concern since the entire map is loaded continuously, despite the absence of players in most areas.
  • The use of directional lighting affects the entire map. To simulate darkness for underground locations, I've had to resort to shadow-only meshes to act as roofs, given the game's top-down perspective which ordinarily doesn't include roofs.
  • Instancing is currently unfeasible. I aim to allow multiple player groups to navigate the same dungeon simultaneously in their own instances, without interaction, enabling, for instance, competitive speedruns through the dungeon.

Here's my core question:
Is there a more efficient method to load maps or scenes solely for the areas occupied by players? Or a way to load scenes in such a manner that they don't interact with others?

Essentially, I'm exploring the possibility of adding a 'fourth dimension' to space within the game. This would allow players to exist at the same Vector3 coordinates but, based on an additional variable, either interact with each other or remain completely unaware of each other's presence.

Any advice or guidance on this matter would be greatly appreciated!

    Skipperro On the server side, I've structured the map as a single extensive scene tree with all potential locations pre-loaded and spaced out to prevent visibility from one to another

    Really not clear — why is it necessary to load the entire map and not just the required areas like scenes?

    This is not exactly what is required, but perhaps it will inspire the right solutions Zone Loading System.

    Skipperro Here's my core question:
    Is there a more efficient method to load maps or scenes solely for the areas occupied by players? Or a way to load scenes in such a manner that they don't interact with others?

    When engine developers talk about the current engine limitations as known issues asset streaming is often brought up. This is the sort of area where on demand asset streaming would be an ideal solution. But that's a thing usually utilized more for client side, I'm not entirely sure why you'd need it for server except for perhaps physics events that you need to happen in an authenticated fashion on the server side so all players would have the same outcomes I suppose. But even then, implementing a more deterministic, custom physics solver on client-side might be a solution too.

    Client side is not the issue - for the client I can load just one scene and client will see only that.
    My problem is with the server - I run physic only on the server to prevent cheating. Clients just get updates for the current state of things and can have authority over not important stuff - like play animations, have limited control over own camera etc. I can't assume that information about physics events send by clients are trustworthy.

    So on the server I have to have every map-piece that all the clients are exploring. If I want two players to explore same map, but each one in their own instance, and I put both of those instances in the same place, players won't be able to see each other, but whole physics interaction will still happen on the server and will affect both client instances.

    @Tomcat I have something like Zone Loading System implemented, but this only partially solves performance concerns, but it still won't do anything for me in terms on instancing same parts of map for different players to play in their own small single-player "bubble" inside of MMO.

      Skipperro My problem is with the server - I run physic only on the server to prevent cheating.

      So on the server I have to have every map-piece that all the clients are exploring.

      I misunderstood right away — do you want to lighten the server? Well, that's the great problem. As far as I know there is no universal solution — they mostly try to shift the calculations to the client, but if it does not suit you (the problem of cheaters really exists), then, for now, only server enhancement is known.

        Tomcat

        No, no... maybe I made a mistake by putting performance as a first issue.
        I can deal with performance, the game is not so demanding that I can't have whole map loaded on the server. I have nice hardware for a server, so it's not as important as the other issue.

        My main concern is that I want to have instances of the same map available for different group of players so they don't collide with each other and server have to have all the instances loaded somewhere.
        Currently I can achieve this only by designating specific coordinates for part of the map, like in (0, 0, 0) there will be one part of the map, and way over at (1000, 0, 0) there will be another part with same map. Nobody can see them and on the client they are not even loaded.

        But the fact remains, that they are still on the same map, so I don't find it very... elegant.
        I was just wondering if there is a better solution for that. And if I gain some performance in the process - that's cool.