Repository files navigation

FoliaLib GitHub Release

Developers and contributors like you make this project possible. This project is not directly affiliated with PaperMC.


Description

This project is a wrapper library that aids developers in supporting the "Folia" Paper fork while not breaking support for Spigot or Paper. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers. Developers are expected to depend on this library and relocate the package to their own to prevent conflicts with other plugins.

Version support:
FoliaLib attempts to be compatible with all your projects no matter how outdated the minecraft version. As of writing, FoliaLib should work in any plugin supporting 1.8.8 to 1.21+. However, we heavily warn against using anything below 1.13.2 since this version adds support for many features FoliaLib depends on. Workarounds are used for supporting older versions.

API Note:
This project is still in its early stages and may make frequent breaking changes to the API. Additionally, I won't claim that this library is perfect; If you find any issues, please report them on the issues page


FoliaLib as a dependency

Caution

The FoliaLib repository has moved! Please update your pom.xml or build.gradle file to use the Jitpack repository (see examples below).

Warning

You are expected to relocate the package com.tcoded.folialib to prevent conflicts with other plugins!
Example configuration snippets demonstrating how to do this are available below for Maven and Gradle.

Tip

Ensure that you exclude FoliaLib from any minimize operation.

Gradle Dependency

[Click to show Gradle example configurations]
plugins {
id("com.gradleup.shadow") version "9.4.1"// For up to Java 17// id("com.gradleup.shadow") version "9.0.0-beta12" // Uncomment for Java 21 or higher
}
repositories {
maven {
name ="tcoded-releases"
url ="https://repo.tcoded.com/releases"
}
}
dependencies {
implementation("com.tcoded:FoliaLib:SET_VERSION_HERE")
}
shadowJar {
// !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !!
relocate("com.tcoded.folialib", "CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib")
// Optional: If you use minimize, make sure you exclude FoliaLib// Do not uncomment this if you don't know what you are doing// minimize {// exclude dependency("com.tcoded:FoliaLib:.*")// }
}

Maven Dependency

[Click to show Maven example configurations]
<repositories>
<repository>
<id>tcoded-releases</id>
<url>https://repo.tcoded.com/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.tcoded</groupId>
<artifactId>FoliaLib</artifactId>
<version>SET_VERSION_HERE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.tcoded.folialib</pattern>
<!-- !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !! -->
<shadedPattern>CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

How to use

Create a new instance of the FoliaLib class:

// Assuming "this" is your plugin instanceFoliaLibfoliaLib = newFoliaLib(this);

Here are some examples of how to use the library:

// Remember that 20 ticks = 1000 milliseconds, and 20 * 50L = 1000L// On a folia server, runNextTick() will run using the GlobalRegionScheduler// !! This does not make it safe to use for players or block changes !!// Use other methods found below for handling these cases// This should only be used for updating the following (see GlobalRegionScheduler.java for more info)// - world day time// - world game time// - weather cycle// - sleep/night skipping// - executing commands for console// On a Spigot server, runNextTick() will run on the main threadfoliaLib.getScheduler().runNextTick(() -> {/* Code */});
// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runAsync(() -> {/* Code */});
// On a Folia server, this method will run using the GlobalRegionScheduler// On a Spigot server, this method will run on the main threadfoliaLib.getScheduler().runTimer(() -> {/* Code */}, 1, 20); // Using ticks// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20); // Using ticksfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20 * 50L, TimeUnit.MILLISECONDS); // Using TimeUnit// On a folia server, this will run the code using the RegionScheduler that is appropriate for the location// On a spigot server, this will run the code on the main threadfoliaLib.getScheduler().runAtLocation(location, () -> {/* Code */});
// On a folia server, this will run the code using the EntityScheduler that is appropriate for the entity// On a spigot server, this will just run the code on the main threadfoliaLib.getScheduler().runAtEntity(entity, () -> {/* Code */});
// On a folia server, this will teleport the entity (or player) asynchronously// On a paper server (which supports async teleports), this will also teleport asynchronously// On a spigot server, this will fallback to teleporting the player on the next tick// Why not immediately teleport on spigot?// 1. We don't know if you're running this from the main thread (but this could be checked)// 2. Above all, we quickly expose any bugs that could result from expecting instant// teleports on any platform// Returns: A CompletableFuture<Boolean> from which you can execute any dependent code. The Boolean// is the success state of the teleportation.foliaLib.getScheduler().teleportAsync(entity, location, optionalTeleportCause);
// During your plugin's onDisable(), please use the following.// This will cancel all the tasks associated with this FoliaLib instancefoliaLib.getScheduler().cancelAllTasks();
// AND MANY MORE OPTIONS...!// You can also manually check for a specific platform if certain parts of your code// should only run under those conditions (ex: use of specific folia-only APIs)foliaLib.isFolia(); // true/falsefoliaLib.isPaper(); // true/falsefoliaLib.isSpigot(); // true/false

License

This project is licensed under the MIT License - see the LICENSE file for details

About

This is a wrapper library for aiding in supporting the Folia Paper Fork. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers.

Topics

Resources

Stars

133 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

FoliaLib GitHub Release

