Exemple #1
0
        void HandleOther(Player p, string[] parts, int offsetIndex)
        {
            CopyArgs cArgs = new CopyArgs();

            cArgs.offsetIndex = offsetIndex;

            for (int i = 0; i < parts.Length; i++)
            {
                string opt = parts[i];
                if (opt.CaselessEq("cut"))
                {
                    cArgs.cut = true;
                }
                else if (opt.CaselessEq("air"))
                {
                    cArgs.air = true;
                }
                else if (opt.Length > 0)
                {
                    Help(p); return;
                }
            }

            if (!p.Ignores.DrawOutput || !p.Supports(CpeExt.MessageTypes))
            {
                p.Message("Place or break two blocks to determine the edges.");
            }
            int marks = cArgs.offsetIndex != -1 ? 3 : 2;

            p.MakeSelection(marks, "Selecting region for &SCopy", cArgs, DoCopy, DoCopyMark);
        }
Exemple #2
0
        void HandleOther(Player p, string[] parts, int offsetIndex)
        {
            CopyArgs cArgs = new CopyArgs();

            cArgs.offsetIndex = offsetIndex;

            for (int i = 0; i < parts.Length; i++)
            {
                string opt = parts[i];
                if (opt.CaselessEq("cut"))
                {
                    cArgs.cut = true;
                }
                else if (opt.CaselessEq("air"))
                {
                    cArgs.air = true;
                }
                else if (opt.Length > 0)
                {
                    Help(p);
                }
            }

            Player.Message(p, "Place or break two blocks to determine the edges.");
            int marks = cArgs.offsetIndex != -1 ? 3 : 2;

            p.MakeSelection(marks, "Selecting region for %SCopy", cArgs, DoCopy, DoCopyMark);
        }
Exemple #3
0
        protected virtual void PopulateCopy(CopyArgs args, MetadataTreeNode copy)
        {
            copy.EnsureNotNull(nameof(copy));
            //
            var copyMetadataElement  = default(IMetadataTreeElement);
            var copyChildrenBuffer   = new List <IMetadataTreeNode>();
            var copyInclusionsBuffer = new List <IMetadataTreeNodeInclusion>();

            try {
                var copyChildren = copy.ReadDA(ref copy._children);
                foreach (var childOfThis in Children)
                {
                    copyChildrenBuffer.Add(childOfThis.CreateCopy(readOnlyState: null));
                    copyChildren.AddComponent(copyChildrenBuffer[copyChildrenBuffer.Count - 1]);
                }
                //
                var copyInclusions = copy.ReadDA(ref copy._inclusions);
                foreach (var inclusionOfThis in Inclusions)
                {
                    copyInclusionsBuffer.Add(inclusionOfThis.CreateCopy(readOnlyState: null));
                    copyInclusions.AddComponent(copyInclusionsBuffer[copyInclusionsBuffer.Count - 1]);
                }
                //
                copyMetadataElement = MetadataElement?.CreateCopy(readOnlyState: null);
                var copyMetadataElementLink = new Link <IMetadataTreeNode, IMetadataTreeElement>(copy, copyMetadataElement);
                copy.SetMetadataElement(copyMetadataElementLink);
                //
            }
            catch (Exception firstException) {
                DisposeManyDeep(firstException, copyMetadataElement, copyInclusionsBuffer, copyChildrenBuffer);
                throw;
            }
        }
Exemple #4
0
        private void CopyItem(object state)
        {
            // get the CopyArgs instance from state param
            CopyArgs args = state as CopyArgs;

            try
            {
                // Copy the item calling the appropriate method
                if (args.IsFolder)
                {
                    this.CopyFolder(args.Source, args.Destination);
                }
                else
                {
                    this.CopyFile(args.Source, args.Destination);
                }
            }
            catch (Exception ex)
            {
                // swallow any exception since there is no point throwing from the thread pool thread
                // track the number of items that failed to copy
                Interlocked.Increment(ref this.failedItems);
                this.traceSource.WriteError(ClassName, "CopyItem failed: source {0}, destination {1}, exception {2}\r\n", args.Source, args.Destination, ex);
            }
            finally
            {
                // Decrement work item and dequeue
                this.DecrementWorkItem();
            }
        }
