예제 #1
0
        public override void GenGlobalEntity(ref List <DataTag> globalEntityList)
        {
            var playerData = new DataTag(
                new Dictionary <string, object>
            {
                {
                    "name", "Player"
                },
                {
                    "type", "island.entity:player"
                },
                {
                    "position", new Vector3(16, 100, 16)
                }
            });

            var cameraData = new DataTag(
                new Dictionary <string, object>
            {
                {
                    "name", "Camera"
                },
                {
                    "type", "island.entity:game_camera"
                }
            });

            globalEntityList.Add(playerData);
            globalEntityList.Add(cameraData);
        }
예제 #2
0
        /// <summary>
        /// 加载实体
        /// </summary>
        /// <param name="entitys"></param>
        public void LoadEntity(ChunkPos chunkPos, ref List <DataTag> entityDataList)
        {
            var entityDataName = chunkPos.IsGlobal() ? "global" : chunkPos.x + "." + chunkPos.z;

            var loadPath = _dir + "e." + entityDataName + ".dat";

            if (!chunkPos.IsAvailable())
            {
                return;
            }

            // 如果未创建实体信息则生成
            if (!File.Exists(loadPath))
            {
                var worldSize = GameManager.WorldManager.worldInfo.worldSize;
                if (!chunkPos.IsGlobal())
                {
                    if (
                        !(chunkPos.x < 0 || chunkPos.x > worldSize.x ||
                          chunkPos.z < 0 || chunkPos.z > worldSize.z))
                    {
                        GameManager.WorldManager.worldGenerator.GenChunkEntity(chunkPos, ref entityDataList);
                    }
                }
                else
                {
                    GameManager.WorldManager.worldGenerator.GenGlobalEntity(ref entityDataList);
                }
                return;
            }

            var entityStream         = File.OpenRead(loadPath);
            var decompressFileStream = new GZipStream(entityStream, CompressionMode.Decompress);
            var reader = new BinaryReader(decompressFileStream);

            // 加载实体
            var entityCount = reader.ReadInt32();

            for (var i = 0; i < entityCount; ++i)
            {
                var entityData = DataTag.Empty();
                entityData.Load(reader);

                entityDataList.Add(entityData);
            }

            reader.Close();
            decompressFileStream.Close();
            entityStream.Close();
        }
예제 #3
0
        /// <summary>
        /// 实例化实体
        /// </summary>
        /// <param name="container"></param>
        /// <param name="type"></param>
        /// <param name="entityName"></param>
        /// <returns></returns>
        public static Entity Create(EntityContainer container, DataTag dataTag)
        {
            var entityObj = new GameObject(dataTag.Get <string>("name"));

            var entity = entityObj.AddComponent <Entity>();

            container.Add(entity);
            entity.Owner = container;

            entity.SetEntityData(dataTag);

            if (entity.IsSelectable)
            {
                entityObj.layer = SelectableLayer;
            }
            else
            {
                entityObj.layer = Layer;
            }

            return(entity);
        }
예제 #4
0
        /// <summary>
        /// 设置实体数据
        /// </summary>
        /// <param name="entityData"></param>
        public void SetEntityData(DataTag entityData)
        {
            // 设置代理
            var entityProxyName = entityData.Get <string>("type");

            // 创建行为
            _entityProxy = GameManager.ProxyManager.Get <IEntity>(entityProxyName);
            foreach (var entityBehaviour in _entityProxy.EntityBehaviours)
            {
                if (gameObject.GetComponent(entityBehaviour) == null)
                {
                    gameObject.AddComponent(entityBehaviour);
                }
            }

            gameObject.SendMessage("OnEntityCreated");

            // 同步标签
            _entityDataTag = entityData;

            // 加载
            LoadFromEntityData();
        }
예제 #5
0
 public Entity Create(DataTag dataTag)
 {
     return(Entity.Create(this, dataTag));
 }
예제 #6
0
        public override void GenChunkEntity(ChunkPos chunkPos, ref List <DataTag> entityData)
        {
            var count = _random.Next() % 50 + 1;

            for (var i = 0; i < count; ++i)
            {
                var x = _random.Next() % 16;
                var z = _random.Next() % 16;

                var height = GetHeight(
                    chunkPos.x * worldInfo.chunkSize.x + x,
                    chunkPos.z * worldInfo.chunkSize.z + z,
                    worldInfo.chunkSize.y / 3 * 2);

                var pos = new Vector3(
                    chunkPos.x * worldInfo.chunkSize.x + (x + 0.5f) * worldInfo.blockSize.x,
                    height * worldInfo.blockSize.y,
                    chunkPos.z * worldInfo.chunkSize.z + (z + 0.5f) * worldInfo.blockSize.z);

                var type = _random.Next(0, 3);

                if (type == 0)
                {
                    var envElement = new DataTag(
                        new Dictionary <string, object>
                    {
                        {
                            "name", "EnvElement"
                        },
                        {
                            "type", "island.entity:env_element"
                        },
                        {
                            "position", pos
                        },
                        {
                            "envElement", "island.env_element:withered_grass"
                        }
                    }
                        );
                    entityData.Add(envElement);
                }
                else if (type == 1)
                {
                    var envElement = new DataTag(
                        new Dictionary <string, object>
                    {
                        {
                            "name", "EnvElement"
                        },
                        {
                            "type", "island.entity:env_element"
                        },
                        {
                            "position", pos
                        },
                        {
                            "envElement", "island.env_element:grass"
                        }
                    }
                        );
                    entityData.Add(envElement);
                }
                else if (type == 2)
                {
                    var dropStone = new DataTag(
                        new Dictionary <string, object>
                    {
                        {
                            "name", "DropStone"
                        },
                        {
                            "type", "island.entity:drop_item"
                        },
                        {
                            "position", pos + Vector3.up * 0.5f
                        },
                        {
                            "item", "island.item:stone"
                        },
                        {
                            "itemCount", 1
                        }
                    }
                        );
                    entityData.Add(dropStone);
                }
            }

            if (chunkPos.x == 1 && chunkPos.z == 1)
            {
                var height2 = GetHeight(
                    chunkPos.x * worldInfo.chunkSize.x,
                    chunkPos.z * worldInfo.chunkSize.z,
                    worldInfo.chunkSize.y / 3 * 2);

                var pos2 = new Vector3(
                    chunkPos.x * worldInfo.chunkSize.x + 0.5f * worldInfo.blockSize.x,
                    height2 * worldInfo.blockSize.y,
                    chunkPos.z * worldInfo.chunkSize.z + 0.5f * worldInfo.blockSize.z);

                var chest = new DataTag(
                    new Dictionary <string, object>
                {
                    {
                        "name", "Chest"
                    },
                    {
                        "type", "island.entity:chest"
                    },
                    {
                        "position", pos2 - Vector3.left
                    }
                }
                    );

                entityData.Add(chest);

                var craftTable = new DataTag(
                    new Dictionary <string, object>
                {
                    {
                        "name", "CraftTable"
                    },
                    {
                        "position", pos2 + Vector3.left
                    },
                    {
                        "type", "island.entity:craft_table"
                    }
                }
                    );
                entityData.Add(craftTable);
            }
        }
예제 #7
0
 /// <summary>
 /// 创建实体
 /// </summary>
 /// <param name="dataTag"></param>
 public void CreateEntity(DataTag dataTag)
 {
     Entity.Create(_entityContainer, dataTag);
 }