//***************************************************
//* 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