Developers and contributors like you make this project possible. This project is not directly affiliated with PaperMC.


Description

This project is a wrapper library that aids developers in supporting the "Folia" Paper fork while not breaking support for Spigot or Paper. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers. Developers are expected to depend on this library and relocate the package to their own to prevent conflicts with other plugins.

Version support:
FoliaLib attempts to be compatible with all your projects no matter how outdated the minecraft version. As of writing, FoliaLib should work in any plugin supporting 1.8.8 to 1.21+. However, we heavily warn against using anything below 1.13.2 since this version adds support for many features FoliaLib depends on. Workarounds are used for supporting older versions.

API Note:
This project is still in its early stages and may make frequent breaking changes to the API. Additionally, I won't claim that this library is perfect; If you find any issues, please report them on the issues page


FoliaLib as a dependency

Caution

The FoliaLib repository has moved! Please update your pom.xml or build.gradle file to use the Jitpack repository (see examples below).

Warning

You are expected to relocate the package com.tcoded.folialib to prevent conflicts with other plugins!
Example configuration snippets demonstrating how to do this are available below for Maven and Gradle.

Tip

Ensure that you exclude FoliaLib from any minimize operation.

Gradle Dependency

[Click to show Gradle example configurations]
plugins {
id("com.gradleup.shadow") version "9.4.1"// For up to Java 17// id("com.gradleup.shadow") version "9.0.0-beta12" // Uncomment for Java 21 or higher
}
repositories {
maven {
name ="tcoded-releases"
url ="https://repo.tcoded.com/releases"
}
}
dependencies {
implementation("com.tcoded:FoliaLib:SET_VERSION_HERE")
}
shadowJar {
// !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !!
relocate("com.tcoded.folialib", "CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib")
// Optional: If you use minimize, make sure you exclude FoliaLib// Do not uncomment this if you don't know what you are doing// minimize {// exclude dependency("com.tcoded:FoliaLib:.*")// }
}

Maven Dependency

[Click to show Maven example configurations]
<repositories>
<repository>
<id>tcoded-releases</id>
<url>https://repo.tcoded.com/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.tcoded</groupId>
<artifactId>FoliaLib</artifactId>
<version>SET_VERSION_HERE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.tcoded.folialib</pattern>
<!-- !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !! -->
<shadedPattern>CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

How to use

Create a new instance of the FoliaLib class:

// Assuming "this" is your plugin instanceFoliaLibfoliaLib = newFoliaLib(this);

Here are some examples of how to use the library:

// Remember that 20 ticks = 1000 milliseconds, and 20 * 50L = 1000L// On a folia server, runNextTick() will run using the GlobalRegionScheduler// !! This does not make it safe to use for players or block changes !!// Use other methods found below for handling these cases// This should only be used for updating the following (see GlobalRegionScheduler.java for more info)// - world day time// - world game time// - weather cycle// - sleep/night skipping// - executing commands for console// On a Spigot server, runNextTick() will run on the main threadfoliaLib.getScheduler().runNextTick(() -> {/* Code */});
// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runAsync(() -> {/* Code */});
// On a Folia server, this method will run using the GlobalRegionScheduler// On a Spigot server, this method will run on the main threadfoliaLib.getScheduler().runTimer(() -> {/* Code */}, 1, 20); // Using ticks// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20); // Using ticksfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20 * 50L, TimeUnit.MILLISECONDS); // Using TimeUnit// On a folia server, this will run the code using the RegionScheduler that is appropriate for the location// On a spigot server, this will run the code on the main threadfoliaLib.getScheduler().runAtLocation(location, () -> {/* Code */});
// On a folia server, this will run the code using the EntityScheduler that is appropriate for the entity// On a spigot server, this will just run the code on the main threadfoliaLib.getScheduler().runAtEntity(entity, () -> {/* Code */});
// On a folia server, this will teleport the entity (or player) asynchronously// On a paper server (which supports async teleports), this will also teleport asynchronously// On a spigot server, this will fallback to teleporting the player on the next tick// Why not immediately teleport on spigot?// 1. We don't know if you're running this from the main thread (but this could be checked)// 2. Above all, we quickly expose any bugs that could result from expecting instant// teleports on any platform// Returns: A CompletableFuture<Boolean> from which you can execute any dependent code. The Boolean// is the success state of the teleportation.foliaLib.getScheduler().teleportAsync(entity, location, optionalTeleportCause);
// During your plugin's onDisable(), please use the following.// This will cancel all the tasks associated with this FoliaLib instancefoliaLib.getScheduler().cancelAllTasks();
// AND MANY MORE OPTIONS...!// You can also manually check for a specific platform if certain parts of your code// should only run under those conditions (ex: use of specific folia-only APIs)foliaLib.isFolia(); // true/falsefoliaLib.isPaper(); // true/falsefoliaLib.isSpigot(); // true/false

License

This project is licensed under the MIT License - see the LICENSE file for details

About

This is a wrapper library for aiding in supporting the Folia Paper Fork. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers.

Topics

Resources

Stars

133 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

FoliaLib GitHub Release

Developers and contributors like you make this project possible. This project is not directly affiliated with PaperMC.


