Ejemplo n.º 1
0
        private void LoadPlayer(Entity camera, int characterID, int classID)
        {
            Game gameComponent = EntityManager.GetComponentData <Game>(game);

            worldSpawnSystem.DestroyWorld(gameComponent.map);
            LightManager.instance.SetLight("GameSun");
            worldSpawnSystem.SpawnMap(startingMap, game);
            int3 newPosition = int3.Zero();

            foreach (Entity e in chunkSpawnSystem.chunks.Values)
            {
                Voxels.Chunk c = EntityManager.GetComponentData <Voxels.Chunk>(e);
                if (c.Value.chunkPosition.x == 0 && c.Value.chunkPosition.z == 0)
                {
                    newPosition = FindNewPosition(c);
                    break;
                }
            }
            int playerID = World.EntityManager.GetComponentData <Controller>(camera).deviceID;

            SetGameState(GameState.LoadCharacter);
            CharacterSpawnSystem.SpawnPlayer(World.EntityManager,
                                             playerID,
                                             camera,
                                             EntityManager.GetComponentData <Game>(game).map,
                                             game,
                                             startingCharacter.Value.id, classID, characterID, newPosition.ToFloat3());
        }
Ejemplo n.º 2
0
        protected override void OnUpdate()
        {
            Entities.WithAll <WorldGenerationChunk, Chunk>().ForEach((Entity e, ref WorldGenerationChunk worldGenerationChunk, ref Chunk chunk) =>
            {
                if (worldGenerationChunk.state == 5)
                {
                    if (ChunkSpawnSystem.isDebugLog)
                    {
                        Debug.LogError("Chunk is dirty at: " + chunk.Value.chunkPosition + "::" + chunk.Value.voxelDimensions);
                    }
                    ChunkTown chunkTown = World.EntityManager.GetComponentData <ChunkTown>(e);
                    if (chunkTown.buildings.Length > 0)
                    {
                        CharacterSpawnSystem.SpawnNPC(World.EntityManager, chunk.world, chunkTown.buildings[0].characterID, chunkTown.buildings[0].position);
                    }

                    /*if ((Bootstrap.instance == null || !Bootstrap.instance.isBiomeMaps)
                     *  && World.EntityManager.HasComponent<Biome>(e))
                     * {
                     *  World.EntityManager.RemoveComponent<Biome>(e);
                     * }
                     * if (World.EntityManager.HasComponent<ChunkTown>(e))
                     * {
                     *  World.EntityManager.RemoveComponent<ChunkTown>(e);
                     * }*/
                    if (World.EntityManager.HasComponent <ChunkTerrain>(e))
                    {
                        World.EntityManager.RemoveComponent <ChunkTerrain>(e);
                    }
                    chunk.hasUpdatedBack    = 0;
                    chunk.hasUpdatedDown    = 0;
                    chunk.hasUpdatedForward = 0;
                    chunk.hasUpdatedLeft    = 0;
                    chunk.hasUpdatedRight   = 0;
                    chunk.hasUpdatedUp      = 0;
                    chunk.isGenerating      = 0;
                    if (chunk.chunkRenders.Length != 0)
                    {
                        if (World.EntityManager.HasComponent <ChunkBuilder>(e))
                        {
                            World.EntityManager.SetComponentData(e, new ChunkBuilder {
                            });
                        }
                        else
                        {
                            World.EntityManager.AddComponentData(e, new ChunkBuilder {
                            });
                        }
                    }
                    else
                    {
                        // World.EntityManager.AddComponentData(e, new WorldGenerationChunkPostponed { });
                    }
                    // for all characters, set their positions

                    World.EntityManager.RemoveComponent <WorldGenerationChunk>(e);
                }
            });
        }
