Exemplo n.º 1
0
        /// <summary>
        /// 创建特殊复制文件
        /// </summary>
        /// <param name="player"></param>
        /// <param name="directory"></param>
        /// <param name="path"></param>
        /// <param name="Start"></param>
        /// <param name="End"></param>
        public static void CreateSpecialCopy(CreatorAPI creatorAPI, string path, Point3 Start, Point3 End)
        {
            CreatorMain.Math.StartEnd(ref Start, ref End);
            FileStream    fileStream    = new FileStream(path, FileMode.Create);
            List <Entity> blockEntities = new List <Entity>();
            List <Entity> entities      = new List <Entity>();
            string        data          = "";

            data += $"{Start.X - End.X},{Start.Y - End.Y},{Start.Z - End.Z}";
            for (int x = End.X; x <= Start.X; x++)
            {
                for (int y = End.Y; y <= Start.Y; y++)
                {
                    for (int z = End.Z; z <= Start.Z; z++)
                    {
                        if (GameManager.Project.FindSubsystem <SubsystemBlockEntities>().GetBlockEntity(x, y, z) != null)
                        {
                            blockEntities.Add(GameManager.Project.FindSubsystem <SubsystemBlockEntities>().GetBlockEntity(x, y, z).Entity);
                        }
                        data += "|" + GameManager.Project.FindSubsystem <SubsystemTerrain>(true).Terrain.GetCellValueFast(x, y, z);
                    }
                }
            }
            foreach (ComponentCreature current in GameManager.Project.FindSubsystem <SubsystemCreatureSpawn>(true).Creatures)
            {
                if (current.DisplayName != "Male Player" && current.DisplayName != "Female Player")
                {
                    Vector3 vector3 = current.ComponentBody.Position;
                    if (vector3.X <= Start.X && vector3.X >= End.X && vector3.Y <= Start.Y && vector3.Y >= End.Y && vector3.Z <= Start.Z && vector3.Z >= End.Z)
                    {
                        entities.Add(current.Entity);
                    }
                }
            }
            data += "\nBlockEntity";
            foreach (Entity entity in blockEntities)
            {
                ComponentBlockEntity componentBlockEntity = entity.FindComponent <ComponentBlockEntity>();
                if (componentBlockEntity != null)
                {
                    Point3 point3   = componentBlockEntity.Coordinates;
                    string typeName = "Chest";
                    if (entity.FindComponent <ComponentDispenser>() != null)
                    {
                        typeName = "Dispenser";
                    }
                    else if (entity.FindComponent <ComponentFurnace>() != null)
                    {
                        typeName = "Furnace";
                    }
                    else if (entity.FindComponent <ComponentCraftingTable>() != null)
                    {
                        typeName = "CraftingTable";
                    }
                    else
                    {
                        throw new Exception("检测到一个无法识别的方块实体,现在电路元件暂时还不能识别");
                    }
                    data += $"|{typeName}\t{point3.X - End.X},{ point3.Y - End.Y},{point3.Z - End.Z}";
                    ComponentInventoryBase blockEntityInventoryBase = entity.FindComponent <ComponentInventoryBase>();
                    if (blockEntityInventoryBase != null)
                    {
                        for (int i = 0; i < blockEntityInventoryBase.SlotsCount; i++)
                        {
                            int slotValue = blockEntityInventoryBase.GetSlotValue(i);
                            int slotCount = blockEntityInventoryBase.GetSlotCount(i);
                            if (slotValue != 0 && slotCount > 0)
                            {
                                data += $"\t{slotValue}:{slotCount}";
                            }
                        }
                    }
                }
            }
            data += "\nEntity";
            foreach (Entity entity in entities)
            {
                ComponentCreature creature = entity.FindComponent <ComponentCreature>();
                Vector3           vector3  = creature.ComponentBody.Position;
                data += $"|{creature.DisplayName}\t{vector3.X - End.X},{ vector3.Y - End.Y},{vector3.Z - End.Z}";
                ComponentInventoryBase EntityInventoryBase = entity.FindComponent <ComponentInventoryBase>();
                if (EntityInventoryBase != null)
                {
                    for (int i = 0; i < EntityInventoryBase.SlotsCount; i++)
                    {
                        int slotValue = EntityInventoryBase.GetSlotValue(i);
                        int slotCount = EntityInventoryBase.GetSlotCount(i);
                        if (slotValue != 0 && slotCount > 0)
                        {
                            data += $"\t{slotValue}:{slotCount}";
                        }
                    }
                }
            }
            fileStream.Write(Encoding.UTF8.GetBytes(data), 0, Encoding.UTF8.GetBytes(data).Length);
            fileStream.Dispose();
            creatorAPI.componentMiner.ComponentPlayer.ComponentGui.DisplaySmallMessage($"复制成功", true, true);
        }