Exemple #5
0
        /// <summary>
        /// Вызывается при копировании объекта.
        /// <para>Выполняет заполнение копии объекта <paramref name="copy"/>.</para>
        /// <para>Связь данного элемента с объектом метаданных (<seealso cref="MetadataTreeElementBase.MetadataLink"/>) в объект <paramref name="copy"/> не копируется.</para>
        /// </summary>
        /// <param name="args">Параметры копирования.</param>
        /// <param name="copy">Копия объекта.</param>
        protected sealed override void PopulateCopy(CopyArgs args, MetadataTreeElementBase copy)
        {
            var locCopy = copy.EnsureNotNull(nameof(copy)).EnsureOfType <MetadataTreeElementBase, EmbeddedMetadataTreeElement>().Value;

            //
            locCopy._embeddedMetadata = null;
            PopulateCopy(args, locCopy);
            base.PopulateCopy(args, copy);
        }
Exemple #6
0
        protected sealed override void PopulateCopy(CopyArgs args, MetadataTreeStructureComponentBase copy)
        {
            var locCopy =
                copy
                .EnsureNotNull(nameof(copy))
                .EnsureOfType <MetadataTreeStructureComponentBase, MetadataTreeNodeInclusionBase>()
                .Value;

            //
            PopulateCopy(args, locCopy);
        }
Exemple #7
0
 /// <summary>
 /// Вызывается при копировании объекта.
 /// <para>Выполняет заполнение копии объекта <paramref name="copy"/>.</para>
 /// <para>Связь данного элемента с объектом метаданных (<seealso cref="MetadataLink"/>) в объект <paramref name="copy"/> не копируется.</para>
 /// </summary>
 /// <param name="args">Параметры копирования.</param>
 /// <param name="copy">Копия объекта.</param>
 protected virtual void PopulateCopy(CopyArgs args, MetadataTreeElementBase copy)
 {
     copy.EnsureNotNull(nameof(copy));
     //
     if (args.Node != null)
     {
         var link = new Link <IMetadataTreeNode, IMetadataTreeElement>(args.Node, copy);
         copy.WriteDA(ref copy._nodeLink, link);
         args.Node.SetMetadataElement(link);
     }
 }
Exemple #8
0
 protected virtual void PopulateCopy(CopyArgs copyArgs, CopyableReadOnlyScopeBase copy)
 {
     copy.EnsureNotNull(nameof(copy));
     //
     if ((copyArgs?.ReadOnlyState) is null)
     {
         copy.WriteDA(ref copy._readOnlyState, ReadOnlyState);
     }
     else
     {
         copy.WriteDA(ref copy._readOnlyState, copyArgs.ReadOnlyState);
     }
 }
Exemple #9
0
        void CompleteCopy(Player p, Vec3S32[] m, CopyArgs cArgs)
        {
            if (!cArgs.cut)
            {
                return;
            }
            DrawOp op = new CuboidDrawOp();

            op.Flags = BlockDBFlags.Cut;
            Brush brush = new SolidBrush(Block.Air);

            DrawOpPerformer.Do(op, brush, p, new Vec3S32[] { m[0], m[1] }, false);
        }
Exemple #10
0
        protected sealed override void PopulateCopy(CopyArgs args, CopyableReadOnlyScopeBase copy)
        {
            var locCopy =
                copy
                .EnsureNotNull(nameof(copy))
                .EnsureOfType <CopyableReadOnlyScopeBase, MetadataTreeStructureComponentBase>()
                .Value;

            //
            locCopy._parentLink = null;
            //
            PopulateCopy(args, locCopy);
            //
            base.PopulateCopy(args, copy);
        }
Exemple #11
0
 protected virtual void PopulateCopy(CopyArgs args, MetadataBase copy)
 {
     copy.EnsureNotNull(nameof(copy));
     //
     if (args.Element != null)
     {
         var link = new Link <IMetadataTreeElement, IVh <IMetadata> >(source: args.Element, target: copy.ToValueHolder(ownsValue: true));
         copy.WriteDA(location: ref copy._treeElementLink, value: link);
         args.Element.SetMetadata(link: link);
     }
     //
     foreach (var referenceSet in EnumerateDA(value: P_GetCopyOfReferenceSetRegistry().Select(locItem => locItem.Set), considerDisposeRequest: true))
     {
         copy.RegisterReferenceSet(referenceSet: referenceSet.CreateCopy(args: null), useDeserializationContext: true);
     }
 }
Exemple #12
0
        /// <summary>
        /// Вызывается при копировании объекта.
        /// <para>Выполняет заполнение копии объекта <paramref name="copy"/>.</para>
        /// </summary>
        /// <param name="args">Параметры копирования.</param>
        /// <param name="copy">Копия объекта.</param>
        protected virtual void PopulateCopy(CopyArgs args, EmbeddedMetadataTreeElement copy)
        {
            copy.EnsureNotNull(nameof(copy));
            //
            var originalEmbeddedMetadata = EmbeddedMetadata;
            var copyEmbeddedMetadata     = default(IMetadata);

            try {
                copy.WriteDA(
                    ref _embeddedMetadata,
                    originalEmbeddedMetadata == null ? null : (copyEmbeddedMetadata = originalEmbeddedMetadata.CreateCopy(readOnlyState: null)).ToValueHolder(true));
            }
            catch (Exception firstException) {
                DisposeMany(firstException, copyEmbeddedMetadata);
                throw;
            }
        }
