Beispiel #1
0
 public AddToCloudPacketOut(Cloud c, int s)
 {
     UsageType = NetUsageType.CLOUDS;
     ID = ServerToClientPacket.ADD_TO_CLOUD;
     Data = new byte[24 + 4 + 4 + 8];
     c.Points[s].ToDoubleBytes().CopyTo(Data, 0);
     Utilities.FloatToBytes((float)c.Sizes[s]).CopyTo(Data, 24);
     Utilities.FloatToBytes((float)c.EndSizes[s]).CopyTo(Data, 24 + 4);
     Utilities.LongToBytes(c.CID).CopyTo(Data, 24 + 4 + 4);
 }
Beispiel #2
0
 public void DeleteCloud(Cloud cloud)
 {
     foreach (PlayerEntity player in Players)
     {
         if (player.ShouldSeePosition(cloud.Position))
         {
             player.Network.SendPacket(new RemoveCloudPacketOut(cloud.CID));
         }
     }
     Clouds.Remove(cloud);
 }
Beispiel #3
0
 public void AddToCloud(Cloud cloud, double start)
 {
     double modif = Math.Sqrt(cloud.Points.Count) * 1.5;
     double d1 = Utilities.UtilRandom.NextDouble() * modif * 2 - modif;
     double d2 = Utilities.UtilRandom.NextDouble() * modif * 2 - modif;
     double d3 = Utilities.UtilRandom.NextDouble() * modif * 2 - modif;
     double d4 = Utilities.UtilRandom.NextDouble() * 10 * modif;
     cloud.Points.Add(new Location(d1, d2, d3));
     cloud.Sizes.Add(start > d4 ? (double)d4 : start);
     cloud.EndSizes.Add((double)d4);
 }
Beispiel #4
0
 public void AddCloudsToNewChunk(Chunk chunk)
 {
     if (chunk.WorldPosition.Z >= 3 && chunk.WorldPosition.Z <= 7 && Utilities.UtilRandom.Next(100) > 90)
     {
         double d1 = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
         double d2 = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
         double d3 = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
         Cloud cloud = new Cloud(this, chunk.WorldPosition.ToLocation() * Chunk.CHUNK_SIZE + new Location(d1, d2, d3));
         int rand = Utilities.UtilRandom.Next(7) > 2 ? Utilities.UtilRandom.Next(50) + 50: Utilities.UtilRandom.Next(100);
         for (int i = 0; i < rand; i++)
         {
             AddToCloud(cloud, 10f);
         }
         SpawnCloud(cloud);
     }
 }
Beispiel #5
0
 public AddCloudPacketOut(Cloud cloud)
 {
     UsageType = NetUsageType.CLOUDS;
     ID = ServerToClientPacket.ADD_CLOUD;
     DataStream ds = new DataStream();
     DataWriter dw = new DataWriter(ds);
     dw.WriteBytes(cloud.Position.ToDoubleBytes());
     dw.WriteBytes((cloud.Velocity + cloud.TheRegion.Wind).ToDoubleBytes());
     dw.WriteLong(cloud.CID);
     dw.WriteInt(cloud.Points.Count);
     for (int i = 0; i < cloud.Points.Count; i++)
     {
         dw.WriteBytes(cloud.Points[i].ToDoubleBytes());
         dw.WriteFloat((float)cloud.Sizes[i]);
         dw.WriteFloat((float)cloud.EndSizes[i]);
     }
     dw.Flush();
     Data = ds.ToArray();
     dw.Close();
 }