Description

This project is a wrapper library that aids developers in supporting the "Folia" Paper fork while not breaking support for Spigot or Paper. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers. Developers are expected to depend on this library and relocate the package to their own to prevent conflicts with other plugins.

Version support:
FoliaLib attempts to be compatible with all your projects no matter how outdated the minecraft version. As of writing, FoliaLib should work in any plugin supporting 1.8.8 to 1.21+. However, we heavily warn against using anything below 1.13.2 since this version adds support for many features FoliaLib depends on. Workarounds are used for supporting older versions.

API Note:
This project is still in its early stages and may make frequent breaking changes to the API. Additionally, I won't claim that this library is perfect; If you find any issues, please report them on the issues page


FoliaLib as a dependency

Caution

The FoliaLib repository has moved! Please update your pom.xml or build.gradle file to use the Jitpack repository (see examples below).

Warning

You are expected to relocate the package com.tcoded.folialib to prevent conflicts with other plugins!
Example configuration snippets demonstrating how to do this are available below for Maven and Gradle.

Tip

Ensure that you exclude FoliaLib from any minimize operation.

Gradle Dependency

[Click to show Gradle example configurations]
plugins {
id("com.gradleup.shadow") version "9.4.1"// For up to Java 17// id("com.gradleup.shadow") version "9.0.0-beta12" // Uncomment for Java 21 or higher
}
repositories {
maven {
name ="tcoded-releases"
url ="https://repo.tcoded.com/releases"
}
}
dependencies {
implementation("com.tcoded:FoliaLib:SET_VERSION_HERE")
}
shadowJar {
// !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !!
relocate("com.tcoded.folialib", "CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib")
// Optional: If you use minimize, make sure you exclude FoliaLib// Do not uncomment this if you don't know what you are doing// minimize {// exclude dependency("com.tcoded:FoliaLib:.*")// }
}

Maven Dependency

[Click to show Maven example configurations]
<repositories>
<repository>
<id>tcoded-releases</id>
<url>https://repo.tcoded.com/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.tcoded</groupId>
<artifactId>FoliaLib</artifactId>
<version>SET_VERSION_HERE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.tcoded.folialib</pattern>
<!-- !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !! -->
<shadedPattern>CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

How to use

Create a new instance of the FoliaLib class:

// Assuming "this" is your plugin instanceFoliaLibfoliaLib = newFoliaLib(this);

Here are some examples of how to use the library:

// Remember that 20 ticks = 1000 milliseconds, and 20 * 50L = 1000L// On a folia server, runNextTick() will run using the GlobalRegionScheduler// !! This does not make it safe to use for players or block changes !!// Use other methods found below for handling these cases// This should only be used for updating the following (see GlobalRegionScheduler.java for more info)// - world day time// - world game time// - weather cycle// - sleep/night skipping// - executing commands for console// On a Spigot server, runNextTick() will run on the main threadfoliaLib.getScheduler().runNextTick(() -> {/* Code */});
// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runAsync(() -> {/* Code */});
// On a Folia server, this method will run using the GlobalRegionScheduler// On a Spigot server, this method will run on the main threadfoliaLib.getScheduler().runTimer(() -> {/* Code */}, 1, 20); // Using ticks// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20); // Using ticksfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20 * 50L, TimeUnit.MILLISECONDS); // Using TimeUnit// On a folia server, this will run the code using the RegionScheduler that is appropriate for the location// On a spigot server, this will run the code on the main threadfoliaLib.getScheduler().runAtLocation(location, () -> {/* Code */});
// On a folia server, this will run the code using the EntityScheduler that is appropriate for the entity// On a spigot server, this will just run the code on the main threadfoliaLib.getScheduler().runAtEntity(entity, () -> {/* Code */});
// On a folia server, this will teleport the entity (or player) asynchronously// On a paper server (which supports async teleports), this will also teleport asynchronously// On a spigot server, this will fallback to teleporting the player on the next tick// Why not immediately teleport on spigot?// 1. We don't know if you're running this from the main thread (but this could be checked)// 2. Above all, we quickly expose any bugs that could result from expecting instant// teleports on any platform// Returns: A CompletableFuture<Boolean> from which you can execute any dependent code. The Boolean// is the success state of the teleportation.foliaLib.getScheduler().teleportAsync(entity, location, optionalTeleportCause);
// During your plugin's onDisable(), please use the following.// This will cancel all the tasks associated with this FoliaLib instancefoliaLib.getScheduler().cancelAllTasks();
// AND MANY MORE OPTIONS...!// You can also manually check for a specific platform if certain parts of your code// should only run under those conditions (ex: use of specific folia-only APIs)foliaLib.isFolia(); // true/falsefoliaLib.isPaper(); // true/falsefoliaLib.isSpigot(); // true/false

License

This project is licensed under the MIT License - see the LICENSE file for details

About

This is a wrapper library for aiding in supporting the Folia Paper Fork. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers.

Topics

Resources

Stars

133 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

FoliaLib GitHub Release

Developers and contributors like you make this project possible. This project is not directly affiliated with PaperMC.


Description