Exemple #13
0
        void HandleOther(Player p, string opt, string[] parts, int offsetIndex)
        {
            CopyArgs cArgs = default(CopyArgs);

            cArgs.offsetIndex = offsetIndex;

            if (opt == "cut")
            {
                cArgs.type = 1;
            }
            else if (opt == "air")
            {
                cArgs.type = 2;
            }
            else if (!String.IsNullOrEmpty(opt))
            {
                Help(p); return;
            }

            Player.Message(p, "Place two blocks to determine the edges.");
            p.MakeSelection(2, cArgs, DoCopy);
        }
Exemple #14
0
        void DoCopyMark(Player p, Vec3S32[] m, int i, object state, BlockID block)
        {
            CopyArgs cArgs = (CopyArgs)state;

            if (i == 2)
            {
                CopyState copy = p.CurrentCopy;
                copy.Offset.X = copy.OriginX - m[i].X;
                copy.Offset.Y = copy.OriginY - m[i].Y;
                copy.Offset.Z = copy.OriginZ - m[i].Z;

                p.Message("Set offset of where to paste from.");
                CompleteCopy(p, m, cArgs);
                return;
            }
            if (i != 1)
            {
                return;
            }

            Vec3S32 min = Vec3S32.Min(m[0], m[1]), max = Vec3S32.Max(m[0], m[1]);
            ushort  minX = (ushort)min.X, minY = (ushort)min.Y, minZ = (ushort)min.Z;
            ushort  maxX = (ushort)max.X, maxY = (ushort)max.Y, maxZ = (ushort)max.Z;

            CopyState cState = new CopyState(minX, minY, minZ, maxX - minX + 1,
                                             maxY - minY + 1, maxZ - minZ + 1);

            cState.OriginX = m[0].X; cState.OriginY = m[0].Y; cState.OriginZ = m[0].Z;

            int index = 0; cState.UsedBlocks = 0;

            cState.PasteAir = cArgs.air;

            for (ushort y = minY; y <= maxY; ++y)
            {
                for (ushort z = minZ; z <= maxZ; ++z)
                {
                    for (ushort x = minX; x <= maxX; ++x)
                    {
                        block = p.level.GetBlock(x, y, z);
                        if (!p.group.Blocks[block])
                        {
                            index++; continue;
                        }

                        if (block != Block.Air || cState.PasteAir)
                        {
                            cState.UsedBlocks++;
                        }
                        cState.Set(block, index);
                        index++;
                    }
                }
            }

            if (cState.UsedBlocks > p.group.DrawLimit)
            {
                p.Message("You tried to copy {0} blocks. You cannot copy more than {1} blocks.",
                          cState.UsedBlocks, p.group.DrawLimit);
                cState.Clear(); cState = null;
                p.ClearSelection();
                return;
            }

            cState.CopySource = "level " + p.level.name;
            p.CurrentCopy     = cState;

            p.Message("Copied &a{0} &Sblocks, origin at ({1}, {2}, {3}) corner", cState.UsedBlocks,
                      cState.OriginX == cState.X ? "Min" : "Max",
                      cState.OriginY == cState.Y ? "Min" : "Max",
                      cState.OriginZ == cState.Z ? "Min" : "Max");
            if (!cState.PasteAir)
            {
                p.Message("To also copy air blocks, use &T/Copy Air");
            }

            if (cArgs.offsetIndex != -1)
            {
                p.Message("Place a block to determine where to paste from");
            }
            else
            {
                CompleteCopy(p, m, cArgs);
            }
        }
