private void Generate(int width, int height, int seed) { int centerHoleDiameter = 10; generatorDrawer = bot.Room.BlockDrawerPool.CreateBlockDrawer(1); Random random = new Random(); Graphics.Tools.Noise.Primitive.SimplexPerlin noise = new Graphics.Tools.Noise.Primitive.SimplexPerlin(seed, NoiseQuality.Best); BlockMap blockMap = new BlockMap(bot, width, height); for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { double distanceFromCenter = Math.Sqrt(Math.Pow(x - width / 2, 2) + Math.Pow(y - height / 2, 2)) / ((width > height) ? width : height) * 2; double distanceFromCenterPow = Math.Pow(distanceFromCenter, 1.5); //if (noise.GetValue(x * 0.015625F, y * 0.015625F, 0) > 1 - 0.25F * distanceFromCenterPow) // slimy mud // blockMap.setBlock(x, y, new NormalBlock(21, 0)); //else if (noise.GetValue(x * 0.03125F, y * 0.03125F, 32) > 1 - 0.75 * distanceFromCenter) // slimy mud // blockMap.setBlock(x, y, new NormalBlock(21, 0)); //else if (noise.GetValue(x * 0.015625F, y * 0.015625F, 48) > 1 - 0.5 * distanceFromCenter) // Water // blockMap.setBlock(x, y, new NormalBlock(197, 0)); //else if (noise.GetValue(x * 0.03125F, y * 0.03125F, 64) > 1 - 0.75 * distanceFromCenter) //wet stones // blockMap.setBlock(x, y, new NormalBlock(197, 0)); if (noise.GetValue(x * 0.0078125F, y * 0.0078125F, 96) > 1 - 0.75 * distanceFromCenterPow) { blockMap.setBlock(x, y, new NormalBlock((int)Blocks.Stone, 0)); } else if (noise.GetValue(x * 0.015625F, y * 0.015625F, 128) > 1 - 0.75 * distanceFromCenter) { blockMap.setBlock(x, y, new NormalBlock((int)Blocks.Stone, 0)); } else if (distanceFromCenter + 0.33 * noise.GetValue(x * 0.015625F, y * 0.015625F, 48) > 1) { blockMap.setBlock(x, y, new NormalBlock((int)1022, 0)); } else if (distanceFromCenter + 0.33 * noise.GetValue(x * 0.015625F, y * 0.015625F, 48) > 0.5) { blockMap.setBlock(x, y, new NormalBlock((int)Skylight.BlockIds.Blocks.Sand.GRAY, 0)); } else// if (noise.GetValue(x * 0.015625F, y * 0.015625F, 160) > 0) { blockMap.setBlock(x, y, new NormalBlock(Skylight.BlockIds.Blocks.Sand.BROWN, 0)); } } } Queue <BlockWithPos> blockQueue = new Queue <BlockWithPos>(); for (int i = 0; i < 64; i++) { blockQueue.Enqueue(new BlockWithPos(random.Next(1, width - 1), random.Next(1, height - 1), new NormalBlock((int)Blocks.Stone, 0))); } for (int i = 0; i < 64; i++) { blockQueue.Enqueue(new BlockWithPos(random.Next(1, width - 1), random.Next(1, height - 1), new NormalBlock((int)Blocks.Copper, 0))); } for (int i = 0; i < 32; i++) { blockQueue.Enqueue(new BlockWithPos(random.Next(1, width - 1), random.Next(1, height - 1), new NormalBlock((int)Blocks.Iron, 0))); } for (int i = 0; i < 16; i++) { blockQueue.Enqueue(new BlockWithPos(random.Next(1, width - 1), random.Next(1, height - 1), new NormalBlock((int)Blocks.Gold, 0))); } for (int i = 0; i < 8; i++) { blockQueue.Enqueue(new BlockWithPos(random.Next(1, width - 1), random.Next(1, height - 1), new NormalBlock((int)Blocks.Emerald, 0))); } int amount = 1536;//2048 later while (blockQueue.Count > 0 && amount > 0) { BlockWithPos block = blockQueue.Dequeue(); blockMap.setBlock(block.X, block.Y, block.Block); if (random.Next(8) == 0) { BlockWithPos block2 = null; switch (random.Next(4)) { case 0: block2 = new BlockWithPos(block.X + 1, block.Y, block.Block); break; case 1: block2 = new BlockWithPos(block.X, block.Y + 1, block.Block); break; case 2: block2 = new BlockWithPos(block.X - 1, block.Y, block.Block); break; case 3: block2 = new BlockWithPos(block.X, block.Y - 1, block.Block); break; } Console.WriteLine("s"); if (block2 != blockMap.getBlock(0, block2.X, block2.Y) && block2.X > 1 && block2.Y > 1 && block2.X < width - 1 && block2.Y < height - 1) { blockQueue.Enqueue(block2); blockMap.setBlock(block2.X, block2.Y, block2.Block); amount--; } } blockQueue.Enqueue(block); } //Make hole in center for the shop for (int x = width / 2 - (centerHoleDiameter / 2 + 1); x < width / 2 + centerHoleDiameter / 2; x++) { for (int y = height / 2 - (centerHoleDiameter / 2 + 1); y < height / 2 + centerHoleDiameter / 2; y++) { blockMap.setBlock(x, y, new NormalBlock(414, 0)); } } blockMap.setBlock(width / 2 - 1, height / 2 - 1, new NormalBlock(255, 0)); Shop.SetLocation(width / 2 - 1, height / 2 - 2); blockMap.setBlock(width / 2 - 1, height / 2 - 2, new NormalBlock(Skylight.BlockIds.Blocks.Pirate.CHEST, 0)); for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { if (blockMap.getBlock(0, x, y) != null) { IBlock block = blockMap.getBlock(0, x, y); generatorDrawer.PlaceBlock(x, y, block); IBlock background = null; switch (block.Id) { case 197: background = new NormalBlock(574, 1); break; case 21: background = new NormalBlock(630, 1); break; default: background = new NormalBlock(584, 1); break; } //generatorDrawer.PlaceBlock(x, y, background); resetBlockHardness(x, y, blockMap.getBlock(0, x, y).Id); } } } generatorDrawer.Start(); }
public void Tick() { long elapsed = playerTickStopwatch.ElapsedMilliseconds; if (elapsed >= msPerTick) { playerTickStopwatch.Restart(); ticksToNextSearch--; if (ticksToNextSearch <= 0) { //Find a target IPlayer target = GetNearestPlayer(searchRange); if (target != null) { this.target = target; } ticksToNextSearch = 5; } //Generate path ticksBetweenNewPath--; if (ticksBetweenNewPath <= 0 || currentPath == null || currentPath.Count <= 0) { if (target != null && !(x == target.BlockX && y == target.BlockY)) { pathFinding = new PathFinding(); int xx = target.BlockX; int yy = target.BlockY; DateTime first = DateTime.Now; currentPath = pathFinding.FindPath(x, y, xx, yy, new List <Zombie>(Zombies.zombies), bot); DateTime second = DateTime.Now; Console.WriteLine("Pahtfinding took " + (second - first).TotalMilliseconds); ticksBetweenNewPath = 1; } else { ticksBetweenNewPath = 2; } } //Walk with path if (currentPath != null && currentPath.Count > 0) { Node next = currentPath.Pop(); x = next.x; y = next.y; BlockPos pos = new BlockPos(0, x, y); while (tailDic.ContainsKey(pos) && currentPath.Count > 0) { next = currentPath.Pop(); x = next.x; y = next.y; pos = new BlockPos(0, x, y); } if (tailDic.ContainsKey(pos)) { return; } pos = new BlockPos(0, x, y); // tail-free block we are moving to IBlock toReplace = bot.Room.getBlock(0, pos.X, pos.Y); tailDic.Add(pos, toReplace); tail.Enqueue(new BlockWithPos(pos.X, pos.Y, toReplace)); bot.Room.setBlock(pos.X, pos.Y, new NormalBlock(196, 0)); //As we move, remove the last block of the tail if (tail.Count > 6) { BlockWithPos toRemove = tail.Dequeue(); BlockPos toRemovePos = new BlockPos(0, toRemove.X, toRemove.Y); if (toRemove.Block != null) { bot.Room.setBlock(toRemove.X, toRemove.Y, toRemove.Block); } if (tailDic.ContainsKey(toRemovePos)) { tailDic.Remove(toRemovePos); } } if (target != null && !target.IsGod && target.BlockX == x && target.BlockY == y) { KillPlayer(target); target = null; } } } else if (elapsed > 2) { Thread.Sleep((int)(msPerTick - elapsed) - 1); } }
public override void onTick() { if (!bot.Room.HasCode) { return; } DigPlayer digPlayer = null; lock (playersToSave) { if (playersToSaveQueue.Count > 0) { IPlayer player = playersToSaveQueue.Dequeue(); playersToSave.Remove(player); digPlayer = (DigPlayer)player.GetMetadata("digplayer"); } } if (digPlayer != null) { digPlayer.Save(); } lock (dugBlocksToPlaceQueueLock) { while (dugBlocksToPlaceQueue.Count > bot.Room.Width * bot.Room.Height / 5) { BlockWithPos block = dugBlocksToPlaceQueue.Dequeue(); if (digHardness[block.X, block.Y] == 0f) { bot.Room.setBlock(block.X, block.Y, block.Block); } } } Pair <BlockPos, ItemDynamite> toRemove = null; List <Pair <BlockPos, ItemDynamite> > .Enumerator e = dynamites.GetEnumerator(); while (e.MoveNext()) { if ((DateTime.Now - e.Current.second.DatePlaced).Seconds >= 5) { Random r = new Random(); int x = e.Current.first.X; int y = e.Current.first.Y; float strength = e.Current.second.Strength; List <Pair <BlockWithPos, double> > blocksToRemove = new List <Pair <BlockWithPos, double> >(); for (int xx = (int)(x - strength); xx < x + strength; xx++) { for (int yy = (int)(y - strength); yy < y + strength; yy++) { double distanceFromCenter = Math.Sqrt(Math.Pow(x - xx, 2) + Math.Pow(y - yy, 2)); if (distanceFromCenter <= strength) { bool shouldRemove = (r.Next((int)((distanceFromCenter / strength) * 100)) <= 50 ? true : false); if (shouldRemove) { blocksToRemove.Add(new Pair <BlockWithPos, double>(new BlockWithPos(xx, yy, new NormalBlock(414, 0)), distanceFromCenter)); if (e.Current.second.Placer != null) { int blockIdReplaced = bot.Room.getBlock(0, xx, yy).Id; InventoryItem oreItem = ItemManager.GetItemFromOreId(blockIdReplaced); if (oreItem != null && r.Next(4) == 0) { e.Current.second.Placer.Inventory.AddItem(oreItem, 1); } } } } } } blocksToRemove.Sort((s1, s2) => s1.second.CompareTo(s2.second)); bot.Room.setBlock(e.Current.first.X, e.Current.first.Y, new NormalBlock(414, 0)); foreach (var block in blocksToRemove) { DigBlock(block.first.X, block.first.Y, null, (int)Math.Floor(1 / block.second * 50) * ((float)r.Next(100) / 100 + 1), false, true); } blocksToRemove.Clear(); toRemove = e.Current; break; } } if (toRemove != null) { dynamites.Remove(toRemove); } }