1
0
俊 王 8 жил өмнө
parent
commit
9004e1b4e9

+ 16 - 0
src/MineCase.Algorithm/Game/Entity/Ai/MobAi/AiSpider.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using MineCase.Algorithm.Game.Entity.Ai.MobAi;
+using MineCase.Server.World.EntitySpawner.Ai.Action;
+
+namespace MineCase.Server.World.EntitySpawner.Ai.MobAi
+{
+    public class AiSpider : AiMonster
+    {
+        public AiSpider(Func<CreatureState> getter, Action<CreatureState> setter)
+            : base(getter, setter)
+        {
+        }
+    }
+}

+ 2 - 3
src/MineCase.Algorithm/World/Biomes/Biome.cs

@@ -290,11 +290,10 @@ namespace MineCase.Algorithm.World.Biomes
         public virtual void SpawnMonster(IWorld world, IGrainFactory grainFactory, IChunkColumnStorage chunk, Random rand, BlockWorldPos pos)
         {
             ChunkWorldPos chunkPos = pos.ToChunkWorldPos();
-            int seed = chunkPos.Z * 16384 + chunkPos.X;
-            Random r = new Random(seed);
+            Random r = new Random();
             foreach (MobType eachType in _monsterList)
             {
-                if (r.Next(64) == 0)
+                if (r.Next(8) == 0)
                 {
                     MonsterSpawner spawner = new MonsterSpawner(eachType, 3);
                     spawner.Spawn(world, grainFactory, chunk, rand, new BlockWorldPos(pos.X, pos.Y, pos.Z));

+ 3 - 0
src/MineCase.Server.Grains/Game/Entities/Components/EntityAiComponent.cs

@@ -96,6 +96,9 @@ namespace MineCase.Server.Game.Entities.Components
                 case MobType.Skeleton:
                     ai = new AiSkeleton(getter, setter);
                     break;
+                case MobType.Spider:
+                    ai = new AiSpider(getter, setter);
+                    break;
                 case MobType.Squid:
                     // TODO new ai for squid
                     ai = new AiChicken(getter, setter);

+ 8 - 5
src/MineCase.Server.Grains/Game/Entities/Components/MobSpawnerComponent.cs

@@ -58,12 +58,15 @@ namespace MineCase.Server.Game.Entities.Components
 
         private async Task OnGameTick(object sender, (TimeSpan deltaTime, long worldAge) e)
         {
-            if (e.worldAge % 512 == 0 && e.worldAge > 9000 && e.worldAge < 18000)
+            long timeOfDay = e.worldAge % 24000;
+            if (e.worldAge % 16 == 0 && timeOfDay > 12000 && timeOfDay < 24000)
             {
                 EntityWorldPos playerPosition = AttachedObject.GetValue(EntityWorldPositionComponent.EntityWorldPositionProperty);
-                int x = random.Next(9) - 4 + (int)playerPosition.X;
-                int z = random.Next(9) - 4 + (int)playerPosition.Z;
-                BlockWorldPos monsterBlockPos = new BlockWorldPos(x, 0, z);
+                int distance = random.Next(16) + 16;
+                double angle = random.NextDouble() * 2 * Math.PI;
+                double deltaX = distance * Math.Cos(angle) + playerPosition.X;
+                double deltaZ = distance * Math.Sin(angle) + playerPosition.Z;
+                BlockWorldPos monsterBlockPos = new BlockWorldPos((int)deltaX, 0, (int)deltaZ);
                 ChunkWorldPos monsterChunkPos = monsterBlockPos.ToChunkWorldPos();
                 var chunkAccessor = AttachedObject.GetComponent<ChunkAccessorComponent>();
                 BiomeId biomeId = await chunkAccessor.GetBlockBiome(monsterBlockPos);
@@ -73,7 +76,7 @@ namespace MineCase.Server.Game.Entities.Components
                 IChunkColumn chunk = await chunkAccessor.GetChunk(monsterChunkPos);
 
                 // TODO
-                // biome.SpawnMonster(world, GrainFactory, await chunk.GetState(), random, monsterBlockPos);
+                biome.SpawnMonster(world, GrainFactory, await chunk.GetState(), random, monsterBlockPos);
             }
         }
     }

+ 3 - 2
src/MineCase.Server.Interfaces/World/EntitySpawner/MonsterSpawner.cs

@@ -25,6 +25,7 @@ namespace MineCase.Server.World.EntitySpawner
 
         public async void Spawn(IWorld world, IGrainFactory grainFactory, IChunkColumnStorage chunk, Random random, BlockWorldPos pos)
         {
+            ChunkWorldPos chunkPos = pos.ToChunkWorldPos();
             int num = random.Next(_groupMaxNum);
             for (int n = 0; n < num; ++n)
             {
@@ -40,7 +41,7 @@ namespace MineCase.Server.World.EntitySpawner
                     }
                 }
 
-                BlockWorldPos standPos = new BlockWorldPos(pos.X + x, height + 1, pos.Z + z);
+                BlockWorldPos standPos = new BlockWorldPos(chunkPos.X * 16 + x, height + 1, chunkPos.Z * 16 + z);
                 if (CanMobStand(world, grainFactory, chunk, random, standPos.ToBlockChunkPos()))
                 {
                     // 添加一个生物
@@ -59,7 +60,7 @@ namespace MineCase.Server.World.EntitySpawner
                     {
                         World = world,
                         EntityId = await world.NewEntityId(),
-                        Position = new EntityWorldPos(pos.X + x + 0.5F, height + 1, pos.Z + z + 0.5F),
+                        Position = new EntityWorldPos(chunkPos.X * 16 + x + 0.5F, height + 1, chunkPos.Z * 16 + z + 0.5F),
                         MobType = _mobType,
                     });
                 }