Author Topic: Auto Saver  (Read 6179 times)

Alright, fixed this. One problem though... If I make the saving interval time over 20 minutes it rapidly saves every second. Does anyone know how to fix this?
Quote
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 function
function 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.");
   }
}
« Last Edit: January 23, 2010, 06:48:10 PM by Wicked »