if(isFile("Add-Ons/System_ReturnToBlockland/server.cs")){ if(!$RTB::RTBR_ServerControl_Hook) { exec("Add-Ons/System_ReturnToBlockland/RTBR_ServerControl_Hook.cs"); } RTB_registerPref("File name","Auto Saver","$AutoSaver::SaveFile","string 255","Server_AutoSaver","autosave",0,0); RTB_registerPref("Loop time","Auto Saver","$AutoSaver::SaveTime","int 1 1440","Server_AutoSaver",30,0,0); RTB_registerPref("Save ownership","Auto Saver","$AutoSaver::SaveOwnership","bool","Server_AutoSaver",1,0,0); RTB_registerPref("Save events","Auto Saver","$AutoSaver::SaveEvents","bool","Server_AutoSaver",1,0,0);}else{ $AutoSaver::SaveFile = "autosave"; $AutoSaver::SaveTime = 30; $AutoSaver::SaveOwnership = 1; $AutoSaver::SaveEvents = 1;}function AutoSaver_saveLoop(){ cancel($AutoSaver::SaveLoop); if($AutoSaver::SaveTime < 1) { $AutoSaver::SaveTime = 1; } if($AutoSaver::SaveFile $= "") { $AutoSaver::SaveFile = "autosave"; } dediSave(fileBase($AutoSaver::SaveFile),$AutoSaver::SaveEvents,$AutoSaver::SaveOwnership); $AutoSaver::SaveLoop = schedule($AutoSaver::SaveTime * 60000,0,"AutoSaver_saveLoop");}//Modified version of Randy's saveBricks functionfunction dediSave(%name, %desc, %events, %ownership){ %path = "saves/" @ MissionInfo.saveName @ "/" @ %name @ ".bls"; if(!isWriteableFileName(%path)) { error("Cannot save to file: ", %path); return; } %file = new FileObject(); %file.openForWrite(%path); %file.writeLine("This is a Blockland save file. You probably shouldn't modify it cause you'll screw it up."); %file.writeLine("1"); // What does this mean? %file.writeLine(%desc); for(%i=0;%i<64;%i++) %file.writeLine(getColorIDTable(%i)); %bricks = 0; for(%i=0;%i<mainBrickGroup.getCount();%i++) %bricks += mainBrickGroup.getObject(%i).getCount(); %file.writeLine("Linecount " @ %bricks); for(%d=0;%d<2;%d++) { for(%i=0;%i<mainBrickGroup.getCount();%i++) { %group = mainBrickGroup.getObject(%i); for(%a=0;%a<%group.getCount();%a++) { %brick = %group.getObject(%a); if(!(%d ^ %brick.isBasePlate())) continue; if(%brick.getDataBlock().hasPrint) { %texture = getPrintTexture(%brick.getPrintId()); %path = filePath(%texture); %underscorePos = strPos(%path, "_"); %name = getSubStr(%path, %underscorePos + 1, strPos(%path, "_", 14) - 14) @ "/" @ fileBase(%texture); if($printNameTable[%name] !$= "") { %print = %name; } } %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(%ownership && %brick.isBasePlate() && !$Server::LAN) %file.writeLine("+-OWNER " @ getBrickGroupFromObject(%brick).bl_id); if(%events) { if(%brick.getName() !$= "") %file.writeLine("+-NTOBJECTNAME " @ %brick.getName()); for(%b=0;%b<%brick.numEvents;%b++) { %targetClass = %brick.eventTargetIdx[%b] >= 0 ? getWord(getField($InputEvent_TargetListfxDTSBrick_[%brick.eventInputIdx[%b]], %brick.eventTargetIdx[%b]), 1) : "fxDtsBrick"; %paramList = $OutputEvent_parameterList[%targetClass, %brick.eventOutputIdx[%b]]; %params = ""; for(%c=0;%c<4;%c++) { if(firstWord(getField(%paramList, %c)) $= "dataBlock" && isObject(%brick.eventOutputParameter[%b, %c + 1])) %params = %params TAB %brick.eventOutputParameter[%b, %c + 1]; else %params = %params TAB %brick.eventOutputParameter[%b, %c + 1]; } %file.writeLine("+-EVENT" TAB %b TAB %brick.eventEnabled[%b] TAB %brick.eventInput[%b] TAB %brick.eventDelay[%b] TAB %brick.eventTarget[%b] TAB %brick.eventNT[%b] TAB %brick.eventOutput[%b] @ %params); } } if(isObject(%brick.emitter)) %file.writeLine("+-EMITTER " @ %brick.emitter.emitter.uiName @ "\" " @ %brick.emitterDirection); if(%brick.getLightID() >= 0) %file.writeLine("+-LIGHT " @ %brick.getLightID().getDataBlock().uiName @ "\" "); // Not sure if something else comes after the name 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 @ "\" "); // Not sure if something else comes after the name if(isObject(%brick.vehicleSpawnMarker)) %file.writeLine("+-VEHICLE " @ %brick.vehicleSpawnMarker.uiName @ "\" " @ %brick.reColorVehicle); } } } %file.close(); %file.delete(); messageAll('',"Auto Saver: "@%bricks@" bricks have been successfully saved.");}function serverCmdStartAutoSaver(%client){ if(%client.isSuperAdmin) { cancel($AutoSaver::SaveLoop); $AutoSaver::SaveLoop = schedule($AutoSaver::SaveTime * 60000,0,"AutoSaver_saveLoop"); messageAll('',%client.getPlayerName() @ "\c6 has started the auto saver."); } else { messageClient(%client,'',"\c6Only \c0Super Admins\c6 may start the auto saver."); }}function serverCmdStopAutoSaver(%client){ if(%client.isSuperAdmin) { cancel($AutoSaver::SaveLoop); messageAll('',%client.getPlayerName() @ "\c6 has stopped the auto saver."); } else { messageClient(%client,'',"\c6Only \c0Super Admins\c6 may stop the auto saver."); }}QuoteYes, I do have the save ownership box checked in server control.
Yes, I do have the save ownership box checked in server control.
It appears to only save ownership for bricks that are baseplates (because all bricks on a baseplate's owners are automatically set to owner of their baseplate). I can make an update to this soon.
This is correct behavior to avoid huge filesizes. In this case, a brick being a baseplate only means that it isn't being supported by another brick.
If it is not possible then how can you make it so it saves the brick's ownership that is touching the ground and the bricks ontop are the same ownership?