예제 #1
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);*/
                        }
                    }
                }
            });
        }