Exemple #15
0
        void DoCopyMark(Player p, Vec3S32[] m, int i, object state, ExtBlock block)
        {
            if (i == 2)
            {
                CopyState copy = p.CopySlots[p.CurrentCopySlot];
                copy.Offset.X = copy.OriginX - m[i].X;
                copy.Offset.Y = copy.OriginY - m[i].Y;
                copy.Offset.Z = copy.OriginZ - m[i].Z;
                Player.Message(p, "Set offset of where to paste from.");
                return;
            }
            if (i != 1)
            {
                return;
            }

            CopyArgs cArgs = (CopyArgs)state;
            Vec3S32  min = Vec3S32.Min(m[0], m[1]), max = Vec3S32.Max(m[0], m[1]);
            ushort   minX = (ushort)min.X, minY = (ushort)min.Y, minZ = (ushort)min.Z;
            ushort   maxX = (ushort)max.X, maxY = (ushort)max.Y, maxZ = (ushort)max.Z;

            CopyState cState = new CopyState(minX, minY, minZ, maxX - minX + 1,
                                             maxY - minY + 1, maxZ - minZ + 1);

            cState.OriginX = m[0].X; cState.OriginY = m[0].Y; cState.OriginZ = m[0].Z;

            int index = 0; cState.UsedBlocks = 0;

            cState.PasteAir = cArgs.air;

            for (ushort y = minY; y <= maxY; ++y)
            {
                for (ushort z = minZ; z <= maxZ; ++z)
                {
                    for (ushort x = minX; x <= maxX; ++x)
                    {
                        block = p.level.GetBlock(x, y, z);
                        if (!p.group.Blocks[block.BlockID])
                        {
                            index++; continue;
                        }                                                  // TODO: will need to fix this when extblock permissions

                        if (block.BlockID != Block.Air || cState.PasteAir)
                        {
                            cState.UsedBlocks++;
                        }
                        cState.Set(block, index);
                        index++;
                    }
                }
            }

            if (cState.UsedBlocks > p.group.DrawLimit)
            {
                Player.Message(p, "You tried to copy {0} blocks. You cannot copy more than {1} blocks.",
                               cState.UsedBlocks, p.group.DrawLimit);
                cState.Clear(); cState = null;
                p.ClearSelection();
                return;
            }

            cState.CopySource = "level " + p.level.name;
            p.SetCurrentCopy(cState);
            if (cArgs.cut)
            {
                DrawOp op = new CuboidDrawOp();
                op.Flags = BlockDBFlags.Cut;
                Brush brush = new SolidBrush(ExtBlock.Air);
                DrawOpPerformer.Do(op, brush, p, new Vec3S32[] { min, max }, false);
            }

            Player.Message(p, "Copied &a{0} %Sblocks, origin at ({1}, {2}, {3}) corner", cState.UsedBlocks,
                           cState.OriginX == cState.X ? "Min" : "Max",
                           cState.OriginY == cState.Y ? "Min" : "Max",
                           cState.OriginZ == cState.Z ? "Min" : "Max");
            if (!cState.PasteAir)
            {
                Player.Message(p, "To also copy air blocks, use %T/Copy Air");
            }
            if (cArgs.offsetIndex != -1)
            {
                Player.Message(p, "Place a block to determine where to paste from");
            }
        }
Exemple #16
0
 protected abstract void PopulateCopy(CopyArgs args, MetadataTreeStructureComponentBase copy);
Exemple #17
0
        public void Copy(CopyArgs args)
        {
            var provider = new CopyProvider(args);

            provider.Copy();
        }
Exemple #18
0
        bool DoCopy(Player p, Vec3S32[] m, object state, byte type, byte extType)
        {
            CopyArgs cArgs = (CopyArgs)state;
            ushort   minX = (ushort)Math.Min(m[0].X, m[1].X), maxX = (ushort)Math.Max(m[0].X, m[1].X);
            ushort   minY = (ushort)Math.Min(m[0].Y, m[1].Y), maxY = (ushort)Math.Max(m[0].Y, m[1].Y);
            ushort   minZ = (ushort)Math.Min(m[0].Z, m[1].Z), maxZ = (ushort)Math.Max(m[0].Z, m[1].Z);

            CopyState cState = new CopyState(minX, minY, minZ, maxX - minX + 1,
                                             maxY - minY + 1, maxZ - minZ + 1);

            cState.OriginX = m[0].X; cState.OriginY = m[0].Y; cState.OriginZ = m[0].Z;

            int index = 0; cState.UsedBlocks = 0;

            cState.PasteAir = cArgs.type == 2;

            for (ushort yy = minY; yy <= maxY; ++yy)
            {
                for (ushort zz = minZ; zz <= maxZ; ++zz)
                {
                    for (ushort xx = minX; xx <= maxX; ++xx)
                    {
                        byte b = p.level.GetTile(xx, yy, zz), extB = 0;
                        if (!Block.canPlace(p, b))
                        {
                            index++; continue;
                        }
                        if (b == Block.custom_block)
                        {
                            extB = p.level.GetExtTile(xx, yy, zz);
                        }

                        if (b != Block.air || cState.PasteAir)
                        {
                            cState.UsedBlocks++;
                        }
                        cState.Blocks[index]    = b;
                        cState.ExtBlocks[index] = extB;
                        index++;
                    }
                }
            }

            if (cState.UsedBlocks > p.group.maxBlocks)
            {
                Player.Message(p, "You tried to copy {0} blocks. You cannot copy more than {1} blocks.",
                               cState.UsedBlocks, p.group.maxBlocks);
                cState.Blocks = null; cState.ExtBlocks = null; cState = null;
                return(false);
            }

            p.CopyBuffer = cState;
            if (cArgs.type == 1)
            {
                DrawOp op = new CuboidDrawOp();
                op.Flags = BlockDBFlags.Cut;
                Brush     brush = new SolidBrush(Block.air, 0);
                Vec3S32[] marks = { new Vec3S32(minX, minY, minZ), new Vec3S32(maxX, maxY, maxZ) };
                DrawOp.DoDrawOp(op, brush, p, marks, false);
            }

            string format = "Copied &a{0} %Sblocks." +
                            (cState.PasteAir ? "" : " To also copy air blocks, use %T/copy air");

            Player.Message(p, format, cState.UsedBlocks);
            if (cArgs.offsetIndex != -1)
            {
                Player.Message(p, "Place a block to determine where to paste from");
                p.Blockchange += BlockchangeOffset;
            }
            return(false);
        }
