In response to The Magic Man
Also, if I'm not mistaken, Minecraft uses Diamond Square, which makes it very easy to generate small sections of a world and seamlessly put them together.

Minecraft is slightly more complicated than that, because you can't describe minecraft maps as a single 2D array of Z-values. There are arches, caves, etc. Caves can stretch across multiple chunks. But I wouldn't be surprised if diamond-square was part of the array.

and yes, it'd be tricky to chunk up a BYOND world properly, particularly a multiplayer one. But it's absolutely doable. And 'seamless' is an analogue scale, not digital - Morrowind puts towns in the world map, Oblivion and Skyrim don't... but Morrowind also has loading screens at chunk edges that Oblivion and Skyrim sometimes don't. Tradeoffs can be made.
In response to Jp
Morrowind didn't actually have loading screens on the world map. If your computer was slow, or you played a console version it would load every now and then though, but on a decent computer you wouldn't be effected by the world loading/unloading around you. Oblivion and Skyrim were the exact same (though technological advances would make it less obvious).
In response to The Magic Man
I literally played morrowind 2 hours ago. If you crossed a chunk boundary, sometimes the game would pause and you'd get a loading bar down the bottom. For example, this video: http://www.youtube.com/watch?v=Whz-LQlbI-U

Oblivion and Skyrim do a better job of streaming the load in the background - you don't run into a loading bar.
Taitz, is this a theoretical system or something you've actually created?
In response to FIREking
It is actually something I created and am using in Evol.
I don't know if you care to share any more insight on this subject, but I'm trying to find a way to handle a strict map size... but its currently not fast enough

I need 2000x2000x5 but everything I've tried (including 100x100 chunk saving as you move around) is fast enough.

Any ideas?
In response to FIREking
Actually, could you elaborate a bit more on what you want to do?
Forgetting about mobs and objects, because those are very easy to figure out in terms of loading only what you need...

I'm trying to load and save a 2000x2000x5 map. This size map is only supported at run time *you can't make a 2000x2000 map in dmm*

The system would need to be able to load a 100x100 cell pretty much within an instant, and then we need to be able to load ~4 cells at once (for corners cases).

All I'm saving about the turfs I wish to load is x,y,z and type as text.
Ok, I get it. But do you really need to load 100x100 chunks at a time? You can go with a smaller size based on your view size, for example using a relatively smaller one 25x25 would be much faster. Even if you use smaller ones you wouldn't actually detect the difference in loading.
25x25 would probably work
Thing is, you don't really need to load things you do not see. 10000 tiles versus 625 tiles makes a large difference.
The smaller you're making the size though, the less impactful each load will be but the more often you're loading, with more and more clients that could get quite intensive.
Here's the implementatoin I whipped up dirty and quick:

#define BLOCK_WIDTH 25
#define BLOCK_HEIGHT 25

var/list/blocks_loaded = list()
var/list/blocks_changed = list()

turf/New()
..()
if(world.time > 0)
post_change()

turf/Del()
..()
if(world.time > 0)
post_change()

proc/get_block_coord_x(n as num)
return round((n - 1) / BLOCK_WIDTH) + 1

proc/get_block_coord_y(n as num)
return round((n - 1) / BLOCK_HEIGHT) + 1

turf/proc/post_change()
var/block_x = get_block_coord_x(src.x)
var/block_y = get_block_coord_y(src.y)

blocks_changed["[block_x],[block_y]"] = 1

proc/save_world()

for(var/i in blocks_changed)
var/block_x = text2num(copytext(i, 1, findtext(i, ",")))
var/block_y = text2num(copytext(i, findtext(i, ",") + 1))

save_block(1 + block_x * BLOCK_WIDTH - BLOCK_WIDTH, 1 + block_y * BLOCK_HEIGHT - BLOCK_HEIGHT, BLOCK_WIDTH, BLOCK_HEIGHT)

proc/check_load(x, y)
var/block_x = get_block_coord_x(x)
var/block_y = get_block_coord_y(y)

if(block_x < 1) return
if(block_y < 1) return
if(block_x > world.maxx) return
if(block_y > world.maxy) return

load_block((block_x - 1) * BLOCK_WIDTH + 1, (block_y - 1) * BLOCK_WIDTH + 1)

proc/save_block(x, y, w, h)
var/savefile/f = new("blocks/world_[x],[y].sav")

var/list/l = list()

var/list/turfs = block(locate(x, y, 1), locate(x + w - 1, y + h - 1, 5))

for(var/turf/t in turfs)
if(t.type != /turf)
l += "x=[t.x];y=[t.y];z=[t.z];t=[t.type]"

f << l

proc/load_block(x, y)
if(blocks_loaded["[x],[y]"]) return
if(!fexists("blocks/world_[x],[y].sav")) return

var/savefile/f = new("blocks/world_[x],[y].sav")

var/list/l

f >> l

for(var/t in l)
var/params = params2list(t)
var/type_path = text2path(params["t"])

new type_path(locate(text2num(params["x"]), text2num(params["y"]), text2num(params["z"])))

blocks_loaded["[x],[y]"] = 1

world/Del()
save_world()
..()

mob/verb/test_save()
save_world()


You just call check_load(x,y) with your coordinates and the code does the rest.
But that doesn't unload the old "blocks", thus leading to the initial problem.
In response to Rushnut
Well for my case, I don't care if it gets unloaded.
Because you use the world as a huge layout instead of using individual map levels unloading the maps won't serve a purpose and would actually take more resources to do in the first place, so after the initial loading you don't need it anymore.
Page: 1 2 3