This project is a wrapper library that aids developers in supporting the "Folia" Paper fork while not breaking support for Spigot or Paper. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers. Developers are expected to depend on this library and relocate the package to their own to prevent conflicts with other plugins.

Version support:
FoliaLib attempts to be compatible with all your projects no matter how outdated the minecraft version. As of writing, FoliaLib should work in any plugin supporting 1.8.8 to 1.21+. However, we heavily warn against using anything below 1.13.2 since this version adds support for many features FoliaLib depends on. Workarounds are used for supporting older versions.

API Note:
This project is still in its early stages and may make frequent breaking changes to the API. Additionally, I won't claim that this library is perfect; If you find any issues, please report them on the issues page


FoliaLib as a dependency

Caution

The FoliaLib repository has moved! Please update your pom.xml or build.gradle file to use the Jitpack repository (see examples below).

Warning

You are expected to relocate the package com.tcoded.folialib to prevent conflicts with other plugins!
Example configuration snippets demonstrating how to do this are available below for Maven and Gradle.

Tip

Ensure that you exclude FoliaLib from any minimize operation.

Gradle Dependency

[Click to show Gradle example configurations]
plugins {
id("com.gradleup.shadow") version "9.4.1"// For up to Java 17// id("com.gradleup.shadow") version "9.0.0-beta12" // Uncomment for Java 21 or higher
}
repositories {
maven {
name ="tcoded-releases"
url ="https://repo.tcoded.com/releases"
}
}
dependencies {
implementation("com.tcoded:FoliaLib:SET_VERSION_HERE")
}
shadowJar {
// !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !!
relocate("com.tcoded.folialib", "CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib")
// Optional: If you use minimize, make sure you exclude FoliaLib// Do not uncomment this if you don't know what you are doing// minimize {// exclude dependency("com.tcoded:FoliaLib:.*")// }
}

Maven Dependency

[Click to show Maven example configurations]
<repositories>
<repository>
<id>tcoded-releases</id>
<url>https://repo.tcoded.com/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.tcoded</groupId>
<artifactId>FoliaLib</artifactId>
<version>SET_VERSION_HERE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.tcoded.folialib</pattern>
<!-- !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !! -->
<shadedPattern>CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

How to use

Create a new instance of the FoliaLib class:

// Assuming "this" is your plugin instanceFoliaLibfoliaLib = newFoliaLib(this);

Here are some examples of how to use the library:

// Remember that 20 ticks = 1000 milliseconds, and 20 * 50L = 1000L// On a folia server, runNextTick() will run using the GlobalRegionScheduler// !! This does not make it safe to use for players or block changes !!// Use other methods found below for handling these cases// This should only be used for updating the following (see GlobalRegionScheduler.java for more info)// - world day time// - world game time// - weather cycle// - sleep/night skipping// - executing commands for console// On a Spigot server, runNextTick() will run on the main threadfoliaLib.getScheduler().runNextTick(() -> {/* Code */});
// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runAsync(() -> {/* Code */});
// On a Folia server, this method will run using the GlobalRegionScheduler// On a Spigot server, this method will run on the main threadfoliaLib.getScheduler().runTimer(() -> {/* Code */}, 1, 20); // Using ticks// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20); // Using ticksfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20 * 50L, TimeUnit.MILLISECONDS); // Using TimeUnit// On a folia server, this will run the code using the RegionScheduler that is appropriate for the location// On a spigot server, this will run the code on the main threadfoliaLib.getScheduler().runAtLocation(location, () -> {/* Code */});
// On a folia server, this will run the code using the EntityScheduler that is appropriate for the entity// On a spigot server, this will just run the code on the main threadfoliaLib.getScheduler().runAtEntity(entity, () -> {/* Code */});
// On a folia server, this will teleport the entity (or player) asynchronously// On a paper server (which supports async teleports), this will also teleport asynchronously// On a spigot server, this will fallback to teleporting the player on the next tick// Why not immediately teleport on spigot?// 1. We don't know if you're running this from the main thread (but this could be checked)// 2. Above all, we quickly expose any bugs that could result from expecting instant// teleports on any platform// Returns: A CompletableFuture<Boolean> from which you can execute any dependent code. The Boolean// is the success state of the teleportation.foliaLib.getScheduler().teleportAsync(entity, location, optionalTeleportCause);
// During your plugin's onDisable(), please use the following.// This will cancel all the tasks associated with this FoliaLib instancefoliaLib.getScheduler().cancelAllTasks();
// AND MANY MORE OPTIONS...!// You can also manually check for a specific platform if certain parts of your code// should only run under those conditions (ex: use of specific folia-only APIs)foliaLib.isFolia(); // true/falsefoliaLib.isPaper(); // true/falsefoliaLib.isSpigot(); // true/false

License

This project is licensed under the MIT License - see the LICENSE file for details

About

This is a wrapper library for aiding in supporting the Folia Paper Fork. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers.

Topics

Resources

Stars

133 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

FoliaLib GitHub Release

Developers and contributors like you make this project possible. This project is not directly affiliated with PaperMC.


Description