Exemple #19
0
        /// <summary>
        /// End copy delegate that is used to perform post copy completion task.
        /// </summary>
        /// <param name="state">
        /// Instance of CopyArgs that contains the source and destination folders
        /// </param>
        private void EndCopy(object state)
        {
            this.internalCopyAsyncEvent.WaitOne();

            CopyArgs args = state as CopyArgs;
            string   oldDstFolderOriginal = args.Destination + FolderCopy.OldExtension;
            string   oldDstFolderNew      = args.Destination + FolderCopy.OldExtension;

            string newDstFolderNew = args.Destination + FolderCopy.NewExtension;

            string dstFolderOld = args.Destination;
            string dstFolderNew = args.Destination;

            try
            {
                if (!this.skipCopy && (this.copyFlag == CopyFlag.AtomicCopy || this.copyFlag == CopyFlag.AtomicCopySkipIfExists) &&
                    this.failedItems == 0 /* rename only if copying all items is successfull */)
                {
                    for (int i = 1; i <= MaxRetryAttempts; i++)
                    {
                        try
                        {
                            // Step 3, 4 & 5
                            if (oldDstFolderOriginal != null && FabricDirectory.Exists(oldDstFolderOriginal))
                            {
                                FabricDirectory.Delete(oldDstFolderOriginal, recursive: true, deleteReadOnlyFiles: true);
                                oldDstFolderOriginal = null;
                            }

                            if (dstFolderOld != null && FabricDirectory.Exists(dstFolderOld))
                            {
                                this.RenameFolder(dstFolderOld, oldDstFolderNew);
                                dstFolderOld = null;
                            }

                            if (dstFolderNew != null)
                            {
                                this.RenameFolder(newDstFolderNew, dstFolderNew);
                                dstFolderNew = null;
                            }

                            if (oldDstFolderNew != null && FabricDirectory.Exists(oldDstFolderNew))
                            {
                                FabricDirectory.Delete(oldDstFolderNew, recursive: true, deleteReadOnlyFiles: true);
                                oldDstFolderNew = null;
                            }

                            break;
                        }
                        catch (Exception ex)
                        {
                            this.traceSource.WriteError(
                                ClassName,
                                "EndCopy exception: destination {0}, current object {1} exception {2}\r\n",
                                args.Destination,
                                oldDstFolderOriginal ?? dstFolderOld ?? dstFolderNew ?? oldDstFolderNew ?? "(null)",
                                ex);

                            if (ExceptionHandler.IsFatalException(ex))
                            {
                                throw;
                            }

                            if (i >= MaxRetryAttempts)
                            {
                                Interlocked.Increment(ref this.failedItems);
                            }
                            else
                            {
                                Thread.Sleep(500);
                            }
                        }
                    }
                }
            }
            finally
            {
                if (newDstFolderNew != null && FabricDirectory.Exists(newDstFolderNew))
                {
                    FabricDirectory.Delete(newDstFolderNew, recursive: true, deleteReadOnlyFiles: true);
                }
            }

            // Signal completion of copy task.
            this.asyncEvent.Set();
        }
Exemple #20
0
 protected abstract void PopulateCopy(CopyArgs args, MetadataTreeNodeInclusionBase copy);
Exemple #21
0
 protected virtual void PopulateCopy(CopyArgs args, MetadataTreeNodeDirectoryInclusion copy)
 {
     copy.EnsureNotNull(nameof(copy));
     //
 }