- ImmutableBaseBlock is no longer needed as NBT was made immutable previously
- BlanketBaseBlock represents to masks that the block has NBT, but does not need to match a specific state
- Allow FuzzyBlockState to create BaseBlocks without NBT data (fixed tab completion issues)
- Required new argument parser, which should ultimately be made into a singe blockstate parser for best results, and proper tab-completion
- The layer brush itself is broken because of the changes to internal block retrieval from legacy
**Add a null-check to CharBlocks FULL section layer-retrieval.**
- It is possible to trim CharBlocks whilst it is attempting to read data due to the batching of chunks to help reduce memory
- This is done when the number of chunks sitting loaded in memory with having been "submitted" to the queue for writing to disk becomes high
- Seconday operations such as heightmap processing and lighting will quickly load chunks, meaning many chunks are submitted early
- This leads to much higher chances of the chunk being submitted and subsequently trimmed given heightmap and light processing is done layer-by-layer over many chunks, rather than chunk-by-chunk - thus leading to NPEs.
- By adding synchronisation to and around only the specific sections when loading/updating, and not blocking the whole chunk, many access can still be thread-safe without causing deadlocks
- This allows removal of lots of the needless and very-slowing synchronisation on get**Block** methods
**Remove much of the synchronisation from ChunkHolder**
- We shouldn't be synchronising with call() and safety should be added elsewhere. (plus it's making edits very very slow when queue target size is hit)
- Also remove much of synchronisation because we've added the null-check and section-specific synchronisation to CharBlocks
**Some QOL/thread-safe data access changes**
- Replaces the Array#clone seen in the get blocks classes with System#arraycopy as deep cloning is not required, and is also slower than arraycopy
- Add System#arraycopy when accessing chunk section data via history to ensure it is not altered whilst being written
- Renaming EMPTY to empty means it is not implied to be a static variable
Fixes https://github.com/IntellectualSites/FastAsyncWorldEdit/issues/1028
Fixes https://github.com/IntellectualSites/FastAsyncWorldEdit/issues/1025
Fixes https://github.com/IntellectualSites/FastAsyncWorldEdit/issues/1089
Fixes https://github.com/IntellectualSites/FastAsyncWorldEdit/issues/1091
Fixes https://github.com/IntellectualSites/FastAsyncWorldEdit/issues/1097
* Use Unsafe to replace Lock
* Start cleaning up everything that has to do with CleanableThreadLocal
* Make cancellation work
Co-authored-by: NotMyFault <mc.cache@web.de>
* Relight using starlight engine on Tuinity
* Make use of invokeExact
* Cache MethodHandle
* Address some requested changes
* Remove random *
Co-authored-by: NotMyFault <mc.cache@web.de>
* Simplify and clean up sendChunk
Hopefully, that doesn't cause any issues
* Add naive HeightmapProcessor
* Make HeightmapProcessor more efficient
* Remove heightmap code from NMSRelighter
* Recognize fluid for waterlogged blocks
* Remove config option for heightmaps as they should always be updated
* Batch relighting for Starlight
* Dirty workaround for CharBlocks blocks NPE
* Revert "Dirty workaround for CharBlocks blocks NPE"
This reverts commit 737606a7
It only caused the heightmap to be wrong again and didn't help much with the original issue
* Adapt better chunk sending on older versions
* Adapt requested changes for HeightMapType
* Relight all changed chunks, batched
Also, address some requested changes
* Avoid deadlocks
* Clean up tuinity relighter and add some comments
* Minor changes to HeightmapProcessor
Co-authored-by: BuildTools <unconfigured@null.spigotmc.org>
Co-authored-by: NotMyFault <mc.cache@web.de>
Co-authored-by: Aurora <21148213+aurorasmiles@users.noreply.github.com>
Also remove option to shorten urls for schematic upload. This option does not work with self hosted interfaces, nor is it really safe to use, as per-design.
As Fawe extends into its own Filter class, this will need a Fawe-suitable solution at some point when removing the deprecated method.
This is a compatibility-layer workaround for plugins calling the WorldEdit method `Pattern#applyBlock`.
similar to ChunkHolder, it represents an internal chunk for which operations should not be accepted by multiple threads at once.
Co-authored-by: NotMyFault <mc.cache@web.de>
This is basically the main "chunk" class for internal FAWE. Chunk operations should (and are) almost always single-threaded operations, however, under certain circumstances it is possible for the chunk to be "called" (flushed: written to the world and sent to the player) from a separate thread. This would specifically occur from SingleThreadQueueExtent when there are a lot of chunks being loaded in memory by FAWE (where the chunk would then be submitted to a multi-threaded queue). It would therefore be possible for a thread accessing the chunk to attempt to access it in the middle of the call, which can lead to a number of issues, and it is my opinion that the most frequent of these is the NPE seen during lighting operations, where new chunks can be accessed/loaded very quickly, increasing the likelihood for the aforementioned synchronisation issue to occur.
Co-authored-by: Matt <4009945+MattBDev@users.noreply.github.com>
* Update so many dependencies, merge Forge/Fabric for final
* Clean up contrib docs for Gradle change
* Fix setting compat flags while using toolchain
* Fix deprecation in doc printer
* Restore proper forge JAR name
* Add dist classifier for mod jar
* Properly relocate new bStats
* Fix jar used from fabric
* Fix fabric bom
* Dup the shaded classes for consistency
* Sync Forge/Fabric log4j versions, de-dup
* Downgrade both log4j. This will work
* Update some plugins as well
* Drop the fabric force stuff
* Use duplicate strategy to directly merge jar
- Add a "loadPrivately" method to be used when GetChunks are called to avoid synchronocity issues with super classes being used on different threads
- Synchronise the call method so we're not attempting to call whilst also loading/updating
- Properly ensures we don't try to submit chunks that already have a monitor (prevent the FAWE-freezing)
- We can't detect if "no" threads hold the chunk's monitor, but equally that would also be kinda very bad practice.
- With enough chunks waiting to write to history, it's possible to fill the secondary fork pool up with locked threads, and thus prevent any threads from actually writing their history.
An extent's content was returned flipped when applied for negative positions, as e.g. `Math.abs(-2) % 3` returns 2 instead of 1 (as 1 + -1 * 3 = -2)
(cherry picked from commit b0cf5dd2bf1b9bcbf1c7efff0fe25de7ee9a2090)