Ejemplo n.º 3
0
        protected override void OnUpdate()
        {
            if (Bootstrap.instance == null || Bootstrap.instance.isMonsters == false)
            {
                return;
            }
            // get player position
            Entities.WithAll <Chunk, LocalToWorld, MonsterSpawnZone>().ForEach((Entity e, ref Chunk chunk, ref Biome biome, ref ChunkTown chunkTown,
                                                                                ref LocalToWorld localToWorld, ref Translation translation, ref MonsterSpawnZone spawnZone) =>
            {
                float time = UnityEngine.Time.time;
                if (time - spawnZone.lastTimeSpawned >= spawnZone.spawnCooldown &&
                    biome.biomes.Length > 0 && World.EntityManager.HasComponent <WorldGenerationChunk>(e) == false)
                {
                    float3 cameraPosition = float3.zero;
                    cameraPosition.y      = 0;
                    Entity previousWorld  = new Entity();

                    if (spawnZone.clanID == 0)
                    {
                        spawnZone.clanID = Bootstrap.GenerateUniqueID();
                    }

                    spawnZone.lastTimeSpawned = time;
                    //Debug.LogError("Spawning monsters now: " + translation.Value.ToString());
                    // check if all entities are dead
                    bool hasAliveOnes = false;
                    for (int i = 0; i < spawnZone.spawnedIDs.Length; i++)
                    {
                        if (characterSpawnSystem.characters.ContainsKey(spawnZone.spawnedIDs[i]))
                        {
                            hasAliveOnes = true;
                            break;
                        }
                    }

                    if (!hasAliveOnes)
                    {
                        var world = chunk.world;
                        //cameraPosition = math.transform(math.inverse(localToWorld.Value), cameraPosition);
                        if (previousWorld != world)
                        {
                            previousWorld           = world;
                            float4x4 worldTransform = World.EntityManager.GetComponentData <LocalToWorld>(world).Value;
                            cameraPosition          = math.transform(math.inverse(worldTransform), cameraSystem.GetMainCamera().transform.position); // math.inverse
                            cameraPosition.y        = 0;
                        }
                        var voxelDimensions      = chunk.Value.voxelDimensions;
                        float3 realChunkPosition = new float3(translation.Value.x + voxelDimensions.x / 2f, 0, translation.Value.z + voxelDimensions.z / 2f);// translation.Value;
                        realChunkPosition.y      = 0;
                        float distanceToCamera   = math.distance(cameraPosition, realChunkPosition);
                        //Debug.DrawLine(realChunkPosition, realChunkPosition + new float3(0, 64, 0), Color.red, 1);
                        //Debug.DrawLine(cameraPosition, cameraPosition + new float3(0, 64, 0), Color.blue, 1);
                        //Debug.DrawLine(realChunkPosition, realChunkPosition + new float3(0, 64, 0));
                        if (distanceToCamera <= chunk.Value.voxelDimensions.x + chunk.Value.voxelDimensions.z)
                        {
                            /*Debug.LogError("Close to cameraPosition: " + realChunkPosition.ToString()
                             + " with cameraPosition: " + cameraPosition.ToString()
                             + ":::" + distanceToCamera);*/

                            // spawn the things
                            List <int> newSpawned = new List <int>();
                            for (int i = 0; i < spawnZone.spawnAmount; i++)
                            {
                                float3 spawnPosition = FindNewPosition(ref chunk).ToFloat3();// realChunkPosition;
                                spawnPosition        = math.transform(localToWorld.Value, spawnPosition);
                                if (!chunkTown.IsPointInsideOf(spawnPosition))
                                {
                                    //float3 spawnPosition = newPosition;// + new float3(UnityEngine.Random.Range(-8, 8), 0, UnityEngine.Random.Range(-8, 8));
                                    int positionXZ     = (int)(spawnPosition.x * chunk.Value.voxelDimensions.z + spawnPosition.z);
                                    positionXZ         = math.min(positionXZ, biome.biomes.Length - 1);
                                    int spawnBiomeType = (int)biome.biomes[positionXZ];
                                    if (spawnZone.spawnDatas.Length == 0)
                                    {
                                        //Debug.LogError("Monster Spawn Datas 0.");
                                        return;
                                    }
                                    if (spawnBiomeType >= spawnZone.spawnDatas.Length)
                                    {
                                        // Debug.LogError("Monster Spawn Datas is wrong: " + spawnBiomeType + ".");
                                        spawnBiomeType = 0;
                                    }
                                    if (spawnBiomeType < 0)
                                    {
                                        //Debug.LogError("Monster Spawn Datas Type is < 0.");
                                        spawnBiomeType = 0;
                                    }
                                    var biomeData = spawnZone.spawnDatas[spawnBiomeType];
                                    if (biomeData.monsterMetaID != 0)
                                    {
                                        newSpawned.AddRange(CharacterSpawnSystem.SpawnNPCs(World.EntityManager, world, biomeData.monsterMetaID, spawnZone.clanID, spawnPosition, 1));
                                    }
                                }
                            }
                            if (spawnZone.spawnedIDs.Length > 0)
                            {
                                spawnZone.spawnedIDs.Dispose();
                            }
                            spawnZone.spawnedIDs = new BlitableArray <int>(newSpawned.Count, Allocator.Persistent);
                            for (int i = 0; i < newSpawned.Count; i++)
                            {
                                spawnZone.spawnedIDs[i] = newSpawned[i];
                            }
                        }
                        //else
                        {
                            /* Debug.LogError("Not Close to cameraPosition: " + realChunkPosition.ToString()
                             + " with cameraPosition: " + cameraPosition.ToString()
                             + ":::" + distanceToCamera);*/
                        }
                    }
                }
            });
        }