Beispiel #6
0
 /// <summary>
 /// Immediately updates all clouds known to the server.
 /// Called by the standard server tick loop.
 /// </summary>
 public void TickClouds()
 {
     foreach (PlayerEntity player in Players)
     {
         for (double x = -player.CloudDistLimit; x <= player.CloudDistLimit; x += CLOUD_GRID_SCALE)
         {
             for (double y = -player.CloudDistLimit; y <= player.CloudDistLimit; y += CLOUD_GRID_SCALE)
             {
                 Vector2i pos = new Vector2i((int)((player.GetPosition().X + x) * (1.0 / CLOUD_GRID_SCALE)), (int)((player.GetPosition().Y + y) * (1.0 / CLOUD_GRID_SCALE)));
                 if (!HandledSections.Contains(pos))
                 {
                     double d1    = Utilities.UtilRandom.NextDouble() * CLOUD_GRID_SCALE;
                     double d2    = Utilities.UtilRandom.NextDouble() * CLOUD_GRID_SCALE;
                     double d3    = RandomCloudHeight();
                     Cloud  cloud = new Cloud(this, new Location((player.GetPosition().X + x) + d1, (player.GetPosition().Y + y) + d2, d3))
                     {
                         GenFull = true
                     };
                     SpawnCloud(cloud);
                 }
             }
         }
     }
     HandledSections.Clear();
     foreach (PlayerEntity player in Players)
     {
         for (double x = -player.CloudDistLimit; x <= player.CloudDistLimit; x += CLOUD_GRID_SCALE)
         {
             for (double y = -player.CloudDistLimit; y <= player.CloudDistLimit; y += CLOUD_GRID_SCALE)
             {
                 Vector2i pos = new Vector2i((int)((player.GetPosition().X + x) * (1.0 / CLOUD_GRID_SCALE)), (int)((player.GetPosition().Y + y) * (1.0 / CLOUD_GRID_SCALE)));
                 if (!HandledSections.Contains(pos))
                 {
                     HandledSections.Add(pos);
                     if (Utilities.UtilRandom.Next(400) > 398) // TODO: Config?
                     {
                         double d1    = Utilities.UtilRandom.NextDouble() * CLOUD_GRID_SCALE;
                         double d2    = Utilities.UtilRandom.NextDouble() * CLOUD_GRID_SCALE;
                         double d3    = RandomCloudHeight();
                         Cloud  cloud = new Cloud(this, new Location((player.GetPosition().X + x) + d1, (player.GetPosition().Y + y) + d2, d3));
                         SpawnCloud(cloud);
                     }
                 }
             }
         }
     }
     for (int i = Clouds.Count - 1; i >= 0; i--)
     {
         // TODO: if in non-air chunk, dissipate rapidly?
         Location ppos = Clouds[i].Position;
         Clouds[i].Position = ppos + Wind + Clouds[i].Velocity;
         bool changed = (Utilities.UtilRandom.Next(25) > Clouds[i].Points.Count) &&
                        (Utilities.UtilRandom.Next(25) > Clouds[i].Points.Count) &&
                        (Utilities.UtilRandom.Next(25) > Clouds[i].Points.Count) &&
                        (Utilities.UtilRandom.Next(25) > Clouds[i].Points.Count);
         for (int s = 0; s < Clouds[i].Sizes.Count; s++)
         {
             Clouds[i].Sizes[s] += 0.05f;
             if (Clouds[i].Sizes[s] > Clouds[i].EndSizes[s])
             {
                 Clouds[i].Sizes[s] = Clouds[i].EndSizes[s];
             }
         }
         bool anySee = false;
         foreach (PlayerEntity player in Players)
         {
             bool prev = player.VisibleClouds.Contains(Clouds[i].CID);
             bool curr = player.ShouldSeeClouds(Clouds[i].Position);
             if (curr)
             {
                 anySee = true;
             }
             if (prev && !curr)
             {
                 player.Network.SendPacket(new RemoveCloudPacketOut(Clouds[i].CID));
             }
             else if (curr && !prev)
             {
                 player.Network.SendPacket(new AddCloudPacketOut(Clouds[i]));
             }
         }
         Clouds[i].IsNew = false;
         if (Clouds[i].GenFull)
         {
             Clouds[i].GenFull = false;
             int count = Utilities.UtilRandom.Next(5, 15);
             for (int cct = 0; cct < count; cct++)
             {
                 AddToCloud(Clouds[i], 190.0);
                 foreach (PlayerEntity player in Players)
                 {
                     bool curr = player.VisibleClouds.Contains(Clouds[i].CID);
                     if (curr)
                     {
                         player.Network.SendPacket(new AddToCloudPacketOut(Clouds[i], Clouds[i].Points.Count - 1));
                     }
                 }
             }
         }
         if (changed)
         {
             AddToCloud(Clouds[i], 0f);
             foreach (PlayerEntity player in Players)
             {
                 bool curr = player.VisibleClouds.Contains(Clouds[i].CID);
                 if (curr)
                 {
                     player.Network.SendPacket(new AddToCloudPacketOut(Clouds[i], Clouds[i].Points.Count - 1));
                 }
             }
         }
         if (!anySee)
         {
             Clouds.RemoveAt(i);
         }
     }
     foreach (PlayerEntity player in Players)
     {
         player.losPos = player.GetPosition();
     }
 }
Beispiel #7
0
 /// <summary>
 /// Spawns a new cloud into the world.
 /// </summary>
 /// <param name="cloud">The cloud to spawn.</param>
 public void SpawnCloud(Cloud cloud)
 {
     cloud.CID = TheServer.AdvanceCloudID();
     Clouds.Add(cloud);
 }
