public static WorldEditWorldObjectBlockData From(WorldObject worldObject)
        {
            WorldEditWorldObjectBlockData worldObjectData = new WorldEditWorldObjectBlockData();

            worldObjectData.WorldObjectType = worldObject.GetType();
            worldObjectData.Rotation        = worldObject.Rotation;

            worldObjectData.Components = new Dictionary <Type, Object>();
            if (worldObject.HasComponent <StorageComponent>())
            {
                StorageComponent      storageComponent = worldObject.GetComponent <StorageComponent>();
                List <InventoryStack> inventoryStacks  = new List <InventoryStack>();

                foreach (ItemStack stack in storageComponent.Inventory.Stacks)
                {
                    if (stack.Empty())
                    {
                        continue;
                    }
                    inventoryStacks.Add(InventoryStack.Create(stack));
                }

                worldObjectData.Components.Add(typeof(StorageComponent), inventoryStacks);
            }

            if (worldObject.HasComponent <CustomTextComponent>())
            {
                CustomTextComponent textComponent = worldObject.GetComponent <CustomTextComponent>();
                worldObjectData.Components.Add(typeof(CustomTextComponent), textComponent.TextData.Text);
            }

            return(worldObjectData);
        }
示例#2
0
 public void RotateBlock(AffineTransform transform, float degrees, float radians)
 {
     this.Position = transform.Apply(this.Position);
     if (this.IsWorldObjectBlock())
     {
         WorldEditWorldObjectBlockData worldObjectBlockData = (WorldEditWorldObjectBlockData)this.BlockData;
         worldObjectBlockData.SetRotation(worldObjectBlockData.Rotation * QuaternionUtils.FromAxisAngle(Vector3.Up, radians));
         this.BlockData = worldObjectBlockData;
     }
     else if (!this.IsPlantBlock() && !this.BlockType.Equals(typeof(EmptyBlock)))
     {
         if (BlockUtils.HasRotatedVariants(this.BlockType, out Type[] variants))
示例#3
0
        public static WorldEditBlock Create(Block block, Vector3i originalPosition, Vector3i offsetPosition)
        {
            Vector3i relativePosition = originalPosition - offsetPosition;

            WorldEditBlock worldEditBlock = new WorldEditBlock();

            worldEditBlock.Position         = relativePosition;
            worldEditBlock.OffsetPosition   = offsetPosition;
            worldEditBlock.OriginalPosition = originalPosition;
            worldEditBlock.BlockType        = block.GetType();


            switch (block)
            {
            case PlantBlock plantBlock:
            case TreeBlock treeBlock:
                //Log.Debug($"{worldEditBlock.BlockType.ToString()} at {originalPosition} is a PlantBlock or TreeBlock");
                Plant plant = EcoSim.PlantSim.GetPlant(originalPosition);
                if (plant != null)
                {
                    worldEditBlock.Position  = plant.Position.XYZi - offsetPosition;
                    worldEditBlock.BlockData = WorldEditPlantBlockData.From(plant);
                }
                else
                {
                    worldEditBlock.BlockType = typeof(EmptyBlock);
                }
                break;

            case WorldObjectBlock objectBlock:
                //Log.Debug($"{worldEditBlock.BlockType.ToString()} at {originalPosition} is a WorldObjectBlock");
                WorldObject worldObject = objectBlock.WorldObjectHandle.Object;
                worldEditBlock.BlockData = WorldEditWorldObjectBlockData.From(worldObject);
                relativePosition         = worldObject.Position3i - offsetPosition;
                worldEditBlock.Position  = relativePosition;
                break;

            case EmptyBlock emptyBlock:
                //Log.Debug($"{worldEditBlock.BlockType.ToString()} at {originalPosition} is a EmptyBlock");
                break;

            default:
                //Log.Debug($"{worldEditBlock.BlockType.ToString()} at {originalPosition} is a Block");
                System.Reflection.ConstructorInfo constuctor = worldEditBlock.BlockType.GetConstructor(Type.EmptyTypes);
                if (constuctor == null)
                {
                    throw new ArgumentOutOfRangeException(message: "Block type is not supported", paramName: worldEditBlock.BlockType.FullName);
                }
                if (BlockContainerManager.Obj.IsBlockContained(originalPosition))
                {
                    worldEditBlock.BlockType = typeof(EmptyBlock);
                    WorldObject obj = ServiceHolder <IWorldObjectManager> .Obj.All.Where(x => x.Position3i.Equals(originalPosition)).FirstOrDefault();

                    if (obj != null)
                    {
                        worldEditBlock.BlockType = typeof(WorldObjectBlock);
                        worldEditBlock.BlockData = WorldEditWorldObjectBlockData.From(obj);
                        relativePosition         = obj.Position3i - offsetPosition;
                        worldEditBlock.Position  = relativePosition;
                    }
                }
                break;
            }

            return(worldEditBlock);
        }