public class CircleGen extends AbstractFillableBlockShape
Class to generate circle related shapes
The Main purpose of this class is to generate the coordinates based on a shape. The coordinates are organized depending on a Map<ChunkPos, LongOpenHashSet>.

It emply some things:

  • The coordinates are divided in chunk
  • It uses LongOpenHashSet for several reasons.
    • First, We use a set to avoid doing unnecessary calculations on the shape. It ensures that no duplicate is present.
    • Second, it compresses the BlockPos: The BlockPos are saved under long using LongPosHelper. It saves some memory since that we save four bytes of data for each BlockPos, and there should not have overhead since that we use primitive data type.
    • Third, since that we use primitive data types and that they take less memory, coordinate generation, accession or deletion is much faster than using a Set<BlockPos>. Encoding and decoding blockPos and then adding it into LongOpenHashSetis extremely faster compared to only adding a BlockPos. ~60- 70% facter.

Dividing Coordinates into Chunk has some advantages :

  • Constructor Details

    • CircleGen

      public CircleGen(@NotNull @NotNull net.minecraft.util.math.BlockPos pos, Rotator rotator, int radiusX, int radiusZ)
      init the Circle Shape
      Parameters:
      pos - the center of the spiral
      radiusX - the radius of the x-axis
      radiusZ - the radius of the z-axis
    • CircleGen

      public CircleGen(@NotNull @NotNull net.minecraft.util.math.BlockPos pos, int radius)
      init a circle generator
      Parameters:
      pos - the center of the spiral
      radius - the radius of the x-axis
  • Method Details

    • setRadiusX

      public void setRadiusX(int radiusX)
      method to set the radius of the circle
      Parameters:
      radiusX - the radius that will be set on the x-axis
    • setRadiusZ

      public void setRadiusZ(int radiusZ)
      method to set the radius of the circle
      Parameters:
      radiusZ - the radius that will be set on the z-axis
    • getShapeCoordinates

      public Map<net.minecraft.util.math.ChunkPos,it.unimi.dsi.fastutil.longs.LongOpenHashSet> getShapeCoordinates()
      method to get all the pos of the circle
      Specified by:
      getShapeCoordinates in class AbstractBlockShape
      Returns:
      the blockPos of the circle. The List is divided into chunkPos, allowing for parallel modification
    • getCoveredChunks

      public it.unimi.dsi.fastutil.longs.LongOpenHashSet getCoveredChunks()
      Description copied from class: AbstractBlockShape
      Method to know the chunks that will be covered by the shape. This avoids generating all the structure, enhancing performance
      Specified by:
      getCoveredChunks in class AbstractBlockShape
      Returns:
      a set of chunkPos. For performance reasons, we use long instead of ChunkPos.

      To convert the long into a ChunkPos, use the long in a constructor.

    • place

      public void place(net.minecraft.world.StructureWorldAccess world, BlockLayerManager blockLayerManager)
      Description copied from class: AbstractBlockShape
      if you don't need to use a shape layer, you can directly place the shape to avoid allocating unnecessary pos
      Specified by:
      place in class AbstractBlockShape