//***************************************************
//* Save Bricks
//***************************************************
function RTB_Hosting::saveBricks(%this,%filename)
{
    if(%this.saving)
        return;
    %bricks = getBrickCount(); 
    if(%bricks <= 0)
        return;
    if($RTBHosting::AnnounceSave)
        messageAll('', 'Saving bricks. Please wait.');
   
    %this.saveBricks = 0;
    %this.saveStart = $Sim::Time;
    %this.saveFilename = %filename;
    %this.saving = true;
    %this.savePath = "saves/" @ %filename;
      
    %file = %this.saveFile = new FileObject();
    %file.openForWrite(%this.savePath);
    %file.writeLine("This is a Blockland save file. You probably shouldn't modify it cause you'll screw it up.");
    %file.writeLine("1");
    %file.writeLine("RTB Hosting Automated Save File - Taken at " @ getDateTime());
   
    for(%i=0;%i<64;%i++)
        %file.writeLine(getColorIDTable(%i));
   
    %file.writeLine("Linecount TBD");
    %this._brickGroupDig(0);
}
//- RTB_Hosting::_saveEnd (called when saving is complete)
function RTB_Hosting::_saveEnd(%this)
{
    %this.saveFile.close();
    %this.saveFile.delete();
    %this.saving = false;
   
    %diff = mFloatLength($Sim::Time - %this.saveStart,2);
    if(getSubStr(%diff,0,1) $= "-")
        %diff = "0.00";
   
    if($RTBHosting::AnnounceSave)
        messageAll('', '%1 bricks saved in %2', %this.saveBricks, getTimeString(%diff));
    %this.commClient.send("packSave\t" @ %this.saveFilename @ "\r\n");
}
//- RTB_Hosting::_writeBrick (writes data for a single brick to file)
function RTB_Hosting::_writeBrick(%this,%brick)
{
    RTB_Hosting.saveBricks++;
   
    %print = (%brick.getDataBlock().hasPrint) ? getPrintTexture(%brick.getPrintID()) : "";
   
    %file = %this.saveFile;
    %file.writeLine(%brick.getDataBlock().uiName @ "\" " @ %brick.getPosition() SPC %brick.getAngleID() SPC %brick.isBasePlate() SPC %brick.getColorID() SPC %print SPC %brick.getColorFXID() SPC %brick.getShapeFXID() SPC %brick.isRayCasting() SPC %brick.isColliding() SPC %brick.isRendering());
   
    if(%brick.isBasePlate())
        %file.writeLine("+-OWNER " @ getBrickGroupFromObject(%brick).bl_id);
    if(%brick.getName() !$= "")
        %file.writeLine("+-NTOBJECTNAME " @ %brick.getName());
    if(isObject(%brick.emitter))
        %file.writeLine("+-EMITTER " @ %brick.emitter.emitter.uiName @ "\" " @ %brick.emitterDirection);
    if(%brick.getLightID() >= 0)
        %file.writeLine("+-LIGHT " @ %brick.getLightID().getDataBlock().uiName @ "\" ");
    if(isObject(%brick.item))
        %file.writeLine("+-ITEM " @ %brick.item.getDataBlock().uiName @ "\" " @ %brick.itemPosition SPC %brick.itemDirection SPC %brick.itemRespawnTime);
    if(isObject(%brick.audioEmitter))
        %file.writeLine("+-AUDIOEMITTER " @ %brick.audioEmitter.getProfileID().uiName @ "\" ");
    if(isObject(%brick.vehicleSpawnMarker))
        %file.writeLine("+-VEHICLE " @  %brick.vehicleSpawnMarker.uiName @ "\" " @ %brick.reColorVehicle);
      
    for(%i=0;%i<%brick.numEvents;%i++)
    {
        %targetClass = %brick.eventTargetIdx[%i] >= 0 ? getWord(getField($InputEvent_TargetListfxDTSBrick_[%brick.eventInputIdx[%i]], %brick.eventTargetIdx[%i]), 1) : "fxDtsBrick";
        %paramList = $OutputEvent_parameterList[%targetClass, %brick.eventOutputIdx[%i]];
        %params = "";
        for(%j=0;%j<getFieldCount(%paramList);%j++)
        {
            if(firstWord(getField(%paramList,%j)) $= "dataBlock" && %brick.eventOutputParameter[%i,%j+1] >= 0)
                %params = %params TAB %brick.eventOutputParameter[%i, %j+1].getName();
            else
                %params = %params TAB %brick.eventOutputParameter[%i, %j+1];
        }
        %file.writeLine("+-EVENT" TAB %i TAB %brick.eventEnabled[%i] TAB %brick.eventInput[%i] TAB %brick.eventDelay[%i] TAB %brick.eventTarget[%i] TAB %brick.eventNT[%i] TAB %brick.eventOutput[%i] @ %params);
    }
}
//- RTB_Hosting::_brickGroupDig (digs through brick groups)
function RTB_Hosting::_brickGroupDig(%this,%index)
{
    if(%index >= mainBrickGroup.getCount())
    {
        %this._saveEnd();
        return;
    }
    %this._brickDig(mainBrickGroup.getObject(%index),0,%index,%count);
}
//- RTB_Hosting::_brickDig (recurses through a brick group in a semi-non-blocking way)
function RTB_Hosting::_brickDig(%this,%group,%index,%childIndex,%count)
{
    if(%index >= %group.getCount())
    {
        %this._brickGroupDig(%childIndex++);
        return;
    }
    if(!isObject(%this.saveFile))
    {
        %this.saveFile = new FileObject();
        %this.saveFile.openForAppend(%this.savePath);
    }
    %this._writeBrick(%group.getObject(%index));
   
    if(%count >= 500)
    {
        %this.saveFile.close();
        %this.saveFile.delete();
        %this.schedule(100,"_brickDig",%group,%index++,%childIndex,0);
    }
    else
        %this._brickDig(%group,%index++,%childIndex,%count++);
}
alternatively here is the code from the rtb hosting auto saver