コード例 #1
0
        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();
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
            }
        }