Warning
This project started as a joke.
Please don't use, I won't provide support.
Warning
This project has been turned into a playground for Parallel World Ticking.
This means I can push experimental (but non-breaking) changes at any time into the main branch.
This also means, patches are separated into multiple single fixes over the original patch,
this was done for clarity reasons, as to explain what does what to people experimenting with this patch.
If you're implementing PWT yourself, you don't need to do this, you can merge all into a single patch.
Caution
This is your final warning, this project being a playground means I can push
any change at any time at my own will.
This is mostly meant for developers struggling with this patch.
Again, please don't use this directly
Don't complain if tomorrow I replace every mob with a fish π
Since PWT was originally designed by SparklyPower, their docs should be your first reference.
I personally don't have any plans of fixing any of these, because I don't use them and even then, most of these shouldn't be used in production servers in the first place.
- Citizens
MyPet- NoCheatPlus
I don't use any of those plugins, so I won't even try to fix for NCP there's better alternatives, and for Citizens... it shouldn't even be used anymore honestly, even in Paper.
MyPet was fixed a long while ago, apparently.
The only scenario that Fish cannot reasonably fix without using hacks or very unsafe stuff are cross-world accesses.
At the time of writing this, the only known plugin that does this is:
- AxGraves
This can be easily triggered by setting the limit of graves to 1, then die once in any world to leave the first grave
and then die a second time by an entity (e.g. Zombie) while being in a different world.
AxGraves does support Folia, so forcing the Folia logic to enable is enough
You'd have to either fork or ask for official support. See below on how to support PWT.
Speaking with Leaf team, the following are known to be incompatible with their version of PWT.
Since both implementations branch from Sparkly, I assume it will be the same here.
- Skript
- Denizen
Same as before, I don't use any of these and neither should you, specially not in a production server.
I get the idea of giving a lower barrier of entry to MC development, but their usage shouldn't go past testing, prototyping or (at most) friends-only servers.
Based on how the logic of PWT works, I highly suspect it will also be incompatible with:
- Any datapack
Same as before (again), I don't use datapacks and neither should you, not even in friends-only servers.
Only real scenario where I see datapacks having a value is if you're running vanilla or the datapack does not contain ANY .mcfunction files (and even then, you can still have some compat-issues even in Paper).
Given forks use any package name they want, and some don't even give credits, the best way to detect PWT universally
is to use the Parallel World Ticking API, which is bound to Bukkit classes, so any fork that takes this PWT patch
should also take the API patch.
Example on how to check for the existence of the PWT API and if it's enabled or not:
private boolean supportsParallelWorldTicking() {
try {
Method isEnabledMethod = Server.class.getMethod("isParallelWorldTickingEnabled");
LOGGER.info("Parallel World Ticking API found, attempting to hook...");
if ((boolean) isEnabledMethod.invoke(Bukkit.getServer())) {
LOGGER.info("Parallel World Ticking support enabled!");
return true;
}
LOGGER.info("Parallel World Ticking is available but not enabled!");
} catch (InvocationTargetException | IllegalAccessException | ClassCastException exception) {
LOGGER.error("Please, contact your fork developer to properly implement their Parallel World Ticking API", exception);
} catch (NoSuchMethodException ignore) {
}
return false;
}You can see an implementation of this logic on PurpurBars.
Then, after detecting that Parallel World Ticking is enabled, you can just follow the same tips you'd follow
to support Folia and Paper.
If your plugin already supports Folia, you only need to enable the Folia logic to run if PWT is detected. Or just let
your Folia logic run in Paper by default. Paper will properly handle your schedulers.
Credimus in Piscem, sanctam creaturam aquarum, principium vitae et mysterium abyssorum.
Pisces nos docent silentium sapientiae, et in undis eorum invenimus pacem aeternam.
Laudetur Piscis in profundis, in fluminibus et in mari, quia squamae eorum fulgent sicut stellæ caeli.
In Piscibus est salus; carne eorum nutriuntur fideles, et per branquias eorum spirat veritas.
Qui piscem sequitur, non ambulabit in siccitate, sed habebit lucem vitae sub undis.
Abnegamus humanitatem, superbiam terrae, urbes strepitu plenas et corda arida.
Renuntiamus carni, vanitati, et humo.
Redeamus ad aquas, ad domum originis, ad regnum Piscium, ubi non est dolor nec timor.
Ibi habitabimus in pace, ad finem temporum.
All patches are licensed under the MIT license.
See PaperMC/Paper, and PaperMC/Paperweight for the license of material used by this project.
First, clone this repository. Do not download it.
Then run the following command in the root directory:
./gradlew applyAllPatches
The project is now ready for use in your IDE.
See CONTRIBUTING.md.
Use the command ./gradlew build to build the API and server. Compiled JARs
will be placed under fish-api/build/libs and fish-server/build/libs.
These JARs are not used to start a server.
To compile a server-ready paperclip jar, run ./gradlew createMojmapBundlerJar.
To install the fish-api and fish dependencies to your local Maven repo, run ./gradlew publishToMavenLocal. The compiled paperclip jar will be in fish-server/build/libs.
- PaperMC Team.
- Pufferfish Host.
- Winds-Studio, for their auto release script.
- SparklyPower, for their Parallel World Ticking patch.