This project is a wrapper library that aids developers in supporting the "Folia" Paper fork while not breaking support for Spigot or Paper. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers. Developers are expected to depend on this library and relocate the package to their own to prevent conflicts with other plugins.

Version support:
FoliaLib attempts to be compatible with all your projects no matter how outdated the minecraft version. As of writing, FoliaLib should work in any plugin supporting 1.8.8 to 1.21+. However, we heavily warn against using anything below 1.13.2 since this version adds support for many features FoliaLib depends on. Workarounds are used for supporting older versions.

API Note:
This project is still in its early stages and may make frequent breaking changes to the API. Additionally, I won't claim that this library is perfect; If you find any issues, please report them on the issues page


FoliaLib as a dependency

Caution

The FoliaLib repository has moved! Please update your pom.xml or build.gradle file to use the Jitpack repository (see examples below).

Warning

You are expected to relocate the package com.tcoded.folialib to prevent conflicts with other plugins!
Example configuration snippets demonstrating how to do this are available below for Maven and Gradle.

Tip

Ensure that you exclude FoliaLib from any minimize operation.

Gradle Dependency

[Click to show Gradle example configurations]
plugins {
id("com.gradleup.shadow") version "9.4.1"// For up to Java 17// id("com.gradleup.shadow") version "9.0.0-beta12" // Uncomment for Java 21 or higher
}
repositories {
maven {
name ="tcoded-releases"
url ="https://repo.tcoded.com/releases"
}
}
dependencies {
implementation("com.tcoded:FoliaLib:SET_VERSION_HERE")
}
shadowJar {
// !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !!
relocate("com.tcoded.folialib", "CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib")
// Optional: If you use minimize, make sure you exclude FoliaLib// Do not uncomment this if you don't know what you are doing// minimize {// exclude dependency("com.tcoded:FoliaLib:.*")// }
}

Maven Dependency

[Click to show Maven example configurations]
<repositories>
<repository>
<id>tcoded-releases</id>
<url>https://repo.tcoded.com/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.tcoded</groupId>
<artifactId>FoliaLib</artifactId>
<version>SET_VERSION_HERE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.tcoded.folialib</pattern>
<!-- !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !! -->
<shadedPattern>CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

How to use

Create a new instance of the FoliaLib class:

// Assuming "this" is your plugin instanceFoliaLibfoliaLib = newFoliaLib(this);

Here are some examples of how to use the library:

// Remember that 20 ticks = 1000 milliseconds, and 20 * 50L = 1000L// On a folia server, runNextTick() will run using the GlobalRegionScheduler// !! This does not make it safe to use for players or block changes !!// Use other methods found below for handling these cases// This should only be used for updating the following (see GlobalRegionScheduler.java for more info)// - world day time// - world game time// - weather cycle// - sleep/night skipping// - executing commands for console// On a Spigot server, runNextTick() will run on the main threadfoliaLib.getScheduler().runNextTick(() -> {/* Code */});
// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runAsync(() -> {/* Code */});
// On a Folia server, this method will run using the GlobalRegionScheduler// On a Spigot server, this method will run on the main threadfoliaLib.getScheduler().runTimer(() -> {/* Code */}, 1, 20); // Using ticks// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20); // Using ticksfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20 * 50L, TimeUnit.MILLISECONDS); // Using TimeUnit// On a folia server, this will run the code using the RegionScheduler that is appropriate for the location// On a spigot server, this will run the code on the main threadfoliaLib.getScheduler().runAtLocation(location, () -> {/* Code */});
// On a folia server, this will run the code using the EntityScheduler that is appropriate for the entity// On a spigot server, this will just run the code on the main threadfoliaLib.getScheduler().runAtEntity(entity, () -> {/* Code */});
// On a folia server, this will teleport the entity (or player) asynchronously// On a paper server (which supports async teleports), this will also teleport asynchronously// On a spigot server, this will fallback to teleporting the player on the next tick// Why not immediately teleport on spigot?// 1. We don't know if you're running this from the main thread (but this could be checked)// 2. Above all, we quickly expose any bugs that could result from expecting instant// teleports on any platform// Returns: A CompletableFuture<Boolean> from which you can execute any dependent code. The Boolean// is the success state of the teleportation.foliaLib.getScheduler().teleportAsync(entity, location, optionalTeleportCause);
// During your plugin's onDisable(), please use the following.// This will cancel all the tasks associated with this FoliaLib instancefoliaLib.getScheduler().cancelAllTasks();
// AND MANY MORE OPTIONS...!// You can also manually check for a specific platform if certain parts of your code// should only run under those conditions (ex: use of specific folia-only APIs)foliaLib.isFolia(); // true/falsefoliaLib.isPaper(); // true/falsefoliaLib.isSpigot(); // true/false

License

This project is licensed under the MIT License - see the LICENSE file for details

About

This is a wrapper library for aiding in supporting the Folia Paper Fork. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers.

Topics

Resources

Stars

133 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

FoliaLib GitHub Release

Developers and contributors like you make this project possible. This project is not directly affiliated with PaperMC.


Description

This project is a wrapper library that aids developers in supporting the "Folia" Paper fork while not breaking support for Spigot or Paper. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers. Developers are expected to depend on this library and relocate the package to their own to prevent conflicts with other plugins.

