Implement this and use StructureUtility.withContext(IStructureElement) in case you need to record some
+ temporary states that don't need to live in your main context, which would usually live for the whole lifetime of the
+ structure than just during structure check.
+ All public stuff in this class and its enclosed classes are considered part of the public API. Backwards
+ compatibility is maintained to the maximum extend possible.
public staticvoidenableInstrument(Object identifier)
+
Start instrumenting for the current thread only. When instrumentation is enabled,
+ IStructureDefinition's builtin iteration methods will send StructureEvent and its subclasses when
+ appropriate. Otherwise, these events will not be sent at all, regardless of whether a listener for these events
+ are registered.
+
+ Identifiers are required to be value-comparable, i.e. overrides Object.equals(Object). Suggested
+ identifier includes
+
+ It's an API abuse for normal IStructureDefinition users to depend on this feature. They have full control
+ and full knowledge of the IStructureDefinition they are using. Using events to instrument the structure
+ check/autoplace is completely unnecessary and does nothing but add overhead.
+
+ Instruments are required to call disableInstrument() whenever it is done with its business, as there can
+ be only one instrument for any given thread.
+
+
Parameters:
+
identifier - an identifier sent along the actual event.
public staticvoidhintParticleTinted(World w,
+ int x,
+ int y,
+ int z,
+ IIcon[] icons,
+ short[] RGBa)
+
Generate a new hint particle on client side at given location using given textures with a tint.
+
+
Parameters:
+
w - World to spawn. Usually the client world.
+
x - x coord
+
y - y coord
+
z - z coord
+
icons - 6 texture. in forge direction order.
+
RGBa - a 4 short array. tint in rgba form. currently alpha channel is ignored, but we might change this
+ later on.
+
+
+
+
+
+
hintParticleTinted
+
public staticvoidhintParticleTinted(World w,
+ int x,
+ int y,
+ int z,
+ Block block,
+ int meta,
+ short[] RGBa)
+
Generate a new hint particle on client side at given location using textures from given block with a tint.
+
+
Parameters:
+
w - World to spawn. Usually the client world.
+
x - x coord
+
y - y coord
+
z - z coord
+
block - block to take texture from
+
meta - the meta of block to take texture from
+
RGBa - a 4 short array. tint in rgba form. currently alpha channel is ignored, but we might change this
+ later on.
+
+
+
+
+
+
hintParticle
+
public staticvoidhintParticle(World w,
+ int x,
+ int y,
+ int z,
+ IIcon[] icons)
+
Generate a new hint particle on client side at given location using given textures.
+
+
Parameters:
+
w - World to spawn. Usually the client world.
+
x - x coord
+
y - y coord
+
z - z coord
+
icons - 6 texture. in forge direction order.
+
+
+
+
+
+
hintParticle
+
public staticvoidhintParticle(World w,
+ int x,
+ int y,
+ int z,
+ Block block,
+ int meta)
+
Generate a new hint particle on client side at given location using textures from given block.
+
+
Parameters:
+
w - World to spawn. Usually the client world.
+
x - x coord
+
y - y coord
+
z - z coord
+
block - block to take texture from
+
meta - the meta of block to take texture from
+
+
+
+
+
+
markHintParticleError
+
public staticbooleanmarkHintParticleError(EntityPlayer player,
+ World w,
+ int x,
+ int y,
+ int z)
+
Update the tint of given hint particle. Do nothing if particle not found.
+
+ Can be called on either client side or server side. Server side will schedule a network message to update it for
+ this player only. Will do nothing if no hint particle is found at given location.
+
+
Returns:
+
false if nothing updated. true if updated or update instruction sent.
+
+
+
+
+
+
updateHintParticleTint
+
public staticbooleanupdateHintParticleTint(EntityPlayer player,
+ World w,
+ int x,
+ int y,
+ int z,
+ short[] RGBa)
+
Update the tint of given hint particle. Do nothing if particle not found.
Query the ExtendedFacing of this tile entity from client side. Can be sent only on client side. The
+ ExtendedFacing will later be set onto given tile entity via
+ IAlignment.setExtendedFacing(ExtendedFacing) upon arrival of
+ server reply.
+
@Deprecated
+public staticbooleanisBlockTriviallyReplaceable(World w,
+ int x,
+ int y,
+ int z,
+ EntityPlayerMP actor)
+
Deprecated.
+
Determines if given block can be replaced without much effort. The exact predicate clauses is not stable and will
+ be changed, but the general idea will always stay the same.
+
public staticbooleanisBlockTriviallyReplaceable(World w,
+ int x,
+ int y,
+ int z,
+ EntityPlayer actor)
+
Determines if given block can be replaced without much effort. The exact predicate clauses is not stable and will
+ be changed, but the general idea will always stay the same.
+
intervalRequired - interval required before last recorded time to actually send the message. unit in
+ millisecond. we purposefully chose to not use a bigger data type to limit how long this
+ interval can be
+
+
+
+
+
+
addThrottledChat
+
public staticvoidaddThrottledChat(Object throttleKey,
+ EntityPlayer player,
+ IChatComponent text,
+ short intervalRequired,
+ boolean forceUpdateLastSend)
intervalRequired - interval required before last recorded time to actually send the message. unit in
+ millisecond. we purposefully chose to not use a bigger data type to limit how long
+ this interval can be
+
forceUpdateLastSend - if true, always update the last send time, even if the message isn't actually sent.
+
+
+
+
+
+
registerChannelDescription
+
public staticvoidregisterChannelDescription(String channel,
+ String modid,
+ String description)
+
Register a channel description here. The description should describe how a channel will be used inside your mod.
+
+
Parameters:
+
channel - channel key
+
modid - your modid
+
description - localization key for your description
+
+
+
+
+
+
registerChannelItem
+
public staticvoidregisterChannelItem(String channel,
+ String modid,
+ int channelValue,
+ ItemStack stack)
+
Register an item stack as an indicator for a (channel, value) pair.
+
+
Parameters:
+
channel - channel key
+
modid - your modid
+
channelValue - value
+
stack - item stack. having a metadata of
+ OreDictionary.WILDCARD_VALUE will match without comparing
+ NBT or metadata value. having a tag with tag.getBoolean("*") == true will match
+ without comparing NBT.
Return a trigger item that
+
+ Still carry all the subchannel in some unspecified ways
+ Have its master channel data replaced with specified subchannel's data
+
+
+ If given subchannel does not exist, masterStack may or may not be returned to save performance.
Still carry all the subchannel in some unspecified ways
+
Have its master channel data replaced with specified subchannel's data
+
+
+ If given subchannel does not exist, masterStack may or may not be returned to save performance. Code within
+ StructureLib can depend on this behavior, you cannot.
channel - subchannel to use. will use current master channel data instead if this channel does not exist
+ Note: all channel identifiers are supposed to be lower case and not empty.
+
Returns:
+
a trigger item with new master channel
+
+
+
+
+
+
hasSubChannel
+
public staticbooleanhasSubChannel(ItemStack masterStack)
+
Check if given trigger item contains any subchannel
+
+
Parameters:
+
masterStack - trigger stack to check
+
Returns:
+
true if contains any subchannel
+
+
+
+
+
+
hasSubChannel
+
public staticbooleanhasSubChannel(ItemStack masterStack,
+ String channel)
+
Check if given trigger item contains specified subchannel
+
+
Parameters:
+
masterStack - trigger stack to check
+
channel - channel identifier. Note: all channel identifiers are supposed to be lower case and not empty.
+
Returns:
+
true if contains specified subchannel
+
+
+
+
+
+
getChannelData
+
public staticintgetChannelData(ItemStack masterStack,
+ String channel)
+
Get the subchannel data from given trigger item. Will use master channel instead if not present.
+
+
Parameters:
+
masterStack - trigger stack to query from
+
channel - channel identifier. Note: all channel identifiers are supposed to be lower case and not empty.
+
Returns:
+
channel data
+
+
+
+
+
+
setChannelData
+
public staticvoidsetChannelData(ItemStack masterStack,
+ String channel,
+ int data)
+
Set the subchannel data on given trigger item
+
+
Parameters:
+
masterStack - trigger stack to check
+
channel - channel identifier. Note: all channel identifiers are supposed to be lower case and not empty.
+
data - subchannel data. should always be a positive value
+
+
+
+
+
+
unsetChannelData
+
public staticvoidunsetChannelData(ItemStack masterStack,
+ String channel)
+
Clear the given subchannel from given trigger item, if it exists
+
+
Parameters:
+
masterStack - trigger stack to unset
+
channel - channel identifier. Note: all channel identifiers are supposed to be lower case and not empty.
+
+
+
+
+
+
wipeChannelData
+
public staticvoidwipeChannelData(ItemStack masterStack)
Iterate over all subchannel data on trigger stack. Does not include master channel!!
+
+
Parameters:
+
masterStack - trigger stack to check
+
Returns:
+
A java8 stream of pairs. Key is channel identifier and value is channel data. Pairs do not support
+ mutation nor removal. Can still cause ConcurrentModificationException if underlying
+ channel data is modified while stream is working.
+
+
+
+
+
+
countChannelData
+
public staticintcountChannelData(ItemStack masterStack)
+
Get the number of subchannels present on given trigger item. Does not include master channel.
public interface ISurvivalConstructable
+extends IConstructable
+
An extension to IConstructable. Tile Entities (or delegates returned by
+ IConstructableProvider.getConstructable() should implement this interface to allow third party tools and
+ StructureLib builtin constructable tools to trigger autoplace in survival mode.
+
+ While not originally planned, a creative player can also use this interface to trigger autoplace by using an
+ IItemSource with every possible items in the game.
elementBudget - The server configured element budget. The implementor can choose to tune this up a bit if
+ the structure is too big, but generally should not be a 4 digits number to not overwhelm the
+ server
+
Returns:
+
-1 if done, otherwise number of elements placed this round
elementBudget - The server configured element budget. The implementor can choose to tune this up a bit if
+ the structure is too big, but generally should not be a 4 digits number to not overwhelm the
+ server
+
Returns:
+
-1 if done, -2 if not supported (e.g. due to an incompatible change in the API of env, otherwise number
+ of elements placed this round
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
This package provide a framework for rotating a given block, or a multiblock structure.
+
+ All public stuff in this package and its subpackages are considered part of the public API. Backwards compatibility
+ is maintained to the maximum extend possible.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Retrieve some amount of items from this item source matching given filter.
+
+ We probably don't need to get a lot of items from this method, so I don't care about the overhead of storing all
+ fetched items even if downstream code doesn't need it
+
+
Parameters:
+
predicate - filtering predicate. should return true for ItemStacks that should be added to result collection
+
simulate - whether to actually commit the modification. true for dry run, false otherwise.
+
count - how many items to extract.
+
Returns:
+
A nonnull map reflecting the result of extraction. Note this map is NBT and metadata aware.
Take exactly one item. ItemStack given must have a stack size of 1.
+
+ This is meant to be an optimized version of takeOne(Predicate, boolean). Implementations that support
+ item storage indexed by ItemStack can use this to speed up calculation.
+
+
Parameters:
+
stack - what item to extract. The NBT tag of this ItemStack is siginifcant and will be considered during
+ matching. must have a stack size of 1.
+
simulate - whether to actually commit the modification. true for dry run, false otherwise.
Take some item. Will not take item if it cannot find enough items to take.
+
+ This is meant to be an optimized version of takeOne(Predicate, boolean). Implementations that support
+ indexing off ItemStack can use this to speed up calculation.
+
+
Parameters:
+
stack - what item and how many to extract. The NBT tag of this ItemStack is siginifcant and will be
+ considered during matching
+
simulate - whether to actually commit the modification. true for dry run, false otherwise.
+
Returns:
+
true if enough item can be/has been extracted. false otherwise
This is the structure definition of your multi. You will have one of these for each multi.
+
+
Cache the instances of this class
+
+ You will construct this definition once per multi, either at class load or at first call to your variant of
+ getStructureDefinition(). You can use a ClassValue<IStructureDefinition<?>> if you
+ have a template for subclass. You can also use defer() or its overloads for
+ simpler cases, but it is slightly less performant as it will allocate new objects on each structure check, whereas
+ ClassValue will allocate once and cache it onwards.
+
addShape() is a 2d string array describing the layout of structure. You can optionally use
+ `StructureUtility#transpose()` to transpose the array to make the structure look nicer in source code.
+
+
+ Imagine you stand in front of the controller, with controller facing towards you not rotated or flipped.
+
+
The "A" position would be the number of blocks on the left side of the controller, not counting controller
+ itself.
+
The "B" position would be the number of blocks on the top side of the controller, not counting controller
+ itself.
+
The "C" position would be the number of blocks between you and controller, not counting controller itself.
+
+
+
+
+
+
+
+
Method Summary
+
+
+
+
+
Modifier and Type
+
Method
+
Description
+
default boolean
+
build(T object,
+ ItemStack trigger,
+ String piece,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC)
+
+
Build the multi in creative mode on a best-effort basis.
buildOrHints(T object,
+ ItemStack trigger,
+ String piece,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ boolean hintsOnly)
check(T object,
+ String piece,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ boolean forceCheckAllBlocks)
hints(T object,
+ ItemStack trigger,
+ String piece,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC)
+ Might, but is not required, to throw NoSuchElementException if the given structure piece is not
+ found.
+
+
Parameters:
+
name - same name as for other methods here
+
Returns:
+
the array of elements to process
+
Throws:
+
NoSuchElementException - if the given structure piece is not found and the moon phase perfectly
+ matches
+
+
+
+
+
+
isContainedInStructure
+
booleanisContainedInStructure(String name,
+ int offsetA,
+ int offsetB,
+ int offsetC)
+
+
+
+
+
check
+
defaultbooleancheck(T object,
+ String piece,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ boolean forceCheckAllBlocks)
+
Run a structure check.
+
+
Parameters:
+
object - context object. usually multiblock controller.
+
piece - the structure piece's string identifier.
+
world - the world object this check takes place in.
+
extendedFacing - the current structure's orientation.
+
basePositionX - X location of the structure
+
basePositionY - Y location of the structure
+
basePositionZ - Z location of the structure
+
basePositionA - see class javadoc
+
basePositionB - see class javadoc
+
basePositionC - see class javadoc
+
forceCheckAllBlocks - check all location even if chunk not currently loaded.
+
Returns:
+
true if successful, false otherwise
+
+
+
+
+
+
hints
+
defaultbooleanhints(T object,
+ ItemStack trigger,
+ String piece,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC)
+
Spawn hint particles. Should not be called on server side.
+
+
Parameters:
+
object - context object. usually multiblock controller.
+
piece - the structure piece's string identifier.
+
world - the world object this check takes place in.
+
extendedFacing - the current structure's orientation.
+
basePositionX - X location of the structure
+
basePositionY - Y location of the structure
+
basePositionZ - Z location of the structure
+
basePositionA - see class javadoc
+
basePositionB - see class javadoc
+
basePositionC - see class javadoc
+
Returns:
+
true if successful, false otherwise
+
+
+
+
+
+
build
+
defaultbooleanbuild(T object,
+ ItemStack trigger,
+ String piece,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC)
+
Build the multi in creative mode on a best-effort basis. Does not guarantee the structure is correct after a
+ successful call.
+
+
Parameters:
+
object - context object. usually multiblock controller.
+
trigger - The trigger item that contains channel data.
+
piece - the structure piece's string identifier.
+
world - the world object this check takes place in.
+
extendedFacing - the current structure's orientation.
+
basePositionX - X location of the structure
+
basePositionY - Y location of the structure
+
basePositionZ - Z location of the structure
+
basePositionA - see class javadoc
+
basePositionB - see class javadoc
+
basePositionC - see class javadoc
+
Returns:
+
true if sucessful, false otherwise
+
+
+
+
+
+
buildOrHints
+
defaultbooleanbuildOrHints(T object,
+ ItemStack trigger,
+ String piece,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ boolean hintsOnly)
static<T>booleaniterate(T object,
+ ItemStack trigger,
+ IStructureElement<T>[] elements,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ boolean hintsOnly,
+ Boolean checkBlocksIfNotNullForceCheckAllIfTrue)
+
Low level utility.
+
+
Type Parameters:
+
T - type of context object.
+
Parameters:
+
object - context object. usually multiblock controller.
+
trigger - The trigger item that contains channel data.
+
elements - the structure piece
+
world - the world object this check takes place in.
+
extendedFacing - the current structure's orientation.
+
basePositionX - X location of the structure
+
basePositionY - Y location of the structure
+
basePositionZ - Z location of the structure
+
basePositionA - see class javadoc
+
basePositionB - see class javadoc
+
basePositionC - see class javadoc
+
hintsOnly - whether to spawn hints or do creative build. no effect if
+ checkBlocksIfNotNullForceCheckAllIfTrue is not null.
+
checkBlocksIfNotNullForceCheckAllIfTrue - creative build or spawn hints if null. Force check not loaded
+ chunk if true. Check only loaded chunk is false.
This element's space is occupied by other stuff and require player attention, or player missing required
+ resource, or the block cannot be placed due to obscure mechanisms, or some other unforeseen situations.
This element either exists already, or does not yet have an implementation for survivalPlaceBlock, or some
+ other unforeseen situations. TODO this definition doesn't seem right. Should we separate SKIP from EXISTS, or
+ SKIP from ERROR?
This element's space is occupied by other stuff and require player attention, or player missing required
+ resource, or the block cannot be placed due to obscure mechanisms, or some other unforeseen situations.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Use StructureUtility to instantiate. These are the building blocks for your IStructureDefinition. It
+ represents what a particular element can be and how this particular element should be autoplaced.
booleancheck(T t,
+ World world,
+ int x,
+ int y,
+ int z)
+
+
+
+
+
couldBeValid
+
defaultbooleancouldBeValid(T t,
+ World world,
+ int x,
+ int y,
+ int z,
+ ItemStack trigger)
+
Pure (stateless and side effect free) function to test if current block could be valid. Used to give user hints
+ about incorrectly placed blocks given a controller and trigger item. If couldBeValid(...) == false for a set of
+ channels, with those same tiers, check(...) == false. Not required, defaults to true which is always safe but
+ won't give the user error hints.
+
+
+
+
+
spawnHint
+
booleanspawnHint(T t,
+ World world,
+ int x,
+ int y,
+ int z,
+ ItemStack trigger)
+
+
+
+
+
placeBlock
+
booleanplaceBlock(T t,
+ World world,
+ int x,
+ int y,
+ int z,
+ ItemStack trigger)
caller should call the non deprecated overload. implementor for reusable IStructureElement
+ should still implement this. implementor for private implementations can freely ignore this as long
+ as you know the caller will not call this overload.
+
+
Try place the block by taking resource from given IItemSource.
+
+ It should be noticed that this filter is only advisory and the actual
+ survivalPlaceBlock(Object, World, int, int, int, ItemStack, AutoPlaceEnvironment) or
+ check(Object, World, int, int, int) are free to reject/accept/place blocks not contained in this list,
+ e.g. when the element can be placed anywhere in the structure, but no more than 3 overall; when the structure
+ element cannot know all blocks it will accept at the time of calling; when this is backed by a legacy
+ IStructureElement that just didn't implement this API.
+
+ It should be noticed that the default implementation is likely to cause unexpected issues if the
+ check(Object, World, int, int, int) is not side effect free, or is not idempotent. E.g. the
+ check(Object, World, int, int, int) will add current coord to a List. As this method
+ might be invoked at a location that is already accepted, this will cause the machine to have multiple of this
+ coord in its list.
Pure (stateless and side effect free) function to test if current block could be valid. Used to give user hints
+ about incorrectly placed blocks given a controller and trigger item. If couldBeValid(...) == false for a set of
+ channels, with those same tiers, check(...) == false. Not required, defaults to true which is always safe but
+ won't give the user error hints.
+
+ It should be noticed that the default implementation is likely to cause unexpected issues if the
+ IStructureElement.check(Object, World, int, int, int) is not side effect free, or is not idempotent. E.g. the
+ IStructureElement.check(Object, World, int, int, int) will add current coord to a List. As this method
+ might be invoked at a location that is already accepted, this will cause the machine to have multiple of this
+ coord in its list.
Pure (stateless and side effect free) function to test if current block could be valid. Used to give user hints
+ about incorrectly placed blocks given a controller and trigger item. If couldBeValid(...) == false for a set of
+ channels, with those same tiers, check(...) == false. Not required, defaults to true which is always safe but
+ won't give the user error hints.
+
+ It should be noticed that the default implementation is likely to cause unexpected issues if the
+ IStructureElement.check(Object, World, int, int, int) is not side effect free, or is not idempotent. E.g. the
+ IStructureElement.check(Object, World, int, int, int) will add current coord to a List. As this method
+ might be invoked at a location that is already accepted, this will cause the machine to have multiple of this
+ coord in its list.
+
+ It should be noticed that the default implementation is likely to cause unexpected issues if the
+ IStructureElement.check(Object, World, int, int, int) is not side effect free, or is not idempotent. E.g. the
+ IStructureElement.check(Object, World, int, int, int) will add current coord to a List. As this method
+ might be invoked at a location that is already accepted, this will cause the machine to have multiple of this
+ coord in its list.
Implement this and use StructureUtility.withContext(IStructureElement) in case you need to record some
+ temporary states that don't need to live in your main context, which would usually live for the whole lifetime of the
+ structure than just during structure check. Usually just save some few bytes, but becomes non-trivial if you need to
+ record too much stuff.
+
+ You will have to reset the context yourself though. The API can't guess when the old context becomes invalid.
A lot of these might seem to make more sense as a default function on
+ IStructureElement. However, in that case javac generic will often fail to infer the type for you, so we have
+ to define them as static methods
+
If block
Provide if block, allowing downstream call only if user specified conditions are meet (i.e.
+ predicate returns true)
+
Just spawn a hint. Do nothing otherwise. Useful when you want to override the hint
+ provided by another structure element, or as a fallback to a structure element that is check only.
+
These elements are elements that can actually do structure check, spawn hint and do auto
+ place. Elements listed in above 2 sections are not going to be helpful without elements like these. They also serve
+ as a reference implementation for your own custom IStructureElement implementations.
+
Simple Block Element
These accept one or more different block types in one location.
+
isAir(), notAir(): They are supplied by default under the identifier '-' and
+ '+' respectively, but are provided here regardless in case you want to use them as a fallback.
+
+
Complex Block Element
In case your logic on determining which block is accepted is complex, use these.
+
checkForRemoving(com.gtnewhorizon.structurelib.item.ModeToggleableItem.TriggerMode mode,
+ boolean checkResult,
+ World world,
+ int x,
+ int y,
+ int z)
getPseudoJavaCode(World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ Function<? super TileEntity,String> tileEntityClassifier,
+ int sizeA,
+ int sizeB,
+ int sizeC,
+ boolean transpose)
+
+
Used only to get pseudo code in structure writer...
Return a structure element that only allow air (or air equivalents, like Railcraft hidden blocks).
+
+
static void
+
iterate(World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ boolean transpose,
+ int sizeA,
+ int sizeB,
+ int sizeC,
+ IBlockPosConsumer iBlockPosConsumer,
+ Runnable nextB,
+ Runnable nextC)
+
+
static void
+
iterate(World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ int sizeA,
+ int sizeB,
+ int sizeC,
+ IBlockPosConsumer iBlockPosConsumer)
+ This method will try to look up an ItemBlock for given block and meta from s and place it at
+ given location. This method assume block at given coord is NOT acceptable, but may or may not be trivially
+ replaceable This method might yield error messages to the player only if there is likely a programming error or
+ exploit.
+ This method will try to look up an ItemBlock for given block and meta from s and place it at
+ given location. This method assume block at given coord is NOT acceptable, but may or may not be trivially
+ replaceable This method might yield error messages to the player only if there is likely a programming error or
+ exploit.
+ This method will try to look up an ItemBlock for given block and meta from s and place it at
+ given location. This method assume block at given coord is NOT acceptable, but may or may not be trivially
+ replaceable This method might yield error messages to the player only if there is likely a programming error or
+ exploit. This method might yield error messages to the chatter.
+
+
Parameters:
+
s - drain resources from this place
+
actor - source of action. cannot be null.
+
chatter - normal error destination. can be null to suppress them.
+ This method will try to look up an ItemBlock for given block and meta from s and place it at
+ given location. This method assume block at given coord is NOT acceptable, but may or may not be trivially
+ replaceable This method might yield error messages to the player only if there is likely a programming error or
+ exploit. This method might yield error messages to the chatter.
+
+
Parameters:
+
s - drain resources from this place
+
actor - source of action. cannot be null.
+
chatter - normal error destination. can be null to suppress them.
+ This method will try to look up an ItemBlock for given block and meta from s and place it at
+ given location. This method assume block at given coord is NOT acceptable, but may or may not be trivially
+ replaceable This method might yield error messages to the player only if there is likely a programming error or
+ exploit.
+
+
Parameters:
+
stack - a valid stack with stack size of exactly 1. Must be of an ItemBlock!
+ This method will try to look up an ItemBlock for given block and meta from s and place it at
+ given location. This method assume block at given coord is NOT acceptable, but may or may not be trivially
+ replaceable This method might yield error messages to the player only if there is likely a programming error or
+ exploit.
+
+
Parameters:
+
stack - a valid stack with stack size of exactly 1. Must be of an ItemBlock!
+ This method will try to look up an ItemBlock for given block and meta from s and place it at
+ given location. This method assume block at given coord is NOT acceptable, but may or may not be trivially
+ replaceable This method might yield error messages to the player only if there is likely a programming error or
+ exploit. This method might yield error messages to the chatter.
+
+
Parameters:
+
stack - a valid stack with stack size of exactly 1. Must be of an ItemBlock!
+
s - drain resources from this place
+
actor - source of action. cannot be null.
+
chatter - normal error destination. can be null to suppress them.
+ This method will try to look up an ItemBlock for given block and meta from s and place it at
+ given location. This method assume block at given coord is NOT acceptable, but may or may not be trivially
+ replaceable This method might yield error messages to the player only if there is likely a programming error or
+ exploit. This method might yield error messages to the chatter.
+
+
Parameters:
+
stack - a valid stack with stack size of exactly 1. Must be of an ItemBlock!
+
s - drain resources from this place
+
actor - source of action. cannot be null.
+
chatter - normal error destination. can be null to suppress them.
Return a structure element that only allow air (or air equivalents, like Railcraft hidden blocks). You usually
+ don't need to call this yourselves. Use - in shape to automatically use this. Provided nonetheless in
+ case you want this as a fallback to something else.
Return a structure element that allow anything but air (or air equivalents, like Railcraft hidden blocks). You
+ usually don't need to call this yourselves. Use + in shape to automatically use this. Provided
+ nonetheless in case you want this as a fallback to something else.
Element representing a component with different tiers. Your multi will accept any of them (as long as player does
+ not mix tier (*)), but would like to know which is used. Player can use more blueprint to get hints denoting more
+ advanced components.
+
+ Above all else, you need to decide what type of tier you are going to use. For simpler cases, Integer is a good
+ choice. You can also use an existing Enum. It can also be a String or a
+ ResourceLocation, or basically anything. It doesn't even have to implement
+ Comparable.
+
+ If your tier extractor function returns null on any (Block, meta) pair, then it means this block is rejected.
+ This also implies null can never be a valid tier.
+
+ This structure element require you will reset the backing storage of getter in your own code, such that in every
+ round of structure checking, the first call to getter would always return notSet. You can also make getter to
+ return other value on that occasion to forcefully select a certain tier, but then you'd probably be better off
+ using block adders or ofBlock(Block, int, Block, int) and its overloads
+
+ There is yet no TileEntity counterpart of this utility. Feel free to submit a PR to add it.
+
+ (*): Implementation wise, this structure element will only accept a block if its tier is the same as existing
+ tier or if existing tier is unset (i.e. value of third argument). If there are multiple (block, tier) tuple for a
+ given tier, then player will be allowed to use multiple kinds of blocks, but their tier is guaranteed to be the
+ same.
+
+
WARNING
You SHOULD NOT return notSet from your tierExtractor. If you do so, we will have this
+ chain of events:
+
+
at check start, tier is reset to notSet
+
the tier extractor returns notSet for first block, so since ofBlocksTiered finds your current tier is notSet,
+ and the new block's tier is the same as that, so it's accepted
+
at 2nd, 3rd..., same thing in 2 happens
+
at last occurrence, player placed a valid block with a tier not notSet. ofBlocksTiered now sets your current
+ tier to this tier, and accept the block
+
check got notified structure is sound, and tier is not notSet. it marks the structure as complete and start
+ doing its business
+
Player enjoy a (probably) hilariously shaped multi and (probably) reduced build cost.
+
+
Example Implementation
+
+ Assume you have 16 tier, each map to one particular block's 16 different meta. You will usually want something
+ like this
+
+
+ public class Tile extends TileEntity {
+ private static final Block B = getTargetBlock();
+ private static final IStructureDefinition<Tile> S = IStructureDefinition.<Tile>builder()
+ // ... addShape, and other elements
+ .addElement('c', ofBlocksTiered((b, m) -> b == B ? m : null,
+ IntStream.range(0, 16).mapToObj(i -> Pair.of(B, i)).collect(Collectors.toList()),
+ -1,
+ (t, m) -> t.tier = m,
+ t -> t.tier))
+ .build();
+ private int tier;
+
+ public boolean check() {
+ tier = -1;
+ if (!S.check(...))
+ return false;
+ return isTierAcceptable(tier);
+ }
+ }
+
+
+ Important bits of this example implementation:
+
+
The supplied ITierConverter returns null for an invalid block
+
Possible tier returned by ITierConverter is Integer object 0 to 15.
notSet is never a tier returned by ITierConverter.
+
+
+ As a friendly reminder, the above characteristics are only for this simply demo, not as a general restriction
+ imposed by ofBlocksTiered.
+
+
Parameters:
+
tierExtractor - a function to extract tier info from a block. This function can return null and will never
+ be passed a null block or an invalid block meta. If this function returns null, then the
+ block would be considered invalid.
+
allKnownTiers - A list of all known tiers as of calling. Can be empty or null. No hint will be spawned if
+ empty or null. Cannot have null elements. First element denotes the most primitive tier.
+ Last element denotes the most advanced tier. If not all tiers are available at definition
+ construction time, use lazy(Supplier) or its overloads to delay a bit. This list is
+ only for hint particle spawning and survival build. The hint/autoplace code will choose 1st
+ pair to spawn/place if trigger item has master channel data of 1, 2nd pair if 2, and so on.
+
notSet - The value returned from getter when there were no tier info found in T yet. Cannot
+ be null.
+
setter - a function to set the current tier into context object
+
getter - a function to retrieve the current tier from context object
Denote a block using unlocalized names. This can be useful to get around mod loading order issues.
+
+ DUE TO HISTORICAL REASONS, THIS WAS CALLED ofBlockUnlocalizedName, BUT IT ACTUALLY USES REGISTRY NAME
+ INSTEAD.
+
+ While no immediate error will be thrown, client code should ensure said mod is loaded and said mod is present,
+ otherwise bad things will happen later!
+
+
+
+
+
ofBlockUnlocalizedName
+
public static<T>IStructureElement<T>ofBlockUnlocalizedName(String modid,
+ String registryName,
+ int meta,
+ boolean wildcard)
+
Denote a block using unlocalized names. This can be useful to get around mod loading order issues.
+
+ DUE TO HISTORICAL REASONS, THIS WAS CALLED ofBlockUnlocalizedName, BUT IT ACTUALLY USES REGISTRY NAME
+ INSTEAD.
+
+ While no immediate error will be thrown, client code should ensure said mod is loaded and said mod is present,
+ otherwise the element will effectively become an error().
+
+ Will place block or hint using the given meta if wildcard is true.
Similiar to the other overload, but allows client code to specify a fallback in case said block was not found
+ later when the element got called.
+
+ DUE TO HISTORICAL REASONS, THIS WAS CALLED ofBlockUnlocalizedName, BUT IT ACTUALLY USES REGISTRY NAME
+ INSTEAD.
+
+ This is slightly different to using the other overload and another element in a
+ ofChain(IStructureElement[]). Here fallback will only ever be used if this fails, where ofChain would
+ form an OR relationship even if the mod is loaded and the block exists in registry.
Accept a set of blocks. Less cumbersome to use than ofBlocksMapHint(Map, Block, int) when for any
+ accepted block type we accept only one meta for each.
+
This allows you to compose different IStructureElement to form a OR chain. As with any other OR
+ operator, this one exhibits short-circuiting behavior, i.e. it will not call next structure element if previous
+ one succeeded. (*)
+
+ This allows you e.g. accept both a glass block using ofBlock(Block, int, Block, int) and a piece of air
+ using isAir(). It will not attempt to capture any errors though, so next one will not be tried if
+ previous one would crash.
+
+ (*): For survival auto place, it will * REJECT, if all structure element REJECT * SKIP, if 1 or more structure
+ element SKIP and the rest structure element (0 or more) REJECT * any other result, **immediately** upon any
+ structure element returns these other results. This behavior is not 100% fixed and might change later on, but we
+ will send the notice on a best effort basis.
+
+ Take care while chaining, as it will try to call every structure element until it returns true. If none does it
+ will finally return false.
Similar to defer, but caches the first returned element returned and won't call it again. Initialization is not
+ thread safe. These both allow the structure element **constructor** to access properties only present on the
+ context object (e.g. GT5 multiblock controller), e.g. hatch texture index to use. Use `lazy` if the data you
+ access will remain constant across different context object.
This will defer the actual instantiation of structure element until the first time structure code is
+ actually called.
+
+ Similar to defer, but caches the first returned element returned and won't call it again. Initialization is not
+ thread safe. This will allow the structure element constructor to access properties only present on the
+ context object (e.g. GT5 multiblock controller), e.g. hatch texture index to use. Use this if the data you access
+ will remain constant.
+
+
Parameters:
+
to - create structure element from the first context object passed in
This will defer the actual instantiation of structure element until the structure code is actually called. This
+ will allow the structure element constructor to access properties only present on the context object (e.g.
+ GT5 multiblock controller), e.g. hatch texture index to use. Use this if it might change for the same structure
+ definition, e.g. if your structure might switch mode and change some parameter, while basically remain the same
+ shape. Using this while lazy(Supplier) is enough will not break anything, but would incur unnecessary
+ performance overhead.
This will defer the actual instantiation of structure element until the structure code is actually called. This
+ will allow the structure element constructor to access properties only present on the context object (e.g.
+ GT5 multiblock controller), e.g. hatch texture index to use. Use this if it might change for the same structure
+ definition, e.g. if your structure might switch mode and change some parameter, while basically remain the same
+ shape. Using this while lazy(Supplier) is enough will not break anything, but would incur unnecessary
+ performance overhead.
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns a key not
+ found in map.
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+
Parameters:
+
keyExtractor - extract a key from the context object
This is the switch block for structure code, with default case support.
+
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. The fallback will only be used when keyExtractor returns a value not found in given map. This will play
+ nicely in combination with error()
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+
Parameters:
+
keyExtractor - extract a key from the context object
+
map - all possible structure element
+
defaultElem - element to use when keyExtractor returns a value not found in given map
This is the switch block for structure code, with default case support.
+
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. The fallback will only be used when keyExtractor returns a value not found in given map. This will play
+ nicely in combination with error()
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+
Parameters:
+
keyExtractor - extract a key from the context object
+
map - all possible structure element
+
defaultElem - element to use when keyExtractor returns a value not found in given map
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ Do pay place null values in the array.
+
+
Parameters:
+
keyExtractor - extract an index from the context object
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ Do pay place null values in the array.
+
+
Parameters:
+
keyExtractor - extract an index from the context object
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ Do pay place null values in the array.
+
+
Parameters:
+
keyExtractor - extract an index from the context object
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ Do pay place null values in the array.
+
+
Parameters:
+
keyExtractor - extract an index from the context object
This will defer the actual instantiation of structure element until the structure code is actually called. This
+ will allow the structure element constructor to access properties only present on the context object (e.g.
+ GT5 multiblock controller), e.g. hatch texture index to use. Use this if it might change for the same structure
+ definition, e.g. if your structure might switch mode and change some parameter, while basically remain the same
+ shape. Using this while lazy(Supplier) is enough will not break anything, but would incur unnecessary
+ performance overhead.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns a key not
+ found in map.
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+
Parameters:
+
keyExtractor - extract a key from the context object and trigger item
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns a key not
+ found in map.
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+
Parameters:
+
keyExtractor - extract a key from the context object and trigger item
This is the switch block for structure code, with default case support.
+
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. The fallback will only be used when keyExtractor returns a value not found in given map. This will play
+ nicely in combination with error()
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+
Parameters:
+
keyExtractor - extract a key from the context object and trigger item
+
map - all possible structure element
+
defaultElem - element to use when keyExtractor returns a value not found in given map
This is the switch block for structure code, with default case support.
+
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. The fallback will only be used when keyExtractor returns a value not found in given map. This will play
+ nicely in combination with error()
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+
Parameters:
+
keyExtractor - extract a key from the context object and trigger item
+
map - all possible structure element
+
defaultElem - element to use when keyExtractor returns a value not found in given map
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ Do pay place null values in the array.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+
Parameters:
+
keyExtractor - extract a key from the context object and trigger item
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ Do pay place null values in the array.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+
Parameters:
+
keyExtractor - extract a key from the context object and trigger item
This will defer the actual instantiation of structure element until the first time structure code is
+ actually called.
+
+ Similar to defer, but caches the first returned element returned and won't call it again. Initialization is not
+ thread safe. This will allow the structure element constructor to access properties only present on the
+ context object (e.g. GT5 multiblock controller), e.g. hatch texture index to use. Use this if the data you access
+ will remain constant.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
toCheck - override the check function with the returned element
+
to - create structure element from the context object passed in
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns a key not
+ found in map.
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
keyExtractorCheck - key extractor of the structure element that will be used for check.
+
keyExtractor - extract a key from the context object and trigger item
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns a key not
+ found in map.
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
keyExtractorCheck - key extractor of the structure element that will be used for check.
+
keyExtractor - extract a key from the context object and trigger item
This is the switch block for structure code, with default case.
+
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. defaultElem will be used if either extractor returned a key not found in map.
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
keyExtractorCheck - key extractor of the structure element that will be used for check.
+
keyExtractor - extract a key from the context object and trigger item
This is the switch block for structure code, with default case.
+
+ This allows you to extract or compute a key from context object, and lookup a map for actual structure element to
+ use. defaultElem will be used if either extractor returned a key not found in map.
+
+ Do pay attention to what properties your map has though. You need to pay attention to how they consider equality
+ and how they consider null key/values. Guava ImmutableMap is usually a good enough choice.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
keyExtractorCheck - key extractor of the structure element that will be used for check.
+
keyExtractor - extract a key from the context object and trigger item
This is the switch block for structure code, with default case.
+
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ Do pay place null values in the array.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
keyExtractorCheck - key extractor of the structure element that will be used for check.
+
keyExtractor - extract a key from the context object and trigger item
This is the switch block for structure code, with default case.
+
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ Do pay place null values in the array.
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
keyExtractorCheck - key extractor of the structure element that will be used for check.
+
keyExtractor - extract a key from the context object and trigger item
This is the switch block for structure code, with default case.
+
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
keyExtractorCheck - key extractor of the structure element that will be used for check.
+
keyExtractor - extract a key from the context object and trigger item
This is the switch block for structure code, with default case.
+
+ This allows you to extract or compute an index from context object, and lookup an array for actual structure
+ element to use. This will usually, but not guaranteed, to throw an exception at runtime if keyExtractor returns
+ an index not within the array bound
+
+ This variant also passes the trigger item to the function, allowing it to get more info.
+
+ This variant will override the check function of the structure element from second function with the one returned
+ from the structure element from first function.
+
+
Parameters:
+
keyExtractorCheck - key extractor of the structure element that will be used for check.
+
keyExtractor - extract a key from the context object and trigger item
public static<T>
+com.gtnewhorizon.structurelib.structure.IStructureNavigate<T>step(int a,
+ int b,
+ int c)
+
Used internally, to generate skips for structure definitions
+
+
+
+
+
step
+
public static<T>
+com.gtnewhorizon.structurelib.structure.IStructureNavigate<T>step(Vec3Impl step)
+
Used internally, to generate skips for structure definitions
+
+
+
+
+
getPseudoJavaCode
+
public staticStringgetPseudoJavaCode(World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ Function<? super TileEntity,String> tileEntityClassifier,
+ int sizeA,
+ int sizeB,
+ int sizeC,
+ boolean transpose)
+
Used only to get pseudo code in structure writer...
+
+ NOTE: GT specific code got removed. TODO add a mean
+
+
Parameters:
+
tileEntityClassifier - return a string that denote the type of a tile entity, or null if it's nothing
+ special. useful if the tile entity cannot be simply distinguished via getClass.
+
+
+
+
+
+
iterate
+
public staticvoiditerate(World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ int sizeA,
+ int sizeB,
+ int sizeC,
+ IBlockPosConsumer iBlockPosConsumer)
+
+
+
+
+
iterate
+
public staticvoiditerate(World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX,
+ int basePositionY,
+ int basePositionZ,
+ int basePositionA,
+ int basePositionB,
+ int basePositionC,
+ boolean transpose,
+ int sizeA,
+ int sizeB,
+ int sizeC,
+ IBlockPosConsumer iBlockPosConsumer,
+ Runnable nextB,
+ Runnable nextC)
+
+
+
+
+
transpose
+
public staticString[][]transpose(String[][] structurePiece)
+
Transposes shape (swaps B and C axis, can be used to un-transpose transposed shape) WARNING! Do not use on old
+ api...
public staticbooleancheckPermission(World world,
+ EntityPlayer actor,
+ int x,
+ int y,
+ int z)
+
+
+
+
+
checkForRemoving
+
public staticIStructureElement.PlaceResultcheckForRemoving(com.gtnewhorizon.structurelib.item.ModeToggleableItem.TriggerMode mode,
+ boolean checkResult,
+ World world,
+ int x,
+ int y,
+ int z)
This package provide support for multiblock structure checking.
+
+ All public stuff in this package and its subpackages are considered part of the public API. Backwards compatibility
+ is maintained to the maximum extend possible.
Implement this and use StructureUtility.withContext(IStructureElement) in case you need to record some
+ temporary states that don't need to live in your main context, which would usually live for the whole lifetime of the
+ structure than just during structure check.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Extract a particular type of item. The extractor can choose to not return all items contained within this
+ item as long as it makes sense, but the author should inform the player of this.
+
+ Whether this method does recursive extraction is at the discretion of implementor.
+
+
Parameters:
+
predicate - the main filtering predicate. never null. It's assumed predicate always returns true on
+ filter, if that is not null
+
simulate - true if only query but does not actually remove
+
store - where to store extracted items. Should increment the
+
source - from where an extraction should be attempted
+
filter - stack to extract. should not be mutated! match the NBT tag using EXACT mode. might be null.
+
player - executor of extraction, or null if from a machine
+
Returns:
+
amount extracted, or -1 if this is not implemented
Extract a particular type of item. The extractor can choose to not return all items contained within this
+ item as long as it makes sense, but the author should inform the player of this.
+
+ Whether this method does recursive extraction is at the discretion of implementor.
+
+
Parameters:
+
source - from where an extraction should be attempted
+
toExtract - stack to extract. should not be mutated! match the NBT tag using EXACT mode.
+
simulate - true if only query but does not actually remove
+
player - executor of extraction, or null if from a machine
+
Returns:
+
amount extracted, or -1 if this is not implemented
Extract a particular type of item. The extractor can choose to not return all items contained within this
+ item as long as it makes sense, but the author should inform the player of this.
+
+ Whether optimized extractor do recursive extraction is at the discretion of implementor.
+
+
Parameters:
+
source - from where an extraction should be attempted
+
toExtract - stack to extract. should not be mutated! match the NBT tag using EXACT mode.
+
simulate - true if only query but does not actually remove
+
player - executor of extraction, or null if from a machine
take count amount of stacks that matches given filter. might take partial amount of stuff, so simulation is
+ suggested if you ever need to take more than one.
+
+
Parameters:
+
player - source of stacks
+
predicate - item stack filter
+
simulate - whether to do removal
+
count - let's hope int size is enough...
+
Returns:
+
amount taken. never negative nor bigger than count...
+
+
+
+
+
+
takeFromInventory
+
public staticinttakeFromInventory(EntityPlayerMP player,
+ ItemStack filter,
+ boolean simulate)
+
take count amount of stacks that matches given filter. might take partial amount of stuff, so simulation is
+ suggested if you ever need to take more than one.
+
+
Parameters:
+
player - source of stacks
+
filter - the precise type of item to extract. stackSize matters
+
simulate - whether to do removal
+
Returns:
+
amount taken. never negative nor bigger than count...
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Implementation of George Marsaglia's elegant Xorshift random generator 30% faster and better quality than the
+ built-in java.util.random see also see http://www.javamex.com/tutorials/random_numbers/xorshift.shtml
Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value
+ (exclusive), drawn from this random number generator's sequence.
Returns the current state of the seed, can be used to clone the object
+
+
Returns:
+
the current seed
+
+
+
+
+
+
setSeed
+
publicvoidsetSeed(long seed)
+
Sets the seed for this pseudo random number generator. As described above, two instances of the same random
+ class, starting with the same seed, produce the same results, if the same methods are called.
Returns an XSRandom object with the same state as the original
+
+
+
+
+
+
next
+
publicintnext(int nbits)
+
Implementation of George Marsaglia's elegant Xorshift random generator 30% faster and better quality than the
+ built-in java.util.random see also see http://www.javamex.com/tutorials/random_numbers/xorshift.shtml
Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value
+ (exclusive), drawn from this random number generator's sequence. The general contract of nextInt is that
+ one int value in the specified range is pseudorandomly generated and returned. All bound possible
+ int values are produced with (approximately) equal probability. The method nextInt(int bound) is
+ implemented by class Random as if by:
+
+
+
+ public int nextInt(int bound) {
+ if (bound <= 0)
+ throw new IllegalArgumentException("bound must be positive");
+
+ if ((bound & -bound) == bound) // i.e., bound is a power of 2
+ return (int)((bound * (long)next(31)) >> 31);
+
+ int bits, val;
+ do {
+ bits = next(31);
+ val = bits % bound;
+ } while (bits - val + (bound-1) < 0);
+ return val;
+ }
+
+
+
+ The hedge "approx imately" is used in the foregoing description only because the next method is only
+ approximately an unbiased source of independently chosen bits. If it were a perfect source of randomly chosen
+ bits, then the algorithm shown would choose int values from the stated range with perfect uniformity.
+
+ The algorithm is slightly tricky. It rejects values that would result in an uneven distribution (due to the fact
+ that 2^31 is not divisible by n). The probability of a value being rejected depends on n. The worst case is
+ n=2^30+1, for which the probability of a reject is 1/2, and the expected number of iterations before the loop
+ terminates is 2.
+
+ The algorithm treats the case where n is a power of two specially: it returns the correct number of high-order
+ bits from the underlying pseudo-random number generator. In the absence of special treatment, the correct number
+ of low-order bits would be returned. Linear congruential pseudo-random number generators such as the one
+ implemented by this class are known to have short periods in the sequence of values of their low-order bits.
+ Thus, this special case greatly increases the length of the sequence of values returned by successive calls to
+ this method if n is a small power of two.
caller should call the non deprecated overload. implementor for reusable IStructureElement
+ should still implement this. implementor for private implementations can freely ignore this as long
+ as you know the caller will not call this overload.
+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces
+
+
Search
+
You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API. These items can be searched using part or all of the name, optionally using "camelCase" abbreviations, or multiple search terms separated by whitespace. Some examples:
+The following sections describe the different kinds of pages in this collection.
+
+
Overview
+
The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.
+
+
+
Package
+
Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:
+
+
Interfaces
+
Classes
+
Enum Classes
+
Exception Classes
+
Annotation Interfaces
+
+
+
+
Class or Interface
+
Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.
+
+
Class Inheritance Diagram
+
Direct Subclasses
+
All Known Subinterfaces
+
All Known Implementing Classes
+
Class or Interface Declaration
+
Class or Interface Description
+
+
+
+
Nested Class Summary
+
Enum Constant Summary
+
Field Summary
+
Property Summary
+
Constructor Summary
+
Method Summary
+
Required Element Summary
+
Optional Element Summary
+
+
+
+
Enum Constant Details
+
Field Details
+
Property Details
+
Constructor Details
+
Method Details
+
Element Details
+
+
Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.
+
The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+
+
+
Other Files
+
Packages and modules may contain pages with additional information related to the declarations nearby.
+
+
+
Tree (Class Hierarchy)
+
There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.
+
+
When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
+
When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
+
+
+
+
Deprecated API
+
The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to shortcomings, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.
+
+
+
All Packages
+
The All Packages page contains an alphabetic index of all packages contained in the documentation.
+
+
+
All Classes and Interfaces
+
The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.
+
+
+
Index
+
The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.
+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
Example Implementation - Search tag in com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered(ITierConverter<TIER>, List<Pair<Block, Integer>>, TIER, BiConsumer<T, TIER>, Function<T, TIER>)
Implement this and use StructureUtility.withContext(IStructureElement) in case you need to record some
+ temporary states that don't need to live in your main context, which would usually live for the whole lifetime of the
+ structure than just during structure check.
next(int) - Method in class com.gtnewhorizon.structurelib.util.XSTR
+
+
Implementation of George Marsaglia's elegant Xorshift random generator 30% faster and better quality than the
+ built-in java.util.random see also see http://www.javamex.com/tutorials/random_numbers/xorshift.shtml
+
+
nextBoolean() - Method in class com.gtnewhorizon.structurelib.util.XSTR
nextDouble() - Method in class com.gtnewhorizon.structurelib.util.XSTR
+
+
nextFloat() - Method in class com.gtnewhorizon.structurelib.util.XSTR
+
+
nextGaussian() - Method in class com.gtnewhorizon.structurelib.util.XSTR
+
+
nextInt() - Method in class com.gtnewhorizon.structurelib.util.XSTR
+
+
nextInt(int) - Method in class com.gtnewhorizon.structurelib.util.XSTR
+
+
Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value
+ (exclusive), drawn from this random number generator's sequence.
+
+
nextLong() - Method in class com.gtnewhorizon.structurelib.util.XSTR
+
+
NONE - Enum constant in enum class com.gtnewhorizon.structurelib.alignment.enumerable.Flip
This element's space is occupied by other stuff and require player attention, or player missing required
+ resource, or the block cannot be placed due to obscure mechanisms, or some other unforeseen situations.
caller should call the non deprecated overload. implementor for reusable IStructureElement
+ should still implement this. implementor for private implementations can freely ignore this as long
+ as you know the caller will not call this overload.
Return a trigger item that
+
+ Still carry all the subchannel in some unspecified ways
+ Have its master channel data replaced with specified subchannel's data
+
+
+ If given subchannel does not exist, masterStack may or may not be returned to save performance.
+ This is the standard library of IStructureElements.
+ The Standard Library contains structure elements that handle basic block element and elements that allow composing
+ these basic elements.
+
+ This interface should be implemented by tile entities that support creative autoplacing and hint particle emitting.
+ You will usually want to have a backing IStructureDefinition
+ and call its build()
+ or hints() method here.
+
+ This interface is an enhancement over IConstructable.
+ If your tile entities also support survival autoplacing then you should implement this.
+ You will usually want to have a backing IStructureDefinition
+ and call its survivalBuild().
+
+ This interface should be implemented on tile entities that will delegate all constructable or survival construable
+ functionality to some other class.
+ This is mostly only to support gregtech meta tile entity system.
+
+ This class backs the standard implementations of IItemSource.
+ You might want to register new inventory provider or inventory extractor there to facilitate survival auto place.
+
+ These interfaces will be used to implement rotation.
+ Provide a framework to rotate the block.
+ You can skip this if you store ExtendedFacing and do rotation in other means.
+
+ This class contains the low level utility used for implementing new IStructureElement.
+ You will also need methods in this class to while implementing rotation.
+
+
+ IF THERE IS A SAME NAMED METHOD IN OTHER CLASS, ONLY USE METHODS FOUND IN THIS CLASS, NOT OTHER CLASS.
+ This abstraction is necessary so we can change how underlying code work (e.g. how hint particles are rendered)
+ without
+ breaking client code.
+
+ This class is the base class of all events that will be posted while a IStructureDefinition are visited.
+ These events are disabled by default, and can be enabled by calling StructureLibAPI.enableInstrument(Object).
+ To receive these events, register an event handler to MinecraftForge.EVENT_BUS.
+ Handlers should filter the events received by StructureEvent.getInstrumentIdentifier().
+
+
+ These events are intended for third party tools to inspect structure details. Normal users should not use
+ these at all.
+
+ Standard structure element library offers method to switch context objects if needed.
+
+
+
Trigger Item
+
+ Trigger Item is the item used to trigger hint spawn, creative build and survival auto place.
+ The trigger item will be passed to relevant classes as an indicator of structure tier.
+ The item type and stack tag compound of this item stack are opaque objects that should not be parsed.
+
+
+ StructureLib comes with a trigger item implementation.
+ It does register it to the game registries, but does not come with a recipe.
+ Usually there is no reason to reimplement this on your own.
+
+
+
ModeToggleableItem
+
+ This class is the base class for ItemConstructableTrigger that defines
+ the TriggerModes for the ItemConstructableTrigger. There are
+ 3 modes, BUILDING, UPDATING, and REMOVING. Each of these modes does as they
+ say, where building will build a new multi from scratch, updating will remove existing an existing structure and
+ replace it with new components (think upgrading glass on a multi, changing from a tier 1 to tier 2 of a multi, etc),
+ and removing will just straight up remove the multi.
+
+ Trigger item carries the player's choice of structure tier by its stack size.
+ When one multi have multiple tiered component that can have interleaving tier, this becomes an obnoxious
+ restriction, as one ItemStack cannot have two stack sizes at the same time.
+ Here we use the channels to bypass this restriction.
+
+
+
+ Basically, channels are information stored on the trigger item's NBT tags.
+ One trigger item can carry multiple channels.
+ Each channel can be identified with lower case strings and has the value being one positive Java int.
+ There will be one and only one master channel and 0 or more sub channel.
+ When a non-existent sub channel is queried, master channel will be used instead to fill its place.
+
+
+
+ Structure Definition Author and/or Structure Element Author can choose whether they use a channel and which channel
+ to use.
+
+
+
+ Structure Element Author will usually not need to consider channels, i.e. proceed as if this concept does not exist,
+ unless it must take input from multiple channels.
+
+
+
+ Structure Definition Author will consider how to map each channel to each tiered component.
+ He will be using `com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel` to direct structure element
+ on which channel to use.
+ Conceptually, it will return an ItemStack with the master channel being the value of selected channel.
+ In implementation, withChannel will return a new ItemStack with same item, nbt but different stack size.
+
+
+
+ It's worth mentioning that the returned new ItemStack will still have all the channel data on it, so a multi-channel
+ structure element can still query the channel it wants just fine. It is however impossible to recover the original
+ master channel.
+
+
+
why is this called channel?
+
+Just give me a better name and I'd do the renaming.
+
+
Channel Descriptions
+
+ Each channel can have one description associated with it per mod.
+ Channel description should briefly describe how a specific channel is used for inside a specific mod.
+ They will be displayed to player in channel editor GUI that comes with StructureLib.
+ The registration process can be done either via direct method call to StructureLibAPI.registerChannelDescription(String, String, String),
+ or by sending an IMC message.
+ After registration, the channel will also show up as autocomplete options when players are editing channels.
+
+
+
+ Here is an example of sending an IMC message to register two channels and their description.
+ In this example, we assume your modid is my_mod and your mod will ship with localization entries for
+ localization key channels.my_mod.channel_1 and channels.my_mod.channel_2
+
+ There is no strict rules over whether you should do direct API method call or send IMC messages.
+ You can choose whichever you prefer.
+
+
+
Channel Indicator Items
+
+ You can associate an ItemStack with a given (channel, value) pair.
+ It is usually (but not required to be) the ItemBlock for the blocks to be placed by this (channel, value) pair.
+ Player will be able to drag and drop this item to the builtin channel configuration GUI.
+ The registration process can be done either via direct method call to StructureLibAPI.registerChannelItem(String, String, int, net.minecraft.item.ItemStack),
+ or by sending an IMC message.
+ After registration, the channel will also show up as autocomplete options when players are editing channels.
+
+
+
+ Here is an example of sending an IMC message to register 3 vanilla sandstone as different indicator for channel "sandstone", with block metadata plus 1 as channel value.
+ In this example, we assume your modid is my_mod.
+
+
+
+ NBTTagCompound command = new NBTTagCompound();
+ NBTTagList items = new NBTTagList();
+ int[] metas = {0, 1, 2};
+ for (int meta : metas) {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setTag("Item", new ItemStack(Blocks.sandstone, 1, meta).writeToNBT(new NBTTagCompound()));
+ NBTTagList channels = new NBTTagList();
+ NBTTagCompound channel = new NBTTagCompound();
+ channel.setString("Channel", "sandstone");
+ channel.setInteger("Value", meta + 1);
+ channels.appendTag(channel);
+ tag.setTag("Channels", channels);
+ items.appendTag(tag);
+ }
+ command.setTag("Items", items);
+ FMLInterModComms.sendMessage("structurelib", "register_channel_item", command);
+
+
+
+ There is no strict rules over whether you should do direct API method call or send IMC messages.
+ You can choose whichever you prefer.
+
+
+
Examples
+
+
For Structure Definition Author
+
+
GT++ Chemical Plant is a multi with 4 distinctly tiered component.
+whereas all these structure elements are designed without considering channels whatsoever
+
+
Multi channel input Structure Element
+
+
+ Suppose your hatch element has a required facing and can accept arbitrary meta tile entity, so it will need both
+ meta id
+ and facing input.
+
+
+
+ It will use
+
+
master channel for its facing
+
channel `"id"` for meta tile entity id
+
+
+ Its code will then look like
+
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+
+public class MyHatchElement<T> implements IStructureElement<T> {
+ //...
+ @Override
+ public PlaceResult survivalPlaceBlock(
+ Object o,
+ World world,
+ int x,
+ int y,
+ int z,
+ ItemStack trigger,
+ IItemSource s,
+ EntityPlayerMP actor,
+ Consumer chatter) {
+ if (shouldSkip(o, world, x, y, z)) return PlaceResult.SKIP;
+ if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, actor)) return PlaceResult.REJECT;
+ ItemStack taken = s.takeOne(filterByID(ChannelDataAccessor.getChannelData(trigger, "id")).andThen(filterByFacing(trigger.stackSize)));
+ if (taken == null) return PlaceResult.REJECT;
+ return StructureUtility.survivalPlaceBlock(taken, ItemStackPredicate.NBTMode.IGNORE, null, true, world, x, y, z, s, actor);
+ }
+}
+
+
+The code for placeBlock() and spawnHint() will be left as an exercise for the reader.
+
+
Instrumenting StructureLib
+
+ StructureLib support third party tools to poke into structure's internals via events. This is done by listening to StructureEvent
+ and its subclasses on the forge main event bus.
+
+
+ Please refer to StructureEvent to see what events are available.
+
+
Extending Inventory Utility
+InventoryUtility is how structurelib survival autoplace pulls item for autoplacing.
+It has two key concepts: inventory providers and stack extractors.
+
+ Inventory Providers are classes that retrieve an Iterable of ItemStacks for examination, given an EntityPlayerMP as identifier.
+ They are also responsible for marking the relevant item container as dirty, so changes can be commited to disk properly when world save happens.
+ Examples include: main player inventory, vanilla ender chest, baubles inventory. StructureLib comes with main player inventory and vanilla ender chest built in.
+
+
+ Stack Extractors are classes that retrieve items from another item.
+ Examples include: Forestry backpacks, ME network over ME Wireless Terminals.
+
+
+Both of these are managed internally by SortedRegistry.
+By default, elements registered will be sorted in lexicographical order in ascending order.
+However, facilities in StructureLib will allow an end user to tweak these registries as their wish.
+They can disable, reorder, reenable any element within the registry, either in game, at main menu or with the game stopped,
+Their changes will be synced to server as well, should they be playing on a dedicated server.
+
+
+ This has the following important implications
+
+
+
Not all inventory providers or stack extractors may be called during a survival autoplace session
+
One player could have stack extractor 001 ordered before 002, while the other having a completely reversed order
+
+Therefore, if your stack extractor can somehow correlate with aonther one, make sure it still works if the calling order is inverted.
+At the very least, inform the player about this ordering constraint.
+A future StructrueLib refactor to specify this dependency info is possible, but the chance is low.
+
Localization
+Both of these would show up in config GUI of StructureLib. Structurelib uses the following localization keys in that GUI.
+
+
structurelib.sortedregistry.inventoryproviders.<registry_key>: This is the name shown on the button for inventory providers. If this is not provided, then registry_key will be used instead.
+
structurelib.sortedregistry.inventoryproviders.<registry_key>.tooltip: This is the tooltip shown when user hover over the button for inventory providers. If this is not provided, then no explicit tooltip will be shown.
+
structurelib.sortedregistry.stackextractors.<registry_key>: This is the name shown on the button for stack extractors. If this is not provided, then registry_key will be used instead.
+
structurelib.sortedregistry.stackextractors.<registry_key>.tooltip: This is the tooltip shown when user hover over the button for stack extractors. If this is not provided, then no explicit tooltip will be shown.
+
+
diff --git a/1.4.19-pre/javadoc/legal/ADDITIONAL_LICENSE_INFO b/1.4.19-pre/javadoc/legal/ADDITIONAL_LICENSE_INFO
new file mode 100644
index 00000000..ff700cd0
--- /dev/null
+++ b/1.4.19-pre/javadoc/legal/ADDITIONAL_LICENSE_INFO
@@ -0,0 +1,37 @@
+ ADDITIONAL INFORMATION ABOUT LICENSING
+
+Certain files distributed by Oracle America, Inc. and/or its affiliates are
+subject to the following clarification and special exception to the GPLv2,
+based on the GNU Project exception for its Classpath libraries, known as the
+GNU Classpath Exception.
+
+Note that Oracle includes multiple, independent programs in this software
+package. Some of those programs are provided under licenses deemed
+incompatible with the GPLv2 by the Free Software Foundation and others.
+For example, the package includes programs licensed under the Apache
+License, Version 2.0 and may include FreeType. Such programs are licensed
+to you under their original licenses.
+
+Oracle facilitates your further distribution of this package by adding the
+Classpath Exception to the necessary parts of its GPLv2 code, which permits
+you to use that code in combination with other independent modules not
+licensed under the GPLv2. However, note that this would not permit you to
+commingle code under an incompatible license with Oracle's GPLv2 licensed
+code by, for example, cutting and pasting such code into a file also
+containing Oracle's GPLv2 licensed code and then distributing the result.
+
+Additionally, if you were to remove the Classpath Exception from any of the
+files to which it applies and distribute the result, you would likely be
+required to license some or all of the other code in that distribution under
+the GPLv2 as well, and since the GPLv2 is incompatible with the license terms
+of some items included in the distribution by Oracle, removing the Classpath
+Exception could therefore effectively compromise your ability to further
+distribute the package.
+
+Failing to distribute notices associated with some files may also create
+unexpected legal consequences.
+
+Proceed with caution and we recommend that you obtain the advice of a lawyer
+skilled in open source matters before removing the Classpath Exception or
+making modifications to this package which may subsequently be redistributed
+and/or involve the use of third party software.
diff --git a/1.4.19-pre/javadoc/legal/ASSEMBLY_EXCEPTION b/1.4.19-pre/javadoc/legal/ASSEMBLY_EXCEPTION
new file mode 100644
index 00000000..42966666
--- /dev/null
+++ b/1.4.19-pre/javadoc/legal/ASSEMBLY_EXCEPTION
@@ -0,0 +1,27 @@
+
+OPENJDK ASSEMBLY EXCEPTION
+
+The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
+openjdk.org ("OpenJDK Code") is distributed under the terms of the GNU
+General Public License version 2
+only ("GPL2"), with the following clarification and special exception.
+
+ Linking this OpenJDK Code statically or dynamically with other code
+ is making a combined work based on this library. Thus, the terms
+ and conditions of GPL2 cover the whole combination.
+
+ As a special exception, Oracle gives you permission to link this
+ OpenJDK Code with certain code licensed by Oracle as indicated at
+ https://openjdk.org/legal/exception-modules-2007-05-08.html
+ ("Designated Exception Modules") to produce an executable,
+ regardless of the license terms of the Designated Exception Modules,
+ and to copy and distribute the resulting executable under GPL2,
+ provided that the Designated Exception Modules continue to be
+ governed by the licenses under which they were offered by Oracle.
+
+As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
+to build an executable that includes those portions of necessary code that
+Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
+with the Classpath exception). If you modify or add to the OpenJDK code,
+that new GPL2 code may still be combined with Designated Exception Modules
+if the new code is made subject to this exception by its copyright holder.
diff --git a/1.4.19-pre/javadoc/legal/LICENSE b/1.4.19-pre/javadoc/legal/LICENSE
new file mode 100644
index 00000000..8b400c7a
--- /dev/null
+++ b/1.4.19-pre/javadoc/legal/LICENSE
@@ -0,0 +1,347 @@
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it. By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users. This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it. (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have. You must
+make sure that they, too, receive or can get the source code. And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License. The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope. The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+ a) You must cause the modified files to carry prominent notices stating
+ that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in whole or
+ in part contains or is derived from the Program or any part thereof, to be
+ licensed as a whole at no charge to all third parties under the terms of
+ this License.
+
+ c) If the modified program normally reads commands interactively when run,
+ you must cause it, when started running for such interactive use in the
+ most ordinary way, to print or display an announcement including an
+ appropriate copyright notice and a notice that there is no warranty (or
+ else, saying that you provide a warranty) and that users may redistribute
+ the program under these conditions, and telling the user how to view a copy
+ of this License. (Exception: if the Program itself is interactive but does
+ not normally print such an announcement, your work based on the Program is
+ not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works. But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable source
+ code, which must be distributed under the terms of Sections 1 and 2 above
+ on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three years, to
+ give any third party, for a charge no more than your cost of physically
+ performing source distribution, a complete machine-readable copy of the
+ corresponding source code, to be distributed under the terms of Sections 1
+ and 2 above on a medium customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer to
+ distribute corresponding source code. (This alternative is allowed only
+ for noncommercial distribution and only if you received the program in
+ object code or executable form with such an offer, in accord with
+ Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it. For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable. However, as a special exception, the source code
+distributed need not include anything that is normally distributed (in either
+source or binary form) with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source
+code from the same place counts as distribution of the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License. However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works. These actions are prohibited by law if you do not
+accept this License. Therefore, by modifying or distributing the Program (or
+any work based on the Program), you indicate your acceptance of this License to
+do so, and all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein. You are not responsible for enforcing compliance by
+third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License. If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices. Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded. In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time. Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software Foundation.
+If the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+ One line to give the program's name and a brief idea of what it does.
+
+ Copyright (C)
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+ with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free
+ software, and you are welcome to redistribute it under certain conditions;
+ type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary. Here
+is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ 'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ signature of Ty Coon, 1 April 1989
+
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL
+
+Certain source files distributed by Oracle America and/or its affiliates are
+subject to the following clarification and special exception to the GPL, but
+only where Oracle has expressly included in the particular source file's header
+the words "Oracle designates this particular file as subject to the "Classpath"
+exception as provided by Oracle in the LICENSE file that accompanied this code."
+
+ Linking this library statically or dynamically with other modules is making
+ a combined work based on this library. Thus, the terms and conditions of
+ the GNU General Public License cover the whole combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,
+ and to copy and distribute the resulting executable under terms of your
+ choice, provided that you also meet, for each linked independent module,
+ the terms and conditions of the license of that module. An independent
+ module is a module which is not derived from or based on this library. If
+ you modify this library, you may extend this exception to your version of
+ the library, but you are not obligated to do so. If you do not wish to do
+ so, delete this exception statement from your version.
diff --git a/1.4.19-pre/javadoc/legal/jquery.md b/1.4.19-pre/javadoc/legal/jquery.md
new file mode 100644
index 00000000..a763ec6f
--- /dev/null
+++ b/1.4.19-pre/javadoc/legal/jquery.md
@@ -0,0 +1,26 @@
+## jQuery v3.7.1
+
+### jQuery License
+```
+jQuery v 3.7.1
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+```
diff --git a/1.4.19-pre/javadoc/legal/jqueryUI.md b/1.4.19-pre/javadoc/legal/jqueryUI.md
new file mode 100644
index 00000000..8bda9d7a
--- /dev/null
+++ b/1.4.19-pre/javadoc/legal/jqueryUI.md
@@ -0,0 +1,49 @@
+## jQuery UI v1.13.2
+
+### jQuery UI License
+```
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-ui
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code contained within the demos directory.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+```
diff --git a/1.4.19-pre/javadoc/link.svg b/1.4.19-pre/javadoc/link.svg
new file mode 100644
index 00000000..7ccc5ed0
--- /dev/null
+++ b/1.4.19-pre/javadoc/link.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/1.4.19-pre/javadoc/member-search-index.js b/1.4.19-pre/javadoc/member-search-index.js
new file mode 100644
index 00000000..74efc372
--- /dev/null
+++ b/1.4.19-pre/javadoc/member-search-index.js
@@ -0,0 +1 @@
+memberSearchIndex = [{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ISurvivalConstructable","l":"__get_player()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"abs()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.PlaceResult","l":"ACCEPT"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.PlaceResult","l":"ACCEPT_STOP"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"add(int, int, int)","u":"add(int,int,int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackCounter","l":"add(ItemStack, int)","u":"add(net.minecraft.item.ItemStack,int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"add(Vec3Impl)","u":"add(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition.Builder","l":"addElement(char, IStructureElement)","u":"addElement(char,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition.Builder","l":"addElement(Character, IStructureElement)","u":"addElement(java.lang.Character,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition.Builder","l":"addShape(String, String[][])","u":"addShape(java.lang.String,java.lang.String[][])"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"addThrottledChat(Object, EntityPlayer, IChatComponent, short)","u":"addThrottledChat(java.lang.Object,net.minecraft.entity.player.EntityPlayer,net.minecraft.util.IChatComponent,short)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"addThrottledChat(Object, EntityPlayer, IChatComponent, short, boolean)","u":"addThrottledChat(java.lang.Object,net.minecraft.entity.player.EntityPlayer,net.minecraft.util.IChatComponent,short,boolean)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"allow(ExtendedFacing)","u":"allow(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"allow(Flip)","u":"allow(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"allow(ForgeDirection)","u":"allow(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"allow(Rotation)","u":"allow(com.gtnewhorizon.structurelib.alignment.enumerable.Rotation)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"allowAll()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits","l":"allowOnly(ExtendedFacing...)","u":"allowOnly(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing...)"},{"p":"com.gtnewhorizon.structurelib.structure.adders","c":"IBlockAdder","l":"apply(T, Block, int)","u":"apply(T,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure.adders","c":"ITileAdder","l":"apply(T, TileEntity)","u":"apply(T,net.minecraft.tileentity.TileEntity)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"AutoPlaceEnvironment(AutoPlaceEnvironment)","u":"%3Cinit%3E(com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"build()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition.Builder","l":"build()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"build(T, ItemStack, String, World, ExtendedFacing, int, int, int, int, int, int)","u":"build(T,net.minecraft.item.ItemStack,java.lang.String,net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"builder()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition","l":"builder()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"buildOrHints(T, ItemStack, String, World, ExtendedFacing, int, int, int, int, int, int, boolean)","u":"buildOrHints(T,net.minecraft.item.ItemStack,java.lang.String,net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int,boolean)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"byIndex(int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"byIndex(int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"byIndex(int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"byName(String)","u":"byName(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"byName(String)","u":"byName(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"byName(String)","u":"byName(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"canSetToDirectionAny(ForgeDirection)","u":"canSetToDirectionAny(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"CHANNEL_SHOW_ERROR"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"check(T, String, World, ExtendedFacing, int, int, int, int, int, int, boolean)","u":"check(T,java.lang.String,net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int,boolean)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"check(T, World, int, int, int)","u":"check(T,net.minecraft.world.World,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementChain","l":"check(T, World, int, int, int)","u":"check(T,net.minecraft.world.World,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"checkedSetDirection(ForgeDirection)","u":"checkedSetDirection(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"checkedSetExtendedFacing(ExtendedFacing)","u":"checkedSetExtendedFacing(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"checkedSetFlip(Flip)","u":"checkedSetFlip(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"checkedSetRotation(Rotation)","u":"checkedSetRotation(com.gtnewhorizon.structurelib.alignment.enumerable.Rotation)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"checkForRemoving(ModeToggleableItem.TriggerMode, boolean, World, int, int, int)","u":"checkForRemoving(com.gtnewhorizon.structurelib.item.ModeToggleableItem.TriggerMode,boolean,net.minecraft.world.World,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"checkPermission(World, EntityPlayer, int, int, int)","u":"checkPermission(net.minecraft.world.World,net.minecraft.entity.player.EntityPlayer,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"CLOCKWISE"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"clone()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"compareTo(Vec3Impl)","u":"compareTo(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IConstructable","l":"construct(ItemStack, boolean)","u":"construct(net.minecraft.item.ItemStack,boolean)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IMultiblockInfoContainer","l":"construct(ItemStack, boolean, T, ExtendedFacing)","u":"construct(net.minecraft.item.ItemStack,boolean,T,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IBlockPosConsumer","l":"consume(World, int, int, int)","u":"consume(net.minecraft.world.World,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IMultiblockInfoContainer","l":"contains(Class>)","u":"contains(java.lang.Class)"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"containsKey(String)","u":"containsKey(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"containsValue(V)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"ITierConverter","l":"convert(Block, int)","u":"convert(net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"couldBeValid(T, World, int, int, int, ItemStack)","u":"couldBeValid(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementChain","l":"couldBeValid(T, World, int, int, int, ItemStack)","u":"couldBeValid(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementCheckOnly","l":"couldBeValid(T, World, int, int, int, ItemStack)","u":"couldBeValid(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"countChannelData(ItemStack)","u":"countChannelData(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"COUNTER_CLOCKWISE"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"create(Block, int)","u":"create(net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"ISurvivalBuildEnvironment","l":"create(IItemSource, EntityPlayer)","u":"create(com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"create(Item, int)","u":"create(net.minecraft.item.Item,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"create(ItemStack)","u":"create(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"create(ItemStack...)","u":"create(net.minecraft.item.ItemStack...)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"create(Iterable)","u":"create(java.lang.Iterable)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"create(Predicate)","u":"create(java.util.function.Predicate)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"createEmpty()"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor","l":"createOnlyOptimized(InventoryUtility.OptimizedExtractor)","u":"createOnlyOptimized(com.gtnewhorizon.structurelib.util.InventoryUtility.OptimizedExtractor)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"crossProduct(Vec3Impl)","u":"crossProduct(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DEFAULT"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(BiFunction, IStructureElement...)","u":"defer(java.util.function.BiFunction,com.gtnewhorizon.structurelib.structure.IStructureElement...)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(BiFunction, List>)","u":"defer(java.util.function.BiFunction,java.util.List)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(BiFunction>)","u":"defer(java.util.function.BiFunction)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(BiFunction, Map>)","u":"defer(java.util.function.BiFunction,java.util.Map)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(BiFunction, Map>, IStructureElement)","u":"defer(java.util.function.BiFunction,java.util.Map,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function, BiFunction, IStructureElement...)","u":"defer(java.util.function.Function,java.util.function.BiFunction,com.gtnewhorizon.structurelib.structure.IStructureElement...)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function, BiFunction, List>)","u":"defer(java.util.function.Function,java.util.function.BiFunction,java.util.List)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function, IStructureElement...)","u":"defer(java.util.function.Function,com.gtnewhorizon.structurelib.structure.IStructureElement...)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function, List>)","u":"defer(java.util.function.Function,java.util.List)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function>)","u":"defer(java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function>, BiFunction>)","u":"defer(java.util.function.Function,java.util.function.BiFunction)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function, BiFunction, Map>)","u":"defer(java.util.function.Function,java.util.function.BiFunction,java.util.Map)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function, BiFunction, Map>, IStructureElement)","u":"defer(java.util.function.Function,java.util.function.BiFunction,java.util.Map,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function, Map>)","u":"defer(java.util.function.Function,java.util.Map)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Function, Map>, IStructureElement)","u":"defer(java.util.function.Function,java.util.Map,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"defer(Supplier>)","u":"defer(java.util.function.Supplier)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"deny(ExtendedFacing)","u":"deny(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"deny(Flip)","u":"deny(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"deny(ForgeDirection)","u":"deny(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"deny(Rotation)","u":"deny(com.gtnewhorizon.structurelib.alignment.enumerable.Rotation)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"denyAll()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits","l":"denyOnly(ExtendedFacing...)","u":"denyOnly(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing...)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"DIRECTIONS_COUNT"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ISurvivalConstructable","l":"DISABLE_HACKY_MIGRATION_CODE"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"disableInstrument()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"distanceSq(double, double, double, boolean)","u":"distanceSq(double,double,double,boolean)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"distanceSq(IPosition, boolean)","u":"distanceSq(net.minecraft.dispenser.IPosition,boolean)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"distanceSq(Vec3Impl)","u":"distanceSq(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"DOWN"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_COUNTER_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_COUNTER_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_COUNTER_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_COUNTER_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_NORMAL_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_NORMAL_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_NORMAL_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_NORMAL_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_UPSIDE_DOWN_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_UPSIDE_DOWN_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_UPSIDE_DOWN_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"DOWN_UPSIDE_DOWN_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"EAST"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_COUNTER_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_COUNTER_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_COUNTER_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_COUNTER_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_NORMAL_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_NORMAL_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_NORMAL_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_NORMAL_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_UPSIDE_DOWN_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_UPSIDE_DOWN_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_UPSIDE_DOWN_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"EAST_UPSIDE_DOWN_VERTICAL"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"enableInstrument(Object)","u":"enableInstrument(java.lang.Object)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"endHinting(World)","u":"endHinting(net.minecraft.world.World)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"ensureDuplicates()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"ensureNoDuplicates(Flip)","u":"ensureNoDuplicates(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"error()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"errored"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate.NBTMode","l":"EXACT"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor.APIType","l":"EXTRACT_ONE_STACK"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.OptimizedExtractor","l":"extract(ItemStack, ItemStack, boolean, EntityPlayerMP)","u":"extract(net.minecraft.item.ItemStack,net.minecraft.item.ItemStack,boolean,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits","l":"FACING_UP"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementChain","l":"fallbacks()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"filter(Function>)","u":"filter(java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"fireEvent(World, int, int, int, int, int, int, IStructureElement>)","u":"fireEvent(net.minecraft.world.World,int,int,int,int,int,int,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"FLIPS_COUNT"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"FOR_FACING"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"forEach(Consumer super V>)","u":"forEach(java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate","l":"from(Block)","u":"from(net.minecraft.block.Block)"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate","l":"from(Item)","u":"from(net.minecraft.item.Item)"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate","l":"from(ItemStack)","u":"from(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate","l":"from(ItemStack, ItemStackPredicate.NBTMode)","u":"from(net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IItemSource","l":"fromInventory(IInventory)","u":"fromInventory(net.minecraft.inventory.IInventory)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"fromLegacy(IItemSource, EntityPlayer, Consumer)","u":"fromLegacy(com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayer,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IItemSource","l":"fromPlayer(EntityPlayerMP)","u":"fromPlayer(net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IMultiblockInfoContainer","l":"get(Class>)","u":"get(java.lang.Class)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"get(int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"get(String)","u":"get(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"get0()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"get1()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"get2()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"getA()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"getActor()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"ISurvivalBuildEnvironment","l":"getActor()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"getAlignment()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentProvider","l":"getAlignment()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"getAlignmentIndex(ForgeDirection, Rotation, Flip)","u":"getAlignmentIndex(net.minecraftforge.common.util.ForgeDirection,com.gtnewhorizon.structurelib.alignment.enumerable.Rotation,com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"getAlignmentLimits()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getAllWith(Flip)","u":"getAllWith(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getAllWith(ForgeDirection)","u":"getAllWith(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getAllWith(Rotation)","u":"getAllWith(com.gtnewhorizon.structurelib.alignment.enumerable.Rotation)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"getAPILevel()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"getAxisVector()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"getAxisVector(ForgeDirection)","u":"getAxisVector(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"getB()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"getBlockHint()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"getBlocksToPlace(T, World, int, int, int, ItemStack, AutoPlaceEnvironment)","u":"getBlocksToPlace(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementChain","l":"getBlocksToPlace(T, World, int, int, int, ItemStack, AutoPlaceEnvironment)","u":"getBlocksToPlace(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"getByAxisVector(Vec3Impl)","u":"getByAxisVector(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"getC()"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"getChannelData(ItemStack, String)","u":"getChannelData(net.minecraft.item.ItemStack,java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"getChatter()"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IConstructableProvider","l":"getConstructable()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IWithExtendedContext","l":"getCurrentContext()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"getDefaultHologramItem()"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IMultiblockInfoContainer","l":"getDescription(ItemStack)","u":"getDescription(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getDirection()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"getDirection()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getDuplicate()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"getElement()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition.Builder","l":"getElements()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition","l":"getElements()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"getExtendedFacing()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"getFacing()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getFlip()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"getFlip()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"getForgeDirection()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"getFromPool(int, int, int)","u":"getFromPool(int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getIndex()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"getIndex()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"getIndex()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent","l":"getInstrumentIdentifier()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getIntegerAxisSwap()"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryIterable","l":"getInventory()"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.InventoryProvider","l":"getInventory(EntityPlayerMP)","u":"getInventory(net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor","l":"getItem(ItemStack, ItemStack, boolean, EntityPlayerMP)","u":"getItem(net.minecraft.item.ItemStack,net.minecraft.item.ItemStack,boolean,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"getItemBlockHint()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"ISpecialItemBlock","l":"getItemMetaFromBlockMeta(Block, int)","u":"getItemMetaFromBlockMeta(net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getLocalizedName()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"getName()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"getName()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getName2()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"getName2()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"getName2()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getOffsetABC(double[], double[])","u":"getOffsetABC(double[],double[])"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getOffsetABC(int[], int[])","u":"getOffsetABC(int[],int[])"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getOffsetABC(Vec3)","u":"getOffsetABC(net.minecraft.util.Vec3)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getOffsetABC(Vec3Impl)","u":"getOffsetABC(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"getOpposite()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"getOpposite()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getOppositeDirection()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getOppositeFlip()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getOppositeRotation()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"getPredicate()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"getPseudoJavaCode(World, ExtendedFacing, int, int, int, int, int, int, Function super TileEntity, String>, int, int, int, boolean)","u":"getPseudoJavaCode(net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int,java.util.function.Function,int,int,int,boolean)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getRelativeBackInWorld()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getRelativeDownInWorld()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getRelativeForwardInWorld()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getRelativeLeftInWorld()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getRelativeRightInWorld()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getRelativeUpInWorld()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getRotation()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"getRotation()"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"getSeed()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition.Builder","l":"getShapes()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition","l":"getShapes()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"getSource()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"ISurvivalBuildEnvironment","l":"getSource()"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"getStackExtractors(EntityPlayerMP)","u":"getStackExtractors(net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.BlocksToPlace","l":"getStacks()"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackArrayIterable","l":"getStacks()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"getStepA()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"getStepB()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"getStepC()"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IConstructable","l":"getStructureDefinition()"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IConstructable","l":"getStructureDescription(ItemStack)","u":"getStructureDescription(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"getStructureFor(String)","u":"getStructureFor(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition","l":"getStructureFor(String)","u":"getStructureFor(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition","l":"getStructures()"},{"p":"com.gtnewhorizon.structurelib.util","c":"MiscUtils","l":"getTagKeys(NBTTagCompound)","u":"getTagKeys(net.minecraft.nbt.NBTTagCompound)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"getWorld()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getWorldDirection(ForgeDirection)","u":"getWorldDirection(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getWorldOffset(double[], double[])","u":"getWorldOffset(double[],double[])"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getWorldOffset(int[], int[])","u":"getWorldOffset(int[],int[])"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getWorldOffset(Vec3)","u":"getWorldOffset(net.minecraft.util.Vec3)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"getWorldOffset(Vec3Impl)","u":"getWorldOffset(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"getX()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"getY()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"getZ()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"AlignmentUtility","l":"handle(EntityPlayer, World, int, int, int)","u":"handle(net.minecraft.entity.player.EntityPlayer,net.minecraft.world.World,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ConstructableUtility","l":"handle(ItemStack, EntityPlayer, World, int, int, int, int)","u":"handle(net.minecraft.item.ItemStack,net.minecraft.entity.player.EntityPlayer,net.minecraft.world.World,int,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"hashCode()"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"hasSubChannel(ItemStack)","u":"hasSubChannel(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"hasSubChannel(ItemStack, String)","u":"hasSubChannel(net.minecraft.item.ItemStack,java.lang.String)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_AIR"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_DEFAULT"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_ERROR"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_0"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_1"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_10"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_11"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_2"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_3"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_4"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_5"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_6"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_7"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_8"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_GENERIC_9"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"HINT_BLOCK_META_NOT_AIR"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"hintParticle(World, int, int, int, Block, int)","u":"hintParticle(net.minecraft.world.World,int,int,int,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"hintParticle(World, int, int, int, IIcon[])","u":"hintParticle(net.minecraft.world.World,int,int,int,net.minecraft.util.IIcon[])"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"hintParticleTinted(World, int, int, int, Block, int, short[])","u":"hintParticleTinted(net.minecraft.world.World,int,int,int,net.minecraft.block.Block,int,short[])"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"hintParticleTinted(World, int, int, int, IIcon[], short[])","u":"hintParticleTinted(net.minecraft.world.World,int,int,int,net.minecraft.util.IIcon[],short[])"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"hints(T, ItemStack, String, World, ExtendedFacing, int, int, int, int, int, int)","u":"hints(T,net.minecraft.item.ItemStack,java.lang.String,net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate.NBTMode","l":"IGNORE"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate.NBTMode","l":"IGNORE_KNOWN_INSIGNIFICANT_TAGS"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate","l":"ignoreMeta()"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate.NBTMode","l":"IN"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"init()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"IntegerAxisSwap(ForgeDirection, ForgeDirection, ForgeDirection)","u":"%3Cinit%3E(net.minecraftforge.common.util.ForgeDirection,net.minecraftforge.common.util.ForgeDirection,net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryIterable","l":"InventoryIterable(Inv)","u":"%3Cinit%3E(Inv)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"InventoryUtility()","u":"%3Cinit%3E()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"inverseTranslate(double[], double[])","u":"inverseTranslate(double[],double[])"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"inverseTranslate(int[], int[])","u":"inverseTranslate(int[],int[])"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"inverseTranslate(Vec3)","u":"inverseTranslate(net.minecraft.util.Vec3)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"inverseTranslate(Vec3Impl)","u":"inverseTranslate(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor.APIType","l":"IS_VALID_SOURCE"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"isAir()"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor","l":"isAPIImplemented(InventoryUtility.ItemStackExtractor.APIType)","u":"isAPIImplemented(com.gtnewhorizon.structurelib.util.InventoryUtility.ItemStackExtractor.APIType)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"isBlockTriviallyReplaceable(World, int, int, int, EntityPlayer)","u":"isBlockTriviallyReplaceable(net.minecraft.world.World,int,int,int,net.minecraft.entity.player.EntityPlayer)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"isBlockTriviallyReplaceable(World, int, int, int, EntityPlayerMP)","u":"isBlockTriviallyReplaceable(net.minecraft.world.World,int,int,int,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"isBothFlipped()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"isClockwise()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"isContainedInPiece(int, int, int)","u":"isContainedInPiece(int,int,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"isContainedInStructure(String, int, int, int)","u":"isContainedInStructure(java.lang.String,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureDefinition","l":"isContainedInStructure(String, int, int, int)","u":"isContainedInStructure(java.lang.String,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"isCounterClockwise()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"isDebugEnabled()"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"isEmpty()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"isExtendedFacingValid()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"isFlipChangeAllowed()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"isHorizontallyFlipped()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"isInstrumentEnabled()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"isNavigating()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"isNewDirectionValid(ForgeDirection)","u":"isNewDirectionValid(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"isNewExtendedFacingValid(ExtendedFacing)","u":"isNewExtendedFacingValid(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits","l":"isNewExtendedFacingValid(ExtendedFacing)","u":"isNewExtendedFacingValid(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"isNewExtendedFacingValid(ForgeDirection, Rotation, Flip)","u":"isNewExtendedFacingValid(net.minecraftforge.common.util.ForgeDirection,com.gtnewhorizon.structurelib.alignment.enumerable.Rotation,com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits","l":"isNewExtendedFacingValid(ForgeDirection, Rotation, Flip)","u":"isNewExtendedFacingValid(net.minecraftforge.common.util.ForgeDirection,com.gtnewhorizon.structurelib.alignment.enumerable.Rotation,com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"isNewFlipValid(Flip)","u":"isNewFlipValid(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"isNewRotationValid(Rotation)","u":"isNewRotationValid(com.gtnewhorizon.structurelib.alignment.enumerable.Rotation)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"isNotFlipped()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"isNotRotated()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"isRotationChangeAllowed()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"isUpsideDown()"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor","l":"isValidSource(ItemStack, EntityPlayerMP)","u":"isValidSource(net.minecraft.item.ItemStack,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"isVerticallyFliped()"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackArrayIterable","l":"ItemStackArrayIterable(ItemStack[])","u":"%3Cinit%3E(net.minecraft.item.ItemStack[])"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"iterate(T, ItemStack, IStructureElement[], World, ExtendedFacing, int, int, int, int, int, int, boolean, Boolean)","u":"iterate(T,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.IStructureElement[],net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int,boolean,java.lang.Boolean)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"iterate(World, ExtendedFacing, int, int, int, int, int, int, boolean, int, int, int, IBlockPosConsumer, Runnable, Runnable)","u":"iterate(net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int,boolean,int,int,int,com.gtnewhorizon.structurelib.structure.IBlockPosConsumer,java.lang.Runnable,java.lang.Runnable)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"iterate(World, ExtendedFacing, int, int, int, int, int, int, int, int, int, IBlockPosConsumer)","u":"iterate(net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int,int,int,int,com.gtnewhorizon.structurelib.structure.IBlockPosConsumer)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"iterateChannelData(ItemStack)","u":"iterateChannelData(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryIterable","l":"iterator()"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackArrayIterable","l":"iterator()"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"iterator()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"lazy(Function>)","u":"lazy(java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"lazy(Supplier>)","u":"lazy(java.util.function.Supplier)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment.APILevel","l":"Legacy"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment.APILevel","l":"LegacyRelaxed"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor.APIType","l":"MAIN"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"manhattanDistance(Vec3Impl)","u":"manhattanDistance(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.InventoryProvider","l":"markDirty(R)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"markHintParticleError(EntityPlayer, World, int, int, int)","u":"markHintParticleError(net.minecraft.entity.player.EntityPlayer,net.minecraft.world.World,int,int,int)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"MOD_ID"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IMultiblockInfoContainer","l":"MULTIBLOCK_MAP"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"newInventoryProvider(Function)","u":"newInventoryProvider(java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"newItemStackProvider(Function)","u":"newItemStackProvider(java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"next(int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"nextBoolean()"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"nextBytes(byte[])"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"nextDouble()"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"nextFloat()"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"nextGaussian()"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"nextInt()"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"nextInt(int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"nextLong()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"NONE"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"noPlacement()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementNoPlacement","l":"noPlacement()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"NORMAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"NORTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_COUNTER_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_COUNTER_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_COUNTER_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_COUNTER_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_NORMAL_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_NORMAL_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_NORMAL_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_NORMAL_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_UPSIDE_DOWN_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_UPSIDE_DOWN_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_UPSIDE_DOWN_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"NORTH_UPSIDE_DOWN_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits","l":"NOT_UPSIDE_DOWN"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"notAir()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"NULL_VECTOR"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"of(ForgeDirection)","u":"of(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"of(ForgeDirection, Rotation, Flip)","u":"of(net.minecraftforge.common.util.ForgeDirection,com.gtnewhorizon.structurelib.alignment.enumerable.Rotation,com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlock(Block, int)","u":"ofBlock(net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlock(Block, int, Block, int)","u":"ofBlock(net.minecraft.block.Block,int,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockAdder(IBlockAdder, Block, int)","u":"ofBlockAdder(com.gtnewhorizon.structurelib.structure.adders.IBlockAdder,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockAdder(IBlockAdder, int)","u":"ofBlockAdder(com.gtnewhorizon.structurelib.structure.adders.IBlockAdder,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockAdderHint(IBlockAdder, Block, int)","u":"ofBlockAdderHint(com.gtnewhorizon.structurelib.structure.adders.IBlockAdder,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockAnyMeta(Block)","u":"ofBlockAnyMeta(net.minecraft.block.Block)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockAnyMeta(Block, Block, int)","u":"ofBlockAnyMeta(net.minecraft.block.Block,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockAnyMeta(Block, int)","u":"ofBlockAnyMeta(net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockHint(Block, int)","u":"ofBlockHint(net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockHint(Block, int, Block, int)","u":"ofBlockHint(net.minecraft.block.Block,int,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlocksFlat(Map, Block, int)","u":"ofBlocksFlat(java.util.Map,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlocksFlatHint(Map, Block, int)","u":"ofBlocksFlatHint(java.util.Map,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlocksMap(Map>, Block, int)","u":"ofBlocksMap(java.util.Map,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlocksMapHint(Map>, Block, int)","u":"ofBlocksMapHint(java.util.Map,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlocksTiered(ITierConverter, List>, TIER, BiConsumer, Function)","u":"ofBlocksTiered(com.gtnewhorizon.structurelib.structure.ITierConverter,java.util.List,TIER,java.util.function.BiConsumer,java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlocksTiered(ITierConverter, TIER, BiConsumer, Function)","u":"ofBlocksTiered(com.gtnewhorizon.structurelib.structure.ITierConverter,TIER,java.util.function.BiConsumer,java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockUnlocalizedName(String, String, int)","u":"ofBlockUnlocalizedName(java.lang.String,java.lang.String,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockUnlocalizedName(String, String, int, boolean)","u":"ofBlockUnlocalizedName(java.lang.String,java.lang.String,int,boolean)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofBlockUnlocalizedName(String, String, int, IStructureElement)","u":"ofBlockUnlocalizedName(java.lang.String,java.lang.String,int,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofChain(IStructureElement...)","u":"ofChain(com.gtnewhorizon.structurelib.structure.IStructureElement...)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofChain(List>)","u":"ofChain(java.util.List)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"offset(ForgeDirection, int)","u":"offset(net.minecraftforge.common.util.ForgeDirection,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofHint(int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofHintDeferred(Supplier)","u":"ofHintDeferred(java.util.function.Supplier)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofHintDeferred(Supplier, short[])","u":"ofHintDeferred(java.util.function.Supplier,short[])"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofSpecificTileAdder(BiPredicate, Class, Block, int)","u":"ofSpecificTileAdder(java.util.function.BiPredicate,java.lang.Class,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"ofTileAdder(ITileAdder, Block, int)","u":"ofTileAdder(com.gtnewhorizon.structurelib.structure.adders.ITileAdder,net.minecraft.block.Block,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"onElementFail(Consumer, B)","u":"onElementFail(java.util.function.Consumer,B)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"onElementPass(Consumer, B)","u":"onElementPass(java.util.function.Consumer,B)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"onlyIf(Predicate super T>, IStructureElement super T>)","u":"onlyIf(java.util.function.Predicate,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"onlyIf(Predicate super T>, IStructureElement super T>, IStructureElement.PlaceResult)","u":"onlyIf(java.util.function.Predicate,com.gtnewhorizon.structurelib.structure.IStructureElement,com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(BiFunction, Map>)","u":"partitionBy(java.util.function.BiFunction,java.util.Map)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(BiFunction, Map>, IStructureElement)","u":"partitionBy(java.util.function.BiFunction,java.util.Map,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(Function, BiFunction, IStructureElement...)","u":"partitionBy(java.util.function.Function,java.util.function.BiFunction,com.gtnewhorizon.structurelib.structure.IStructureElement...)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(Function, BiFunction, List>)","u":"partitionBy(java.util.function.Function,java.util.function.BiFunction,java.util.List)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(Function, IStructureElement...)","u":"partitionBy(java.util.function.Function,com.gtnewhorizon.structurelib.structure.IStructureElement...)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(Function, List>)","u":"partitionBy(java.util.function.Function,java.util.List)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(Function, BiFunction, Map>)","u":"partitionBy(java.util.function.Function,java.util.function.BiFunction,java.util.Map)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(Function, BiFunction, Map>, IStructureElement)","u":"partitionBy(java.util.function.Function,java.util.function.BiFunction,java.util.Map,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(Function, Map>)","u":"partitionBy(java.util.function.Function,java.util.Map)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"partitionBy(Function, Map>, IStructureElement)","u":"partitionBy(java.util.function.Function,java.util.Map,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"placeBlock(T, World, int, int, int, ItemStack)","u":"placeBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementChain","l":"placeBlock(T, World, int, int, int, ItemStack)","u":"placeBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementCheckOnly","l":"placeBlock(T, World, int, int, int, ItemStack)","u":"placeBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementNoPlacement","l":"placeBlock(T, World, int, int, int, ItemStack)","u":"placeBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"placeRemoveOrUpdate(ItemStack, Runnable, Runnable, Runnable)","u":"placeRemoveOrUpdate(net.minecraft.item.ItemStack,java.lang.Runnable,java.lang.Runnable,java.lang.Runnable)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"queryAlignment(IAlignmentProvider)","u":"queryAlignment(com.gtnewhorizon.structurelib.alignment.IAlignmentProvider)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"random(Random)","u":"random(java.util.Random)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"random(Random)","u":"random(java.util.Random)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"random(Random)","u":"random(java.util.Random)"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"register(String, V)","u":"register(java.lang.String,V)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"registerChannelDescription(String, String, String)","u":"registerChannelDescription(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"registerChannelItem(String, String, int, ItemStack)","u":"registerChannelItem(java.lang.String,java.lang.String,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"registerEnableEnderCondition(Predicate super EntityPlayerMP>)","u":"registerEnableEnderCondition(java.util.function.Predicate)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"registerInventoryProvider(String, Function)","u":"registerInventoryProvider(java.lang.String,java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"registerInventoryProvider(String, InventoryUtility.InventoryProvider>)","u":"registerInventoryProvider(java.lang.String,com.gtnewhorizon.structurelib.util.InventoryUtility.InventoryProvider)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"registerStackExtractor(String, Function)","u":"registerStackExtractor(java.lang.String,java.util.function.Function)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"registerStackExtractor(String, InventoryUtility.ItemStackExtractor)","u":"registerStackExtractor(java.lang.String,com.gtnewhorizon.structurelib.util.InventoryUtility.ItemStackExtractor)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IMultiblockInfoContainer","l":"registerTileClass(Class, IMultiblockInfoContainer>)","u":"registerTileClass(java.lang.Class,com.gtnewhorizon.structurelib.alignment.constructable.IMultiblockInfoContainer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.PlaceResult","l":"REJECT"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"resetA()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"resetB()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"resetC()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"ROTATIONS_COUNT"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"sendAlignment(IAlignmentProvider)","u":"sendAlignment(com.gtnewhorizon.structurelib.alignment.IAlignmentProvider)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"sendAlignment(IAlignmentProvider, EntityPlayerMP)","u":"sendAlignment(com.gtnewhorizon.structurelib.alignment.IAlignmentProvider,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"sendAlignment(IAlignmentProvider, NetworkRegistry.TargetPoint)","u":"sendAlignment(com.gtnewhorizon.structurelib.alignment.IAlignmentProvider,cpw.mods.fml.common.network.NetworkRegistry.TargetPoint)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"sendAlignment(IAlignmentProvider, World)","u":"sendAlignment(com.gtnewhorizon.structurelib.alignment.IAlignmentProvider,net.minecraft.world.World)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"ICustomBlockSetting","l":"setBlock(World, int, int, int, int)","u":"setBlock(net.minecraft.world.World,int,int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"setChannelData(ItemStack, String, int)","u":"setChannelData(net.minecraft.item.ItemStack,java.lang.String,int)"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"setDebugEnabled(boolean)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"setDirection(ForgeDirection)","u":"setDirection(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"setExtendedFacing(ExtendedFacing)","u":"setExtendedFacing(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"setFlip(Flip)","u":"setFlip(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate","l":"setMeta(int)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"setRotation(Rotation)","u":"setRotation(com.gtnewhorizon.structurelib.alignment.enumerable.Rotation)"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"setSeed(long)"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate","l":"setTag(ItemStackPredicate.NBTMode, NBTTagCompound)","u":"setTag(com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode,net.minecraft.nbt.NBTTagCompound)"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"size()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.PlaceResult","l":"SKIP"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"SortedRegistry()","u":"%3Cinit%3E()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"SOUTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_COUNTER_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_COUNTER_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_COUNTER_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_COUNTER_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_NORMAL_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_NORMAL_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_NORMAL_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_NORMAL_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_UPSIDE_DOWN_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_UPSIDE_DOWN_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_UPSIDE_DOWN_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"SOUTH_UPSIDE_DOWN_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"spawnHint(T, World, int, int, int, ItemStack)","u":"spawnHint(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementChain","l":"spawnHint(T, World, int, int, int, ItemStack)","u":"spawnHint(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementCheckOnly","l":"spawnHint(T, World, int, int, int, ItemStack)","u":"spawnHint(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.util","c":"SortedRegistry","l":"spliterator()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"startHinting(World)","u":"startHinting(net.minecraft.world.World)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"STATES_COUNT"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"STATES_COUNT"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"step(int, int, int)","u":"step(int,int,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"step(Vec3Impl)","u":"step(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.PlaceResult","l":"STOP"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"StructureLibAPI()","u":"%3Cinit%3E()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"sub(int, int, int)","u":"sub(int,int,int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"sub(Vec3Impl)","u":"sub(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"survivalBuild(T, ItemStack, String, World, ExtendedFacing, int, int, int, int, int, int, int, IItemSource, EntityPlayerMP, boolean)","u":"survivalBuild(T,net.minecraft.item.ItemStack,java.lang.String,net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP,boolean)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureDefinition","l":"survivalBuild(T, ItemStack, String, World, ExtendedFacing, int, int, int, int, int, int, int, ISurvivalBuildEnvironment, boolean)","u":"survivalBuild(T,net.minecraft.item.ItemStack,java.lang.String,net.minecraft.world.World,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing,int,int,int,int,int,int,int,com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment,boolean)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ISurvivalConstructable","l":"survivalConstruct(ItemStack, int, IItemSource, EntityPlayerMP)","u":"survivalConstruct(net.minecraft.item.ItemStack,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ISurvivalConstructable","l":"survivalConstruct(ItemStack, int, ISurvivalBuildEnvironment)","u":"survivalConstruct(net.minecraft.item.ItemStack,int,com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IMultiblockInfoContainer","l":"survivalConstruct(ItemStack, int, ISurvivalBuildEnvironment, T, ExtendedFacing)","u":"survivalConstruct(net.minecraft.item.ItemStack,int,com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment,T,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"survivalPlaceBlock(Block, int, World, int, int, int, IItemSource, EntityPlayer)","u":"survivalPlaceBlock(net.minecraft.block.Block,int,net.minecraft.world.World,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"survivalPlaceBlock(Block, int, World, int, int, int, IItemSource, EntityPlayer, Consumer)","u":"survivalPlaceBlock(net.minecraft.block.Block,int,net.minecraft.world.World,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayer,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"survivalPlaceBlock(Block, int, World, int, int, int, IItemSource, EntityPlayerMP)","u":"survivalPlaceBlock(net.minecraft.block.Block,int,net.minecraft.world.World,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"survivalPlaceBlock(Block, int, World, int, int, int, IItemSource, EntityPlayerMP, Consumer)","u":"survivalPlaceBlock(net.minecraft.block.Block,int,net.minecraft.world.World,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"survivalPlaceBlock(ItemStack, ItemStackPredicate.NBTMode, NBTTagCompound, boolean, World, int, int, int, IItemSource, EntityPlayer)","u":"survivalPlaceBlock(net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode,net.minecraft.nbt.NBTTagCompound,boolean,net.minecraft.world.World,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"survivalPlaceBlock(ItemStack, ItemStackPredicate.NBTMode, NBTTagCompound, boolean, World, int, int, int, IItemSource, EntityPlayer, Consumer)","u":"survivalPlaceBlock(net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode,net.minecraft.nbt.NBTTagCompound,boolean,net.minecraft.world.World,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayer,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"survivalPlaceBlock(ItemStack, ItemStackPredicate.NBTMode, NBTTagCompound, boolean, World, int, int, int, IItemSource, EntityPlayerMP)","u":"survivalPlaceBlock(net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode,net.minecraft.nbt.NBTTagCompound,boolean,net.minecraft.world.World,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"survivalPlaceBlock(ItemStack, ItemStackPredicate.NBTMode, NBTTagCompound, boolean, World, int, int, int, IItemSource, EntityPlayerMP, Consumer)","u":"survivalPlaceBlock(net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode,net.minecraft.nbt.NBTTagCompound,boolean,net.minecraft.world.World,int,int,int,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"survivalPlaceBlock(T, World, int, int, int, ItemStack, AutoPlaceEnvironment)","u":"survivalPlaceBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementChain","l":"survivalPlaceBlock(T, World, int, int, int, ItemStack, AutoPlaceEnvironment)","u":"survivalPlaceBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementCheckOnly","l":"survivalPlaceBlock(T, World, int, int, int, ItemStack, AutoPlaceEnvironment)","u":"survivalPlaceBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementNoPlacement","l":"survivalPlaceBlock(T, World, int, int, int, ItemStack, AutoPlaceEnvironment)","u":"survivalPlaceBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement","l":"survivalPlaceBlock(T, World, int, int, int, ItemStack, IItemSource, EntityPlayerMP, Consumer)","u":"survivalPlaceBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementChain","l":"survivalPlaceBlock(T, World, int, int, int, ItemStack, IItemSource, EntityPlayerMP, Consumer)","u":"survivalPlaceBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementCheckOnly","l":"survivalPlaceBlock(T, World, int, int, int, ItemStack, IItemSource, EntityPlayerMP, Consumer)","u":"survivalPlaceBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElementNoPlacement","l":"survivalPlaceBlock(T, World, int, int, int, ItemStack, IItemSource, EntityPlayerMP, Consumer)","u":"survivalPlaceBlock(T,net.minecraft.world.World,int,int,int,net.minecraft.item.ItemStack,com.gtnewhorizon.structurelib.structure.IItemSource,net.minecraft.entity.player.EntityPlayerMP,java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IItemSource","l":"take(Predicate, boolean, int)","u":"take(java.util.function.Predicate,boolean,int)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IItemSource","l":"takeAll(ItemStack, boolean)","u":"takeAll(net.minecraft.item.ItemStack,boolean)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IItemSource","l":"takeAll(Predicate, boolean, int)","u":"takeAll(java.util.function.Predicate,boolean,int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"takeFromInventory(EntityPlayerMP, ItemStack, boolean)","u":"takeFromInventory(net.minecraft.entity.player.EntityPlayerMP,net.minecraft.item.ItemStack,boolean)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"takeFromInventory(EntityPlayerMP, Predicate, boolean, int)","u":"takeFromInventory(net.minecraft.entity.player.EntityPlayerMP,java.util.function.Predicate,boolean,int)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility","l":"takeFromInventory(Iterable, Predicate, boolean, int, boolean)","u":"takeFromInventory(java.lang.Iterable,java.util.function.Predicate,boolean,int,boolean)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor","l":"takeFromStack(Predicate, boolean, int, InventoryUtility.ItemStackCounter, ItemStack, ItemStack, EntityPlayerMP)","u":"takeFromStack(java.util.function.Predicate,boolean,int,com.gtnewhorizon.structurelib.util.InventoryUtility.ItemStackCounter,net.minecraft.item.ItemStack,net.minecraft.item.ItemStack,net.minecraft.entity.player.EntityPlayerMP)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IItemSource","l":"takeOne(ItemStack, boolean)","u":"takeOne(net.minecraft.item.ItemStack,boolean)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IItemSource","l":"takeOne(Predicate, boolean)","u":"takeOne(java.util.function.Predicate,boolean)"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate","l":"test(ItemStack)","u":"test(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"IMultiblockInfoContainer","l":"toConstructable(T, ExtendedFacing)","u":"toConstructable(T,com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"toolSetDirection(ForgeDirection)","u":"toolSetDirection(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"toolSetExtendedFacing(ExtendedFacing)","u":"toolSetExtendedFacing(com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"toolSetFlip(Flip)","u":"toolSetFlip(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignment","l":"toolSetRotation(Rotation)","u":"toolSetRotation(com.gtnewhorizon.structurelib.alignment.enumerable.Rotation)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"toString()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"toString()"},{"p":"com.gtnewhorizon.structurelib","c":"StructureEvent.StructureElementVisitedEvent","l":"toString()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"toString()"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"translate(double[], double[])","u":"translate(double[],double[])"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"translate(int[], int[])","u":"translate(int[],int[])"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"translate(Vec3)","u":"translate(net.minecraft.util.Vec3)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IntegerAxisSwap","l":"translate(Vec3Impl)","u":"translate(com.gtnewhorizon.structurelib.util.Vec3Impl)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"transpose(String[][])","u":"transpose(java.lang.String[][])"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"tryGiveOrDropItem(World, EntityPlayer, ItemStack)","u":"tryGiveOrDropItem(net.minecraft.world.World,net.minecraft.entity.player.EntityPlayer,net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits","l":"UNLIMITED"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"unsetChannelData(ItemStack, String)","u":"unsetChannelData(net.minecraft.item.ItemStack,java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"UP"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_COUNTER_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_COUNTER_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_COUNTER_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_COUNTER_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_NORMAL_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_NORMAL_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_NORMAL_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_NORMAL_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_UPSIDE_DOWN_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_UPSIDE_DOWN_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_UPSIDE_DOWN_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"UP_UPSIDE_DOWN_VERTICAL"},{"p":"com.gtnewhorizon.structurelib","c":"StructureLibAPI","l":"updateHintParticleTint(EntityPlayer, World, int, int, int, short[])","u":"updateHintParticleTint(net.minecraft.entity.player.EntityPlayer,net.minecraft.world.World,int,int,int,short[])"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits","l":"UPRIGHT"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"UPSIDE_DOWN"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment.APILevel","l":"V2"},{"p":"com.gtnewhorizon.structurelib.alignment","c":"IAlignmentLimits.Builder","l":"validStates"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment.APILevel","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.PlaceResult","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor.APIType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate.NBTMode","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"VALUES"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"VALUES"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"VALUES"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"VALUES"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"values()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"values()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"values()"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Rotation","l":"values()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment.APILevel","l":"values()"},{"p":"com.gtnewhorizon.structurelib.structure","c":"IStructureElement.PlaceResult","l":"values()"},{"p":"com.gtnewhorizon.structurelib.util","c":"InventoryUtility.ItemStackExtractor.APIType","l":"values()"},{"p":"com.gtnewhorizon.structurelib.util","c":"ItemStackPredicate.NBTMode","l":"values()"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"Vec3Impl(int, int, int)","u":"%3Cinit%3E(int,int,int)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Flip","l":"VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"Direction","l":"WEST"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_COUNTER_CLOCKWISE_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_COUNTER_CLOCKWISE_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_COUNTER_CLOCKWISE_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_COUNTER_CLOCKWISE_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_NORMAL_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_NORMAL_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_NORMAL_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_NORMAL_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_UPSIDE_DOWN_BOTH"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_UPSIDE_DOWN_HORIZONTAL"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_UPSIDE_DOWN_NONE"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"WEST_UPSIDE_DOWN_VERTICAL"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"wipeChannelData(ItemStack)","u":"wipeChannelData(net.minecraft.item.ItemStack)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"with(Flip)","u":"with(com.gtnewhorizon.structurelib.alignment.enumerable.Flip)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"with(ForgeDirection)","u":"with(net.minecraftforge.common.util.ForgeDirection)"},{"p":"com.gtnewhorizon.structurelib.alignment.enumerable","c":"ExtendedFacing","l":"with(Rotation)","u":"with(com.gtnewhorizon.structurelib.alignment.enumerable.Rotation)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"withActor(EntityPlayer)","u":"withActor(net.minecraft.entity.player.EntityPlayer)"},{"p":"com.gtnewhorizon.structurelib.alignment.constructable","c":"ChannelDataAccessor","l":"withChannel(ItemStack, String)","u":"withChannel(net.minecraft.item.ItemStack,java.lang.String)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"withChannel(String, IStructureElement)","u":"withChannel(java.lang.String,com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"withChatter(Consumer)","u":"withChatter(java.util.function.Consumer)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"StructureUtility","l":"withContext(IStructureElement)","u":"withContext(com.gtnewhorizon.structurelib.structure.IStructureElement)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"withinDistance(IPosition, double)","u":"withinDistance(net.minecraft.dispenser.IPosition,double)"},{"p":"com.gtnewhorizon.structurelib.util","c":"Vec3Impl","l":"withinDistance(Vec3Impl, double)","u":"withinDistance(com.gtnewhorizon.structurelib.util.Vec3Impl,double)"},{"p":"com.gtnewhorizon.structurelib.structure","c":"AutoPlaceEnvironment","l":"withSource(IItemSource)","u":"withSource(com.gtnewhorizon.structurelib.structure.IItemSource)"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"XSTR_INSTANCE"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"XSTR()","u":"%3Cinit%3E()"},{"p":"com.gtnewhorizon.structurelib.util","c":"XSTR","l":"XSTR(long)","u":"%3Cinit%3E(long)"}];updateSearchResults();
\ No newline at end of file
diff --git a/1.4.19-pre/javadoc/module-search-index.js b/1.4.19-pre/javadoc/module-search-index.js
new file mode 100644
index 00000000..0d59754f
--- /dev/null
+++ b/1.4.19-pre/javadoc/module-search-index.js
@@ -0,0 +1 @@
+moduleSearchIndex = [];updateSearchResults();
\ No newline at end of file
diff --git a/1.4.19-pre/javadoc/overview-summary.html b/1.4.19-pre/javadoc/overview-summary.html
new file mode 100644
index 00000000..d5a397ab
--- /dev/null
+++ b/1.4.19-pre/javadoc/overview-summary.html
@@ -0,0 +1,25 @@
+
+
+
+
+StructureLib 1.4.19-pre API
+
+
+
+
+
+
+
+
+
+
+
+
+
The help page provides an introduction to the scope and syntax of JavaDoc search.
+
You can use the <ctrl> or <cmd> keys in combination with the left and right arrow keys to switch between result tabs in this page.
+
The URL template below may be used to configure this page as a search engine in browsers that support this feature. It has been tested to work in Google Chrome and Mozilla Firefox. Note that other browsers may not support this feature or require a different URL format.
+link
+
+
+
+
+
Loading search index...
+
+
+
+
+
+
+
+
+
diff --git a/1.4.19-pre/javadoc/search.js b/1.4.19-pre/javadoc/search.js
new file mode 100644
index 00000000..d3986705
--- /dev/null
+++ b/1.4.19-pre/javadoc/search.js
@@ -0,0 +1,458 @@
+/*
+ * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+"use strict";
+const messages = {
+ enterTerm: "Enter a search term",
+ noResult: "No results found",
+ oneResult: "Found one result",
+ manyResults: "Found {0} results",
+ loading: "Loading search index...",
+ searching: "Searching...",
+ redirecting: "Redirecting to first result...",
+ linkIcon: "Link icon",
+ linkToSection: "Link to this section"
+}
+const categories = {
+ modules: "Modules",
+ packages: "Packages",
+ types: "Classes and Interfaces",
+ members: "Members",
+ searchTags: "Search Tags"
+};
+const highlight = "$&";
+const NO_MATCH = {};
+const MAX_RESULTS = 300;
+function checkUnnamed(name, separator) {
+ return name === "" || !name ? "" : name + separator;
+}
+function escapeHtml(str) {
+ return str.replace(//g, ">");
+}
+function getHighlightedText(str, boundaries, from, to) {
+ var start = from;
+ var text = "";
+ for (var i = 0; i < boundaries.length; i += 2) {
+ var b0 = boundaries[i];
+ var b1 = boundaries[i + 1];
+ if (b0 >= to || b1 <= from) {
+ continue;
+ }
+ text += escapeHtml(str.slice(start, Math.max(start, b0)));
+ text += "";
+ text += escapeHtml(str.slice(Math.max(start, b0), Math.min(to, b1)));
+ text += "";
+ start = Math.min(to, b1);
+ }
+ text += escapeHtml(str.slice(start, to));
+ return text;
+}
+function getURLPrefix(item, category) {
+ var urlPrefix = "";
+ var slash = "/";
+ if (category === "modules") {
+ return item.l + slash;
+ } else if (category === "packages" && item.m) {
+ return item.m + slash;
+ } else if (category === "types" || category === "members") {
+ if (item.m) {
+ urlPrefix = item.m + slash;
+ } else {
+ $.each(packageSearchIndex, function(index, it) {
+ if (it.m && item.p === it.l) {
+ urlPrefix = it.m + slash;
+ }
+ });
+ }
+ }
+ return urlPrefix;
+}
+function getURL(item, category) {
+ if (item.url) {
+ return item.url;
+ }
+ var url = getURLPrefix(item, category);
+ if (category === "modules") {
+ url += "module-summary.html";
+ } else if (category === "packages") {
+ if (item.u) {
+ url = item.u;
+ } else {
+ url += item.l.replace(/\./g, '/') + "/package-summary.html";
+ }
+ } else if (category === "types") {
+ if (item.u) {
+ url = item.u;
+ } else {
+ url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.l + ".html";
+ }
+ } else if (category === "members") {
+ url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.c + ".html" + "#";
+ if (item.u) {
+ url += item.u;
+ } else {
+ url += item.l;
+ }
+ } else if (category === "searchTags") {
+ url += item.u;
+ }
+ item.url = url;
+ return url;
+}
+function createMatcher(term, camelCase) {
+ if (camelCase && !isUpperCase(term)) {
+ return null; // no need for camel-case matcher for lower case query
+ }
+ var pattern = "";
+ var upperCase = [];
+ term.trim().split(/\s+/).forEach(function(w, index, array) {
+ var tokens = w.split(/(?=[A-Z,.()<>?[\/])/);
+ for (var i = 0; i < tokens.length; i++) {
+ var s = tokens[i];
+ // ',' and '?' are the only delimiters commonly followed by space in java signatures
+ pattern += "(" + $.ui.autocomplete.escapeRegex(s).replace(/[,?]/g, "$&\\s*?") + ")";
+ upperCase.push(false);
+ var isWordToken = /\w$/.test(s);
+ if (isWordToken) {
+ if (i === tokens.length - 1 && index < array.length - 1) {
+ // space in query string matches all delimiters
+ pattern += "(.*?)";
+ upperCase.push(isUpperCase(s[0]));
+ } else {
+ if (!camelCase && isUpperCase(s) && s.length === 1) {
+ pattern += "()";
+ } else {
+ pattern += "([a-z0-9$<>?[\\]]*?)";
+ }
+ upperCase.push(isUpperCase(s[0]));
+ }
+ } else {
+ pattern += "()";
+ upperCase.push(false);
+ }
+ }
+ });
+ var re = new RegExp(pattern, "gi");
+ re.upperCase = upperCase;
+ return re;
+}
+function findMatch(matcher, input, startOfName, endOfName) {
+ var from = startOfName;
+ matcher.lastIndex = from;
+ var match = matcher.exec(input);
+ // Expand search area until we get a valid result or reach the beginning of the string
+ while (!match || match.index + match[0].length < startOfName || endOfName < match.index) {
+ if (from === 0) {
+ return NO_MATCH;
+ }
+ from = input.lastIndexOf(".", from - 2) + 1;
+ matcher.lastIndex = from;
+ match = matcher.exec(input);
+ }
+ var boundaries = [];
+ var matchEnd = match.index + match[0].length;
+ var score = 5;
+ var start = match.index;
+ var prevEnd = -1;
+ for (var i = 1; i < match.length; i += 2) {
+ var isUpper = isUpperCase(input[start]);
+ var isMatcherUpper = matcher.upperCase[i];
+ // capturing groups come in pairs, match and non-match
+ boundaries.push(start, start + match[i].length);
+ // make sure groups are anchored on a left word boundary
+ var prevChar = input[start - 1] || "";
+ var nextChar = input[start + 1] || "";
+ if (start !== 0 && !/[\W_]/.test(prevChar) && !/[\W_]/.test(input[start])) {
+ if (isUpper && (isLowerCase(prevChar) || isLowerCase(nextChar))) {
+ score -= 0.1;
+ } else if (isMatcherUpper && start === prevEnd) {
+ score -= isUpper ? 0.1 : 1.0;
+ } else {
+ return NO_MATCH;
+ }
+ }
+ prevEnd = start + match[i].length;
+ start += match[i].length + match[i + 1].length;
+
+ // lower score for parts of the name that are missing
+ if (match[i + 1] && prevEnd < endOfName) {
+ score -= rateNoise(match[i + 1]);
+ }
+ }
+ // lower score if a type name contains unmatched camel-case parts
+ if (input[matchEnd - 1] !== "." && endOfName > matchEnd)
+ score -= rateNoise(input.slice(matchEnd, endOfName));
+ score -= rateNoise(input.slice(0, Math.max(startOfName, match.index)));
+
+ if (score <= 0) {
+ return NO_MATCH;
+ }
+ return {
+ input: input,
+ score: score,
+ boundaries: boundaries
+ };
+}
+function isUpperCase(s) {
+ return s !== s.toLowerCase();
+}
+function isLowerCase(s) {
+ return s !== s.toUpperCase();
+}
+function rateNoise(str) {
+ return (str.match(/([.(])/g) || []).length / 5
+ + (str.match(/([A-Z]+)/g) || []).length / 10
+ + str.length / 20;
+}
+function doSearch(request, response) {
+ var term = request.term.trim();
+ var maxResults = request.maxResults || MAX_RESULTS;
+ if (term.length === 0) {
+ return this.close();
+ }
+ var matcher = {
+ plainMatcher: createMatcher(term, false),
+ camelCaseMatcher: createMatcher(term, true)
+ }
+ var indexLoaded = indexFilesLoaded();
+
+ function getPrefix(item, category) {
+ switch (category) {
+ case "packages":
+ return checkUnnamed(item.m, "/");
+ case "types":
+ return checkUnnamed(item.p, ".");
+ case "members":
+ return checkUnnamed(item.p, ".") + item.c + ".";
+ default:
+ return "";
+ }
+ }
+ function useQualifiedName(category) {
+ switch (category) {
+ case "packages":
+ return /[\s/]/.test(term);
+ case "types":
+ case "members":
+ return /[\s.]/.test(term);
+ default:
+ return false;
+ }
+ }
+ function searchIndex(indexArray, category) {
+ var matches = [];
+ if (!indexArray) {
+ if (!indexLoaded) {
+ matches.push({ l: messages.loading, category: category });
+ }
+ return matches;
+ }
+ $.each(indexArray, function (i, item) {
+ var prefix = getPrefix(item, category);
+ var simpleName = item.l;
+ var qualifiedName = prefix + simpleName;
+ var useQualified = useQualifiedName(category);
+ var input = useQualified ? qualifiedName : simpleName;
+ var startOfName = useQualified ? prefix.length : 0;
+ var endOfName = category === "members" && input.indexOf("(", startOfName) > -1
+ ? input.indexOf("(", startOfName) : input.length;
+ var m = findMatch(matcher.plainMatcher, input, startOfName, endOfName);
+ if (m === NO_MATCH && matcher.camelCaseMatcher) {
+ m = findMatch(matcher.camelCaseMatcher, input, startOfName, endOfName);
+ }
+ if (m !== NO_MATCH) {
+ m.indexItem = item;
+ m.prefix = prefix;
+ m.category = category;
+ if (!useQualified) {
+ m.input = qualifiedName;
+ m.boundaries = m.boundaries.map(function(b) {
+ return b + prefix.length;
+ });
+ }
+ matches.push(m);
+ }
+ return true;
+ });
+ return matches.sort(function(e1, e2) {
+ return e2.score - e1.score;
+ }).slice(0, maxResults);
+ }
+
+ var result = searchIndex(moduleSearchIndex, "modules")
+ .concat(searchIndex(packageSearchIndex, "packages"))
+ .concat(searchIndex(typeSearchIndex, "types"))
+ .concat(searchIndex(memberSearchIndex, "members"))
+ .concat(searchIndex(tagSearchIndex, "searchTags"));
+
+ if (!indexLoaded) {
+ updateSearchResults = function() {
+ doSearch(request, response);
+ }
+ } else {
+ updateSearchResults = function() {};
+ }
+ response(result);
+}
+// JQuery search menu implementation
+$.widget("custom.catcomplete", $.ui.autocomplete, {
+ _create: function() {
+ this._super();
+ this.widget().menu("option", "items", "> .result-item");
+ // workaround for search result scrolling
+ this.menu._scrollIntoView = function _scrollIntoView( item ) {
+ var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+ if ( this._hasScroll() ) {
+ borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
+ paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
+ offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+ scroll = this.activeMenu.scrollTop();
+ elementHeight = this.activeMenu.height() - 26;
+ itemHeight = item.outerHeight();
+
+ if ( offset < 0 ) {
+ this.activeMenu.scrollTop( scroll + offset );
+ } else if ( offset + itemHeight > elementHeight ) {
+ this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+ }
+ }
+ };
+ },
+ _renderMenu: function(ul, items) {
+ var currentCategory = "";
+ var widget = this;
+ widget.menu.bindings = $();
+ $.each(items, function(index, item) {
+ if (item.category && item.category !== currentCategory) {
+ ul.append("