Exemple #1
0
        public static void GenerateShrine(User user, int numberOfShrines = 1, int shrineSize = 12)
        {
            if (shrineSize < 1 || shrineSize > 20)
            {
                ChatManager.DebugAddToChatLog("#Shrine location", "Shrine size must be between 1 and 20", user.Name, 1);
                return;
            }

            for (int i = 0; i < numberOfShrines; ++i)
            {
                var location = World.GetRandomLandPos() + (Vector3i.Down * (shrineSize * 2));

                location.SpiralOutXZIter(shrineSize).ForEach(x =>
                {
                    var height = Math.Min((shrineSize * 0.5f), (shrineSize * 0.6f) - WorldPosition3i.Distance(x, location));
                    for (int j = 0; j < height; ++j)
                    {
                        if (!World.GetBlock((Vector3i)x + (Vector3i.Up * j)).Is <Impenetrable>())
                        {
                            World.DeleteBlock((Vector3i)x + (Vector3i.Up * j));
                        }
                        if ((int)WorldPosition3i.Distance(x, location) != 0 && !World.GetBlock((Vector3i)x + (Vector3i.Down * j)).Is <Impenetrable>())
                        {
                            World.SetBlock <WaterBlock>((Vector3i)x + (Vector3i.Down * j));
                        }
                    }
                });
                WorldObjectUtil.Spawn("EckoStatueObject", null, (Vector3i)location);

                ChatManager.DebugAddToChatLog("#Shrine location", location.ToString(), user.Name, 1);
            }
        }
        public static BTStatus RouteToWater(Animal agent, float speed, AnimalAnimationState state)
        {
            var start = agent.Position.WorldPosition3i;

            // only works for surface start points
            if (World.World.IsUnderwater(start) || start.y != World.World.MaxYCache[start] || RouteManager.RouteToSeaMap == null)
                return BTStatus.Failure;

            if (start.IsValid)
            {
                agent.AnimationState = state;

                // get a destination a decent
                var current = start;
                for (int i = 0; i < 10; i++)
                {
                    var next = RouteManager.RouteToSeaMap[current];
                    if (next == current)
                        break;
                    current = next;
                    if (WorldPosition3i.Distance(current, start) > 10)
                        break;
                }

                var target = ((Vector2)(WorldPosition3i.GetDelta(current, start)).XZ).Rotate(RandomUtil.Range(-20, 20));
                return AmphibiousMovement(agent, target, speed, state, 10, 20);
            }

            return BTStatus.Failure;
        }
Exemple #3
0
        /// <summary>
        /// WIP
        /// </summary>
        /// <param name="pos"></param>
        /// <param name="block"></param>
        /// <param name="initialspread"></param>
        /// <param name="spreaddecay"></param>
        /// <param name="coreSize"></param>
        public static void CreateVein(WorldPosition3i pos, Block block, float initialspread = 1f, float spreaddecay = 0.95f, int coreSize = 0)
        {
            float newspread = initialspread * spreaddecay;                                         // calculate new spreadchance

            World.SetBlock(block.GetType(), pos);                                                  // set initial block

            foreach (Vector3i neighborpos in ((Vector3i)pos).XYZNeighbors)                         //iterate through all neighbouring blocks
            {
                if (World.GetBlock(neighborpos) != block)                                          // check if block is already part of the vein
                {
                    if (initialspread > random.NextDouble())                                       // check spreadchance
                    {
                        CreateVein(((WorldPosition3i)neighborpos), block, newspread, spreaddecay); // continue veingeneration with next block
                    }
                }
            }
        }
Exemple #4
0
        public static BTResult RouteToWater(Animal agent, bool wandering, AnimalState state)
        {
            var start = agent.Position.WorldPosition3i;

            // only works for surface start points
            if (World.World.IsUnderwater(start))
            {
                return(BTResult.Failure("Already underwater."));
            }
            if (start.y != World.World.MaxYCache[start])
            {
                return(BTResult.Failure("Not on world surface."));
            }
            if (RouteManager.RouteToSeaMap == null)
            {
                return(BTResult.Failure("Missing sea route map."));
            }

            if (start.IsValid)
            {
                agent.ChangeState(state, 0, false);

                // get a destination a decent
                var current = start;
                for (int i = 0; i < 10; i++)
                {
                    var next = RouteManager.RouteToSeaMap[current];
                    if (next == current)
                    {
                        break;
                    }
                    current = next;
                    if (WorldPosition3i.Distance(current, start) > 10)
                    {
                        break;
                    }
                }

                var target = ((Vector2)WorldPosition3i.GetDelta(current, start).XZ).Rotate(RandomUtil.Range(-20, 20));
                return(AmphibiousMovement(agent, target, wandering, state, 10, 20));
            }

            return(BTResult.Failure("Invalid start pos"));
        }
Exemple #5
0
    public void Generate(Random seed, Vector3 voxelSize, WorldSettings settings)
    {
        for (int i = 0; i < numberOfShrines; ++i)
        {
            var location = World.GetRandomLandPos() + (Vector3i.Down * (shrineSize * 2));

            location.SpiralOutXZIter(shrineSize).ForEach(x =>
            {
                var height = Math.Min((shrineSize * 0.5f), (shrineSize * 0.6f) - WorldPosition3i.Distance(x, location));
                for (int j = 0; j < height; ++j)
                {
                    if (!World.GetBlock((Vector3i)x + (Vector3i.Up * j)).Is <Impenetrable>())
                    {
                        World.DeleteBlock((Vector3i)x + (Vector3i.Up * j));
                    }
                    if ((int)WorldPosition3i.Distance(x, location) != 0 && !World.GetBlock((Vector3i)x + (Vector3i.Down * j)).Is <Impenetrable>())
                    {
                        World.SetBlock <WaterBlock>((Vector3i)x + (Vector3i.Down * j));
                    }
                }
            });
            WorldObjectUtil.Spawn("EckoStatueObject", null, (Vector3i)location);
        }
    }
Exemple #6
0
 public KingFern(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
 public TreeEntity(TreeSpecies species, WorldPosition3i position, PlantPack plantPack)
     : base(species, position, plantPack)
 {
 }
Exemple #8
0
 public Redwood(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #9
0
 public Saxifrage(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #10
0
 public Heliconia(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
 public Taro(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #12
0
 public PitcherPlant(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #13
0
 public BarrelCactus(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #14
0
 public BigBluestem(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #15
0
 public Pumpkin(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #16
0
 public SaguaroCactus(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
 public CriminiMushroom(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #18
0
 public Waterweed(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
 public CommonGrass(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #20
0
 public LatticeMushroom(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #21
0
 public PeatMoss(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #22
0
 public Sunflower(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #23
0
 public Bunchgrass(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #24
0
 public ColorPlantBlock(WorldPosition3i position) : base(position)
 {
 }
Exemple #25
0
 public OceanSpray(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
 public Pineapple(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #27
0
 public Huckleberry(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #28
0
 public PricklyPear(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #29
0
 public DwarfWillow(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }
Exemple #30
0
 public CreosoteBush(WorldPosition3i mapPos, PlantPack plantPack) : base(species, mapPos, plantPack)
 {
 }