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); }
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); }
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); }
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); } }
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(); }
/// <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(); } }
/// <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); }
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(); } }
public void SpawnCloud(Cloud cloud) { cloud.CID = TheServer.AdvanceCloudID(); Clouds.Add(cloud); }