Version support:
FoliaLib attempts to be compatible with all your projects no matter how outdated the minecraft version. As of writing, FoliaLib should work in any plugin supporting 1.8.8 to 1.21+. However, we heavily warn against using anything below 1.13.2 since this version adds support for many features FoliaLib depends on. Workarounds are used for supporting older versions.

API Note:
This project is still in its early stages and may make frequent breaking changes to the API. Additionally, I won't claim that this library is perfect; If you find any issues, please report them on the issues page


FoliaLib as a dependency

Caution

The FoliaLib repository has moved! Please update your pom.xml or build.gradle file to use the Jitpack repository (see examples below).

Warning

You are expected to relocate the package com.tcoded.folialib to prevent conflicts with other plugins!
Example configuration snippets demonstrating how to do this are available below for Maven and Gradle.

Tip

Ensure that you exclude FoliaLib from any minimize operation.

Gradle Dependency

[Click to show Gradle example configurations]
plugins {
id("com.gradleup.shadow") version "9.4.1"// For up to Java 17// id("com.gradleup.shadow") version "9.0.0-beta12" // Uncomment for Java 21 or higher
}
repositories {
maven {
name ="tcoded-releases"
url ="https://repo.tcoded.com/releases"
}
}
dependencies {
implementation("com.tcoded:FoliaLib:SET_VERSION_HERE")
}
shadowJar {
// !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !!
relocate("com.tcoded.folialib", "CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib")
// Optional: If you use minimize, make sure you exclude FoliaLib// Do not uncomment this if you don't know what you are doing// minimize {// exclude dependency("com.tcoded:FoliaLib:.*")// }
}

Maven Dependency

[Click to show Maven example configurations]
<repositories>
<repository>
<id>tcoded-releases</id>
<url>https://repo.tcoded.com/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.tcoded</groupId>
<artifactId>FoliaLib</artifactId>
<version>SET_VERSION_HERE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.tcoded.folialib</pattern>
<!-- !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !! -->
<shadedPattern>CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

How to use

Create a new instance of the FoliaLib class:

// Assuming "this" is your plugin instanceFoliaLibfoliaLib = newFoliaLib(this);

Here are some examples of how to use the library:

// Remember that 20 ticks = 1000 milliseconds, and 20 * 50L = 1000L// On a folia server, runNextTick() will run using the GlobalRegionScheduler// !! This does not make it safe to use for players or block changes !!// Use other methods found below for handling these cases// This should only be used for updating the following (see GlobalRegionScheduler.java for more info)// - world day time// - world game time// - weather cycle// - sleep/night skipping// - executing commands for console// On a Spigot server, runNextTick() will run on the main threadfoliaLib.getScheduler().runNextTick(() -> {/* Code */});
// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runAsync(() -> {/* Code */});
// On a Folia server, this method will run using the GlobalRegionScheduler// On a Spigot server, this method will run on the main threadfoliaLib.getScheduler().runTimer(() -> {/* Code */}, 1, 20); // Using ticks// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20); // Using ticksfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20 * 50L, TimeUnit.MILLISECONDS); // Using TimeUnit// On a folia server, this will run the code using the RegionScheduler that is appropriate for the location// On a spigot server, this will run the code on the main threadfoliaLib.getScheduler().runAtLocation(location, () -> {/* Code */});
// On a folia server, this will run the code using the EntityScheduler that is appropriate for the entity// On a spigot server, this will just run the code on the main threadfoliaLib.getScheduler().runAtEntity(entity, () -> {/* Code */});
// On a folia server, this will teleport the entity (or player) asynchronously// On a paper server (which supports async teleports), this will also teleport asynchronously// On a spigot server, this will fallback to teleporting the player on the next tick// Why not immediately teleport on spigot?// 1. We don't know if you're running this from the main thread (but this could be checked)// 2. Above all, we quickly expose any bugs that could result from expecting instant// teleports on any platform// Returns: A CompletableFuture<Boolean> from which you can execute any dependent code. The Boolean// is the success state of the teleportation.foliaLib.getScheduler().teleportAsync(entity, location, optionalTeleportCause);
// During your plugin's onDisable(), please use the following.// This will cancel all the tasks associated with this FoliaLib instancefoliaLib.getScheduler().cancelAllTasks();
// AND MANY MORE OPTIONS...!// You can also manually check for a specific platform if certain parts of your code// should only run under those conditions (ex: use of specific folia-only APIs)foliaLib.isFolia(); // true/falsefoliaLib.isPaper(); // true/falsefoliaLib.isSpigot(); // true/false

License

This project is licensed under the MIT License - see the LICENSE file for details

About

This is a wrapper library for aiding in supporting the Folia Paper Fork. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers.

Topics

Resources

Stars

133 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

FoliaLib GitHub Release

Developers and contributors like you make this project possible. This project is not directly affiliated with PaperMC.


Description

This project is a wrapper library that aids developers in supporting the "Folia" Paper fork while not breaking support for Spigot or Paper. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers. Developers are expected to depend on this library and relocate the package to their own to prevent conflicts with other plugins.

