Пример #1
0
        public static void SpecialPasetData(CreatorAPI creatorAPI, string path, Point3 Start, Point3 End)
        {
            ChunkData chunkData = new ChunkData(creatorAPI);

            creatorAPI.revokeData = new ChunkData(creatorAPI);
            Stream stream = File.OpenRead(path);

            CreatorMain.Math.StartEnd(ref Start, ref End);
            StreamReader streamReader = new StreamReader(stream);
            string       text         = streamReader.ReadToEnd();

            streamReader.Dispose();
            stream.Dispose();
            string[] data  = text.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
            string[] data2 = data[0].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            string[] data3 = data2[0].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            int      MaxX  = int.Parse(data3[0]);
            int      MaxY  = int.Parse(data3[1]);
            int      MaxZ  = int.Parse(data3[2]);
            int      num   = 0;

            for (int x = 0; x <= MaxX; x++)
            {
                for (int y = 0; y <= MaxY; y++)
                {
                    for (int z = 0; z <= MaxZ; z++)
                    {
                        creatorAPI.CreateBlock(End.X + x, End.Y + y, End.Z + z, int.Parse(data2[num + 1]), chunkData);
                        num++;
                    }
                }
            }
            chunkData.Render();
            string[] data4 = data[1].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 1; i < data4.Length; i++)
            {
                string[]         data5            = data4[i].Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                string[]         data6            = data5[1].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                DatabaseObject   databaseObject   = GameManager.Project.GameDatabase.Database.FindDatabaseObject(data5[0], GameManager.Project.GameDatabase.EntityTemplateType, true);
                ValuesDictionary valuesDictionary = new ValuesDictionary();
                valuesDictionary.PopulateFromDatabaseObject(databaseObject);
                valuesDictionary.GetValue <ValuesDictionary>("BlockEntity").SetValue <Point3>("Coordinates", new Point3(int.Parse(data6[0]) + End.X, int.Parse(data6[1]) + End.Y, int.Parse(data6[2]) + End.Z));
                Entity entity = GameManager.Project.CreateEntity(valuesDictionary);
                ComponentInventoryBase inventoryBase = entity.FindComponent <ComponentInventoryBase>();
                if (inventoryBase != null)
                {
                    for (int j = 2, s = 0; j < data5.Length; j++, s++)
                    {
                        string[] data7 = data5[j].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                        inventoryBase.AddSlotItems(s, int.Parse(data7[0]), int.Parse(data7[1]));
                    }
                }
                GameManager.Project.AddEntity(entity);
            }
            string[] data8 = data[2].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 1; i < data8.Length; i++)
            {
                string[] data9  = data8[i].Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                string[] data10 = data9[1].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                Entity   entity = DatabaseManager.CreateEntity(GameManager.Project, data9[0], true);
                entity.FindComponent <ComponentBody>(true).Position       = new Vector3(float.Parse(data10[0]) + End.X, float.Parse(data10[1]) + End.Y, float.Parse(data10[2]) + End.Z);
                entity.FindComponent <ComponentBody>(true).Rotation       = Quaternion.CreateFromAxisAngle(Vector3.UnitY, 1.2f);
                entity.FindComponent <ComponentSpawn>(true).SpawnDuration = 0.25f;
                ComponentInventoryBase inventoryBase = entity.FindComponent <ComponentInventoryBase>();
                if (inventoryBase != null)
                {
                    for (int j = 2, s = 0; j < data9.Length; j++, s++)
                    {
                        string[] data11 = data9[j].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                        inventoryBase.AddSlotItems(s, int.Parse(data11[0]), int.Parse(data11[1]));
                    }
                }
                GameManager.Project.AddEntity(entity);
            }
            creatorAPI.componentMiner.ComponentPlayer.ComponentGui.DisplaySmallMessage($"粘贴成功,共{num}个方块", true, true);
        }
Пример #2
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);
        }