Tags
Creators
Details
1.6.0
Compatibility
Changes
:rocket: PaperTS 1.6.0 Released
In this new release we included the Java Bridge API, a new interface that bridges the gap between TypeScript and the underlying Java Virtual Machine. It was a contribution from @sirio_03 .
:tools: Setup & Type Definitions To use the Java Bridge with full TypeScript support, create a javaBridge.ts file in your project and add the following type declarations:
declare const Java: {
/**
* Get an enum value by class name and value name.
*/
enumValue<T = unknown>(className: string, valueName: string): T;
/**
* Get all values of an enum.
*/
enumValues<T = unknown>(className: string): T[];
/**
* Create a new instance of a Java class.
*/
newInstance<T = unknown>(className: string, ...args: unknown[]): T;
/**
* Call a static method on a Java class.
*/
callStatic<T = unknown>(
className: string,
methodName: string,
...args: unknown[]
): T;
/**
* Get a static field value from a Java class.
*/
getStatic<T = unknown>(className: string, fieldName: string): T;
/**
* Check if a Java class exists.
*/
classExists(className: string): boolean;
};
:bulb: Usage Examples
1. Managing Enums Access any Bukkit enum without needing a wrapper.
const gameModes = Java.enumValues("org.bukkit.GameMode");
player.sendMessage(`Available modes: ${gameModes.join(", ")}`);
2. Instantiating Java Classes Perfect for creating objects like Location.
// Create a new Location
const world = Java.callStatic("org.bukkit.Bukkit", "getWorld", "world");
const location = Java.newInstance("org.bukkit.Location", world, 100, 64, 100);
player.teleport(location);
3. Static Methods & Fields Interact with the Server constants directly.
// Call a static method
Java.callStatic("org.bukkit.Bukkit", "broadcastMessage", "Hello from PaperTS!");
const onlinePlayer: any[] = Java.callStatic(
"org.bukkit.Bukkit",
"getOnlinePlayers"
);
onlinePlayer.forEach((player) => player.sendMessage("Hi everyone"));
// Get a static constant
const legacyPrefix = Java.getStatic("org.bukkit.Material", "LEGACY_PREFIX");;
player.sendMessage(legacyPrefix);
4. Conditional Integration Check if a plugin (like Vault or WorldEdit) is installed before attempting to use it.
// Check if a class exists before using it
if (Java.classExists("com.example.CustomPlugin")) {
const customValue = Java.callStatic("com.example.CustomPlugin", "getValue");
player.sendMessage(`Custom plugin value: ${customValue}`);
} else {
player.sendMessage("Custom plugin not found");
}
// Useful for optional integrations
const hasVault = Java.classExists("net.milkbowl.vault.economy.Economy");
if (hasVault) {
// Initialize Vault integration
}
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:uqOgfcal:lYLqKVkA"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:uqOgfcal:lYLqKVkA"
}