Version support:
FoliaLib attempts to be compatible with all your projects no matter how outdated the minecraft version. As of writing, FoliaLib should work in any plugin supporting 1.8.8 to 1.21+. However, we heavily warn against using anything below 1.13.2 since this version adds support for many features FoliaLib depends on. Workarounds are used for supporting older versions.

API Note:
This project is still in its early stages and may make frequent breaking changes to the API. Additionally, I won't claim that this library is perfect; If you find any issues, please report them on the issues page


FoliaLib as a dependency

Caution

The FoliaLib repository has moved! Please update your pom.xml or build.gradle file to use the Jitpack repository (see examples below).

Warning

You are expected to relocate the package com.tcoded.folialib to prevent conflicts with other plugins!
Example configuration snippets demonstrating how to do this are available below for Maven and Gradle.

Tip

Ensure that you exclude FoliaLib from any minimize operation.

Gradle Dependency

[Click to show Gradle example configurations]
plugins {
id("com.gradleup.shadow") version "9.4.1"// For up to Java 17// id("com.gradleup.shadow") version "9.0.0-beta12" // Uncomment for Java 21 or higher
}
repositories {
maven {
name ="tcoded-releases"
url ="https://repo.tcoded.com/releases"
}
}
dependencies {
implementation("com.tcoded:FoliaLib:SET_VERSION_HERE")
}
shadowJar {
// !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !!
relocate("com.tcoded.folialib", "CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib")
// Optional: If you use minimize, make sure you exclude FoliaLib// Do not uncomment this if you don't know what you are doing// minimize {// exclude dependency("com.tcoded:FoliaLib:.*")// }
}

Maven Dependency

[Click to show Maven example configurations]
<repositories>
<repository>
<id>tcoded-releases</id>
<url>https://repo.tcoded.com/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.tcoded</groupId>
<artifactId>FoliaLib</artifactId>
<version>SET_VERSION_HERE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.tcoded.folialib</pattern>
<!-- !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !! -->
<shadedPattern>CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

How to use

Create a new instance of the FoliaLib class:

// Assuming "this" is your plugin instanceFoliaLibfoliaLib = newFoliaLib(this);

Here are some examples of how to use the library:

// Remember that 20 ticks = 1000 milliseconds, and 20 * 50L = 1000L// On a folia server, runNextTick() will run using the GlobalRegionScheduler// !! This does not make it safe to use for players or block changes !!// Use other methods found below for handling these cases// This should only be used for updating the following (see GlobalRegionScheduler.java for more info)// - world day time// - world game time// - weather cycle// - sleep/night skipping// - executing commands for console// On a Spigot server, runNextTick() will run on the main threadfoliaLib.getScheduler().runNextTick(() -> {/* Code */});
// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runAsync(() -> {/* Code */});
// On a Folia server, this method will run using the GlobalRegionScheduler// On a Spigot server, this method will run on the main threadfoliaLib.getScheduler().runTimer(() -> {/* Code */}, 1, 20); // Using ticks// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20); // Using ticksfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20 * 50L, TimeUnit.MILLISECONDS); // Using TimeUnit// On a folia server, this will run the code using the RegionScheduler that is appropriate for the location// On a spigot server, this will run the code on the main threadfoliaLib.getScheduler().runAtLocation(location, () -> {/* Code */});
// On a folia server, this will run the code using the EntityScheduler that is appropriate for the entity// On a spigot server, this will just run the code on the main threadfoliaLib.getScheduler().runAtEntity(entity, () -> {/* Code */});
// On a folia server, this will teleport the entity (or player) asynchronously// On a paper server (which supports async teleports), this will also teleport asynchronously// On a spigot server, this will fallback to teleporting the player on the next tick// Why not immediately teleport on spigot?// 1. We don't know if you're running this from the main thread (but this could be checked)// 2. Above all, we quickly expose any bugs that could result from expecting instant// teleports on any platform// Returns: A CompletableFuture<Boolean> from which you can execute any dependent code. The Boolean// is the success state of the teleportation.foliaLib.getScheduler().teleportAsync(entity, location, optionalTeleportCause);
// During your plugin's onDisable(), please use the following.// This will cancel all the tasks associated with this FoliaLib instancefoliaLib.getScheduler().cancelAllTasks();
// AND MANY MORE OPTIONS...!// You can also manually check for a specific platform if certain parts of your code// should only run under those conditions (ex: use of specific folia-only APIs)foliaLib.isFolia(); // true/falsefoliaLib.isPaper(); // true/falsefoliaLib.isSpigot(); // true/false

License

This project is licensed under the MIT License - see the LICENSE file for details

About

This is a wrapper library for aiding in supporting the Folia Paper Fork. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers.

Topics

Resources

Stars

133 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

FoliaLib GitHub Release

Developers and contributors like you make this project possible. This project is not directly affiliated with PaperMC.


Description

This project is a wrapper library that aids developers in supporting the "Folia" Paper fork while not breaking support for Spigot or Paper. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers. Developers are expected to depend on this library and relocate the package to their own to prevent conflicts with other plugins.