Beispiel #8
0
 public void TickClouds()
 {
     foreach (Chunk chunk in LoadedChunks.Values)
     {
         // TODO: Only if pure air?
         if (chunk.WorldPosition.Z >= 3 && chunk.WorldPosition.Z <= 7) // TODO: Better estimating
         {
             if (Utilities.UtilRandom.Next(400) > 399)
             {
                 double d1 = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
                 double d2 = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
                 double d3 = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
                 Cloud cloud = new Cloud(this, chunk.WorldPosition.ToLocation() * Chunk.CHUNK_SIZE + new Location(d1, d2, d3));
                 SpawnCloud(cloud);
             }
         }
     }
     for (int i = Clouds.Count - 1; i >= 0; i--)
     {
         // TODO: if in non-air chunk, dissipate rapidly?
         Location ppos = Clouds[i].Position;
         Clouds[i].Position = ppos + Wind + Clouds[i].Velocity;
         bool changed = (Utilities.UtilRandom.Next(100) > Clouds[i].Points.Count)
             && (Utilities.UtilRandom.Next(100) > Clouds[i].Points.Count)
             && (Utilities.UtilRandom.Next(100) > Clouds[i].Points.Count)
             && (Utilities.UtilRandom.Next(100) > Clouds[i].Points.Count);
         for (int s = 0; s < Clouds[i].Sizes.Count; s++)
         {
             Clouds[i].Sizes[s] += 0.05f;
             if (Clouds[i].Sizes[s] > Clouds[i].EndSizes[s])
             {
                 Clouds[i].Sizes[s] = Clouds[i].EndSizes[s];
             }
         }
         foreach (PlayerEntity player in Players)
         {
             bool prev = player.ShouldSeeLODPositionOneSecondAgo(ppos);
             bool curr = player.ShouldLoadPosition(Clouds[i].Position);
             if (prev && !curr)
             {
                 player.Network.SendPacket(new RemoveCloudPacketOut(Clouds[i].CID));
             }
             else if (curr && (Clouds[i].IsNew || !prev))
             {
                 player.Network.SendPacket(new AddCloudPacketOut(Clouds[i]));
             }
         }
         Clouds[i].IsNew = false;
         if (changed)
         {
             AddToCloud(Clouds[i], 0f);
             foreach (PlayerEntity player in Players)
             {
                 bool curr = player.ShouldLoadPosition(Clouds[i].Position);
                 if (curr)
                 {
                     player.Network.SendPacket(new AddToCloudPacketOut(Clouds[i], Clouds[i].Points.Count - 1));
                 }
             }
         }
         Vector3i cpos = ChunkLocFor(Clouds[i].Position);
         if (!LoadedChunks.ContainsKey(cpos))
         {
             DeleteCloud(Clouds[i]);
             continue;
         }
     }
     foreach (PlayerEntity player in Players)
     {
         player.losPos = player.GetPosition();
     }
 }
Beispiel #9
0
 public void SpawnCloud(Cloud cloud)
 {
     cloud.CID = TheServer.AdvanceCloudID();
     Clouds.Add(cloud);
 }
Beispiel #10
0
 public void TickClouds()
 {
     foreach (Chunk chunk in LoadedChunks.Values)
     {
         // TODO: Only if pure air?
         if (chunk.WorldPosition.Z >= 3 && chunk.WorldPosition.Z <= 7) // TODO: Better estimating
         {
             if (Utilities.UtilRandom.Next(400) > 399)
             {
                 double d1    = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
                 double d2    = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
                 double d3    = Utilities.UtilRandom.NextDouble() * Chunk.CHUNK_SIZE;
                 Cloud  cloud = new Cloud(this, chunk.WorldPosition.ToLocation() * Chunk.CHUNK_SIZE + new Location(d1, d2, d3));
                 SpawnCloud(cloud);
             }
         }
     }
     for (int i = Clouds.Count - 1; i >= 0; i--)
     {
         // TODO: if in non-air chunk, dissipate rapidly?
         Location ppos = Clouds[i].Position;
         Clouds[i].Position = ppos + Wind + Clouds[i].Velocity;
         bool changed = (Utilities.UtilRandom.Next(100) > Clouds[i].Points.Count) &&
                        (Utilities.UtilRandom.Next(100) > Clouds[i].Points.Count) &&
                        (Utilities.UtilRandom.Next(100) > Clouds[i].Points.Count) &&
                        (Utilities.UtilRandom.Next(100) > Clouds[i].Points.Count);
         for (int s = 0; s < Clouds[i].Sizes.Count; s++)
         {
             Clouds[i].Sizes[s] += 0.05f;
             if (Clouds[i].Sizes[s] > Clouds[i].EndSizes[s])
             {
                 Clouds[i].Sizes[s] = Clouds[i].EndSizes[s];
             }
         }
         foreach (PlayerEntity player in Players)
         {
             bool prev = player.ShouldSeeLODPositionOneSecondAgo(ppos);
             bool curr = player.ShouldLoadPosition(Clouds[i].Position);
             if (prev && !curr)
             {
                 player.Network.SendPacket(new RemoveCloudPacketOut(Clouds[i].CID));
             }
             else if (curr && (Clouds[i].IsNew || !prev))
             {
                 player.Network.SendPacket(new AddCloudPacketOut(Clouds[i]));
             }
         }
         Clouds[i].IsNew = false;
         if (changed)
         {
             AddToCloud(Clouds[i], 0f);
             foreach (PlayerEntity player in Players)
             {
                 bool curr = player.ShouldLoadPosition(Clouds[i].Position);
                 if (curr)
                 {
                     player.Network.SendPacket(new AddToCloudPacketOut(Clouds[i], Clouds[i].Points.Count - 1));
                 }
             }
         }
         Vector3i cpos = ChunkLocFor(Clouds[i].Position);
         if (!LoadedChunks.ContainsKey(cpos))
         {
             DeleteCloud(Clouds[i]);
             continue;
         }
     }
     foreach (PlayerEntity player in Players)
     {
         player.losPos = player.GetPosition();
     }
 }