Version support:
FoliaLib attempts to be compatible with all your projects no matter how outdated the minecraft version. As of writing, FoliaLib should work in any plugin supporting 1.8.8 to 1.21+. However, we heavily warn against using anything below 1.13.2 since this version adds support for many features FoliaLib depends on. Workarounds are used for supporting older versions.

API Note:
This project is still in its early stages and may make frequent breaking changes to the API. Additionally, I won't claim that this library is perfect; If you find any issues, please report them on the issues page


FoliaLib as a dependency

Caution

The FoliaLib repository has moved! Please update your pom.xml or build.gradle file to use the Jitpack repository (see examples below).

Warning

You are expected to relocate the package com.tcoded.folialib to prevent conflicts with other plugins!
Example configuration snippets demonstrating how to do this are available below for Maven and Gradle.

Tip

Ensure that you exclude FoliaLib from any minimize operation.

Gradle Dependency

[Click to show Gradle example configurations]
plugins {
id("com.gradleup.shadow") version "9.4.1"// For up to Java 17// id("com.gradleup.shadow") version "9.0.0-beta12" // Uncomment for Java 21 or higher
}
repositories {
maven {
name ="tcoded-releases"
url ="https://repo.tcoded.com/releases"
}
}
dependencies {
implementation("com.tcoded:FoliaLib:SET_VERSION_HERE")
}
shadowJar {
// !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !!
relocate("com.tcoded.folialib", "CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib")
// Optional: If you use minimize, make sure you exclude FoliaLib// Do not uncomment this if you don't know what you are doing// minimize {// exclude dependency("com.tcoded:FoliaLib:.*")// }
}

Maven Dependency

[Click to show Maven example configurations]
<repositories>
<repository>
<id>tcoded-releases</id>
<url>https://repo.tcoded.com/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.tcoded</groupId>
<artifactId>FoliaLib</artifactId>
<version>SET_VERSION_HERE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.tcoded.folialib</pattern>
<!-- !! MAKE SURE TO CHANGE THIS TO YOUR PLUGIN'S GROUP & PLUGIN NAME !! -->
<shadedPattern>CHANGE-THE-GROUP.CHANGE-THE-PLUGIN-NAME.lib.folialib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

How to use

Create a new instance of the FoliaLib class:

// Assuming "this" is your plugin instanceFoliaLibfoliaLib = newFoliaLib(this);

Here are some examples of how to use the library:

// Remember that 20 ticks = 1000 milliseconds, and 20 * 50L = 1000L// On a folia server, runNextTick() will run using the GlobalRegionScheduler// !! This does not make it safe to use for players or block changes !!// Use other methods found below for handling these cases// This should only be used for updating the following (see GlobalRegionScheduler.java for more info)// - world day time// - world game time// - weather cycle// - sleep/night skipping// - executing commands for console// On a Spigot server, runNextTick() will run on the main threadfoliaLib.getScheduler().runNextTick(() -> {/* Code */});
// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runAsync(() -> {/* Code */});
// On a Folia server, this method will run using the GlobalRegionScheduler// On a Spigot server, this method will run on the main threadfoliaLib.getScheduler().runTimer(() -> {/* Code */}, 1, 20); // Using ticks// In both cases, this method will run asynchronouslyfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20); // Using ticksfoliaLib.getScheduler().runTimerAsync(() -> {/* Code */}, 1, 20 * 50L, TimeUnit.MILLISECONDS); // Using TimeUnit// On a folia server, this will run the code using the RegionScheduler that is appropriate for the location// On a spigot server, this will run the code on the main threadfoliaLib.getScheduler().runAtLocation(location, () -> {/* Code */});
// On a folia server, this will run the code using the EntityScheduler that is appropriate for the entity// On a spigot server, this will just run the code on the main threadfoliaLib.getScheduler().runAtEntity(entity, () -> {/* Code */});
// On a folia server, this will teleport the entity (or player) asynchronously// On a paper server (which supports async teleports), this will also teleport asynchronously// On a spigot server, this will fallback to teleporting the player on the next tick// Why not immediately teleport on spigot?// 1. We don't know if you're running this from the main thread (but this could be checked)// 2. Above all, we quickly expose any bugs that could result from expecting instant// teleports on any platform// Returns: A CompletableFuture<Boolean> from which you can execute any dependent code. The Boolean// is the success state of the teleportation.foliaLib.getScheduler().teleportAsync(entity, location, optionalTeleportCause);
// During your plugin's onDisable(), please use the following.// This will cancel all the tasks associated with this FoliaLib instancefoliaLib.getScheduler().cancelAllTasks();
// AND MANY MORE OPTIONS...!// You can also manually check for a specific platform if certain parts of your code// should only run under those conditions (ex: use of specific folia-only APIs)foliaLib.isFolia(); // true/falsefoliaLib.isPaper(); // true/falsefoliaLib.isSpigot(); // true/false

License

This project is licensed under the MIT License - see the LICENSE file for details

About

This is a wrapper library for aiding in supporting the Folia Paper Fork. This library adds multiple scheduler options to use instead of the Bukkit or Folia native schedulers.

Topics

Resources

Stars

133 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages