From 3e255aa8272d4ac5346d40b1f58cc8145322ce40 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:48:21 +0100 Subject: [PATCH 01/61] Release 5.2.0 --- src/main/kotlin/com/chattriggers/ctjs/CTJS.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt index a05ad542..1161d212 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt @@ -55,7 +55,7 @@ class CTJS : ClientModInitializer { companion object { const val MOD_ID = "ctjs" const val WEBSITE_ROOT = "https://www.chattriggers.com" - const val MOD_VERSION = "5.1.1" + const val MOD_VERSION = "5.2.0" const val MODULES_FOLDER = "./config/ChatTriggers/modules" val configLocation = File("./config") From fcd475da08374ce43405160396f863d260daf365 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:25:51 +0100 Subject: [PATCH 02/61] Use client ctjs api for mixins --- src/main/java/com/v5/mixins/BlockMixin.java | 4 +- src/main/java/com/v5/mixins/CameraMixin.java | 29 ++--- .../com/v5/mixins/ChatComponentMixin.java | 4 +- .../com/v5/mixins/EntityRendererMixin.java | 4 +- src/main/java/com/v5/mixins/FrustumMixin.java | 4 +- .../v5/mixins/ItemInHandRendererMixin.java | 5 +- .../com/v5/mixins/KeyboardHandlerMixin.java | 3 +- .../com/v5/mixins/LevelRendererMixin.java | 7 +- .../java/com/v5/mixins/MinecraftMixin.java | 75 ++++++------- .../java/com/v5/mixins/MouseHandlerMixin.java | 29 ++--- .../com/v5/mixins/PlayerTabOverlayMixin.java | 4 +- .../java/com/v5/mixins/VisGraphMixin.java | 4 +- .../java/com/v5/storage/V5MixinStorage.java | 103 ------------------ .../chattriggers/ctjs/api/client/Client.kt | 62 +++++++++++ 14 files changed, 134 insertions(+), 203 deletions(-) delete mode 100644 src/main/java/com/v5/storage/V5MixinStorage.java diff --git a/src/main/java/com/v5/mixins/BlockMixin.java b/src/main/java/com/v5/mixins/BlockMixin.java index 218df85e..03e94844 100644 --- a/src/main/java/com/v5/mixins/BlockMixin.java +++ b/src/main/java/com/v5/mixins/BlockMixin.java @@ -1,6 +1,6 @@ package com.v5.mixins; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import java.util.Set; import net.minecraft.world.level.block.Block; import org.spongepowered.asm.mixin.Mixin; @@ -27,7 +27,7 @@ public class BlockMixin { @Inject(method = "spawnDestroyParticles", at = @At("HEAD"), cancellable = true) private void v5$spawnBreakParticles(CallbackInfo ci) { - if (!V5MixinStorage.getBoolean("hideParticles", false)) { + if (!Client.getHideParticles()) { return; } diff --git a/src/main/java/com/v5/mixins/CameraMixin.java b/src/main/java/com/v5/mixins/CameraMixin.java index b2c6df68..36369320 100644 --- a/src/main/java/com/v5/mixins/CameraMixin.java +++ b/src/main/java/com/v5/mixins/CameraMixin.java @@ -1,6 +1,6 @@ package com.v5.mixins; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -25,18 +25,15 @@ public abstract class CameraMixin { @Inject(method = "alignWithEntity", at = @At("TAIL")) private void v5$applyCameraOverride(float partialTick, CallbackInfo ci) { - Object yaw = V5MixinStorage.get("cameraOverrideYaw", null); - Object pitch = V5MixinStorage.get("cameraOverridePitch", null); - if (V5MixinStorage.getBoolean("freelookEnabled", false) - && yaw instanceof Number yawNumber - && pitch instanceof Number pitchNumber) { + Float yaw = Client.getCameraYaw(); + Float pitch = Client.getCameraPitch(); + if (Client.isFreelook() && yaw != null && pitch != null) { LocalPlayer player = Minecraft.getInstance().player; if (player != null) { - float yawRadians = yawNumber.floatValue() * Mth.DEG_TO_RAD; - float pitchRadians = pitchNumber.floatValue() * Mth.DEG_TO_RAD; + float yawRadians = yaw * Mth.DEG_TO_RAD; + float pitchRadians = pitch * Mth.DEG_TO_RAD; float cosPitch = Mth.cos(pitchRadians); - Object storedDistance = V5MixinStorage.get("freelookCameraDistance", 4.0); - double distance = storedDistance instanceof Number number ? Mth.clamp(number.doubleValue(), 1.0, 12.0) : 4.0; + double distance = Client.getFreelookDistance(); Vec3 eyePos = player.getEyePosition(partialTick); this.setPosition(eyePos.add( Mth.sin(yawRadians) * cosPitch * distance, @@ -44,16 +41,12 @@ public abstract class CameraMixin { -Mth.cos(yawRadians) * cosPitch * distance)); } } else { - Object override = V5MixinStorage.get("cameraOverridePos", null); - if (override instanceof Vec3 pos) { - this.setPosition(pos); - } + Vec3 position = Client.getCameraPosition(); + if (position != null) this.setPosition(position); } - if (yaw instanceof Number yawNumber && pitch instanceof Number pitchNumber) { - this.setRotation(yawNumber.floatValue(), pitchNumber.floatValue()); - } + if (yaw != null && pitch != null) this.setRotation(yaw, pitch); - if (V5MixinStorage.getBoolean("freecamEnabled", false)) this.detached = true; + if (Client.isFreecam()) this.detached = true; } } diff --git a/src/main/java/com/v5/mixins/ChatComponentMixin.java b/src/main/java/com/v5/mixins/ChatComponentMixin.java index c7e3ef10..17f848fc 100644 --- a/src/main/java/com/v5/mixins/ChatComponentMixin.java +++ b/src/main/java/com/v5/mixins/ChatComponentMixin.java @@ -1,6 +1,6 @@ package com.v5.mixins; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.gui.components.ChatComponent; import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; @@ -15,6 +15,6 @@ public class ChatComponentMixin { ordinal = 0, argsOnly = true) private Component v5$addMessage(Component original) { - return V5MixinStorage.applyMethod("nameProcessor", original, Component.class); + return Client.processName(original); } } diff --git a/src/main/java/com/v5/mixins/EntityRendererMixin.java b/src/main/java/com/v5/mixins/EntityRendererMixin.java index 05fac2d7..fe1b4ca8 100644 --- a/src/main/java/com/v5/mixins/EntityRendererMixin.java +++ b/src/main/java/com/v5/mixins/EntityRendererMixin.java @@ -1,6 +1,6 @@ package com.v5.mixins; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; @@ -17,7 +17,7 @@ public class EntityRendererMixin { return; } - Component updated = V5MixinStorage.applyMethod("nameProcessor", original, Component.class); + Component updated = Client.processName(original); if (updated != original) { cir.setReturnValue(updated); } diff --git a/src/main/java/com/v5/mixins/FrustumMixin.java b/src/main/java/com/v5/mixins/FrustumMixin.java index 5eff1c18..502a93ad 100644 --- a/src/main/java/com/v5/mixins/FrustumMixin.java +++ b/src/main/java/com/v5/mixins/FrustumMixin.java @@ -1,6 +1,6 @@ package com.v5.mixins; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.renderer.culling.Frustum; import org.joml.FrustumIntersection; import org.spongepowered.asm.mixin.Mixin; @@ -14,6 +14,6 @@ public class FrustumMixin { private void v5$showEverythingInFreecam(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, CallbackInfoReturnable cir) { - if (V5MixinStorage.getBoolean("freecamEnabled", false)) cir.setReturnValue(FrustumIntersection.INSIDE); + if (Client.isFreecam()) cir.setReturnValue(FrustumIntersection.INSIDE); } } diff --git a/src/main/java/com/v5/mixins/ItemInHandRendererMixin.java b/src/main/java/com/v5/mixins/ItemInHandRendererMixin.java index 03f0b0da..3ba9df76 100644 --- a/src/main/java/com/v5/mixins/ItemInHandRendererMixin.java +++ b/src/main/java/com/v5/mixins/ItemInHandRendererMixin.java @@ -1,6 +1,6 @@ package com.v5.mixins; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.ItemInHandRenderer; import net.minecraft.world.InteractionHand; @@ -53,7 +53,6 @@ public class ItemInHandRendererMixin { } private LivingEntity v5$getSpectatedEntity() { - Object target = V5MixinStorage.get("freecamSpectatedEntity", null); - return target instanceof LivingEntity entity ? entity : null; + return Client.getSpectatedEntity(); } } diff --git a/src/main/java/com/v5/mixins/KeyboardHandlerMixin.java b/src/main/java/com/v5/mixins/KeyboardHandlerMixin.java index 5131ed32..07d8845f 100644 --- a/src/main/java/com/v5/mixins/KeyboardHandlerMixin.java +++ b/src/main/java/com/v5/mixins/KeyboardHandlerMixin.java @@ -2,7 +2,6 @@ import com.chattriggers.ctjs.api.client.Client; import com.mojang.blaze3d.platform.InputConstants; -import com.v5.storage.V5MixinStorage; import net.minecraft.client.KeyboardHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; @@ -22,7 +21,7 @@ public class KeyboardHandlerMixin { } Minecraft client = Minecraft.getInstance(); - if (!V5MixinStorage.getBoolean("freecamEnabled", false) || client.screen != null) { + if (!Client.isFreecam() || client.screen != null) { return; } diff --git a/src/main/java/com/v5/mixins/LevelRendererMixin.java b/src/main/java/com/v5/mixins/LevelRendererMixin.java index cd455219..b15cf413 100644 --- a/src/main/java/com/v5/mixins/LevelRendererMixin.java +++ b/src/main/java/com/v5/mixins/LevelRendererMixin.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.framegraph.FrameGraphBuilder; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; @@ -21,13 +21,12 @@ public class LevelRendererMixin { @ModifyVariable(method = "cullTerrain", at = @At("HEAD"), argsOnly = true) private boolean v5$useSpectatorCullingInFreecam(boolean spectator) { - return spectator || V5MixinStorage.getBoolean("freecamEnabled", false); + return spectator || Client.isFreecam(); } @Inject(method = "addMainPass", at = @At("HEAD"), cancellable = true) private void v5$renderMain(FrameGraphBuilder frameGraphBuilder, Frustum frustum, Matrix4fc matrix4f, GpuBufferSlice gpuBufferSlice, boolean renderBlockOutline, LevelRenderState worldRenderState, DeltaTracker deltaTracker, ProfilerFiller profiler, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { - if (V5MixinStorage.getBoolean("macroEnabled", false) - && "No Render".equals(V5MixinStorage.getString("renderLimiter", "Off"))) { + if (Client.isMacroEnabled() && "No Render".equals(Client.getRenderLimiter())) { ci.cancel(); } } diff --git a/src/main/java/com/v5/mixins/MinecraftMixin.java b/src/main/java/com/v5/mixins/MinecraftMixin.java index c574372a..ee60c658 100644 --- a/src/main/java/com/v5/mixins/MinecraftMixin.java +++ b/src/main/java/com/v5/mixins/MinecraftMixin.java @@ -1,7 +1,6 @@ package com.v5.mixins; import com.chattriggers.ctjs.api.client.Client; -import com.v5.storage.V5MixinStorage; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; @@ -21,6 +20,11 @@ public class MinecraftMixin { @Shadow @Final public Options options; + private Integer v5$savedDistance; + private CameraType v5$savedPerspective; + private Integer v5$savedFps; + private Float v5$savedMasterVolume; + @ModifyExpressionValue( method = "pauseIfInactive", at = @At( @@ -40,12 +44,12 @@ public class MinecraftMixin { ) ) private boolean v5$allowAttackWhileUngrabbed(boolean original) { - return original || V5MixinStorage.getBoolean("ungrabbed", false) || Client.automatedAttackHeld; + return original || Client.isUngrabbed() || Client.automatedAttackHeld; } @Inject(method = "handleKeybinds()V", at = @At("HEAD")) private void v5$handleInputEvents(CallbackInfo ci) { - if (!V5MixinStorage.getBoolean("inputLocked", false)) { + if (!Client.isInputLocked()) { return; } @@ -63,74 +67,59 @@ public class MinecraftMixin { int currentFps = options.framerateLimit().get(); float currentMasterVolume = options.getFinalSoundSourceVolume(SoundSource.MASTER); - boolean macroEnabled = V5MixinStorage.getBoolean("macroEnabled", false); - String renderLimiter = V5MixinStorage.getString("renderLimiter", "Off"); - boolean forcePerspective = V5MixinStorage.getBoolean("forcePerspective", false); - boolean limitFps = V5MixinStorage.getBoolean("limitFps", false); - boolean muteGame = V5MixinStorage.getBoolean("muteGame", false); + boolean macroEnabled = Client.isMacroEnabled(); + String renderLimiter = Client.getRenderLimiter(); + boolean forcePerspective = Client.isForcePerspective(); + boolean limitFps = Client.getLimitFps(); + boolean muteGame = Client.getMuteGame(); - Object savedDistanceObj = V5MixinStorage.get("savedDistance", null); if (macroEnabled && "Limit Chunks".equals(renderLimiter)) { - if (savedDistanceObj == null) { - V5MixinStorage.set("savedDistance", currentDist); - } + if (v5$savedDistance == null) v5$savedDistance = currentDist; if (currentDist != 2) { options.renderDistance().set(2); } - } else if (savedDistanceObj instanceof Number savedDistanceNum) { - int savedDistance = savedDistanceNum.intValue(); - if (currentDist != savedDistance) { - options.renderDistance().set(savedDistance); + } else if (v5$savedDistance != null) { + if (currentDist != v5$savedDistance) { + options.renderDistance().set(v5$savedDistance); } - V5MixinStorage.set("savedDistance", null); + v5$savedDistance = null; } - Object savedPerspectiveObj = V5MixinStorage.get("savedPerspective", null); if (macroEnabled && forcePerspective) { - if (savedPerspectiveObj == null) { - V5MixinStorage.set("savedPerspective", currentPerspective); - } + if (v5$savedPerspective == null) v5$savedPerspective = currentPerspective; if (currentPerspective != CameraType.THIRD_PERSON_BACK) { options.setCameraType(CameraType.THIRD_PERSON_BACK); } - } else if (savedPerspectiveObj instanceof CameraType savedPerspective) { - if (currentPerspective != savedPerspective) { - options.setCameraType(savedPerspective); + } else if (v5$savedPerspective != null) { + if (currentPerspective != v5$savedPerspective) { + options.setCameraType(v5$savedPerspective); } - V5MixinStorage.set("savedPerspective", null); + v5$savedPerspective = null; } - Object savedFpsObj = V5MixinStorage.get("savedFps", null); if (macroEnabled && limitFps) { - if (savedFpsObj == null) { - V5MixinStorage.set("savedFps", currentFps); - } + if (v5$savedFps == null) v5$savedFps = currentFps; if (currentFps != 30) { options.framerateLimit().set(30); } - } else if (savedFpsObj instanceof Number savedFpsNum) { - int savedFps = savedFpsNum.intValue(); - if (currentFps != savedFps) { - int restoreValue = savedFps > 240 ? 260 : savedFps; + } else if (v5$savedFps != null) { + if (currentFps != v5$savedFps) { + int restoreValue = v5$savedFps > 240 ? 260 : v5$savedFps; options.framerateLimit().set(restoreValue); } - V5MixinStorage.set("savedFps", null); + v5$savedFps = null; } - Object savedMasterVolumeObj = V5MixinStorage.get("savedMasterVolume", null); if (macroEnabled && muteGame) { - if (savedMasterVolumeObj == null) { - V5MixinStorage.set("savedMasterVolume", currentMasterVolume); - } + if (v5$savedMasterVolume == null) v5$savedMasterVolume = currentMasterVolume; if (Float.compare(currentMasterVolume, 0.0F) != 0) { options.getSoundSourceOptionInstance(SoundSource.MASTER).set(0.0D); } - } else if (savedMasterVolumeObj instanceof Number savedMasterVolumeNum) { - float savedMasterVolume = savedMasterVolumeNum.floatValue(); - if (Float.compare(currentMasterVolume, savedMasterVolume) != 0) { - options.getSoundSourceOptionInstance(SoundSource.MASTER).set((double) savedMasterVolume); + } else if (v5$savedMasterVolume != null) { + if (Float.compare(currentMasterVolume, v5$savedMasterVolume) != 0) { + options.getSoundSourceOptionInstance(SoundSource.MASTER).set((double) v5$savedMasterVolume); } - V5MixinStorage.set("savedMasterVolume", null); + v5$savedMasterVolume = null; } } } diff --git a/src/main/java/com/v5/mixins/MouseHandlerMixin.java b/src/main/java/com/v5/mixins/MouseHandlerMixin.java index 995a8b0a..517dac30 100644 --- a/src/main/java/com/v5/mixins/MouseHandlerMixin.java +++ b/src/main/java/com/v5/mixins/MouseHandlerMixin.java @@ -2,7 +2,6 @@ import com.chattriggers.ctjs.api.client.Client; import com.mojang.blaze3d.platform.InputConstants; -import com.v5.storage.V5MixinStorage; import net.minecraft.client.Minecraft; import net.minecraft.client.MouseHandler; import net.minecraft.client.input.MouseButtonInfo; @@ -20,8 +19,7 @@ public class MouseHandlerMixin { private int v5$guiMouseButton = -1; private boolean v5$cameraLookEnabled() { - return V5MixinStorage.getBoolean("freecamEnabled", false) - || V5MixinStorage.getBoolean("freelookEnabled", false); + return Client.isFreecam() || Client.isFreelook(); } @Inject(method = "onButton", at = @At("HEAD"), cancellable = true) @@ -55,19 +53,16 @@ public class MouseHandlerMixin { return; } - Object yaw = V5MixinStorage.get("cameraOverrideYaw", player.getYRot()); - Object pitch = V5MixinStorage.get("cameraOverridePitch", player.getXRot()); - if (yaw instanceof Number yawNumber && pitch instanceof Number pitchNumber) { - V5MixinStorage.set("cameraOverrideYaw", yawNumber.floatValue() + (float) yawDelta * 0.15F); - V5MixinStorage.set( - "cameraOverridePitch", - Mth.clamp(pitchNumber.floatValue() + (float) pitchDelta * 0.15F, -90.0F, 90.0F)); - } + Float yaw = Client.getCameraYaw(); + Float pitch = Client.getCameraPitch(); + Client.setCameraRotation( + (yaw != null ? yaw : player.getYRot()) + (float) yawDelta * 0.15F, + Mth.clamp((pitch != null ? pitch : player.getXRot()) + (float) pitchDelta * 0.15F, -90.0F, 90.0F)); } @Inject(method = "grabMouse()V", at = @At("HEAD"), cancellable = true) private void v5$lockCursor(CallbackInfo ci) { - if (V5MixinStorage.getBoolean("ungrabbed", false)) { + if (Client.isUngrabbed()) { Client.resumeHeldKeys(); ci.cancel(); } @@ -80,7 +75,7 @@ public class MouseHandlerMixin { @Inject(method = "turnPlayer(D)V", at = @At("HEAD"), cancellable = true) private void v5$updateMouse(CallbackInfo ci) { - if (V5MixinStorage.getBoolean("ungrabbed", false)) { + if (Client.isUngrabbed()) { ci.cancel(); } } @@ -88,15 +83,13 @@ public class MouseHandlerMixin { @Inject(method = "onScroll(JDD)V", at = @At("HEAD"), cancellable = true) private void v5$onMouseScroll(long window, double horizontalScroll, double verticalScroll, CallbackInfo ci) { Minecraft client = Minecraft.getInstance(); - if (V5MixinStorage.getBoolean("freelookEnabled", false) && client.screen == null) { - Object storedDistance = V5MixinStorage.get("freelookCameraDistance", 4.0); - double distance = storedDistance instanceof Number number ? number.doubleValue() : 4.0; - V5MixinStorage.set("freelookCameraDistance", Mth.clamp(distance - verticalScroll, 1.0, 12.0)); + if (Client.isFreelook() && client.screen == null) { + Client.setFreelookDistance(Client.getFreelookDistance() - verticalScroll); ci.cancel(); return; } - if (!V5MixinStorage.getBoolean("inputLocked", false)) { + if (!Client.isInputLocked()) { return; } diff --git a/src/main/java/com/v5/mixins/PlayerTabOverlayMixin.java b/src/main/java/com/v5/mixins/PlayerTabOverlayMixin.java index 332969e8..353c32fb 100644 --- a/src/main/java/com/v5/mixins/PlayerTabOverlayMixin.java +++ b/src/main/java/com/v5/mixins/PlayerTabOverlayMixin.java @@ -1,7 +1,7 @@ package com.v5.mixins; import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.gui.components.PlayerTabOverlay; import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; @@ -11,6 +11,6 @@ public class PlayerTabOverlayMixin { @ModifyReturnValue(method = "getNameForDisplay", at = @At("RETURN")) private Component v5$getPlayerName(Component original) { - return V5MixinStorage.applyMethod("nameProcessor", original, Component.class); + return Client.processName(original); } } diff --git a/src/main/java/com/v5/mixins/VisGraphMixin.java b/src/main/java/com/v5/mixins/VisGraphMixin.java index 69d21a58..2ce7ec70 100644 --- a/src/main/java/com/v5/mixins/VisGraphMixin.java +++ b/src/main/java/com/v5/mixins/VisGraphMixin.java @@ -1,6 +1,6 @@ package com.v5.mixins; -import com.v5.storage.V5MixinStorage; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.renderer.chunk.VisGraph; import net.minecraft.core.BlockPos; import org.spongepowered.asm.mixin.Mixin; @@ -12,6 +12,6 @@ public class VisGraphMixin { @Inject(method = "setOpaque", at = @At("HEAD"), cancellable = true) private void v5$disableFreecamOcclusion(BlockPos pos, CallbackInfo ci) { - if (V5MixinStorage.getBoolean("freecamEnabled", false)) ci.cancel(); + if (Client.isFreecam()) ci.cancel(); } } diff --git a/src/main/java/com/v5/storage/V5MixinStorage.java b/src/main/java/com/v5/storage/V5MixinStorage.java deleted file mode 100644 index bbe77f62..00000000 --- a/src/main/java/com/v5/storage/V5MixinStorage.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.v5.storage; - -import com.chattriggers.ctjs.internal.engine.JSLoader; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.function.Function; -import org.mozilla.javascript.Callable; -import org.mozilla.javascript.ScriptRuntime; -import org.mozilla.javascript.Undefined; - -public final class V5MixinStorage { - private static final String METHOD_PREFIX = "method_"; - private static final Map STORAGE = new HashMap<>(); - - private V5MixinStorage() {} - - public static Object get(String key, Object defaultValue) { - return STORAGE.getOrDefault(key, defaultValue); - } - - public static boolean getBoolean(String key, boolean defaultValue) { - Object value = get(key, defaultValue); - if (value == null || value == Undefined.instance) { - return defaultValue; - } - - if (value instanceof Boolean bool) { - return bool; - } - - if (value instanceof Number number) { - return number.doubleValue() != 0.0D; - } - - if (value instanceof CharSequence sequence) { - String normalized = sequence.toString().trim().toLowerCase(Locale.ROOT); - if ("true".equals(normalized)) return true; - if ("false".equals(normalized)) return false; - return defaultValue; - } - - return convertOrDefault(value, ScriptRuntime::toBoolean, defaultValue); - } - - public static String getString(String key, String defaultValue) { - Object value = get(key, defaultValue); - if (value == null || value == Undefined.instance) { - return defaultValue; - } - - if (value instanceof String str) { - return str; - } - - return convertOrDefault(value, ScriptRuntime::toString, defaultValue); - } - - public static void set(String key, Object value) { - STORAGE.put(key, value); - } - - public static void clear() { - Object savedDistance = STORAGE.get("savedDistance"); - Object savedPerspective = STORAGE.get("savedPerspective"); - Object savedFps = STORAGE.get("savedFps"); - Object savedMasterVolume = STORAGE.get("savedMasterVolume"); - STORAGE.clear(); - if (savedDistance != null) STORAGE.put("savedDistance", savedDistance); - if (savedPerspective != null) STORAGE.put("savedPerspective", savedPerspective); - if (savedFps != null) STORAGE.put("savedFps", savedFps); - if (savedMasterVolume != null) STORAGE.put("savedMasterVolume", savedMasterVolume); - } - - public static T applyMethod(String methodName, T original, Class expectedType) { - Object value = STORAGE.get(METHOD_PREFIX + methodName); - if (!(value instanceof Callable callable)) { - return original; - } - - try { - Object result = JSLoader.invokeMixin(callable, new Object[] { original }); - if (result == null || result == Undefined.instance) { - return original; - } - - if (expectedType.isInstance(result)) { - return expectedType.cast(result); - } - } catch (Throwable ignored) { - } - - return original; - } - - private static T convertOrDefault(Object value, Function converter, T defaultValue) { - try { - return converter.apply(value); - } catch (Throwable ignored) { - return defaultValue; - } - } -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt index 6444345a..2b5c0a06 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt @@ -1,8 +1,10 @@ package com.chattriggers.ctjs.api.client +import com.chattriggers.ctjs.CTJS import com.chattriggers.ctjs.api.inventory.Slot import com.chattriggers.ctjs.api.message.TextComponent import com.chattriggers.ctjs.api.world.World +import com.chattriggers.ctjs.internal.engine.JSLoader import com.chattriggers.ctjs.internal.listeners.ClientListener import com.chattriggers.ctjs.internal.mixins.ChatScreenAccessor import com.chattriggers.ctjs.internal.mixins.AbstractSignEditScreenAccessor @@ -32,11 +34,35 @@ import com.mojang.realmsclient.RealmsMainScreen import net.minecraft.network.protocol.Packet import net.minecraft.network.protocol.game.ServerGamePacketListener import net.minecraft.network.chat.Component +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.phys.Vec3 +import org.mozilla.javascript.Callable +import org.mozilla.javascript.Undefined object Client { internal var referenceSystemTime: Long = 0 private val heldKeys = mutableSetOf() + @JvmStatic @Volatile var isFreecam = false + @JvmStatic @Volatile var isFreelook = false + @JvmStatic @Volatile var isUngrabbed = false + @JvmStatic @Volatile var isInputLocked = false + @JvmStatic @Volatile var hideParticles = false + @JvmStatic @Volatile var isMacroEnabled = false + @JvmStatic @Volatile var isForcePerspective = false + @JvmStatic @Volatile var limitFps = false + @JvmStatic @Volatile var muteGame = false + @JvmStatic @Volatile var renderLimiter = "Off" + @Volatile private var cameraYaw: Float? = null + @Volatile private var cameraPitch: Float? = null + @JvmStatic @Volatile var cameraPosition: Vec3? = null + @JvmStatic @Volatile var freelookDistance = 4.0 + set(value) { + field = value.coerceIn(1.0, 12.0) + } + @JvmStatic @Volatile var spectatedEntity: LivingEntity? = null + @Volatile private var nameProcessor: Callable? = null + @JvmField internal var automatedAttackHeld = false @@ -46,6 +72,42 @@ object Client { @JvmField val camera = CameraWrapper() + @JvmStatic + fun setCameraRotation(yaw: Float, pitch: Float) { + cameraYaw = yaw + cameraPitch = pitch + } + + @JvmStatic + fun clearCameraRotation() { + cameraYaw = null + cameraPitch = null + } + + @JvmStatic + fun getCameraYaw(): Float? = cameraYaw + + @JvmStatic + fun getCameraPitch(): Float? = cameraPitch + + @JvmStatic + fun setNameProcessor(processor: Callable?) { + nameProcessor = processor + } + + @JvmStatic + fun processName(original: Component): Component { + val processor = nameProcessor ?: return original + if (!CTJS.isLoaded) return original + + return try { + val result = JSLoader.invokeMixin(processor, arrayOf(original)) + if (result != null && result != Undefined.instance && result is Component) result else original + } catch (_: Throwable) { + original + } + } + /** * Gets Minecraft's Minecraft object * From 20b3f2d76267606eceaf2e9cf62b5a89f40f68f7 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:30:52 +0100 Subject: [PATCH 03/61] Move v5 mixins into ctjs --- .../ctjs/internal}/mixins/CameraMixin.java | 2 +- .../internal/mixins/ChatComponentMixin.java | 12 ++ .../ctjs/internal/mixins/ConnectionMixin.java | 14 +- .../mixins/ConnectionProxyMixin.java | 2 +- .../mixins/CrossCollisionBlockMixin.java | 2 +- .../internal}/mixins/EntityRendererMixin.java | 2 +- .../mixins/FirmamentModAnnouncerMixin.java | 2 +- .../mixins/FramerateLimitTrackerMixin.java | 2 +- .../ctjs/internal}/mixins/FrustumMixin.java | 2 +- .../ctjs/internal/mixins/GuiMixin.java | 6 + .../internal/mixins/GuiRendererMixin.java} | 8 +- .../mixins/ItemInHandRendererMixin.java | 2 +- .../mixins/JoinMultiplayerScreenMixin.java | 2 +- .../mixins/KeyboardHandlerMixin.java | 2 +- .../internal/mixins/LevelRendererMixin.java | 16 +++ .../ctjs/internal/mixins/MinecraftMixin.java | 112 ++++++++++++++++ .../internal/mixins/MouseHandlerMixin.java | 92 +++++++++++++ .../mixins/PlayerTabOverlayMixin.java | 7 + .../ctjs/internal}/mixins/VisGraphMixin.java | 2 +- .../mixins/YggdrasilServicesKeyInfoMixin.java | 4 +- src/main/java/com/v5/mixins/BlockMixin.java | 39 ------ .../com/v5/mixins/ChatComponentMixin.java | 20 --- .../java/com/v5/mixins/ConnectionMixin.java | 26 ---- .../com/v5/mixins/DrawContextCapture.java | 18 --- .../com/v5/mixins/LevelRendererMixin.java | 33 ----- .../java/com/v5/mixins/MinecraftMixin.java | 125 ------------------ .../java/com/v5/mixins/MouseHandlerMixin.java | 100 -------------- .../com/v5/mixins/PlayerTabOverlayMixin.java | 16 --- .../chattriggers/ctjs/api/client/Client.kt | 9 +- src/main/resources/ctjs.mixins.json | 13 ++ src/main/resources/fabric.mod.json | 2 +- src/main/resources/v5.mixins.json | 34 ----- 32 files changed, 295 insertions(+), 433 deletions(-) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/CameraMixin.java (97%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/ConnectionProxyMixin.java (97%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/CrossCollisionBlockMixin.java (94%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/EntityRendererMixin.java (94%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/FirmamentModAnnouncerMixin.java (92%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/FramerateLimitTrackerMixin.java (93%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/FrustumMixin.java (94%) rename src/main/java/com/{v5/mixins/GameRendererMixin.java => chattriggers/ctjs/internal/mixins/GuiRendererMixin.java} (81%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/ItemInHandRendererMixin.java (98%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/JoinMultiplayerScreenMixin.java (97%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/KeyboardHandlerMixin.java (96%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/VisGraphMixin.java (92%) rename src/main/java/com/{v5 => chattriggers/ctjs/internal}/mixins/YggdrasilServicesKeyInfoMixin.java (94%) delete mode 100644 src/main/java/com/v5/mixins/BlockMixin.java delete mode 100644 src/main/java/com/v5/mixins/ChatComponentMixin.java delete mode 100644 src/main/java/com/v5/mixins/ConnectionMixin.java delete mode 100644 src/main/java/com/v5/mixins/DrawContextCapture.java delete mode 100644 src/main/java/com/v5/mixins/LevelRendererMixin.java delete mode 100644 src/main/java/com/v5/mixins/MinecraftMixin.java delete mode 100644 src/main/java/com/v5/mixins/MouseHandlerMixin.java delete mode 100644 src/main/java/com/v5/mixins/PlayerTabOverlayMixin.java delete mode 100644 src/main/resources/v5.mixins.json diff --git a/src/main/java/com/v5/mixins/CameraMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/CameraMixin.java similarity index 97% rename from src/main/java/com/v5/mixins/CameraMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/CameraMixin.java index 36369320..234bd829 100644 --- a/src/main/java/com/v5/mixins/CameraMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/CameraMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.Camera; diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/ChatComponentMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/ChatComponentMixin.java index 04baf2b7..796d1117 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/ChatComponentMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/ChatComponentMixin.java @@ -1,5 +1,6 @@ package com.chattriggers.ctjs.internal.mixins; +import com.chattriggers.ctjs.api.client.Client; import com.chattriggers.ctjs.api.message.ChatLib; import net.minecraft.client.gui.components.ChatComponent; import net.minecraft.client.multiplayer.chat.GuiMessage; @@ -11,6 +12,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.List; @@ -21,6 +23,16 @@ public class ChatComponentMixin { @Shadow private List allMessages; + @ModifyVariable( + method = "addMessage(Lnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/MessageSignature;Lnet/minecraft/client/multiplayer/chat/GuiMessageSource;Lnet/minecraft/client/multiplayer/chat/GuiMessageTag;)V", + at = @At("HEAD"), + ordinal = 0, + argsOnly = true + ) + private Component v5$addMessage(Component original) { + return Client.processName(original); + } + @Inject(method = "clearMessages", at = @At("TAIL")) private void injectClear(boolean clearHistory, CallbackInfo ci) { ChatLib.INSTANCE.onChatHudClearChat$ctjs(); diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/ConnectionMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/ConnectionMixin.java index aa885bb5..8fb2a3ed 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/ConnectionMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/ConnectionMixin.java @@ -1,14 +1,15 @@ package com.chattriggers.ctjs.internal.mixins; +import com.chattriggers.ctjs.api.triggers.PacketEvent; import com.chattriggers.ctjs.internal.engine.CTEvents; import com.chattriggers.ctjs.api.triggers.TriggerType; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import net.minecraft.network.Connection; +import net.minecraft.network.PacketListener; import net.minecraft.network.protocol.PacketFlow; -import net.minecraft.network.PacketSendListener; import net.minecraft.network.protocol.Packet; -import org.jetbrains.annotations.Nullable; +import net.minecraft.network.protocol.game.ClientboundBundlePacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -34,6 +35,15 @@ private void injectHandlePacket(ChannelHandlerContext channelHandlerContext, Pac CTEvents.PACKET_RECEIVED.invoker().receive(packet, ci); } + @Inject(method = "genericsFtw", at = @At("HEAD")) + private static void triggerPacketEvent(Packet packet, PacketListener listener, CallbackInfo ci) { + if (packet instanceof ClientboundBundlePacket bundlePacket) { + bundlePacket.subPackets().forEach(PacketEvent.RECEIVE.invoker()::trigger); + } else { + PacketEvent.RECEIVE.invoker().trigger(packet); + } + } + @Inject( method = "send(Lnet/minecraft/network/protocol/Packet;Lio/netty/channel/ChannelFutureListener;)V", at = @At("HEAD"), diff --git a/src/main/java/com/v5/mixins/ConnectionProxyMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/ConnectionProxyMixin.java similarity index 97% rename from src/main/java/com/v5/mixins/ConnectionProxyMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/ConnectionProxyMixin.java index e535c710..b2f52911 100644 --- a/src/main/java/com/v5/mixins/ConnectionProxyMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/ConnectionProxyMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Proxy; import com.chattriggers.ctjs.api.client.ProxyInfo; diff --git a/src/main/java/com/v5/mixins/CrossCollisionBlockMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/CrossCollisionBlockMixin.java similarity index 94% rename from src/main/java/com/v5/mixins/CrossCollisionBlockMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/CrossCollisionBlockMixin.java index de3ba779..e937e5f2 100644 --- a/src/main/java/com/v5/mixins/CrossCollisionBlockMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/CrossCollisionBlockMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import net.minecraft.world.level.block.CrossCollisionBlock; import net.minecraft.world.level.block.StainedGlassPaneBlock; diff --git a/src/main/java/com/v5/mixins/EntityRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/EntityRendererMixin.java similarity index 94% rename from src/main/java/com/v5/mixins/EntityRendererMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/EntityRendererMixin.java index fe1b4ca8..1c1954eb 100644 --- a/src/main/java/com/v5/mixins/EntityRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/EntityRendererMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.renderer.entity.EntityRenderer; diff --git a/src/main/java/com/v5/mixins/FirmamentModAnnouncerMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/FirmamentModAnnouncerMixin.java similarity index 92% rename from src/main/java/com/v5/mixins/FirmamentModAnnouncerMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/FirmamentModAnnouncerMixin.java index e2bcd92f..330c4fde 100644 --- a/src/main/java/com/v5/mixins/FirmamentModAnnouncerMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/FirmamentModAnnouncerMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; diff --git a/src/main/java/com/v5/mixins/FramerateLimitTrackerMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/FramerateLimitTrackerMixin.java similarity index 93% rename from src/main/java/com/v5/mixins/FramerateLimitTrackerMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/FramerateLimitTrackerMixin.java index 1b75ad86..6185a791 100644 --- a/src/main/java/com/v5/mixins/FramerateLimitTrackerMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/FramerateLimitTrackerMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.mojang.blaze3d.platform.FramerateLimitTracker; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/com/v5/mixins/FrustumMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/FrustumMixin.java similarity index 94% rename from src/main/java/com/v5/mixins/FrustumMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/FrustumMixin.java index 502a93ad..65aa002e 100644 --- a/src/main/java/com/v5/mixins/FrustumMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/FrustumMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.renderer.culling.Frustum; diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java index 405174ba..837037ec 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java @@ -1,5 +1,6 @@ package com.chattriggers.ctjs.internal.mixins; +import com.chattriggers.ctjs.api.render.DrawContextHolder; import com.chattriggers.ctjs.api.world.Scoreboard; import com.chattriggers.ctjs.internal.engine.CTEvents; import gg.essential.universal.UMatrixStack; @@ -14,6 +15,11 @@ @Mixin(Gui.class) public class GuiMixin { + @Inject(method = "extractRenderState", at = @At("HEAD")) + private void captureContext(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { + DrawContextHolder.setCurrentContext(context); + } + @Inject(method = "extractScoreboardSidebar", at = @At("HEAD"), cancellable = true) private void injectRenderScoreboard(GuiGraphicsExtractor matrices, DeltaTracker tickCounter, CallbackInfo ci) { if (!Scoreboard.getShouldRender()) diff --git a/src/main/java/com/v5/mixins/GameRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java similarity index 81% rename from src/main/java/com/v5/mixins/GameRendererMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java index b47641c2..464cda9a 100644 --- a/src/main/java/com/v5/mixins/GameRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java @@ -1,7 +1,7 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; -import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.chattriggers.ctjs.api.render.NVGRenderer; +import com.mojang.blaze3d.buffers.GpuBufferSlice; import net.minecraft.client.gui.render.GuiRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -9,14 +9,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GuiRenderer.class) -public class GameRendererMixin { +public class GuiRendererMixin { @Inject(method = "render", at = @At("HEAD")) private void beforeRender(GpuBufferSlice fogBuffer, CallbackInfo ci) { NVGRenderer.runPreDrawables(); } @Inject(method = "render", at = @At("TAIL")) - private void onRender(GpuBufferSlice fogBuffer, CallbackInfo ci) { + private void afterRender(GpuBufferSlice fogBuffer, CallbackInfo ci) { NVGRenderer.runDrawables(); } } diff --git a/src/main/java/com/v5/mixins/ItemInHandRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/ItemInHandRendererMixin.java similarity index 98% rename from src/main/java/com/v5/mixins/ItemInHandRendererMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/ItemInHandRendererMixin.java index 3ba9df76..504c5675 100644 --- a/src/main/java/com/v5/mixins/ItemInHandRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/ItemInHandRendererMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/v5/mixins/JoinMultiplayerScreenMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/JoinMultiplayerScreenMixin.java similarity index 97% rename from src/main/java/com/v5/mixins/JoinMultiplayerScreenMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/JoinMultiplayerScreenMixin.java index b0923e24..d1f8a2f2 100644 --- a/src/main/java/com/v5/mixins/JoinMultiplayerScreenMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/JoinMultiplayerScreenMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.ProxyManagerScreen; import net.minecraft.client.gui.GuiGraphicsExtractor; diff --git a/src/main/java/com/v5/mixins/KeyboardHandlerMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/KeyboardHandlerMixin.java similarity index 96% rename from src/main/java/com/v5/mixins/KeyboardHandlerMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/KeyboardHandlerMixin.java index 07d8845f..87069459 100644 --- a/src/main/java/com/v5/mixins/KeyboardHandlerMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/KeyboardHandlerMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Client; import com.mojang.blaze3d.platform.InputConstants; diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java index 54273df5..3bffe511 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java @@ -1,8 +1,10 @@ package com.chattriggers.ctjs.internal.mixins; +import com.chattriggers.ctjs.api.client.Client; import com.chattriggers.ctjs.internal.listeners.WorldListener; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.framegraph.FrameGraphBuilder; import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import com.mojang.blaze3d.resource.ResourceHandle; import com.mojang.blaze3d.vertex.PoseStack; @@ -10,6 +12,7 @@ import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.state.level.BlockOutlineRenderState; import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.client.renderer.state.level.LevelRenderState; @@ -19,6 +22,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -26,6 +30,18 @@ public abstract class LevelRendererMixin { private float ctjs$tickDelta = 1.0F; + @ModifyVariable(method = "cullTerrain", at = @At("HEAD"), argsOnly = true) + private boolean v5$useSpectatorCullingInFreecam(boolean spectator) { + return spectator || Client.isFreecam(); + } + + @Inject(method = "addMainPass", at = @At("HEAD"), cancellable = true) + private void v5$renderMain(FrameGraphBuilder frameGraphBuilder, Frustum frustum, Matrix4fc matrix4f, GpuBufferSlice gpuBufferSlice, boolean renderBlockOutline, LevelRenderState worldRenderState, DeltaTracker deltaTracker, ProfilerFiller profiler, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { + if (Client.isMacroEnabled() && Client.getRenderLimiter() == Client.RenderLimiter.NO_RENDER) { + ci.cancel(); + } + } + @Inject( method = "renderBlockOutline", at = @At( diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftMixin.java index 49516b09..c0dc424f 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftMixin.java @@ -6,12 +6,19 @@ import com.chattriggers.ctjs.internal.engine.CTEvents; import com.chattriggers.ctjs.api.triggers.TriggerType; import com.chattriggers.ctjs.internal.engine.module.ModuleManager; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import net.minecraft.client.CameraType; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; import net.minecraft.client.gui.screens.Overlay; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.sounds.SoundSource; import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -21,10 +28,115 @@ @Mixin(Minecraft.class) public abstract class MinecraftMixin { @Shadow @Nullable public ClientLevel level; + @Shadow @Final public Options options; @Shadow public abstract ServerData getCurrentServer(); @Shadow public abstract boolean hasSingleplayerServer(); + private Integer v5$savedDistance; + private CameraType v5$savedPerspective; + private Integer v5$savedFps; + private Float v5$savedMasterVolume; + + @ModifyExpressionValue( + method = "pauseIfInactive", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/Options;pauseOnLostFocus:Z", + opcode = Opcodes.GETFIELD + ) + ) + private boolean v5$pauseIfInactive(boolean original) { + return false; + } + + @ModifyExpressionValue( + method = "handleKeybinds", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/MouseHandler;isMouseGrabbed()Z" + ) + ) + private boolean v5$allowAttackWhileUngrabbed(boolean original) { + return original || Client.isUngrabbed() || Client.automatedAttackHeld; + } + + @Inject(method = "handleKeybinds()V", at = @At("HEAD")) + private void v5$handleInputEvents(CallbackInfo ci) { + if (!Client.isInputLocked()) { + return; + } + + for (KeyMapping key : options.keyHotbarSlots) { + if (key.consumeClick()) { + key.setDown(false); + } + } + } + + @Inject(method = "tick()V", at = @At("HEAD")) + private void v5$tickRenderLimiter(CallbackInfo ci) { + int currentDist = options.renderDistance().get(); + CameraType currentPerspective = options.getCameraType(); + int currentFps = options.framerateLimit().get(); + float currentMasterVolume = options.getFinalSoundSourceVolume(SoundSource.MASTER); + + boolean macroEnabled = Client.isMacroEnabled(); + Client.RenderLimiter renderLimiter = Client.getRenderLimiter(); + boolean forcePerspective = Client.isForcePerspective(); + boolean limitFps = Client.getLimitFps(); + boolean muteGame = Client.getMuteGame(); + + if (macroEnabled && renderLimiter == Client.RenderLimiter.LIMIT_CHUNKS) { + if (v5$savedDistance == null) v5$savedDistance = currentDist; + if (currentDist != 2) { + options.renderDistance().set(2); + } + } else if (v5$savedDistance != null) { + if (currentDist != v5$savedDistance) { + options.renderDistance().set(v5$savedDistance); + } + v5$savedDistance = null; + } + + if (macroEnabled && forcePerspective) { + if (v5$savedPerspective == null) v5$savedPerspective = currentPerspective; + if (currentPerspective != CameraType.THIRD_PERSON_BACK) { + options.setCameraType(CameraType.THIRD_PERSON_BACK); + } + } else if (v5$savedPerspective != null) { + if (currentPerspective != v5$savedPerspective) { + options.setCameraType(v5$savedPerspective); + } + v5$savedPerspective = null; + } + + if (macroEnabled && limitFps) { + if (v5$savedFps == null) v5$savedFps = currentFps; + if (currentFps != 30) { + options.framerateLimit().set(30); + } + } else if (v5$savedFps != null) { + if (currentFps != v5$savedFps) { + int restoreValue = v5$savedFps > 240 ? 260 : v5$savedFps; + options.framerateLimit().set(restoreValue); + } + v5$savedFps = null; + } + + if (macroEnabled && muteGame) { + if (v5$savedMasterVolume == null) v5$savedMasterVolume = currentMasterVolume; + if (Float.compare(currentMasterVolume, 0.0F) != 0) { + options.getSoundSourceOptionInstance(SoundSource.MASTER).set(0.0D); + } + } else if (v5$savedMasterVolume != null) { + if (Float.compare(currentMasterVolume, v5$savedMasterVolume) != 0) { + options.getSoundSourceOptionInstance(SoundSource.MASTER).set((double) v5$savedMasterVolume); + } + v5$savedMasterVolume = null; + } + } + @Inject(method = "setLevel", at = @At("HEAD")) private void injectWorldUnload(ClientLevel world, CallbackInfo ci) { if (world == null) diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/MouseHandlerMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/MouseHandlerMixin.java index cbe3409d..8d14b4a3 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/MouseHandlerMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/MouseHandlerMixin.java @@ -1,23 +1,115 @@ package com.chattriggers.ctjs.internal.mixins; +import com.chattriggers.ctjs.api.client.Client; import com.chattriggers.ctjs.internal.engine.CTEvents; import com.chattriggers.ctjs.internal.listeners.MouseListener; import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.Minecraft; import net.minecraft.client.MouseHandler; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.input.MouseButtonInfo; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.util.Mth; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.lwjgl.glfw.GLFW; @Mixin(MouseHandler.class) public class MouseHandlerMixin { @Shadow private MouseButtonInfo activeButton; + private int v5$guiMouseButton = -1; + + private boolean v5$cameraLookEnabled() { + return Client.isFreecam() || Client.isFreelook(); + } + + @Inject(method = "onButton", at = @At("HEAD"), cancellable = true) + private void v5$cancelFreecamClick(long window, MouseButtonInfo button, int action, CallbackInfo ci) { + Minecraft client = Minecraft.getInstance(); + if (action == GLFW.GLFW_PRESS && client.screen != null) { + v5$guiMouseButton = button.button(); + } else if (action == GLFW.GLFW_RELEASE) { + if (button.button() == v5$guiMouseButton) { + v5$guiMouseButton = -1; + } else if (!v5$cameraLookEnabled() || (button.button() != 0 && button.button() != 1)) { + Client.releaseHeldKey(InputConstants.Type.MOUSE.getOrCreate(button.button())); + } + } + + if (v5$cameraLookEnabled() + && client.screen == null + && (button.button() == 0 || button.button() == 1)) { + ci.cancel(); + } + } + + @Redirect( + method = "turnPlayer(D)V", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/player/LocalPlayer;turn(DD)V" + ) + ) + private void v5$turnFreecam(LocalPlayer player, double yawDelta, double pitchDelta) { + if (!v5$cameraLookEnabled()) { + player.turn(yawDelta, pitchDelta); + return; + } + + Float yaw = Client.getCameraYaw(); + Float pitch = Client.getCameraPitch(); + Client.setCameraRotation( + (yaw != null ? yaw : player.getYRot()) + (float) yawDelta * 0.15F, + Mth.clamp((pitch != null ? pitch : player.getXRot()) + (float) pitchDelta * 0.15F, -90.0F, 90.0F) + ); + } + + @Inject(method = "grabMouse()V", at = @At("HEAD"), cancellable = true) + private void v5$lockCursor(CallbackInfo ci) { + if (Client.isUngrabbed()) { + Client.resumeHeldKeys(); + ci.cancel(); + } + } + + @Inject(method = "grabMouse()V", at = @At("TAIL")) + private void v5$restoreHeldKeys(CallbackInfo ci) { + Client.resumeHeldKeys(); + } + + @Inject(method = "turnPlayer(D)V", at = @At("HEAD"), cancellable = true) + private void v5$updateMouse(CallbackInfo ci) { + if (Client.isUngrabbed()) { + ci.cancel(); + } + } + + @Inject(method = "onScroll(JDD)V", at = @At("HEAD"), cancellable = true) + private void v5$onMouseScroll(long window, double horizontalScroll, double verticalScroll, CallbackInfo ci) { + Minecraft client = Minecraft.getInstance(); + if (Client.isFreelook() && client.screen == null) { + Client.setFreelookDistance(Client.getFreelookDistance() - verticalScroll); + ci.cancel(); + return; + } + + if (!Client.isInputLocked()) { + return; + } + + if (client.screen == null) { + ci.cancel(); + } + } + @Inject( method = "onButton", at = @At( diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/PlayerTabOverlayMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/PlayerTabOverlayMixin.java index 3109d2d9..6bc2f641 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/PlayerTabOverlayMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/PlayerTabOverlayMixin.java @@ -1,7 +1,9 @@ package com.chattriggers.ctjs.internal.mixins; +import com.chattriggers.ctjs.api.client.Client; import com.chattriggers.ctjs.api.triggers.TriggerType; import com.chattriggers.ctjs.api.world.TabList; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.PlayerTabOverlay; import net.minecraft.world.scores.Scoreboard; @@ -14,6 +16,11 @@ @Mixin(PlayerTabOverlay.class) public class PlayerTabOverlayMixin { + @ModifyReturnValue(method = "getNameForDisplay", at = @At("RETURN")) + private Component v5$getPlayerName(Component original) { + return Client.processName(original); + } + @Inject(method = "extractRenderState", at = @At("HEAD"), cancellable = true) private void injectRenderPlayerList(GuiGraphicsExtractor context, int scaledWindowWidth, Scoreboard scoreboard, Objective objective, CallbackInfo ci) { TriggerType.RENDER_PLAYER_LIST.triggerAll(ci); diff --git a/src/main/java/com/v5/mixins/VisGraphMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/VisGraphMixin.java similarity index 92% rename from src/main/java/com/v5/mixins/VisGraphMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/VisGraphMixin.java index 2ce7ec70..0bafd2bf 100644 --- a/src/main/java/com/v5/mixins/VisGraphMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/VisGraphMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.renderer.chunk.VisGraph; diff --git a/src/main/java/com/v5/mixins/YggdrasilServicesKeyInfoMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/YggdrasilServicesKeyInfoMixin.java similarity index 94% rename from src/main/java/com/v5/mixins/YggdrasilServicesKeyInfoMixin.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/YggdrasilServicesKeyInfoMixin.java index 6833b7af..609eca92 100644 --- a/src/main/java/com/v5/mixins/YggdrasilServicesKeyInfoMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/YggdrasilServicesKeyInfoMixin.java @@ -1,4 +1,4 @@ -package com.v5.mixins; +package com.chattriggers.ctjs.internal.mixins; import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; import org.slf4j.Logger; @@ -20,4 +20,4 @@ public class YggdrasilServicesKeyInfoMixin { private void redirectLoggerError(Logger instance, String s, Object o, Object o1) { // Do nothing - suppress the log } -} \ No newline at end of file +} diff --git a/src/main/java/com/v5/mixins/BlockMixin.java b/src/main/java/com/v5/mixins/BlockMixin.java deleted file mode 100644 index 03e94844..00000000 --- a/src/main/java/com/v5/mixins/BlockMixin.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.v5.mixins; - -import com.chattriggers.ctjs.api.client.Client; -import java.util.Set; -import net.minecraft.world.level.block.Block; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Block.class) -public class BlockMixin { - private static final Set TARGET_KEYS = - Set.of( - "block.minecraft.melon", - "block.minecraft.pumpkin", - "block.minecraft.carrots", - "block.minecraft.potatoes", - "block.minecraft.wheat", - "block.minecraft.nether_wart", - "block.minecraft.sugar_cane", - "block.minecraft.cactus", - "block.minecraft.cocoa", - "block.minecraft.melon_stem", - "block.minecraft.pumpkin_stem", - "block.minecraft.carved_pumpkin"); - - @Inject(method = "spawnDestroyParticles", at = @At("HEAD"), cancellable = true) - private void v5$spawnBreakParticles(CallbackInfo ci) { - if (!Client.getHideParticles()) { - return; - } - - String blockKey = ((Block) (Object) this).getDescriptionId(); - if (TARGET_KEYS.contains(blockKey)) { - ci.cancel(); - } - } -} diff --git a/src/main/java/com/v5/mixins/ChatComponentMixin.java b/src/main/java/com/v5/mixins/ChatComponentMixin.java deleted file mode 100644 index 17f848fc..00000000 --- a/src/main/java/com/v5/mixins/ChatComponentMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.v5.mixins; - -import com.chattriggers.ctjs.api.client.Client; -import net.minecraft.client.gui.components.ChatComponent; -import net.minecraft.network.chat.Component; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -@Mixin(ChatComponent.class) -public class ChatComponentMixin { - @ModifyVariable( - method = "addMessage(Lnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/MessageSignature;Lnet/minecraft/client/multiplayer/chat/GuiMessageSource;Lnet/minecraft/client/multiplayer/chat/GuiMessageTag;)V", - at = @At("HEAD"), - ordinal = 0, - argsOnly = true) - private Component v5$addMessage(Component original) { - return Client.processName(original); - } -} diff --git a/src/main/java/com/v5/mixins/ConnectionMixin.java b/src/main/java/com/v5/mixins/ConnectionMixin.java deleted file mode 100644 index 5c12c7e4..00000000 --- a/src/main/java/com/v5/mixins/ConnectionMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.v5.mixins; - -import com.chattriggers.ctjs.api.triggers.PacketEvent; -import net.minecraft.network.Connection; -import net.minecraft.network.PacketListener; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundBundlePacket; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Connection.class) -public class ConnectionMixin { - - @Inject(method = "genericsFtw", at = @At("HEAD")) - private static void onPacketReceived(Packet packet, PacketListener listener, CallbackInfo ci) { - if (packet instanceof ClientboundBundlePacket bundlePacket) { - for (Packet subPacket : bundlePacket.subPackets()) { - PacketEvent.RECEIVE.invoker().trigger(subPacket); - } - } else { - PacketEvent.RECEIVE.invoker().trigger(packet); - } - } -} diff --git a/src/main/java/com/v5/mixins/DrawContextCapture.java b/src/main/java/com/v5/mixins/DrawContextCapture.java deleted file mode 100644 index 8cdd1364..00000000 --- a/src/main/java/com/v5/mixins/DrawContextCapture.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.v5.mixins; - -import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.DeltaTracker; -import com.chattriggers.ctjs.api.render.DrawContextHolder; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Gui.class) -public class DrawContextCapture { - @Inject(method = "extractRenderState", at = @At("HEAD")) - private void captureContext(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { - DrawContextHolder.setCurrentContext(context); - } -} diff --git a/src/main/java/com/v5/mixins/LevelRendererMixin.java b/src/main/java/com/v5/mixins/LevelRendererMixin.java deleted file mode 100644 index b15cf413..00000000 --- a/src/main/java/com/v5/mixins/LevelRendererMixin.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.v5.mixins; - -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import com.mojang.blaze3d.framegraph.FrameGraphBuilder; -import com.chattriggers.ctjs.api.client.Client; -import net.minecraft.client.DeltaTracker; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; -import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.client.renderer.state.level.LevelRenderState; -import net.minecraft.util.profiling.ProfilerFiller; -import org.joml.Matrix4fc; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(LevelRenderer.class) -public class LevelRendererMixin { - - @ModifyVariable(method = "cullTerrain", at = @At("HEAD"), argsOnly = true) - private boolean v5$useSpectatorCullingInFreecam(boolean spectator) { - return spectator || Client.isFreecam(); - } - - @Inject(method = "addMainPass", at = @At("HEAD"), cancellable = true) - private void v5$renderMain(FrameGraphBuilder frameGraphBuilder, Frustum frustum, Matrix4fc matrix4f, GpuBufferSlice gpuBufferSlice, boolean renderBlockOutline, LevelRenderState worldRenderState, DeltaTracker deltaTracker, ProfilerFiller profiler, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { - if (Client.isMacroEnabled() && "No Render".equals(Client.getRenderLimiter())) { - ci.cancel(); - } - } -} diff --git a/src/main/java/com/v5/mixins/MinecraftMixin.java b/src/main/java/com/v5/mixins/MinecraftMixin.java deleted file mode 100644 index ee60c658..00000000 --- a/src/main/java/com/v5/mixins/MinecraftMixin.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.v5.mixins; - -import com.chattriggers.ctjs.api.client.Client; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.client.Minecraft; -import net.minecraft.client.Options; -import net.minecraft.client.KeyMapping; -import net.minecraft.client.CameraType; -import net.minecraft.sounds.SoundSource; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Minecraft.class) -public class MinecraftMixin { - - @Shadow @Final public Options options; - - private Integer v5$savedDistance; - private CameraType v5$savedPerspective; - private Integer v5$savedFps; - private Float v5$savedMasterVolume; - - @ModifyExpressionValue( - method = "pauseIfInactive", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/client/Options;pauseOnLostFocus:Z", - opcode = Opcodes.GETFIELD - )) - private boolean v5$pauseIfInactive(boolean original) { - return false; - } - - @ModifyExpressionValue( - method = "handleKeybinds", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/MouseHandler;isMouseGrabbed()Z" - ) - ) - private boolean v5$allowAttackWhileUngrabbed(boolean original) { - return original || Client.isUngrabbed() || Client.automatedAttackHeld; - } - - @Inject(method = "handleKeybinds()V", at = @At("HEAD")) - private void v5$handleInputEvents(CallbackInfo ci) { - if (!Client.isInputLocked()) { - return; - } - - for (KeyMapping key : options.keyHotbarSlots) { - if (key.consumeClick()) { - key.setDown(false); - } - } - } - - @Inject(method = "tick()V", at = @At("HEAD")) - private void v5$tickRenderLimiter(CallbackInfo ci) { - int currentDist = options.renderDistance().get(); - CameraType currentPerspective = options.getCameraType(); - int currentFps = options.framerateLimit().get(); - float currentMasterVolume = options.getFinalSoundSourceVolume(SoundSource.MASTER); - - boolean macroEnabled = Client.isMacroEnabled(); - String renderLimiter = Client.getRenderLimiter(); - boolean forcePerspective = Client.isForcePerspective(); - boolean limitFps = Client.getLimitFps(); - boolean muteGame = Client.getMuteGame(); - - if (macroEnabled && "Limit Chunks".equals(renderLimiter)) { - if (v5$savedDistance == null) v5$savedDistance = currentDist; - if (currentDist != 2) { - options.renderDistance().set(2); - } - } else if (v5$savedDistance != null) { - if (currentDist != v5$savedDistance) { - options.renderDistance().set(v5$savedDistance); - } - v5$savedDistance = null; - } - - if (macroEnabled && forcePerspective) { - if (v5$savedPerspective == null) v5$savedPerspective = currentPerspective; - if (currentPerspective != CameraType.THIRD_PERSON_BACK) { - options.setCameraType(CameraType.THIRD_PERSON_BACK); - } - } else if (v5$savedPerspective != null) { - if (currentPerspective != v5$savedPerspective) { - options.setCameraType(v5$savedPerspective); - } - v5$savedPerspective = null; - } - - if (macroEnabled && limitFps) { - if (v5$savedFps == null) v5$savedFps = currentFps; - if (currentFps != 30) { - options.framerateLimit().set(30); - } - } else if (v5$savedFps != null) { - if (currentFps != v5$savedFps) { - int restoreValue = v5$savedFps > 240 ? 260 : v5$savedFps; - options.framerateLimit().set(restoreValue); - } - v5$savedFps = null; - } - - if (macroEnabled && muteGame) { - if (v5$savedMasterVolume == null) v5$savedMasterVolume = currentMasterVolume; - if (Float.compare(currentMasterVolume, 0.0F) != 0) { - options.getSoundSourceOptionInstance(SoundSource.MASTER).set(0.0D); - } - } else if (v5$savedMasterVolume != null) { - if (Float.compare(currentMasterVolume, v5$savedMasterVolume) != 0) { - options.getSoundSourceOptionInstance(SoundSource.MASTER).set((double) v5$savedMasterVolume); - } - v5$savedMasterVolume = null; - } - } -} diff --git a/src/main/java/com/v5/mixins/MouseHandlerMixin.java b/src/main/java/com/v5/mixins/MouseHandlerMixin.java deleted file mode 100644 index 517dac30..00000000 --- a/src/main/java/com/v5/mixins/MouseHandlerMixin.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.v5.mixins; - -import com.chattriggers.ctjs.api.client.Client; -import com.mojang.blaze3d.platform.InputConstants; -import net.minecraft.client.Minecraft; -import net.minecraft.client.MouseHandler; -import net.minecraft.client.input.MouseButtonInfo; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.util.Mth; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.lwjgl.glfw.GLFW; - -@Mixin(MouseHandler.class) -public class MouseHandlerMixin { - private int v5$guiMouseButton = -1; - - private boolean v5$cameraLookEnabled() { - return Client.isFreecam() || Client.isFreelook(); - } - - @Inject(method = "onButton", at = @At("HEAD"), cancellable = true) - private void v5$cancelFreecamClick(long window, MouseButtonInfo button, int action, CallbackInfo ci) { - Minecraft client = Minecraft.getInstance(); - if (action == GLFW.GLFW_PRESS && client.screen != null) { - v5$guiMouseButton = button.button(); - } else if (action == GLFW.GLFW_RELEASE) { - if (button.button() == v5$guiMouseButton) { - v5$guiMouseButton = -1; - } else if (!v5$cameraLookEnabled() || (button.button() != 0 && button.button() != 1)) { - Client.releaseHeldKey(InputConstants.Type.MOUSE.getOrCreate(button.button())); - } - } - - if (v5$cameraLookEnabled() - && client.screen == null - && (button.button() == 0 || button.button() == 1)) { - ci.cancel(); - } - } - - @Redirect( - method = "turnPlayer(D)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;turn(DD)V")) - private void v5$turnFreecam(LocalPlayer player, double yawDelta, double pitchDelta) { - if (!v5$cameraLookEnabled()) { - player.turn(yawDelta, pitchDelta); - return; - } - - Float yaw = Client.getCameraYaw(); - Float pitch = Client.getCameraPitch(); - Client.setCameraRotation( - (yaw != null ? yaw : player.getYRot()) + (float) yawDelta * 0.15F, - Mth.clamp((pitch != null ? pitch : player.getXRot()) + (float) pitchDelta * 0.15F, -90.0F, 90.0F)); - } - - @Inject(method = "grabMouse()V", at = @At("HEAD"), cancellable = true) - private void v5$lockCursor(CallbackInfo ci) { - if (Client.isUngrabbed()) { - Client.resumeHeldKeys(); - ci.cancel(); - } - } - - @Inject(method = "grabMouse()V", at = @At("TAIL")) - private void v5$restoreHeldKeys(CallbackInfo ci) { - Client.resumeHeldKeys(); - } - - @Inject(method = "turnPlayer(D)V", at = @At("HEAD"), cancellable = true) - private void v5$updateMouse(CallbackInfo ci) { - if (Client.isUngrabbed()) { - ci.cancel(); - } - } - - @Inject(method = "onScroll(JDD)V", at = @At("HEAD"), cancellable = true) - private void v5$onMouseScroll(long window, double horizontalScroll, double verticalScroll, CallbackInfo ci) { - Minecraft client = Minecraft.getInstance(); - if (Client.isFreelook() && client.screen == null) { - Client.setFreelookDistance(Client.getFreelookDistance() - verticalScroll); - ci.cancel(); - return; - } - - if (!Client.isInputLocked()) { - return; - } - - if (client != null && client.screen == null) { - ci.cancel(); - } - } -} diff --git a/src/main/java/com/v5/mixins/PlayerTabOverlayMixin.java b/src/main/java/com/v5/mixins/PlayerTabOverlayMixin.java deleted file mode 100644 index 353c32fb..00000000 --- a/src/main/java/com/v5/mixins/PlayerTabOverlayMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.v5.mixins; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.chattriggers.ctjs.api.client.Client; -import net.minecraft.client.gui.components.PlayerTabOverlay; -import net.minecraft.network.chat.Component; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(PlayerTabOverlay.class) -public class PlayerTabOverlayMixin { - @ModifyReturnValue(method = "getNameForDisplay", at = @At("RETURN")) - private Component v5$getPlayerName(Component original) { - return Client.processName(original); - } -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt index 2b5c0a06..e77d9ff2 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt @@ -40,6 +40,12 @@ import org.mozilla.javascript.Callable import org.mozilla.javascript.Undefined object Client { + enum class RenderLimiter { + OFF, + LIMIT_CHUNKS, + NO_RENDER, + } + internal var referenceSystemTime: Long = 0 private val heldKeys = mutableSetOf() @@ -47,12 +53,11 @@ object Client { @JvmStatic @Volatile var isFreelook = false @JvmStatic @Volatile var isUngrabbed = false @JvmStatic @Volatile var isInputLocked = false - @JvmStatic @Volatile var hideParticles = false @JvmStatic @Volatile var isMacroEnabled = false @JvmStatic @Volatile var isForcePerspective = false @JvmStatic @Volatile var limitFps = false @JvmStatic @Volatile var muteGame = false - @JvmStatic @Volatile var renderLimiter = "Off" + @JvmStatic @Volatile var renderLimiter = RenderLimiter.OFF @Volatile private var cameraYaw: Float? = null @Volatile private var cameraPitch: Float? = null @JvmStatic @Volatile var cameraPosition: Vec3? = null diff --git a/src/main/resources/ctjs.mixins.json b/src/main/resources/ctjs.mixins.json index 8745973f..e4275cff 100644 --- a/src/main/resources/ctjs.mixins.json +++ b/src/main/resources/ctjs.mixins.json @@ -9,6 +9,7 @@ "BlockEntityRenderStateMixin", "BookViewScreenAccessor", "BossHealthOverlayAccessor", + "CameraMixin", "ChatComponentAccessor", "ChatComponentMixin", "ChatScreenAccessor", @@ -20,16 +21,26 @@ "MultiPlayerGameModeMixin", "ClientPacketListenerAccessor", "ClientLevelAccessor", + "ConnectionProxyMixin", "CreativeModeInventoryScreenMixin", + "CrossCollisionBlockMixin", + "EntityRendererMixin", "EntityRenderDispatcherMixin", "EntityRenderStateMixin", + "FirmamentModAnnouncerMixin", + "FramerateLimitTrackerMixin", + "FrustumMixin", "OptionsAccessor", "OptionsMixin", "AbstractContainerScreenAccessor", "AbstractContainerScreenMixin", "GuiMixin", + "GuiRendererMixin", + "ItemInHandRendererMixin", + "JoinMultiplayerScreenMixin", "KeyMappingAccessor", "KeyMappingAccessor$Category", + "KeyboardHandlerMixin", "MinecraftAccessor", "MinecraftMixin", "MouseHandlerMixin", @@ -40,6 +51,8 @@ "PlayerTabOverlayMixin", "RenderTickCounterMixin", "LevelRendererMixin", + "VisGraphMixin", + "YggdrasilServicesKeyInfoMixin", "commands.ClientSuggestionProviderMixin", "commands.ClientPacketListenerMixin", "sound.SoundAccessor", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 2e573bd0..46a76720 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -27,7 +27,7 @@ "com.chattriggers.ctjs.api.world.pathfinding.Swift" ] }, - "mixins": ["ctjs.mixins.json", "v5.mixins.json"], + "mixins": ["ctjs.mixins.json"], "depends": { "minecraft": "=$minecraft_version", "fabricloader": ">=$loader_version", diff --git a/src/main/resources/v5.mixins.json b/src/main/resources/v5.mixins.json deleted file mode 100644 index 66d21dc0..00000000 --- a/src/main/resources/v5.mixins.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "com.v5.mixins", - "compatibilityLevel": "JAVA_25", - "client": [ - "BlockMixin", - "CameraMixin", - "ChatComponentMixin", - "ConnectionProxyMixin", - "CrossCollisionBlockMixin", - "DrawContextCapture", - "EntityRendererMixin", - "FirmamentModAnnouncerMixin", - "FramerateLimitTrackerMixin", - "FrustumMixin", - "GameRendererMixin", - "ItemInHandRendererMixin", - "KeyboardHandlerMixin", - "MinecraftMixin", - "MouseHandlerMixin", - "JoinMultiplayerScreenMixin", - "PlayerTabOverlayMixin", - "LevelRendererMixin", - "VisGraphMixin", - "YggdrasilServicesKeyInfoMixin" - ], - "mixins": [ - "ConnectionMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} From 9e01cb06c75d0ee06a1486c9de389a706208bd07 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Tue, 4 Aug 2026 00:08:29 +0100 Subject: [PATCH 04/61] new rendering --- build.gradle.kts | 2 +- gradle.properties | 2 +- .../mixins/GuiGraphicsExtractorAccessor.java | 12 + .../ctjs/internal/mixins/GuiMixin.java | 8 +- .../internal/mixins/GuiRendererMixin.java | 20 +- src/main/kotlin/com/chattriggers/ctjs/CTJS.kt | 7 +- .../ctjs/api/client/ScreenHelper.kt | 14 +- .../ctjs/api/render/DrawContextHolder.kt | 2 +- .../ctjs/api/render/FreeTypeTextRenderer.kt | 326 + .../com/chattriggers/ctjs/api/render/Gui.kt | 17 +- .../ctjs/api/render/GuiRendererBackend.kt | 856 + .../ctjs/api/render/LegacyPipelineBuilder.kt | 92 - .../ctjs/api/render/NVGRenderer.kt | 875 - .../chattriggers/ctjs/api/render/Rectangle.kt | 22 +- .../ctjs/api/render/RenderLayers.kt | 78 +- .../chattriggers/ctjs/api/render/Renderer.kt | 330 +- .../ctjs/api/render/Renderer3d.kt | 339 - .../com/chattriggers/ctjs/api/render/Shape.kt | 125 - .../assets/ctjs/js/moduleProvidedLibs.js | 3 +- .../resources/assets/v5/font/default.json | 11 + src/main/resources/assets/v5/font/font.ttf | Bin 0 -> 528296 bytes .../resources/assets/v5/font/segoe_bold.json | 11 + .../resources/assets/v5/font/segoe_bold.ttf | Bin 0 -> 53488 bytes .../assets/v5/font/segoe_regular.json | 11 + .../assets/v5/font/segoe_regular.ttf | Bin 0 -> 50028 bytes src/main/resources/ctjs.mixins.json | 1 + .../com/chattriggers/ctjs/typing/prologue.kt | 17 - .../main/resources/provided-types.properties | 20 - .../src/main/resources/typings.d.ts | 21679 ++++++---------- 29 files changed, 9355 insertions(+), 15525 deletions(-) create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/GuiGraphicsExtractorAccessor.java create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/FreeTypeTextRenderer.kt create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt delete mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/LegacyPipelineBuilder.kt delete mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/NVGRenderer.kt delete mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer3d.kt delete mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/Shape.kt create mode 100644 src/main/resources/assets/v5/font/default.json create mode 100644 src/main/resources/assets/v5/font/font.ttf create mode 100644 src/main/resources/assets/v5/font/segoe_bold.json create mode 100644 src/main/resources/assets/v5/font/segoe_bold.ttf create mode 100644 src/main/resources/assets/v5/font/segoe_regular.json create mode 100644 src/main/resources/assets/v5/font/segoe_regular.ttf diff --git a/build.gradle.kts b/build.gradle.kts index 0cf6c451..bae395de 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -50,7 +50,7 @@ dependencies { implementation("meteordevelopment:discord-ipc:1.1") include("meteordevelopment:discord-ipc:1.1") - // NanoVG (with natives) + // CPU-only NanoSVG rasterization (no NanoVG renderer or GL backend) implementation(libs.lwjgl.nanovg) { include(this) } listOf("windows", "linux", "macos", "macos-arm64").forEach { implementation(variantOf(libs.lwjgl.nanovg) { classifier("natives-$it") }) { diff --git a/gradle.properties b/gradle.properties index 67e53a9a..bd4551bd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ org.gradle.parallel=true org.gradle.caching=true # Mod Properties -mod_version = 1.0.0 +mod_version = 5.2.0 archives_base_name = ctjs diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiGraphicsExtractorAccessor.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiGraphicsExtractorAccessor.java new file mode 100644 index 00000000..2388f657 --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiGraphicsExtractorAccessor.java @@ -0,0 +1,12 @@ +package com.chattriggers.ctjs.internal.mixins; + +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.state.gui.GuiRenderState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GuiGraphicsExtractor.class) +public interface GuiGraphicsExtractorAccessor { + @Accessor("guiRenderState") + GuiRenderState getCtjsGuiRenderState(); +} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java index 837037ec..57112809 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java @@ -1,11 +1,13 @@ package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.render.DrawContextHolder; +import com.chattriggers.ctjs.api.render.Renderer; import com.chattriggers.ctjs.api.world.Scoreboard; import com.chattriggers.ctjs.internal.engine.CTEvents; import gg.essential.universal.UMatrixStack; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.Gui; +import net.minecraft.client.Minecraft; import net.minecraft.client.DeltaTracker; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -17,7 +19,9 @@ public class GuiMixin { @Inject(method = "extractRenderState", at = @At("HEAD")) private void captureContext(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { - DrawContextHolder.setCurrentContext(context); + DrawContextHolder.currentContext = context; + if (Minecraft.getInstance().screen == null) + Renderer.INSTANCE.runPreDrawables(context); } @Inject(method = "extractScoreboardSidebar", at = @At("HEAD"), cancellable = true) @@ -32,5 +36,7 @@ private void injectRenderScoreboard(GuiGraphicsExtractor matrices, DeltaTracker ) private void injectRenderOverlay(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { CTEvents.RENDER_OVERLAY.invoker().render(context, new UMatrixStack(context.pose()).toMC(), tickCounter.getGameTimeDeltaTicks()); + if (Minecraft.getInstance().screen == null) + Renderer.INSTANCE.runDrawables(context); } } diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java index 464cda9a..25409ee9 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java @@ -1,22 +1,18 @@ package com.chattriggers.ctjs.internal.mixins; -import com.chattriggers.ctjs.api.render.NVGRenderer; -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import net.minecraft.client.gui.render.GuiRenderer; +import com.chattriggers.ctjs.api.render.Renderer; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.Screen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(GuiRenderer.class) +@Mixin(Screen.class) public class GuiRendererMixin { - @Inject(method = "render", at = @At("HEAD")) - private void beforeRender(GpuBufferSlice fogBuffer, CallbackInfo ci) { - NVGRenderer.runPreDrawables(); - } - - @Inject(method = "render", at = @At("TAIL")) - private void afterRender(GpuBufferSlice fogBuffer, CallbackInfo ci) { - NVGRenderer.runDrawables(); + @Inject(method = "extractRenderStateWithTooltipAndSubtitles", at = @At("TAIL")) + private void afterExtract(GuiGraphicsExtractor context, int mouseX, int mouseY, float deltaTicks, CallbackInfo ci) { + Renderer.INSTANCE.runPreDrawables(context); + Renderer.INSTANCE.runDrawables(context); } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt index 1161d212..83ebe549 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt @@ -8,7 +8,7 @@ import com.chattriggers.ctjs.api.client.WelcomeScreen import com.chattriggers.ctjs.api.commands.DynamicCommands import com.chattriggers.ctjs.api.message.ChatLib import com.chattriggers.ctjs.api.render.Image -import com.chattriggers.ctjs.api.render.NVGRenderer +import com.chattriggers.ctjs.api.render.Renderer import com.chattriggers.ctjs.api.triggers.TriggerType import com.chattriggers.ctjs.api.world.Scoreboard import com.chattriggers.ctjs.api.world.World @@ -21,6 +21,7 @@ import com.chattriggers.ctjs.internal.utils.Initializer import kotlinx.serialization.json.Json import net.fabricmc.api.ClientModInitializer import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents import net.fabricmc.loader.api.FabricLoader import net.minecraft.client.gui.screens.TitleScreen import java.io.File @@ -43,6 +44,7 @@ class CTJS : ClientModInitializer { autoOpenTriggered = true WelcomeScreen.open() } + ClientLifecycleEvents.CLIENT_STOPPING.register { _ -> Renderer.destroy() } SecureLoader.onInitialize() @@ -96,12 +98,13 @@ class CTJS : ClientModInitializer { Register.clearCustomTriggers() StaticCommand.unregisterAll() DynamicCommands.unregisterAll() - NVGRenderer.clearCallbacks() + Renderer.clearCallbacks() if (Config.clearConsoleOnLoad) Console.clear() Client.scheduleTask { + Renderer.destroy() images.forEach(Image::destroy) sounds.forEach(Sound::destroy) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/ScreenHelper.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/ScreenHelper.kt index 743b0eb3..9c47d827 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/ScreenHelper.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/ScreenHelper.kt @@ -1,10 +1,8 @@ package com.chattriggers.ctjs.api.client import com.chattriggers.ctjs.api.render.Font -import com.chattriggers.ctjs.api.render.NVGRenderer +import com.chattriggers.ctjs.api.render.Renderer import net.minecraft.util.ARGB -import org.lwjgl.nanovg.NanoVG.NVG_ALIGN_CENTER -import org.lwjgl.nanovg.NanoVG.NVG_ALIGN_MIDDLE object ScreenHelper { @JvmField @@ -41,17 +39,17 @@ object ScreenHelper { val defaultTextColor = if (hovered) argb(255, 255, 255, 255) else argb(252, 224, 232, 242) val textColor = textColorOverride ?: defaultTextColor - NVGRenderer.drawDropShadow(x, y, width, height, 5f, 14f, 1.3f, argb(60, 0, 10, 28)) - NVGRenderer.drawRoundedRect(x, y, width, height, 5f, bg) - NVGRenderer.drawHollowRect(x, y, width, height, 0.65f, border, 5f) - NVGRenderer.text( + Renderer.drawDropShadow(x, y, width, height, 5f, 14f, 1.3f, argb(60, 0, 10, 28)) + Renderer.drawRoundedRect(x, y, width, height, 5f, bg) + Renderer.drawHollowRect(x, y, width, height, 0.65f, border, 5f) + Renderer.text( label, x + width / 2f, y + height / 2f, 8.7f, textColor, smallerFont, - NVG_ALIGN_CENTER or NVG_ALIGN_MIDDLE + Renderer.ALIGN_CENTER or Renderer.ALIGN_MIDDLE ) } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/DrawContextHolder.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/DrawContextHolder.kt index 502a69a9..77878655 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/DrawContextHolder.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/DrawContextHolder.kt @@ -3,7 +3,7 @@ package com.chattriggers.ctjs.api.render import net.minecraft.client.gui.GuiGraphicsExtractor object DrawContextHolder { - @JvmStatic + @JvmField var currentContext: GuiGraphicsExtractor? = null inline fun withContext(context: GuiGraphicsExtractor, block: () -> T): T { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/FreeTypeTextRenderer.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/FreeTypeTextRenderer.kt new file mode 100644 index 00000000..f478ab3b --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/FreeTypeTextRenderer.kt @@ -0,0 +1,326 @@ +package com.chattriggers.ctjs.api.render + +import com.mojang.blaze3d.platform.NativeImage +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.textures.AddressMode +import com.mojang.blaze3d.textures.FilterMode +import com.mojang.blaze3d.textures.GpuTexture +import com.mojang.blaze3d.textures.GpuTextureView +import com.mojang.blaze3d.textures.TextureFormat +import net.minecraft.client.gui.render.TextureSetup +import org.lwjgl.system.MemoryStack +import org.lwjgl.system.MemoryUtil +import org.lwjgl.util.freetype.FT_Face +import org.lwjgl.util.freetype.FT_Vector +import org.lwjgl.util.freetype.FreeType.FT_Done_Face +import org.lwjgl.util.freetype.FreeType.FT_Done_FreeType +import org.lwjgl.util.freetype.FreeType.FT_Get_Char_Index +import org.lwjgl.util.freetype.FreeType.FT_Get_Kerning +import org.lwjgl.util.freetype.FreeType.FT_Init_FreeType +import org.lwjgl.util.freetype.FreeType.FT_KERNING_UNSCALED +import org.lwjgl.util.freetype.FreeType.FT_LOAD_DEFAULT +import org.lwjgl.util.freetype.FreeType.FT_Load_Glyph +import org.lwjgl.util.freetype.FreeType.FT_New_Memory_Face +import org.lwjgl.util.freetype.FreeType.FT_RENDER_MODE_NORMAL +import org.lwjgl.util.freetype.FreeType.FT_Render_Glyph +import org.lwjgl.util.freetype.FreeType.FT_Set_Pixel_Sizes +import java.nio.ByteBuffer +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.ConcurrentLinkedQueue +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Executors +import java.util.concurrent.atomic.AtomicBoolean +import kotlin.math.max + +/** FreeType layout/raster work plus render-thread-owned grayscale atlas pages. */ +internal class FreeTypeTextRenderer { + data class Layout( + val codePoints: IntArray, + val xs: FloatArray, + val lines: IntArray, + val lineWidths: FloatArray, + val width: Float, + val ascender: Float, + val lineHeight: Float, + ) { + val height get() = lineHeight * lineWidths.size + internal val glyphRuns = HashMap() + } + + internal class GlyphRun(size: Int) { + val glyphs = arrayOfNulls(size) + val resolved = BooleanArray(size) + var complete = false + } + + data class Glyph( + val page: AtlasPage, + val u0: Float, + val v0: Float, + val u1: Float, + val v1: Float, + val width: Int, + val height: Int, + val left: Int, + val top: Int, + ) + + internal class AtlasPage( + val texture: GpuTexture, + val view: GpuTextureView, + val setup: TextureSetup, + ) : AutoCloseable { + var x = PADDING + var y = PADDING + var rowHeight = 0 + override fun close() { view.close(); texture.close() } + } + + private data class LayoutKey(val font: Font, val text: String) + private data class GlyphKey(val font: Font, val codePoint: Int, val pixelSize: Int) + private data class BitmapGlyph(val key: GlyphKey, val pixels: ByteArray, val width: Int, val height: Int, val left: Int, val top: Int) + private data class FaceData(val face: FT_Face, val bytes: ByteBuffer, var pixelSize: Int = 0) { + val units = (face.units_per_EM().toInt() and 0xffff).coerceAtLeast(1) + private val verticalUnits = (face.ascender() - face.descender()).coerceAtLeast(1) + val ascender = face.ascender().toFloat() * BASE_SIZE / verticalUnits + val lineHeight = max(face.height().toInt(), verticalUnits).toFloat() * BASE_SIZE / verticalUnits + val kernings = HashMap() + } + + private val executor = Executors.newSingleThreadExecutor { task -> Thread(task, "V5 FreeType").apply { isDaemon = true } } + private val layouts = object : LinkedHashMap(128, .75f, true) { + override fun removeEldestEntry(eldest: MutableMap.MutableEntry?) = size > MAX_LAYOUTS + } + private val pendingLayouts = ConcurrentHashMap>() + private val requestedGlyphs = ConcurrentHashMap.newKeySet() + private val completedGlyphs = ConcurrentLinkedQueue() + private val glyphs = ConcurrentHashMap() + private val blankGlyphs = ConcurrentHashMap.newKeySet() + private val pages = ArrayList() + private val closed = AtomicBoolean() + private var library = 0L + private val faces = HashMap() + + fun layout(text: String, font: Font, pixelSize: Int? = null): Layout? { + val key = LayoutKey(font, text) + synchronized(layouts) { layouts[key] }?.let { result -> + if (pixelSize != null) requestGlyphs(result, font, pixelSize) + return result + } + requestLayout(key, pixelSize) + return null + } + + fun measure(text: String, font: Font): Layout { + val key = LayoutKey(font, text) + synchronized(layouts) { layouts[key] }?.let { return it } + return requestLayout(key, null).join() + } + + fun glyphs(layout: Layout, font: Font, pixelSize: Int): Array = synchronized(layout.glyphRuns) { + val run = layout.glyphRuns.getOrPut(pixelSize) { GlyphRun(layout.codePoints.size) } + if (!run.complete) { + var complete = true + for (i in layout.codePoints.indices) if (!run.resolved[i]) { + val key = GlyphKey(font, layout.codePoints[i], pixelSize) + val glyph = glyphs[key] + if (glyph != null) { run.glyphs[i] = glyph; run.resolved[i] = true } + else if (key in blankGlyphs) run.resolved[i] = true + else complete = false + } + run.complete = complete + } + run.glyphs + } + + fun processUploads(limit: Int = 128) { + if (completedGlyphs.isEmpty()) return + RenderSystem.assertOnRenderThread() + repeat(limit) { + val bitmap = completedGlyphs.poll() ?: return + if (bitmap.width == 0 || bitmap.height == 0) { + blankGlyphs += bitmap.key + return@repeat + } + val page = pages.firstOrNull { place(it, bitmap.width, bitmap.height) != null } + ?: newPage().also { place(it, bitmap.width, bitmap.height) } + val px = page.x - bitmap.width - PADDING + val py = page.y + val upload = MemoryUtil.memAlloc(bitmap.width * bitmap.height * 4) + for (coverage in bitmap.pixels) upload.put(0xff.toByte()).put(0xff.toByte()).put(0xff.toByte()).put(coverage) + upload.flip() + RenderSystem.getDevice().createCommandEncoder().writeToTexture( + page.texture, upload, NativeImage.Format.RGBA, 0, 0, px, py, bitmap.width, bitmap.height, + ) + MemoryUtil.memFree(upload) + glyphs[bitmap.key] = Glyph( + page, + px.toFloat() / PAGE_SIZE, py.toFloat() / PAGE_SIZE, + (px + bitmap.width).toFloat() / PAGE_SIZE, (py + bitmap.height).toFloat() / PAGE_SIZE, + bitmap.width, bitmap.height, bitmap.left, bitmap.top, + ) + } + } + + fun close() { + if (!closed.compareAndSet(false, true)) return + executor.execute { + faces.values.forEach { FT_Done_Face(it.face) } + faces.clear() + if (library != 0L) FT_Done_FreeType(library) + library = 0L + } + executor.shutdown() + pages.forEach(AtlasPage::close) + pages.clear() + } + + private fun requestGlyphs(layout: Layout, font: Font, pixelSize: Int) { + for (codePoint in layout.codePoints) { + val key = GlyphKey(font, codePoint, pixelSize) + if (!glyphs.containsKey(key) && key !in blankGlyphs && requestedGlyphs.add(key)) submit { completedGlyphs += rasterize(key, face(font)) } + } + } + + private fun requestLayout(key: LayoutKey, pixelSize: Int?): CompletableFuture = + pendingLayouts.computeIfAbsent(key) { + CompletableFuture().also { future -> + submit { + try { + val result = buildLayout(key.text, face(key.font)) + synchronized(layouts) { layouts[key] = result } + if (pixelSize != null) requestGlyphs(result, key.font, pixelSize) + future.complete(result) + } catch (error: Throwable) { + future.completeExceptionally(error) + throw error + } finally { + pendingLayouts.remove(key, future) + } + } + } + } + + private fun submit(task: () -> Unit) { + if (!closed.get()) executor.execute { + try { task() } catch (e: Exception) { System.err.println("[V5] FreeType: ${e.message}") } + } + } + + private fun face(font: Font): FaceData = faces.getOrPut(font) { + if (library == 0L) MemoryStack.stackPush().use { stack -> + val pointer = stack.mallocPointer(1) + checkFt(FT_Init_FreeType(pointer), "initialize FreeType") + library = pointer[0] + } + val bytes = font.buffer() + MemoryStack.stackPush().use { stack -> + val pointer = stack.mallocPointer(1) + checkFt(FT_New_Memory_Face(library, bytes, 0, pointer), "load ${font.name}") + FaceData(FT_Face.create(pointer[0]), bytes) + } + } + + private fun buildLayout(text: String, data: FaceData): Layout { + val codePoints = ArrayList(text.length) + val xs = ArrayList(text.length) + val lines = ArrayList(text.length) + val widths = ArrayList() + var line = 0 + var x = 0f + var previous = 0 + var offset = 0 + while (offset < text.length) { + val codePoint = text.codePointAt(offset) + offset += Character.charCount(codePoint) + if (codePoint == '\r'.code) { + if (offset < text.length && text[offset] == '\n') offset++ + widths += x; line++; x = 0f; previous = 0; continue + } + if (codePoint == '\n'.code) { widths += x; line++; x = 0f; previous = 0; continue } + val glyph = glyphIndex(data.face, codePoint) + if (previous != 0 && glyph != 0) x += kerning(data, previous, glyph) + codePoints += codePoint; xs += x; lines += line + checkFt(FT_Load_Glyph(data.face, glyph, org.lwjgl.util.freetype.FreeType.FT_LOAD_NO_SCALE), "measure glyph") + x += data.face.glyph()!!.metrics().horiAdvance() * BASE_SIZE / data.units + previous = glyph + } + widths += x + val lineWidths = widths.toFloatArray() + return Layout(codePoints.toIntArray(), xs.toFloatArray(), lines.toIntArray(), lineWidths, lineWidths.maxOrNull() ?: 0f, data.ascender, data.lineHeight) + } + + private fun kerning(data: FaceData, left: Int, right: Int): Float { + val key = (left.toLong() shl 32) or (right.toLong() and 0xffffffffL) + return data.kernings.getOrPut(key) { + MemoryStack.stackPush().use { stack -> + val value = FT_Vector.malloc(stack) + if (FT_Get_Kerning(data.face, left, right, FT_KERNING_UNSCALED, value) == 0) value.x() * BASE_SIZE / data.units else 0f + } + } + } + + private fun rasterize(key: GlyphKey, data: FaceData): BitmapGlyph { + if (data.pixelSize != key.pixelSize) { + checkFt(FT_Set_Pixel_Sizes(data.face, 0, key.pixelSize), "set ${key.pixelSize}px font size") + data.pixelSize = key.pixelSize + } + val index = glyphIndex(data.face, key.codePoint) + checkFt(FT_Load_Glyph(data.face, index, FT_LOAD_DEFAULT), "load glyph U+${key.codePoint.toString(16)}") + val slot = data.face.glyph()!! + checkFt(FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL), "render glyph U+${key.codePoint.toString(16)}") + val bitmap = slot.bitmap() + val width = bitmap.width() + val height = bitmap.rows() + val pixels = ByteArray(width * height) + if (width > 0 && height > 0) { + val pitch = bitmap.pitch() + val source = bitmap.buffer(kotlin.math.abs(pitch) * height)!! + for (y in 0 until height) { + val row = if (pitch >= 0) y * pitch else (height - 1 - y) * -pitch + for (x in 0 until width) pixels[y * width + x] = source[row + x] + } + } + return BitmapGlyph(key, pixels, width, height, slot.bitmap_left(), slot.bitmap_top()) + } + + private fun glyphIndex(face: FT_Face, codePoint: Int): Int { + val direct = FT_Get_Char_Index(face, codePoint.toLong()) + if (direct != 0) return direct + return FT_Get_Char_Index(face, 0xfffd).takeIf { it != 0 } ?: 0 + } + + private fun newPage(): AtlasPage { + val device = RenderSystem.getDevice() + val texture = device.createTexture( + { "V5 glyph atlas ${pages.size}" }, + GpuTexture.USAGE_COPY_DST or GpuTexture.USAGE_TEXTURE_BINDING, + TextureFormat.RGBA8, PAGE_SIZE, PAGE_SIZE, 1, 1, + ) + val empty = MemoryUtil.memCalloc(PAGE_SIZE * PAGE_SIZE * 4) + device.createCommandEncoder().writeToTexture(texture, empty, NativeImage.Format.RGBA, 0, 0, 0, 0, PAGE_SIZE, PAGE_SIZE) + MemoryUtil.memFree(empty) + val view = device.createTextureView(texture) + val sampler = RenderSystem.getSamplerCache().getSampler(AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, FilterMode.LINEAR, FilterMode.LINEAR, false) + return AtlasPage(texture, view, TextureSetup.singleTexture(view, sampler)).also(pages::add) + } + + private fun place(page: AtlasPage, width: Int, height: Int): Unit? { + val paddedWidth = width + PADDING + val paddedHeight = height + PADDING + if (page.x + paddedWidth > PAGE_SIZE) { page.x = PADDING; page.y += page.rowHeight + PADDING; page.rowHeight = 0 } + if (page.y + paddedHeight > PAGE_SIZE) return null + page.x += paddedWidth + page.rowHeight = max(page.rowHeight, height) + return Unit + } + + private fun checkFt(error: Int, action: String) = check(error == 0) { "Failed to $action (FreeType error $error)" } + + companion object { + const val BASE_SIZE = 8f + private const val PAGE_SIZE = 1024 + private const val PADDING = 2 + private const val MAX_LAYOUTS = 1024 + } +} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt index 7de89139..517f7946 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt @@ -277,15 +277,14 @@ class Gui @JvmOverloads constructor( @Suppress("UNCHECKED_CAST") val drawContexts = drawContextsField.get(this) as List - Renderer.pushMatrix(UMatrixStack(drawContexts.last().pose())) - - Renderer.partialTicks = partialTicks - - this.mouseX = mouseX - this.mouseY = mouseY - onDraw?.trigger(arrayOf(mouseX, mouseY, partialTicks)) - - Renderer.popMatrix() + DrawContextHolder.withContext(drawContexts.last()) { + Renderer.pushMatrix(UMatrixStack(drawContexts.last().pose())) + Renderer.partialTicks = partialTicks + this.mouseX = mouseX + this.mouseY = mouseY + onDraw?.trigger(arrayOf(mouseX, mouseY, partialTicks)) + Renderer.popMatrix() + } } /** diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt new file mode 100644 index 00000000..5a9b3357 --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt @@ -0,0 +1,856 @@ +package com.chattriggers.ctjs.api.render + +import com.chattriggers.ctjs.internal.mixins.GuiGraphicsExtractorAccessor +import com.mojang.blaze3d.platform.NativeImage +import com.mojang.blaze3d.vertex.VertexConsumer +import net.minecraft.client.Minecraft +import net.minecraft.client.gui.GuiGraphicsExtractor +import net.minecraft.client.gui.navigation.ScreenRectangle +import net.minecraft.client.gui.render.TextureSetup +import net.minecraft.client.renderer.RenderPipelines +import net.minecraft.client.renderer.state.gui.GuiElementRenderState +import net.minecraft.client.renderer.texture.DynamicTexture +import org.joml.Matrix3x2f +import org.lwjgl.nanovg.NanoSVG.nsvgCreateRasterizer +import org.lwjgl.nanovg.NanoSVG.nsvgDelete +import org.lwjgl.nanovg.NanoSVG.nsvgDeleteRasterizer +import org.lwjgl.nanovg.NanoSVG.nsvgParse +import org.lwjgl.nanovg.NanoSVG.nsvgRasterize +import org.lwjgl.system.MemoryUtil +import java.awt.Color +import java.awt.image.BufferedImage +import java.io.File +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.net.URI +import java.util.concurrent.ConcurrentLinkedQueue +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArrayList +import java.util.concurrent.Executors +import java.util.concurrent.LinkedBlockingQueue +import javax.imageio.ImageIO +import javax.imageio.metadata.IIOMetadataNode +import kotlin.math.PI +import kotlin.math.atan2 +import kotlin.math.ceil +import kotlin.math.cos +import kotlin.math.floor +import kotlin.math.hypot +import kotlin.math.max +import kotlin.math.min +import kotlin.math.roundToInt +import kotlin.math.sin + +/** Minecraft GUI extraction and GPU resource implementation for [Renderer]. */ +open class GuiRendererBackend { + private val mc = Minecraft.getInstance() + private val preRenderCallbacks = CopyOnWriteArrayList() + private val renderCallbacks = CopyOnWriteArrayList() + private val imageCache = HashMap() + private val generatedTextureCache = HashMap() + private val gifCache = HashMap() + private val urlCache = ConcurrentHashMap() + private val pendingDownloads = ConcurrentHashMap.newKeySet() + private val failedDownloads = ConcurrentHashMap.newKeySet() + private val downloadQueue = LinkedBlockingQueue>() + private val decodeExecutor = Executors.newFixedThreadPool(2) { task -> + Thread(task, "V5 image decoder").apply { isDaemon = true } + } + private val decodedImages = ConcurrentLinkedQueue>() + private val pendingImages = HashMap() + private val failedImages = HashSet() + private val decodedGifs = ConcurrentLinkedQueue>() + private val pendingGifs = HashMap() + private val failedGifs = HashSet() + private val vertexPool = ArrayDeque() + private val inFlightVertices = ArrayDeque() + @Volatile private var textEngine: FreeTypeTextRenderer? = FreeTypeTextRenderer() + @Volatile private var destroyed = false + + private var activeContext: GuiGraphicsExtractor? = null + private val context get() = activeContext ?: DrawContextHolder.currentContext + private var alpha = 1f + private var clip: Clip? = null + private val states = ArrayDeque() + + @JvmField + val defaultFont = Font("Default", "/assets/v5/font.otf") + + @JvmField val ALIGN_CENTER = 2 + @JvmField val ALIGN_MIDDLE = 16 + + data class GifData(val width: Int, val height: Int, val frameCount: Int, val delays: IntArray) { + override fun equals(other: Any?) = other is GifData && width == other.width && height == other.height && + frameCount == other.frameCount && delays.contentEquals(other.delays) + override fun hashCode() = 31 * (31 * (31 * width + height) + frameCount) + delays.contentHashCode() + } + + private data class CachedTexture(val texture: DynamicTexture, var refs: Int = 1) : AutoCloseable { + val setup = TextureSetup.singleTexture(texture.textureView, texture.sampler) + override fun close() = texture.close() + } + + private data class CachedGif( + val frames: List, + val delays: IntArray, + val width: Int, + val height: Int, + var refs: Int = 1, + ) + private data class DecodedGif(val frames: List, val delays: IntArray, val width: Int, val height: Int) + + private data class Clip(val local: FloatArray, val screen: ScreenRectangle) + private data class SavedState(val alpha: Float, val clip: Clip?) + private enum class Gradient { LEFT_TO_RIGHT, TOP_TO_BOTTOM, TL_TO_BR, BL_TO_TR } + + private class QuadState( + private val x: Float, + private val y: Float, + private val w: Float, + private val h: Float, + private val c0: Int, + private val c1: Int, + private val c2: Int, + private val c3: Int, + private val pose: Matrix3x2f, + private val textured: Boolean, + private val setup: TextureSetup, + private val scissor: ScreenRectangle?, + private val area: ScreenRectangle, + ) : GuiElementRenderState { + override fun buildVertices(buffer: VertexConsumer) { + for (i in 0..3) { + val consumer = buffer.addVertexWith2DPose( + pose, + if (i >= 2) x + w else x, + if (i == 1 || i == 2) y + h else y, + ) + if (textured) consumer.setUv(if (i >= 2) 1f else 0f, if (i == 1 || i == 2) 1f else 0f) + consumer.setColor(when (i) { 0 -> c0; 1 -> c1; 2 -> c2; else -> c3 }) + } + } + + override fun pipeline() = if (textured) RenderPipelines.GUI_TEXTURED else RenderPipelines.GUI + override fun textureSetup() = setup + override fun scissorArea() = scissor + override fun bounds() = area + } + + private class MeshState( + private val vertices: FloatArray, + private val count: Int, + private val pose: Matrix3x2f, + private val textured: Boolean, + private val setup: TextureSetup, + private val scissor: ScreenRectangle?, + private val area: ScreenRectangle, + ) : GuiElementRenderState { + override fun buildVertices(buffer: VertexConsumer) { + for (i in 0 until count) { + val offset = i * 5 + val consumer = buffer.addVertexWith2DPose(pose, vertices[offset], vertices[offset + 1]) + if (textured) consumer.setUv(vertices[offset + 2], vertices[offset + 3]) + consumer.setColor(vertices[offset + 4].toRawBits()) + } + } + + override fun pipeline() = if (textured) RenderPipelines.GUI_TEXTURED else RenderPipelines.GUI + override fun textureSetup() = setup + override fun scissorArea() = scissor + override fun bounds() = area + } + + fun registerV5Render(runnable: Runnable) { renderCallbacks += runnable } + fun unregisterV5Render(runnable: Runnable) { renderCallbacks -= runnable } + fun registerV5PreRender(runnable: Runnable) { preRenderCallbacks += runnable } + fun unregisterV5PreRender(runnable: Runnable) { preRenderCallbacks -= runnable } + fun clearCallbacks() { renderCallbacks.clear(); preRenderCallbacks.clear() } + + + fun runPreDrawables(context: GuiGraphicsExtractor) { + synchronized(vertexPool) { + vertexPool.addAll(inFlightVertices) + inFlightVertices.clear() + } + withContext(context) { runCallbacks(preRenderCallbacks) } + } + + + fun runDrawables(context: GuiGraphicsExtractor) = withContext(context) { + processImageQueues() + textEngine?.processUploads() + runCallbacks(renderCallbacks) + } + + private inline fun withContext(drawContext: GuiGraphicsExtractor, block: () -> Unit) { + val previous = DrawContextHolder.currentContext + DrawContextHolder.currentContext = drawContext + activeContext = drawContext + alpha = 1f + clip = null + states.clear() + try { block() } finally { + while (states.isNotEmpty()) restore() + if (clip != null) drawContext.disableScissor() + alpha = 1f + clip = null + activeContext = null + DrawContextHolder.currentContext = previous + } + } + + private fun runCallbacks(callbacks: List) = callbacks.forEach { + try { it.run() } catch (e: Exception) { e.printStackTrace() } + } + + fun blurBackground() { context?.blurBeforeThisStratum() } + fun save() { context?.pose()?.pushMatrix(); states.addLast(SavedState(alpha, clip)) } + fun restore() { + val saved = states.removeLastOrNull() ?: return + val changedClip = clip != saved.clip + context?.pose()?.popMatrix() + if (changedClip) { + if (clip != null) context?.disableScissor() + if (clip == null) saved.clip?.local?.let { + context?.enableScissor(it[0].roundToInt(), it[1].roundToInt(), (it[0] + it[2]).roundToInt(), (it[1] + it[3]).roundToInt()) + } + } + alpha = saved.alpha + clip = saved.clip + } + fun globalAlpha(value: Float) { alpha = value.coerceIn(0f, 1f) } + + fun scissor(x: Float, y: Float, w: Float, h: Float) { + val ctx = context ?: return + val local = floatArrayOf(x, y, w, h) + val transformed = ScreenRectangle(x.toInt(), y.toInt(), ceil(w.toDouble()).toInt(), ceil(h.toDouble()).toInt()) + .transformMaxBounds(Matrix3x2f(ctx.pose())) + val intersected = clip?.screen?.intersection(transformed) ?: transformed + ctx.enableScissor(x.roundToInt(), y.roundToInt(), (x + w).roundToInt(), (y + h).roundToInt()) + clip = Clip(local, intersected) + } + + fun resetScissor() { if (clip != null) context?.disableScissor(); clip = null } + fun pushScissor(x: Float, y: Float, w: Float, h: Float) { save(); scissor(x, y, w, h) } + fun popScissor() = restore() + + fun drawRect(x: Float, y: Float, w: Float, h: Float, color: Int) = + emitQuad(x, y, w, h, applyAlpha(color)) + + fun drawRoundedRect(x: Float, y: Float, w: Float, h: Float, radius: Float, color: Int) = + if (radius <= 0f) drawRect(x, y, w, h, color) else emitFill(x, y, w, h, radius, radius, radius, radius, applyAlpha(color)) + + fun drawRoundedRectVaried(x: Float, y: Float, w: Float, h: Float, color: Int, tl: Float, tr: Float, br: Float, bl: Float) = + if (max(max(tl, tr), max(br, bl)) <= 0f) drawRect(x, y, w, h, color) + else emitFill(x, y, w, h, tl, tr, br, bl, applyAlpha(color)) + + fun drawCircle(x: Float, y: Float, radius: Float, color: Int) = + drawRoundedRect(x - radius, y - radius, radius * 2, radius * 2, radius, color) + + + @JvmOverloads + fun drawHollowRect(x: Float, y: Float, w: Float, h: Float, thickness: Float, color: Int, radius: Float = 0f) { + val t = thickness.coerceAtLeast(0.1f) + emitRing(x, y, w, h, radius, x + t, y + t, w - 2 * t, h - 2 * t, max(0f, radius - t), applyAlpha(color)) + } + + + fun drawLine(x1: Float, y1: Float, x2: Float, y2: Float, thickness: Float, color: Int) { + val dx = x2 - x1 + val dy = y2 - y1 + val length = hypot(dx.toDouble(), dy.toDouble()).toFloat() + if (length == 0f) return drawCircle(x1, y1, thickness / 2f, color) + val nx = -dy / length * thickness / 2f + val ny = dx / length * thickness / 2f + val c = applyAlpha(color) + emitQuadPoints(x1 + nx, y1 + ny, x1 - nx, y1 - ny, x2 - nx, y2 - ny, x2 + nx, y2 + ny, c) + drawCircle(x1, y1, thickness / 2f, color) + drawCircle(x2, y2, thickness / 2f, color) + } + + + fun drawDropShadow(x: Float, y: Float, w: Float, h: Float, radius: Float, blur: Float, spread: Float, color: Int) { + val steps = max(2, ceil(blur.coerceAtLeast(1f) / 2f).toInt()) + var ix = x - spread + var iy = y - spread + var iw = w + 2 * spread + var ih = h + 2 * spread + var ir = radius + spread + for (step in 1..steps) { + val distance = blur * step / steps + val ox = x - spread - distance + val oy = y - spread - distance + val ow = w + 2 * (spread + distance) + val oh = h + 2 * (spread + distance) + val outerRadius = radius + spread + distance + val fade = 1f - step.toFloat() / (steps + 1) + emitRing(ix, iy, iw, ih, ir, ox, oy, ow, oh, outerRadius, applyAlpha(withAlpha(color, (((color ushr 24) and 255) * fade).roundToInt()))) + ix = ox; iy = oy; iw = ow; ih = oh; ir = outerRadius + } + } + + + @JvmOverloads + fun drawGradientRect(x: Float, y: Float, w: Float, h: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) { + val gradient = resolveGradient(direction) + if (radius <= 0f) emitGradientQuad(x, y, w, h, color1, color2, gradient) + else emitFill(x, y, w, h, radius, radius, radius, radius, color1, color2, gradient) + } + + + @JvmOverloads + fun drawHollowGradientRect(x: Float, y: Float, w: Float, h: Float, thickness: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) { + val t = thickness.coerceAtLeast(0.1f) + emitRing(x, y, w, h, radius, x + t, y + t, w - 2 * t, h - 2 * t, max(0f, radius - t), color1, color2, resolveGradient(direction)) + } + + + @JvmOverloads + fun drawCheckerboard(x: Float, y: Float, w: Float, h: Float, radius: Float, size: Float = 4f) { + val width = ceil(w.toDouble()).toInt().coerceAtLeast(1) + val height = ceil(h.toDouble()).toInt().coerceAtLeast(1) + val step = size.roundToInt().coerceAtLeast(1) + val key = "checker:$width:$height:$step" + val texture = generatedTextureCache.getOrPut(key) { + val image = NativeImage(width, height, false) + for (py in 0 until height) for (px in 0 until width) { + image.setPixel(px, py, if ((px / step + py / step) % 2 == 0) 0xff404040.toInt() else 0xff737373.toInt()) + } + createTexture("V5 checkerboard", image) + } + drawTexture(texture, x, y, w, h, radius, 1f) + } + + + fun drawHueBar(x: Float, y: Float, w: Float, h: Float, radius: Float) { + val texture = generatedTextureCache.getOrPut("hue") { + val image = NativeImage(256, 1, false) + for (px in 0 until 256) { + image.setPixel(px, 0, 0xff000000.toInt() or (Color.HSBtoRGB(px / 255f, 1f, 1f) and 0xffffff)) + } + createTexture("V5 hue bar", image) + } + drawTexture(texture, x, y, w, h, radius, 1f) + } + + fun getDefaultFont() = defaultFont + + + @JvmOverloads + fun text(text: String, x: Float, y: Float, size: Float, color: Int, font: Font? = defaultFont, align: Int) { + val ctx = context ?: return + val resolvedFont = font ?: defaultFont + val renderer = textRenderer() + val scale = size / 8f + val pose = Matrix3x2f(ctx.pose()) + val framebufferScale = mc.window.guiScale * scale * max( + hypot(pose.m00().toDouble(), pose.m01().toDouble()), + hypot(pose.m10().toDouble(), pose.m11().toDouble()), + ) + val pixelSize = ceil(8.0 * framebufferScale).toInt().coerceIn(1, 512) + val layout = renderer.layout(text, resolvedFont, pixelSize) ?: return + val localY = when { + align and 32 != 0 -> -layout.height + align and 16 != 0 -> -layout.height / 2f + align and 8 != 0 -> 0f + else -> -layout.ascender + } + ctx.pose().pushMatrix() + ctx.pose().translate(x, y) + ctx.pose().scale(scale, scale) + emitText(renderer, layout, resolvedFont, pixelSize, localY, align, applyAlpha(color)) + ctx.pose().popMatrix() + } + + + @JvmOverloads + fun textWidth(text: String, size: Float, font: Font? = defaultFont): Float = + textRenderer().measure(text, font ?: defaultFont).width * size / 8f + + + fun loadImage(path: String): String { + if (path.isRemoteUrl()) return path + synchronized(imageCache) { + imageCache[path]?.let { it.refs++; return path } + if (path in failedImages) return path + pendingImages[path]?.let { pendingImages[path] = it + 1; return path } + pendingImages[path] = 1 + } + decodeExecutor.execute { + val image = try { + if (path.endsWith(".svg", true)) loadSvg(readImage(path), path) else NativeImage.read(readImage(path)) + } catch (e: Exception) { + println("[V5] Failed to load image $path: ${e.message}"); null + } + if (destroyed) image?.close() else decodedImages += path to image + } + return path + } + + fun unloadImage(path: String) = synchronized(imageCache) { + imageCache[path]?.let { if (--it.refs <= 0) { it.close(); imageCache.remove(path) } } + pendingImages[path]?.let { pendingImages[path] = max(0, it - 1) } + } + fun isImageLoaded(path: String) = synchronized(imageCache) { path in imageCache } + + + @JvmOverloads + fun drawImage(path: String, x: Float, y: Float, w: Float, h: Float, radius: Float = 0f, alpha: Float = 1f) { + if (path.isRemoteUrl()) return drawImageFromUrl(path, x, y, w, h, radius, alpha) + val texture = synchronized(imageCache) { imageCache[path] } + if (texture == null) { ensureImageRequested(path); return } + drawTexture(texture, x, y, w, h, radius, alpha) + } + + private fun ensureImageRequested(path: String) { + synchronized(imageCache) { + if (path in imageCache || path in pendingImages || path in failedImages) return + } + loadImage(path) + } + + + @JvmOverloads + fun drawImageFromUrl(url: String, x: Float, y: Float, w: Float, h: Float, radius: Float = 0f, alpha: Float = 1f) { + if (url == "none" || url in failedDownloads) return + urlCache[url]?.let { return drawTexture(it, x, y, w, h, radius, alpha) } + if (pendingDownloads.add(url)) Thread({ + val image = try { + URI.create(url).toURL().openConnection().apply { + connectTimeout = 5000; readTimeout = 5000; setRequestProperty("User-Agent", "V5-Loader") + }.getInputStream().use(NativeImage::read) + } catch (_: Exception) { null } + downloadQueue += url to image + }, "V5 image ${url.hashCode()}").start() + } + + private fun processImageQueues() { + for (ignored in 0 until 5) { + val (url, image) = downloadQueue.poll() ?: break + if (image == null) failedDownloads += url else urlCache[url] = createTexture("V5 URL $url", image) + pendingDownloads -= url + } + repeat(5) { + val (path, image) = decodedImages.poll() ?: return@repeat + synchronized(imageCache) { + val refs = pendingImages.remove(path) ?: 0 + if (image == null) failedImages += path + else if (refs > 0) imageCache[path] = createTexture("V5 image $path", image).also { it.refs = refs } + else image.close() + } + } + decodedGifs.poll()?.let { (path, decoded) -> + val refs = synchronized(gifCache) { pendingGifs.remove(path) ?: 0 } + if (decoded == null) failedGifs += path + else if (refs > 0) gifCache[path] = CachedGif( + decoded.frames.mapIndexed { index, image -> createTexture("V5 GIF $path#$index", image) }, + decoded.delays, decoded.width, decoded.height, refs, + ) else decoded.frames.forEach(NativeImage::close) + } + } + + + fun loadGif(path: String): GifData? { + synchronized(gifCache) { + gifCache[path]?.let { it.refs++; return GifData(it.width, it.height, it.frames.size, it.delays) } + if (path in pendingGifs || path in failedGifs) return null + pendingGifs[path] = 1 + } + decodeExecutor.execute { + val gif = decodeGif(path) + if (destroyed) gif?.frames?.forEach(NativeImage::close) else decodedGifs += path to gif + } + return null + } + + private fun decodeGif(path: String): DecodedGif? = try { + FileInputStream(File(path)).use { stream -> + val reader = ImageIO.getImageReadersByFormatName("gif").asSequence().firstOrNull() ?: return null + reader.input = ImageIO.createImageInputStream(stream) + val count = reader.getNumImages(true) + val first = reader.read(0) + val master = BufferedImage(first.width, first.height, BufferedImage.TYPE_INT_ARGB) + val graphics = master.createGraphics().apply { background = Color(0, 0, 0, 0) } + val frames = ArrayList(count) + val delays = IntArray(count) + for (i in 0 until count) { + val frame = reader.read(i) + val tree = reader.getImageMetadata(i).getAsTree(reader.getImageMetadata(i).nativeMetadataFormatName) as IIOMetadataNode + val gce = tree.getElementsByTagName("GraphicControlExtension").item(0) as IIOMetadataNode + val desc = tree.getElementsByTagName("ImageDescriptor").item(0) as IIOMetadataNode + val fx = desc.getAttribute("imageLeftPosition").toInt() + val fy = desc.getAttribute("imageTopPosition").toInt() + delays[i] = (gce.getAttribute("delayTime").toInt() * 10).coerceAtLeast(10) + graphics.drawImage(frame, fx, fy, null) + frames += master.toNativeImage() + if (gce.getAttribute("disposalMethod") == "restoreToBackgroundColor") graphics.clearRect(fx, fy, frame.width, frame.height) + } + graphics.dispose(); reader.dispose() + DecodedGif(frames, delays, first.width, first.height) + } + } catch (e: Exception) { println("[V5] Failed to load GIF $path: ${e.message}"); null } + + fun unloadGif(path: String) = synchronized(gifCache) { + gifCache[path]?.let { if (--it.refs <= 0) { it.frames.forEach(CachedTexture::close); gifCache.remove(path) } } + pendingGifs[path]?.let { pendingGifs[path] = max(0, it - 1) } + } + + + @JvmOverloads + fun drawGif(path: String, x: Float, y: Float, w: Float, h: Float, frameIndex: Int, radius: Float = 0f, alpha: Float = 1f) { + val frames = gifCache[path]?.frames ?: return + if (frames.isNotEmpty()) drawTexture(frames[Math.floorMod(frameIndex, frames.size)], x, y, w, h, radius, alpha) + } + + private fun drawTexture(texture: CachedTexture, x: Float, y: Float, w: Float, h: Float, radius: Float, imageAlpha: Float) { + val color = applyAlpha(withAlpha(0xffffffff.toInt(), (255 * imageAlpha.coerceIn(0f, 1f)).roundToInt())) + if (radius <= 0f) emitQuad(x, y, w, h, color, textured = true, setup = texture.setup) + else emitFill(x, y, w, h, radius, radius, radius, radius, color, textured = true, setup = texture.setup) + } + + private fun readImage(path: String): ByteArray { + val trimmed = path.trim() + require(!trimmed.isRemoteUrl()) { "Remote images must use drawImageFromUrl" } + val stream = when { + File(trimmed).isFile -> FileInputStream(trimmed) + else -> GuiRendererBackend::class.java.getResourceAsStream(trimmed) ?: throw FileNotFoundException(trimmed) + } + return stream.use { it.readBytes() } + } + + private fun String.isRemoteUrl() = startsWith("http://", true) || startsWith("https://", true) + + private fun loadSvg(bytes: ByteArray, name: String): NativeImage { + val svg = nsvgParse(String(bytes), "px", 96f) ?: error("Invalid SVG: $name") + val width = svg.width().roundToInt().coerceAtLeast(1) + val height = svg.height().roundToInt().coerceAtLeast(1) + val pixels = MemoryUtil.memAlloc(width * height * 4) + val rasterizer = nsvgCreateRasterizer() + try { + nsvgRasterize(rasterizer, svg, 0f, 0f, 1f, pixels, width, height, width * 4) + val image = NativeImage(width, height, false) + for (y in 0 until height) for (x in 0 until width) { + val i = (y * width + x) * 4 + image.setPixel(x, y, ((pixels.get(i + 3).toInt() and 255) shl 24) or ((pixels.get(i).toInt() and 255) shl 16) or + ((pixels.get(i + 1).toInt() and 255) shl 8) or (pixels.get(i + 2).toInt() and 255)) + } + return image + } finally { nsvgDeleteRasterizer(rasterizer); nsvgDelete(svg); MemoryUtil.memFree(pixels) } + } + + private fun BufferedImage.toNativeImage(): NativeImage { + val native = NativeImage(width, height, false) + for (y in 0 until height) for (x in 0 until width) native.setPixel(x, y, getRGB(x, y)) + return native + } + + private fun createTexture(name: String, image: NativeImage) = CachedTexture(DynamicTexture({ name }, image)) + + fun clearImageCache() { + synchronized(imageCache) { + imageCache.values.forEach(CachedTexture::close); imageCache.clear() + pendingImages.clear(); failedImages.clear() + } + generatedTextureCache.values.forEach(CachedTexture::close); generatedTextureCache.clear() + synchronized(gifCache) { + gifCache.values.flatMap { it.frames }.forEach(CachedTexture::close); gifCache.clear() + pendingGifs.clear(); failedGifs.clear() + } + while (true) (decodedImages.poll() ?: break).second?.close() + while (true) (decodedGifs.poll() ?: break).second?.frames?.forEach(NativeImage::close) + urlCache.values.filterNotNull().forEach(CachedTexture::close); urlCache.clear(); pendingDownloads.clear(); failedDownloads.clear() + } + fun getCacheStats() = "Images: ${imageCache.size}, GIFs: ${gifCache.size}, URLs: ${urlCache.size}" + fun destroy() { + destroyed = true + decodeExecutor.shutdownNow() + synchronized(this) { textEngine?.close(); textEngine = null } + clearImageCache() + } + + private fun textRenderer(): FreeTypeTextRenderer = textEngine ?: synchronized(this) { + textEngine ?: FreeTypeTextRenderer().also { textEngine = it } + } + + private fun emitText(renderer: FreeTypeTextRenderer, layout: FreeTypeTextRenderer.Layout, font: Font, pixelSize: Int, y: Float, align: Int, color: Int) { + val ctx = context ?: return + val pose = Matrix3x2f(ctx.pose()) + val bitmapScale = 8f / pixelSize + var vertices: FloatArray? = null + var count = 0 + var page: FreeTypeTextRenderer.AtlasPage? = null + var minX = Float.POSITIVE_INFINITY + var minY = Float.POSITIVE_INFINITY + var maxX = Float.NEGATIVE_INFINITY + var maxY = Float.NEGATIVE_INFINITY + val glyphs = renderer.glyphs(layout, font, pixelSize) + + fun flush() { + val data = vertices ?: return + val atlas = page ?: return releaseFloats(data) + if (count > 0) emitMesh(data, count, true, atlas.setup, minX, minY, maxX, maxY, pose) else releaseFloats(data) + vertices = null; count = 0; page = null + minX = Float.POSITIVE_INFINITY; minY = Float.POSITIVE_INFINITY + maxX = Float.NEGATIVE_INFINITY; maxY = Float.NEGATIVE_INFINITY + } + + for (i in layout.codePoints.indices) { + val glyph = glyphs[i] ?: continue + if (glyph.page !== page) { flush(); page = glyph.page; vertices = acquireFloats(4 * 5 * 16) } + if (count + 4 > vertices!!.size / 5) { + val old = vertices!! + vertices = acquireFloats(old.size * 2).also { old.copyInto(it) } + releaseFloats(old) + } + val lineWidth = layout.lineWidths[layout.lines[i]] + val lineX = when { + align and 4 != 0 -> -lineWidth + align and 2 != 0 -> -lineWidth / 2f + else -> 0f + } + val x0 = lineX + layout.xs[i] + glyph.left * bitmapScale + val baseline = y + layout.ascender + layout.lines[i] * layout.lineHeight + val y0 = baseline - glyph.top * bitmapScale + val x1 = x0 + glyph.width * bitmapScale + val y1 = y0 + glyph.height * bitmapScale + minX = min(minX, x0); minY = min(minY, y0); maxX = max(maxX, x1); maxY = max(maxY, y1) + count = putText(vertices!!, count, x0, y0, glyph.u0, glyph.v0, color) + count = putText(vertices!!, count, x0, y1, glyph.u0, glyph.v1, color) + count = putText(vertices!!, count, x1, y1, glyph.u1, glyph.v1, color) + count = putText(vertices!!, count, x1, y0, glyph.u1, glyph.v0, color) + } + flush() + } + + private fun putText(vertices: FloatArray, index: Int, x: Float, y: Float, u: Float, v: Float, color: Int): Int { + val offset = index * 5 + vertices[offset] = x; vertices[offset + 1] = y; vertices[offset + 2] = u; vertices[offset + 3] = v + vertices[offset + 4] = Float.fromBits(color) + return index + 1 + } + + private fun emitFill( + x: Float, y: Float, w: Float, h: Float, + tl: Float, tr: Float, br: Float, bl: Float, + color1: Int, color2: Int = color1, gradient: Gradient? = null, + textured: Boolean = false, setup: TextureSetup = TextureSetup.noTexture(), + ) { + val ctx = context ?: return + if (w <= 0f || h <= 0f) return + val pose = Matrix3x2f(ctx.pose()) + val maxRadius = min(w, h) / 2f + val rtl = tl.coerceIn(0f, maxRadius) + val rtr = tr.coerceIn(0f, maxRadius) + val rbr = br.coerceIn(0f, maxRadius) + val rbl = bl.coerceIn(0f, maxRadius) + val count = contourPointCount(rtl, rtr, rbr, rbl, pose) + val points = acquireFloats(count * 2) + val outer = acquireFloats(count * 2) + writeContour(points, outer, x, y, w, h, rtl, rtr, rbr, rbl, pose) + val vertices = acquireFloats(count * 8 * 5) + var vertexCount = 0 + val cx = x + w / 2f + val cy = y + h / 2f + for (i in 0 until count) { + val next = (i + 1) % count + val ax = points[i * 2]; val ay = points[i * 2 + 1] + val bx = points[next * 2]; val by = points[next * 2 + 1] + val oax = outer[i * 2]; val oay = outer[i * 2 + 1] + val obx = outer[next * 2]; val oby = outer[next * 2 + 1] + vertexCount = put(vertices, vertexCount, cx, cy, sampleColor(cx, cy, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) + vertexCount = put(vertices, vertexCount, bx, by, sampleColor(bx, by, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) + vertexCount = put(vertices, vertexCount, ax, ay, sampleColor(ax, ay, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) + vertexCount = put(vertices, vertexCount, ax, ay, sampleColor(ax, ay, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) + vertexCount = put(vertices, vertexCount, oax, oay, withAlpha(sampleColor(oax, oay, x, y, w, h, color1, color2, gradient), 0), x, y, w, h, textured) + vertexCount = put(vertices, vertexCount, ax, ay, sampleColor(ax, ay, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) + vertexCount = put(vertices, vertexCount, bx, by, sampleColor(bx, by, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) + vertexCount = put(vertices, vertexCount, obx, oby, withAlpha(sampleColor(obx, oby, x, y, w, h, color1, color2, gradient), 0), x, y, w, h, textured) + } + releaseFloats(points); releaseFloats(outer) + emitMesh(vertices, vertexCount, textured, setup, x - localPixel(pose), y - localPixel(pose), x + w + localPixel(pose), y + h + localPixel(pose), pose) + } + + private fun emitRing( + ax: Float, ay: Float, aw: Float, ah: Float, ar: Float, + bx: Float, by: Float, bw: Float, bh: Float, br: Float, + color: Int, + ) = emitRing(ax, ay, aw, ah, ar, bx, by, bw, bh, br, color, color, null) + + private fun emitRing( + ax: Float, ay: Float, aw: Float, ah: Float, ar: Float, + bx: Float, by: Float, bw: Float, bh: Float, br: Float, + color1: Int, color2: Int, gradient: Gradient?, + ) { + val ctx = context ?: return + if (aw <= 0f || ah <= 0f || bw <= 0f || bh <= 0f) return + val pose = Matrix3x2f(ctx.pose()) + val radiusA = ar.coerceIn(0f, min(aw, ah) / 2f) + val radiusB = br.coerceIn(0f, min(bw, bh) / 2f) + val segments = cornerSegments(max(radiusA, radiusB), pose) + val count = 4 * (segments + 1) + val a = acquireFloats(count * 2) + val b = acquireFloats(count * 2) + writeContour(a, null, ax, ay, aw, ah, radiusA, radiusA, radiusA, radiusA, pose, segments) + writeContour(b, null, bx, by, bw, bh, radiusB, radiusB, radiusB, radiusB, pose, segments) + val vertices = acquireFloats(count * 4 * 5) + var vertexCount = 0 + for (i in 0 until count) { + val next = (i + 1) % count + val aix = a[i * 2]; val aiy = a[i * 2 + 1] + val bix = b[i * 2]; val biy = b[i * 2 + 1] + val anx = a[next * 2]; val any = a[next * 2 + 1] + val bnx = b[next * 2]; val bny = b[next * 2 + 1] + vertexCount = put(vertices, vertexCount, aix, aiy, sampleColor(aix, aiy, ax, ay, aw, ah, color1, color2, gradient)) + vertexCount = put(vertices, vertexCount, bix, biy, sampleColor(bix, biy, ax, ay, aw, ah, color1, color2, gradient)) + vertexCount = put(vertices, vertexCount, bnx, bny, sampleColor(bnx, bny, ax, ay, aw, ah, color1, color2, gradient)) + vertexCount = put(vertices, vertexCount, anx, any, sampleColor(anx, any, ax, ay, aw, ah, color1, color2, gradient)) + } + releaseFloats(a); releaseFloats(b) + emitMesh(vertices, vertexCount, false, TextureSetup.noTexture(), min(ax, bx), min(ay, by), max(ax + aw, bx + bw), max(ay + ah, by + bh), pose) + } + + private fun contourPointCount(tl: Float, tr: Float, br: Float, bl: Float, pose: Matrix3x2f) = + cornerSegments(tl, pose) + cornerSegments(tr, pose) + cornerSegments(br, pose) + cornerSegments(bl, pose) + 4 + + private fun cornerSegments(radius: Float, pose: Matrix3x2f): Int { + val renderedRadius = radius * max( + hypot(pose.m00().toDouble(), pose.m01().toDouble()), + hypot(pose.m10().toDouble(), pose.m11().toDouble()), + ) * mc.window.guiScale + return ceil(PI * renderedRadius / 4.0).toInt().coerceIn(1, 32) + } + + private fun writeContour( + points: FloatArray, outer: FloatArray?, x: Float, y: Float, w: Float, h: Float, + tl: Float, tr: Float, br: Float, bl: Float, pose: Matrix3x2f, fixedSegments: Int = 0, + ) { + var point = 0 + for (corner in 0..3) { + val radius = when (corner) { 0 -> tl; 1 -> tr; 2 -> br; else -> bl } + val cx = when (corner) { 0, 3 -> x + radius; else -> x + w - radius } + val cy = when (corner) { 0, 1 -> y + radius; else -> y + h - radius } + val start = when (corner) { 0 -> PI; 1 -> -PI / 2; 2 -> 0.0; else -> PI / 2 } + val segments = if (fixedSegments > 0) fixedSegments else cornerSegments(radius, pose) + for (i in 0..segments) { + val angle = start + PI * i / (2 * segments) + val dx = cos(angle).toFloat() + val dy = sin(angle).toFloat() + points[point * 2] = cx + dx * radius + points[point * 2 + 1] = cy + dy * radius + outer?.let { + val feather = framebufferPixelAlong(dx, dy, pose) + it[point * 2] = cx + dx * (radius + feather) + it[point * 2 + 1] = cy + dy * (radius + feather) + } + point++ + } + } + } + + private fun framebufferPixelAlong(dx: Float, dy: Float, pose: Matrix3x2f): Float { + val tx = pose.m00() * dx + pose.m10() * dy + val ty = pose.m01() * dx + pose.m11() * dy + val length = mc.window.guiScale * hypot(tx.toDouble(), ty.toDouble()) + return if (length > 1e-6) (1.0 / length).toFloat() else 0f + } + + private fun localPixel(pose: Matrix3x2f): Float = max( + max(framebufferPixelAlong(1f, 0f, pose), framebufferPixelAlong(0f, 1f, pose)), + max(framebufferPixelAlong(0.70710677f, 0.70710677f, pose), framebufferPixelAlong(0.70710677f, -0.70710677f, pose)), + ) + + private fun emitGradientQuad(x: Float, y: Float, w: Float, h: Float, a: Int, b: Int, gradient: Gradient) = + emitQuad( + x, y, w, h, + gradientColor(x, y, x, y, w, h, a, b, gradient), + gradientColor(x, y + h, x, y, w, h, a, b, gradient), + gradientColor(x + w, y + h, x, y, w, h, a, b, gradient), + gradientColor(x + w, y, x, y, w, h, a, b, gradient), + ) + + private fun emitQuad( + x: Float, y: Float, w: Float, h: Float, c0: Int, c1: Int = c0, c2: Int = c0, c3: Int = c0, + textured: Boolean = false, setup: TextureSetup = TextureSetup.noTexture(), + ) { + val ctx = context ?: return + if (w <= 0f || h <= 0f) return + val pose = Matrix3x2f(ctx.pose()) + val bounds = bounds(x, y, x + w, y + h, pose) + (ctx as GuiGraphicsExtractorAccessor).ctjsGuiRenderState.addGuiElement( + QuadState(x, y, w, h, c0, c1, c2, c3, pose, textured, setup, clip?.screen, bounds), + ) + } + + private fun emitQuadPoints( + x0: Float, y0: Float, x1: Float, y1: Float, x2: Float, y2: Float, x3: Float, y3: Float, color: Int, + ) { + val ctx = context ?: return + val pose = Matrix3x2f(ctx.pose()) + val vertices = acquireFloats(20) + var count = 0 + count = put(vertices, count, x0, y0, color); count = put(vertices, count, x1, y1, color) + count = put(vertices, count, x2, y2, color); count = put(vertices, count, x3, y3, color) + emitMesh(vertices, count, false, TextureSetup.noTexture(), min(min(x0, x1), min(x2, x3)), min(min(y0, y1), min(y2, y3)), max(max(x0, x1), max(x2, x3)), max(max(y0, y1), max(y2, y3)), pose) + } + + private fun put( + vertices: FloatArray, index: Int, x: Float, y: Float, color: Int, + boundsX: Float = 0f, boundsY: Float = 0f, boundsW: Float = 1f, boundsH: Float = 1f, textured: Boolean = false, + ): Int { + val offset = index * 5 + vertices[offset] = x; vertices[offset + 1] = y + vertices[offset + 2] = if (textured) (x - boundsX) / boundsW else 0f + vertices[offset + 3] = if (textured) (y - boundsY) / boundsH else 0f + vertices[offset + 4] = Float.fromBits(color) + return index + 1 + } + + private fun acquireFloats(size: Int): FloatArray = synchronized(vertexPool) { + vertexPool.firstOrNull { it.size >= size }?.also(vertexPool::remove) ?: FloatArray(size) + } + + private fun releaseFloats(vertices: FloatArray) = synchronized(vertexPool) { vertexPool.addLast(vertices) } + + private fun emitMesh( + vertices: FloatArray, count: Int, textured: Boolean, setup: TextureSetup, + minX: Float, minY: Float, maxX: Float, maxY: Float, pose: Matrix3x2f, + ) { + val ctx = context ?: return releaseFloats(vertices) + val area = bounds(minX, minY, maxX, maxY, pose) + synchronized(vertexPool) { inFlightVertices.addLast(vertices) } + (ctx as GuiGraphicsExtractorAccessor).ctjsGuiRenderState.addGuiElement(MeshState(vertices, count, pose, textured, setup, clip?.screen, area)) + } + + private fun bounds(minX: Float, minY: Float, maxX: Float, maxY: Float, pose: Matrix3x2f): ScreenRectangle { + var area = ScreenRectangle(floor(minX).toInt(), floor(minY).toInt(), ceil(maxX - floor(minX)).toInt(), ceil(maxY - floor(minY)).toInt()).transformMaxBounds(pose) + clip?.screen?.let { area = area.intersection(it) ?: ScreenRectangle.empty() } + return area + } + + private fun resolveGradient(direction: Any): Gradient { + val name = direction.toString() + return when { + name.contains("TopToBottom") -> Gradient.TOP_TO_BOTTOM + name.contains("TopLeftToBottomRight") -> Gradient.TL_TO_BR + name.contains("BottomLeftToTopRight") -> Gradient.BL_TO_TR + else -> Gradient.LEFT_TO_RIGHT + } + } + + private fun sampleColor(px: Float, py: Float, x: Float, y: Float, w: Float, h: Float, a: Int, b: Int, gradient: Gradient?) = + if (gradient == null) a else gradientColor(px, py, x, y, w, h, a, b, gradient) + + private fun gradientColor(px: Float, py: Float, x: Float, y: Float, w: Float, h: Float, a: Int, b: Int, direction: Gradient): Int { + val value = when (direction) { + Gradient.TOP_TO_BOTTOM -> (py - y) / h + Gradient.TL_TO_BR -> ((px - x) / w + (py - y) / h) / 2f + Gradient.BL_TO_TR -> ((px - x) / w + 1f - (py - y) / h) / 2f + Gradient.LEFT_TO_RIGHT -> (px - x) / w + }.coerceIn(0f, 1f) + fun channel(shift: Int) = (((a ushr shift) and 255) + (((b ushr shift) and 255) - ((a ushr shift) and 255)) * value).roundToInt() + return applyAlpha((channel(24) shl 24) or (channel(16) shl 16) or (channel(8) shl 8) or channel(0)) + } + + private fun applyAlpha(color: Int): Int = withAlpha(color, (((color ushr 24) and 255) * alpha).roundToInt()) + private fun withAlpha(color: Int, value: Int) = (color and 0xffffff) or (value.coerceIn(0, 255) shl 24) +} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/LegacyPipelineBuilder.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/LegacyPipelineBuilder.kt deleted file mode 100644 index fce0e5c9..00000000 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/LegacyPipelineBuilder.kt +++ /dev/null @@ -1,92 +0,0 @@ -package com.chattriggers.ctjs.api.render - -import com.mojang.blaze3d.pipeline.ColorTargetState -import com.mojang.blaze3d.pipeline.BlendFunction -import com.mojang.blaze3d.pipeline.DepthStencilState -import com.mojang.blaze3d.pipeline.RenderPipeline -import com.mojang.blaze3d.platform.CompareOp -import com.mojang.blaze3d.platform.DestFactor -import com.mojang.blaze3d.platform.SourceFactor -import net.minecraft.client.renderer.rendertype.RenderType - -object LegacyPipelineBuilder { - private val pipelineList = mutableMapOf() - private var cull: Boolean? = null - private var depth: Boolean? = null - private var blend: Boolean? = null - private var drawMode = Renderer.DrawMode.QUADS - private var vertexFormat = Renderer.VertexFormat.POSITION_COLOR - private var snippet = Renderer.RenderSnippet.POSITION_COLOR_SNIPPET - - fun begin( - drawMode: Renderer.DrawMode = Renderer.DrawMode.QUADS, - vertexFormat: Renderer.VertexFormat = Renderer.VertexFormat.POSITION_COLOR, - snippet: Renderer.RenderSnippet = Renderer.RenderSnippet.POSITION_COLOR_SNIPPET - ) = apply { - this.drawMode = drawMode - this.vertexFormat = vertexFormat - this.snippet = snippet - } - - fun enableBlend() = apply { - blend = true - } - - fun disableBlend() = apply { - blend = false - } - - fun enableCull() = apply { - cull = true - } - - fun disableCull() = apply { - cull = false - } - - fun enableDepth() = apply { - depth = true - } - - fun disableDepth() = apply { - depth = false - } - - fun build(): RenderPipeline { - val key = state() - return pipelineList.getOrPut(key) { - val basePipeline = RenderPipeline.builder(snippet.mcSnippet) - .withLocation("ctjs/custom/pipeline${hashCode()}") - .withVertexFormat(vertexFormat.toMC(), drawMode.toUC().mcMode) - if (blend == true) basePipeline.withColorTargetState(ColorTargetState(BlendFunction(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ZERO))) - - cull?.let(basePipeline::withCull) - - if (depth == true) { - basePipeline - .withDepthStencilState(DepthStencilState(CompareOp.LESS_THAN_OR_EQUAL, true)) - } - else if (depth == false) { - basePipeline - .withDepthStencilState(DepthStencilState(CompareOp.ALWAYS_PASS, false)) - } - - basePipeline.build() - } - } - - fun layer(): RenderType { - throw Error("LegacyPipelineBuilder#layer currently not supported") - } - - fun state(): String { - return "LegacyPipelineBuilder[" + - "cull=$cull, " + - "depth=$depth, " + - "blend=$blend, " + - "drawMode=${drawMode.name}, " + - "vertexFormat=${vertexFormat.name}, " + - "snippet=${snippet.name}" + - "]" - } -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/NVGRenderer.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/NVGRenderer.kt deleted file mode 100644 index 0c523e35..00000000 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/NVGRenderer.kt +++ /dev/null @@ -1,875 +0,0 @@ -package com.chattriggers.ctjs.api.render - -import com.mojang.blaze3d.opengl.GlStateManager -import com.mojang.blaze3d.opengl.GlTexture -import com.mojang.blaze3d.opengl.DirectStateAccess -import com.mojang.blaze3d.systems.GpuDevice -import com.mojang.blaze3d.systems.RenderSystem -import net.minecraft.client.Minecraft -import org.lwjgl.nanovg.NVGColor -import org.lwjgl.nanovg.NVGPaint -import org.lwjgl.nanovg.NanoVG.* -import org.lwjgl.nanovg.NanoVGGL3.* -import org.lwjgl.nanovg.NanoSVG.* -import org.lwjgl.opengl.GL20C -import org.lwjgl.opengl.GL30 -import org.lwjgl.opengl.GL33C -import org.lwjgl.stb.STBImage.stbi_load_from_memory -import org.lwjgl.stb.STBImage.stbi_image_free -import org.lwjgl.system.MemoryUtil -import java.nio.ByteBuffer -import java.awt.Color -import java.awt.image.BufferedImage -import javax.imageio.ImageIO -import javax.imageio.metadata.IIOMetadataNode -import java.util.concurrent.CopyOnWriteArrayList -import java.util.concurrent.ConcurrentHashMap -import java.io.File -import java.io.FileNotFoundException -import java.io.FileInputStream -import java.net.URI - -object NVGRenderer { - - private val mc = Minecraft.getInstance() - private val nvgColor = NVGColor.malloc() - private val nvgColor2 = NVGColor.malloc() - private val nvgPaint = NVGPaint.malloc() - - private var checkTexId = 0 - private var hueTexId = 0 - - val defaultFont by lazy { - try { - val stream = NVGRenderer::class.java.getResourceAsStream("/assets/v5/font.otf") - ?: throw Exception("Could not find /assets/v5/font.otf in classpath") - Font("Default", stream) - } catch (e: Exception) { - println("[V5] Failed to load font: ${e.message}") - null - } - } - - private val fontMap = HashMap() - private val fontBounds = FloatArray(4) - - private val imageCache = HashMap() - - private val gifCache = ConcurrentHashMap() - private val glTextureCache = ConcurrentHashMap() - - private val urlCache = ConcurrentHashMap() - private val pendingDownloads = ConcurrentHashMap.newKeySet() - - private data class DecodedImage( - val url: String, - val pixels: ByteBuffer?, - val width: Int, - val height: Int - ) - private val downloadQueue = java.util.concurrent.LinkedBlockingQueue() - private const val MAX_DOWNLOADS_PER_FRAME = 5 - - private val preRenderCallbacks = CopyOnWriteArrayList() - private val renderCallbacks = CopyOnWriteArrayList() - - private var drawing = false - @JvmField var vg = -1L - private var framebufferWarningPrinted = false - - private val gpuBackendField by lazy { - GpuDevice::class.java.getDeclaredField("backend").apply { isAccessible = true } - } - private val directStateAccessMethod by lazy { - Class.forName("com.mojang.blaze3d.opengl.GlDevice") - .getDeclaredMethod("directStateAccess") - .apply { isAccessible = true } - } - - data class GifData( - val width: Int, - val height: Int, - val frameCount: Int, - val delays: IntArray - ) { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is GifData) return false - return width == other.width && height == other.height && - frameCount == other.frameCount && delays.contentEquals(other.delays) - } - override fun hashCode(): Int = 31 * (31 * (31 * width + height) + frameCount) + delays.contentHashCode() - } - - private data class CachedGif( - var frameIds: IntArray?, - var rawFrames: ArrayList?, - val delays: IntArray, - val width: Int, - val height: Int, - var refCount: Int - ) - - private data class CachedImage( - val nvgId: Int, - var refCount: Int, - ) - - private data class NVGFont(val id: Int, val buffer: ByteBuffer) - - @JvmStatic - fun registerV5Render(runnable: Runnable) { - renderCallbacks.add(runnable) - } - - @JvmStatic - fun unregisterV5Render(runnable: Runnable) { - renderCallbacks.remove(runnable) - } - - @JvmStatic - fun registerV5PreRender(runnable: Runnable) { - preRenderCallbacks.add(runnable) - } - - @JvmStatic - fun unregisterV5PreRender(runnable: Runnable) { - preRenderCallbacks.remove(runnable) - } - - fun clearCallbacks() { - renderCallbacks.clear() - preRenderCallbacks.clear() - } - - @JvmStatic - fun runPreDrawables() { - runCallbacks(preRenderCallbacks) - } - - @JvmStatic - fun runDrawables() { - processDownloadQueue() - runCallbacks(renderCallbacks) - } - - private fun runCallbacks(callbacks: List) { - callbacks.forEach { runnable -> - try { - runnable.run() - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - private fun isGameReady(): Boolean { - return mc.window.handle() != 0L - } - - private fun ensureInitialized() { - if (vg != -1L) return - vg = nvgCreate(NVG_ANTIALIAS or NVG_STENCIL_STROKES) - if (vg == -1L) throw RuntimeException("Failed to initialize NanoVG") - } - - private fun mainFramebufferId(): Int { - val target = mc.mainRenderTarget - val colorTexture = target.colorTexture as? GlTexture ?: return GL33C.glGetInteger(GL30.GL_FRAMEBUFFER_BINDING) - return try { - val backend = gpuBackendField.get(RenderSystem.getDevice()) - val directStateAccess = directStateAccessMethod.invoke(backend) as DirectStateAccess - colorTexture.getFbo(directStateAccess, target.depthTexture) - } catch (e: Exception) { - if (!framebufferWarningPrinted) { - framebufferWarningPrinted = true - println("[V5] Failed to bind NanoVG to main framebuffer: ${e.message}") - } - GL33C.glGetInteger(GL30.GL_FRAMEBUFFER_BINDING) - } - } - - @JvmStatic - fun beginFrame(width: Float, height: Float) { - if (!isGameReady()) return - ensureInitialized() - if (drawing) return - - val framebuffer = mc.mainRenderTarget - val prevFramebuffer = GL33C.glGetInteger(GL30.GL_FRAMEBUFFER_BINDING) - val prevViewport = IntArray(4) - GL33C.glGetIntegerv(GL33C.GL_VIEWPORT, prevViewport) - val prevProgram = GL33C.glGetInteger(GL20C.GL_CURRENT_PROGRAM) - - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, mainFramebufferId()) - GlStateManager._viewport(0, 0, framebuffer.width, framebuffer.height) - GlStateManager._activeTexture(GL30.GL_TEXTURE0) - - GL33C.glBindSampler(0, 0) - val pixelRatio = if (width > 0) framebuffer.width.toFloat() / width else 1.0f - - nvgBeginFrame(vg, width, height, pixelRatio) - nvgTextAlign(vg, NVG_ALIGN_LEFT or NVG_ALIGN_TOP) - drawing = true - - savedFramebuffer = prevFramebuffer - savedViewport = prevViewport - savedProgram = prevProgram - } - - private var savedFramebuffer = 0 - private var savedViewport = IntArray(4) - private var savedProgram = 0 - - @JvmStatic - fun endFrame() { - if (!drawing || vg == -1L) return - - nvgEndFrame(vg) - GL33C.glBindSampler(0, 0) - GlStateManager._disableCull() - GlStateManager._disableDepthTest() - GlStateManager._enableBlend() - GlStateManager._blendFuncSeparate(770, 771, 1, 0) - GlStateManager._glUseProgram(savedProgram) - - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, savedFramebuffer) - GlStateManager._viewport(savedViewport[0], savedViewport[1], savedViewport[2], savedViewport[3]) - - GlStateManager._activeTexture(GL30.GL_TEXTURE0) - GlStateManager._bindTexture(0) - - drawing = false - } - - private fun applyColor(color: Int, target: NVGColor = nvgColor) { - nvgRGBA( - ((color shr 16) and 0xFF).toByte(), - ((color shr 8) and 0xFF).toByte(), - (color and 0xFF).toByte(), - ((color shr 24) and 0xFF).toByte(), - target - ) - } - - private fun applyGradient(x: Float, y: Float, w: Float, h: Float, color1: Int, color2: Int, direction: Any) { - applyColor(color1, nvgColor) - applyColor(color2, nvgColor2) - val dir = direction.toString() - when { - dir.contains("LeftToRight") -> nvgLinearGradient(vg, x, y, x + w, y, nvgColor, nvgColor2, nvgPaint) - dir.contains("TopToBottom") -> nvgLinearGradient(vg, x, y, x, y + h, nvgColor, nvgColor2, nvgPaint) - dir.contains("TopLeftToBottomRight") -> nvgLinearGradient(vg, x, y, x + w, y + h, nvgColor, nvgColor2, nvgPaint) - dir.contains("BottomLeftToTopRight") -> nvgLinearGradient(vg, x, y + h, x + w, y, nvgColor, nvgColor2, nvgPaint) - else -> nvgLinearGradient(vg, x, y, x + w, y, nvgColor, nvgColor2, nvgPaint) - } - } - - @JvmStatic - @JvmOverloads - fun drawCheckerboard(x: Float, y: Float, w: Float, h: Float, radius: Float, size: Float = 4f) { - if (!drawing) return - - if (checkTexId == 0) { - val buf = MemoryUtil.memAlloc(16) - val c1 = 64.toByte() - val c2 = 115.toByte() - val a = 255.toByte() - buf.put(c1).put(c1).put(c1).put(a).put(c2).put(c2).put(c2).put(a) - buf.put(c2).put(c2).put(c2).put(a).put(c1).put(c1).put(c1).put(a) - buf.flip() - checkTexId = nvgCreateImageRGBA(vg, 2, 2, NVG_IMAGE_REPEATX or NVG_IMAGE_REPEATY or NVG_IMAGE_NEAREST, buf) - MemoryUtil.memFree(buf) - } - - nvgImagePattern(vg, x, y, size * 2, size * 2, 0f, checkTexId, 1f, nvgPaint) - nvgBeginPath(vg) - nvgRoundedRect(vg, x, y, w, h, radius) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - - @JvmStatic - fun drawHueBar(x: Float, y: Float, w: Float, h: Float, radius: Float) { - if (!drawing) return - - if (hueTexId == 0) { - val width = 128 - val buf = MemoryUtil.memAlloc(width * 4) - for (i in 0 until width) { - val rgb = Color.HSBtoRGB(i.toFloat() / width, 1f, 1f) - buf.put((rgb shr 16 and 0xFF).toByte()) - buf.put((rgb shr 8 and 0xFF).toByte()) - buf.put((rgb and 0xFF).toByte()) - buf.put(255.toByte()) - } - buf.flip() - hueTexId = nvgCreateImageRGBA(vg, width, 1, 0, buf) - MemoryUtil.memFree(buf) - } - - nvgImagePattern(vg, x, y, w, 1f, 0f, hueTexId, 1f, nvgPaint) - nvgBeginPath(vg) - nvgRoundedRect(vg, x, y, w, h, radius) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - - @JvmStatic - @JvmOverloads - fun drawGradientRect(x: Float, y: Float, w: Float, h: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) { - if (!drawing) return - nvgBeginPath(vg) - if (radius > 0) nvgRoundedRect(vg, x, y, w, h, radius) else nvgRect(vg, x, y, w, h) - applyGradient(x, y, w, h, color1, color2, direction) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - - @JvmStatic - @JvmOverloads - fun drawHollowGradientRect(x: Float, y: Float, w: Float, h: Float, thickness: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) { - if (!drawing) return - nvgBeginPath(vg) - if (radius > 0) nvgRoundedRect(vg, x, y, w, h, radius) else nvgRect(vg, x, y, w, h) - nvgStrokeWidth(vg, thickness) - applyGradient(x, y, w, h, color1, color2, direction) - nvgStrokePaint(vg, nvgPaint) - nvgStroke(vg) - } - - @JvmStatic - fun linearGradient(sx: Float, sy: Float, ex: Float, ey: Float, color1: Int, color2: Int) { - applyColor(color1, nvgColor) - applyColor(color2, nvgColor2) - nvgLinearGradient(vg, sx, sy, ex, ey, nvgColor, nvgColor2, nvgPaint) - } - - @JvmStatic - fun setGlobalCompositeOperation(op: Int) { - if (vg != -1L) nvgGlobalCompositeOperation(vg, op) - } - - @JvmStatic fun save() { if (vg != -1L) nvgSave(vg) } - @JvmStatic fun restore() { if (vg != -1L) nvgRestore(vg) } - @JvmStatic fun translate(x: Float, y: Float) { if (vg != -1L) nvgTranslate(vg, x, y) } - @JvmStatic fun rotate(angle: Float) { if (vg != -1L) nvgRotate(vg, Math.toRadians(angle.toDouble()).toFloat()) } - @JvmStatic fun scale(x: Float, y: Float) { if (vg != -1L) nvgScale(vg, x, y) } - @JvmStatic fun globalAlpha(alpha: Float) { if (vg != -1L) nvgGlobalAlpha(vg, alpha.coerceIn(0f, 1f)) } - - @JvmStatic - fun drawRect(x: Float, y: Float, w: Float, h: Float, color: Int) { - if (!drawing) return - nvgBeginPath(vg) - nvgRect(vg, x, y, w, h) - applyColor(color) - nvgFillColor(vg, nvgColor) - nvgFill(vg) - } - - @JvmStatic - fun drawRoundedRect(x: Float, y: Float, w: Float, h: Float, radius: Float, color: Int) { - if (!drawing) return - nvgBeginPath(vg) - nvgRoundedRect(vg, x, y, w, h, radius) - applyColor(color) - nvgFillColor(vg, nvgColor) - nvgFill(vg) - } - - @JvmStatic - fun drawRoundedRectVaried(x: Float, y: Float, w: Float, h: Float, color: Int, tl: Float, tr: Float, br: Float, bl: Float) { - if (!drawing) return - nvgBeginPath(vg) - nvgRoundedRectVarying(vg, x, y, w, h, tl, tr, br, bl) - applyColor(color) - nvgFillColor(vg, nvgColor) - nvgFill(vg) - } - - @JvmStatic - fun drawCircle(x: Float, y: Float, radius: Float, color: Int) { - if (!drawing) return - nvgBeginPath(vg) - nvgCircle(vg, x, y, radius) - applyColor(color) - nvgFillColor(vg, nvgColor) - nvgFill(vg) - } - - @JvmStatic - fun drawDropShadow(x: Float, y: Float, w: Float, h: Float, radius: Float, blur: Float, spread: Float, color: Int) { - if (!drawing) return - applyColor(color, nvgColor) - applyColor(0, nvgColor2) - - nvgBoxGradient(vg, x - spread, y - spread, w + 2 * spread, h + 2 * spread, radius + spread, blur, nvgColor, nvgColor2, nvgPaint) - - nvgBeginPath(vg) - nvgRect(vg, x - spread - blur, y - spread - blur, w + 2 * spread + 2 * blur, h + 2 * spread + 2 * blur) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - - @JvmStatic - @JvmOverloads - fun drawHollowRect(x: Float, y: Float, w: Float, h: Float, thickness: Float, color: Int, radius: Float = 0f) { - if (!drawing) return - nvgBeginPath(vg) - if (radius > 0) nvgRoundedRect(vg, x, y, w, h, radius) else nvgRect(vg, x, y, w, h) - nvgStrokeWidth(vg, thickness) - nvgPathWinding(vg, NVG_HOLE) - applyColor(color) - nvgStrokeColor(vg, nvgColor) - nvgStroke(vg) - } - - @JvmStatic - fun drawLine(x1: Float, y1: Float, x2: Float, y2: Float, thickness: Float, color: Int) { - if (!drawing) return - nvgBeginPath(vg) - nvgMoveTo(vg, x1, y1) - nvgLineTo(vg, x2, y2) - nvgStrokeWidth(vg, thickness) - applyColor(color) - nvgStrokeColor(vg, nvgColor) - nvgStroke(vg) - } - - @JvmStatic - fun loadImage(path: String): String { - ensureInitialized() - - synchronized(imageCache) { - imageCache[path]?.let { - it.refCount++ - return path - } - } - - val bytes = readImage(path) - val nvgId = if (path.endsWith(".svg", true)) loadSVGImage(bytes, path) else loadRasterImage(bytes, path) - - synchronized(imageCache) { - imageCache[path] = CachedImage(nvgId, 1) - } - - return path - } - - @JvmStatic - fun unloadImage(path: String) { - synchronized(imageCache) { - val cached = imageCache[path] ?: return - if (--cached.refCount <= 0) { - nvgDeleteImage(vg, cached.nvgId) - imageCache.remove(path) - } - } - } - - @JvmStatic - fun isImageLoaded(path: String): Boolean = synchronized(imageCache) { imageCache.containsKey(path) } - - private fun readImage(path: String): ByteArray { - val trimmed = path.trim() - val stream = when { - trimmed.startsWith("http://") || trimmed.startsWith("https://") -> URI.create(trimmed).toURL().openStream() - File(trimmed).isFile -> FileInputStream(trimmed) - else -> NVGRenderer::class.java.getResourceAsStream(trimmed) - ?: throw FileNotFoundException("Cannot find image: $trimmed") - } - return stream.use { it.readBytes() } - } - - private fun loadRasterImage(bytes: ByteArray, identifier: String): Int { - val w = IntArray(1) - val h = IntArray(1) - val channels = IntArray(1) - val buffer = MemoryUtil.memAlloc(bytes.size).put(bytes).flip() as ByteBuffer - try { - val pixels = stbi_load_from_memory(buffer, w, h, channels, 4) - ?: throw RuntimeException("Failed to load image: $identifier") - val nvgId = nvgCreateImageRGBA(vg, w[0], h[0], 0, pixels) - stbi_image_free(pixels) - return nvgId - } finally { - MemoryUtil.memFree(buffer) - } - } - - private fun loadSVGImage(bytes: ByteArray, identifier: String): Int { - val svg = nsvgParse(String(bytes), "px", 96f) - ?: throw RuntimeException("Failed to parse SVG: $identifier") - - val width = svg.width().toInt() - val height = svg.height().toInt() - - if (width <= 0 || height <= 0) { - nsvgDelete(svg) - throw RuntimeException("Invalid SVG dimensions: $identifier") - } - - val buffer = MemoryUtil.memAlloc(width * height * 4) - try { - val rasterizer = nsvgCreateRasterizer() - nsvgRasterize(rasterizer, svg, 0f, 0f, 1f, buffer, width, height, width * 4) - val nvgId = nvgCreateImageRGBA(vg, width, height, 0, buffer) - nsvgDeleteRasterizer(rasterizer) - return nvgId - } finally { - nsvgDelete(svg) - MemoryUtil.memFree(buffer) - } - } - - @JvmStatic - fun loadGif(path: String): GifData? { - gifCache[path]?.let { cached -> - synchronized(cached) { cached.refCount++ } - val count = cached.frameIds?.size ?: cached.rawFrames?.size ?: 0 - return GifData(cached.width, cached.height, count, cached.delays) - } - - val file = File(path) - if (!file.exists()) return null - - try { - FileInputStream(file).use { stream -> - val readers = ImageIO.getImageReadersByFormatName("gif") - if (!readers.hasNext()) return null - val reader = readers.next() - reader.input = ImageIO.createImageInputStream(stream) - - val numFrames = reader.getNumImages(true) - val rawFrames = ArrayList(numFrames) - val delays = IntArray(numFrames) - - val firstFrame = reader.read(0) - val width = firstFrame.width - val height = firstFrame.height - - val masterImage = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) - val masterGraphics = masterImage.createGraphics() - masterGraphics.background = Color(0, 0, 0, 0) - - for (i in 0 until numFrames) { - val frameImage = reader.read(i) - val metadata = reader.getImageMetadata(i) - val tree = metadata.getAsTree(metadata.nativeMetadataFormatName) as IIOMetadataNode - - val gce = tree.getElementsByTagName("GraphicControlExtension").item(0) as IIOMetadataNode - delays[i] = (gce.getAttribute("delayTime").toInt() * 10).coerceAtLeast(10) - val disposal = gce.getAttribute("disposalMethod") - - val imgDesc = tree.getElementsByTagName("ImageDescriptor").item(0) as IIOMetadataNode - val fx = imgDesc.getAttribute("imageLeftPosition").toInt() - val fy = imgDesc.getAttribute("imageTopPosition").toInt() - - masterGraphics.drawImage(frameImage, fx, fy, null) - rawFrames.add(bufferedImageToByteBuffer(masterImage)) - - if (disposal == "restoreToBackgroundColor") { - masterGraphics.clearRect(fx, fy, frameImage.width, frameImage.height) - } - } - masterGraphics.dispose() - reader.dispose() - - gifCache[path] = CachedGif(null, rawFrames, delays, width, height, 1) - return GifData(width, height, numFrames, delays) - } - } catch (e: Exception) { - println("[V5] Failed to load GIF $path: ${e.message}") - return null - } - } - - @JvmStatic - fun unloadGif(path: String) { - val cached = gifCache[path] ?: return - val shouldFree = synchronized(cached) { --cached.refCount <= 0 } - - if (shouldFree) { - cached.frameIds?.forEach { nvgDeleteImage(vg, it) } - cached.rawFrames?.forEach { MemoryUtil.memFree(it) } - gifCache.remove(path) - } - } - - @JvmStatic - @JvmOverloads - fun drawGif(path: String, x: Float, y: Float, w: Float, h: Float, frameIndex: Int, radius: Float = 0f, alpha: Float = 1f) { - if (!drawing) return - val cached = gifCache[path] ?: return - - if (cached.frameIds == null) { - val raw = cached.rawFrames ?: return - cached.frameIds = IntArray(raw.size) { i -> - val id = nvgCreateImageRGBA(vg, cached.width, cached.height, 0, raw[i]) - MemoryUtil.memFree(raw[i]) - id - } - cached.rawFrames = null - } - - val frames = cached.frameIds!! - if (frames.isEmpty()) return - - nvgImagePattern(vg, x, y, w, h, 0f, frames[frameIndex % frames.size], alpha, nvgPaint) - nvgBeginPath(vg) - if (radius > 0) nvgRoundedRect(vg, x, y, w, h, radius) else nvgRect(vg, x, y, w, h) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - - private fun bufferedImageToByteBuffer(image: BufferedImage): ByteBuffer { - val pixels = IntArray(image.width * image.height) - image.getRGB(0, 0, image.width, image.height, pixels, 0, image.width) - - val buffer = MemoryUtil.memAlloc(pixels.size * 4) - for (pixel in pixels) { - buffer.put((pixel shr 16 and 0xFF).toByte()) // R - buffer.put((pixel shr 8 and 0xFF).toByte()) // G - buffer.put((pixel and 0xFF).toByte()) // B - buffer.put((pixel shr 24 and 0xFF).toByte()) // A - } - buffer.flip() - return buffer - } - - @JvmStatic - @JvmOverloads - fun drawImage(path: String, x: Float, y: Float, w: Float, h: Float, radius: Float = 0f, alpha: Float = 1f) { - if (!drawing) return - - val cached = synchronized(imageCache) { imageCache[path] } - - if (cached == null) { - try { - loadImage(path) - drawImage(path, x, y, w, h, radius, alpha) - } catch (e: Exception) { - println("[V5] Failed to load image: $path - ${e.message}") - } - return - } - - nvgImagePattern(vg, x, y, w, h, 0f, cached.nvgId, alpha, nvgPaint) - nvgBeginPath(vg) - if (radius > 0) nvgRoundedRect(vg, x, y, w, h, radius) else nvgRect(vg, x, y, w, h) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - - private fun processDownloadQueue() { - var processed = 0 - while (processed < MAX_DOWNLOADS_PER_FRAME) { - val decoded = downloadQueue.poll() ?: break - - if (decoded.pixels != null && vg != -1L) { - val nvgId = nvgCreateImageRGBA(vg, decoded.width, decoded.height, 0, decoded.pixels) - stbi_image_free(decoded.pixels) - urlCache[decoded.url] = nvgId - } else { - urlCache[decoded.url] = 0 - } - pendingDownloads.remove(decoded.url) - processed++ - } - } - - @JvmStatic - @JvmOverloads - fun drawImageFromUrl(url: String, x: Float, y: Float, w: Float, h: Float, radius: Float = 0f, alpha: Float = 1f) { - if (!drawing || url == "none") return - - urlCache[url]?.let { cachedId -> - if (cachedId > 0) { - nvgImagePattern(vg, x, y, w, h, 0f, cachedId, alpha, nvgPaint) - nvgBeginPath(vg) - if (radius > 0) nvgRoundedRect(vg, x, y, w, h, radius) else nvgRect(vg, x, y, w, h) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - return - } - - if (pendingDownloads.add(url)) { - Thread({ - try { - val connection = URI.create(url).toURL().openConnection().apply { - connectTimeout = 5000 - readTimeout = 5000 - setRequestProperty("User-Agent", "Mozilla/5.0") - } - val bytes = connection.getInputStream().use { it.readBytes() } - - val buffer = MemoryUtil.memAlloc(bytes.size).put(bytes).flip() as ByteBuffer - val wArr = IntArray(1) - val hArr = IntArray(1) - val cArr = IntArray(1) - - val pixels = stbi_load_from_memory(buffer, wArr, hArr, cArr, 4) - MemoryUtil.memFree(buffer) - - if (pixels != null) { - downloadQueue.add(DecodedImage(url, pixels, wArr[0], hArr[0])) - } else { - downloadQueue.add(DecodedImage(url, null, 0, 0)) - } - } catch (e: Exception) { - downloadQueue.add(DecodedImage(url, null, 0, 0)) - } - }, "V5-ImageDownload-${url.hashCode()}").start() - } - } - - @JvmStatic - @JvmOverloads - fun drawGLTexture(glTextureId: Int, texW: Int, texH: Int, x: Float, y: Float, w: Float, h: Float, radius: Float = 0f, alpha: Float = 1f) { - if (!drawing) return - ensureInitialized() - - val nvgId = glTextureCache.getOrPut(glTextureId) { - nvglCreateImageFromHandle(vg, glTextureId, texW, texH, NVG_IMAGE_NODELETE) - } - if (nvgId == 0) return - - nvgImagePattern(vg, x, y, w, h, 0f, nvgId, alpha, nvgPaint) - nvgBeginPath(vg) - if (radius > 0) nvgRoundedRect(vg, x, y, w, h, radius) else nvgRect(vg, x, y, w, h) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - - @JvmStatic - @JvmOverloads - fun drawGLTextureRegion(glTextureId: Int, textureWidth: Int, textureHeight: Int, subX: Int, subY: Int, subW: Int, subH: Int, x: Float, y: Float, w: Float, h: Float, radius: Float = 0f, alpha: Float = 1f) { - if (!drawing) return - ensureInitialized() - - val nvgId = glTextureCache.getOrPut(glTextureId) { - nvglCreateImageFromHandle(vg, glTextureId, textureWidth, textureHeight, NVG_IMAGE_NODELETE) - } - if (nvgId == 0) return - - val sw = subW.toFloat() / textureWidth - val sh = subH.toFloat() / textureHeight - val iw = w / sw - val ih = h / sh - val ix = x - iw * (subX.toFloat() / textureWidth) - val iy = y - ih * (subY.toFloat() / textureHeight) - - nvgImagePattern(vg, ix, iy, iw, ih, 0f, nvgId, alpha, nvgPaint) - nvgBeginPath(vg) - if (radius > 0) nvgRoundedRect(vg, x, y, w, h, radius) else nvgRect(vg, x, y, w, h) - nvgFillPaint(vg, nvgPaint) - nvgFill(vg) - } - - @JvmStatic - fun invalidateGLTexture(glTextureId: Int) { - glTextureCache.remove(glTextureId)?.takeIf { it != 0 }?.let { nvgDeleteImage(vg, it) } - } - - @JvmStatic - fun clearImageCache() { - if (vg == -1L) return - - synchronized(imageCache) { - imageCache.values.forEach { nvgDeleteImage(vg, it.nvgId) } - imageCache.clear() - } - - gifCache.values.forEach { gif -> - gif.frameIds?.forEach { nvgDeleteImage(vg, it) } - gif.rawFrames?.forEach { MemoryUtil.memFree(it) } - } - gifCache.clear() - - glTextureCache.values.filter { it != 0 }.forEach { nvgDeleteImage(vg, it) } - glTextureCache.clear() - - urlCache.values.filter { it > 0 }.forEach { nvgDeleteImage(vg, it) } - urlCache.clear() - pendingDownloads.clear() - - if (checkTexId != 0) { - nvgDeleteImage(vg, checkTexId) - checkTexId = 0 - } - if (hueTexId != 0) { - nvgDeleteImage(vg, hueTexId) - hueTexId = 0 - } - } - - @JvmStatic - fun getCacheStats(): String { - return "Images: ${imageCache.size}, GIFs: ${gifCache.size}, GL: ${glTextureCache.size}, URLs: ${urlCache.size}" - } - - @JvmStatic - fun scissor(x: Float, y: Float, w: Float, h: Float) { - if (vg != -1L) nvgIntersectScissor(vg, x, y, w, h) - } - - @JvmStatic - fun pushScissor(x: Float, y: Float, w: Float, h: Float) { - if (vg != -1L) { - nvgSave(vg) - nvgIntersectScissor(vg, x, y, w, h) - } - } - - @JvmStatic - fun popScissor() { - if (vg != -1L) nvgRestore(vg) - } - - @JvmStatic - fun resetScissor() { - if (vg != -1L) nvgResetScissor(vg) - } - - @JvmStatic - @JvmOverloads - fun text(text: String, x: Float, y: Float, size: Float, color: Int, font: Font? = defaultFont, align: Int) { - if (font == null || !drawing) return - nvgFontSize(vg, size) - nvgFontFaceId(vg, getFontID(font)) - nvgTextAlign(vg, align) - applyColor(color) - nvgFillColor(vg, nvgColor) - nvgText(vg, x, y, text) - } - - @JvmStatic - @JvmOverloads - fun textWidth(text: String, size: Float, font: Font? = defaultFont): Float { - if (font == null || vg == -1L) return 0f - nvgFontSize(vg, size) - nvgFontFaceId(vg, getFontID(font)) - return nvgTextBounds(vg, 0f, 0f, text, fontBounds) - } - - private fun getFontID(font: Font): Int { - return fontMap.getOrPut(font) { - val buffer = font.buffer() - NVGFont(nvgCreateFontMem(vg, font.name, buffer, false), buffer) - }.id - } - - @JvmStatic - fun destroy() { - clearImageCache() - - fontMap.clear() - - if (vg != -1L) { - nvgDelete(vg) - vg = -1L - } - } -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Rectangle.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Rectangle.kt index e3a58195..9912503e 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Rectangle.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Rectangle.kt @@ -82,7 +82,7 @@ class Rectangle( fun draw() = apply { shadow.draw() outline.draw() - Renderer.drawRect(color, x, y, width, height) + Renderer.drawRect(x, y, width, height, color.toInt()) } private class Shadow( @@ -93,20 +93,8 @@ class Rectangle( ) { fun draw() { if (!on) return - Renderer.drawRect( - color, - rect.x + offset.x, - rect.y + rect.height, - rect.width, - offset.y - ) - Renderer.drawRect( - color, - rect.x + rect.width, - rect.y + offset.y, - offset.x, - rect.height - offset.y - ) + Renderer.drawRect(rect.x + offset.x, rect.y + rect.height, rect.width, offset.y, color.toInt()) + Renderer.drawRect(rect.x + rect.width, rect.y + offset.y, offset.x, rect.height - offset.y, color.toInt()) } } @@ -119,11 +107,11 @@ class Rectangle( fun draw() { if (!on) return Renderer.drawRect( - color, rect.x - thickness, rect.y - thickness, rect.width + thickness * 2, - rect.height + thickness * 2 + rect.height + thickness * 2, + color.toInt(), ) } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderLayers.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderLayers.kt index ea23be66..43725cf7 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderLayers.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderLayers.kt @@ -1,61 +1,38 @@ package com.chattriggers.ctjs.api.render -import com.mojang.blaze3d.pipeline.ColorTargetState import com.mojang.blaze3d.pipeline.BlendFunction -import com.mojang.blaze3d.pipeline.DepthStencilState +import com.mojang.blaze3d.pipeline.ColorTargetState import com.mojang.blaze3d.pipeline.RenderPipeline -import com.mojang.blaze3d.platform.CompareOp import com.mojang.blaze3d.vertex.DefaultVertexFormat import com.mojang.blaze3d.vertex.VertexFormat.Mode +import net.minecraft.client.renderer.RenderPipelines as MinecraftRenderPipelines import net.minecraft.client.renderer.rendertype.LayeringTransform import net.minecraft.client.renderer.rendertype.RenderSetup import net.minecraft.client.renderer.rendertype.RenderType -import net.minecraft.client.renderer.RenderPipelines as MinecraftRenderPipelines +import java.util.Optional +/** The only custom world pipelines are the two states vanilla does not expose: no-depth ESP. */ object RenderPipelines { - @JvmField - val LINE_LIST: RenderPipeline = MinecraftRenderPipelines.register( - RenderPipeline.builder(MinecraftRenderPipelines.LINES_SNIPPET) - .withLocation("pipeline/ctjs_lines") - .withVertexFormat(DefaultVertexFormat.POSITION_COLOR_NORMAL_LINE_WIDTH, Mode.LINES) - .withCull(false) - .withColorTargetState(ColorTargetState(BlendFunction.TRANSLUCENT)) - .withDepthStencilState(DepthStencilState(CompareOp.LESS_THAN_OR_EQUAL, true)) - .build() - ) + @JvmField val LINE_LIST = MinecraftRenderPipelines.LINES_TRANSLUCENT + @JvmField val TRIANGLE_STRIP = MinecraftRenderPipelines.DEBUG_FILLED_BOX @JvmField - val LINE_LIST_ESP: RenderPipeline = MinecraftRenderPipelines.register( - RenderPipeline.builder(MinecraftRenderPipelines.LINES_SNIPPET) - .withLocation("pipeline/ctjs_lines_esp") - .withVertexFormat(DefaultVertexFormat.POSITION_COLOR_NORMAL_LINE_WIDTH, Mode.LINES) - .withCull(false) - .withColorTargetState(ColorTargetState(BlendFunction.TRANSLUCENT)) - .withDepthStencilState(DepthStencilState(CompareOp.ALWAYS_PASS, false)) - .build() - ) - - @JvmField - val TRIANGLE_STRIP: RenderPipeline = MinecraftRenderPipelines.register( - RenderPipeline.builder(MinecraftRenderPipelines.DEBUG_FILLED_SNIPPET) - .withLocation("pipeline/ctjs_debug_filled_box") - .withCull(false) - .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, Mode.QUADS) - .withDepthStencilState(DepthStencilState(CompareOp.LESS_THAN_OR_EQUAL, true)) - .withColorTargetState(ColorTargetState(BlendFunction.TRANSLUCENT)) - .build() - ) + val LINE_LIST_ESP: RenderPipeline = RenderPipeline.builder(MinecraftRenderPipelines.LINES_SNIPPET) + .withLocation("pipeline/ctjs_lines_esp") + .withVertexFormat(DefaultVertexFormat.POSITION_COLOR_NORMAL_LINE_WIDTH, Mode.LINES) + .withCull(false) + .withColorTargetState(ColorTargetState(BlendFunction.TRANSLUCENT)) + .withDepthStencilState(Optional.empty()) + .build() @JvmField - val TRIANGLE_STRIP_ESP: RenderPipeline = MinecraftRenderPipelines.register( - RenderPipeline.builder(MinecraftRenderPipelines.DEBUG_FILLED_SNIPPET) - .withLocation("pipeline/ctjs_debug_filled_box_esp") - .withCull(false) - .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, Mode.QUADS) - .withDepthStencilState(DepthStencilState(CompareOp.ALWAYS_PASS, false)) - .withColorTargetState(ColorTargetState(BlendFunction.TRANSLUCENT)) - .build() - ) + val TRIANGLE_STRIP_ESP: RenderPipeline = RenderPipeline.builder(MinecraftRenderPipelines.DEBUG_FILLED_SNIPPET) + .withLocation("pipeline/ctjs_filled_box_esp") + .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, Mode.QUADS) + .withCull(false) + .withColorTargetState(ColorTargetState(BlendFunction.TRANSLUCENT)) + .withDepthStencilState(Optional.empty()) + .build() } object RenderLayers { @@ -64,30 +41,27 @@ object RenderLayers { "line-list", RenderSetup.builder(RenderPipelines.LINE_LIST) .setLayeringTransform(LayeringTransform.VIEW_OFFSET_Z_LAYERING) - .createRenderSetup() + .createRenderSetup(), ) @JvmField val LINE_LIST_ESP: RenderType = RenderType.create( "line-list-esp", - RenderSetup.builder(RenderPipelines.LINE_LIST_ESP) - .createRenderSetup() + RenderSetup.builder(RenderPipelines.LINE_LIST_ESP).createRenderSetup(), ) @JvmField val TRIANGLE_STRIP: RenderType = RenderType.create( - "triangle_strip", + "filled-box", RenderSetup.builder(RenderPipelines.TRIANGLE_STRIP) .setLayeringTransform(LayeringTransform.VIEW_OFFSET_Z_LAYERING) .sortOnUpload() - .createRenderSetup() + .createRenderSetup(), ) @JvmField val TRIANGLE_STRIP_ESP: RenderType = RenderType.create( - "triangle_strip_esp", - RenderSetup.builder(RenderPipelines.TRIANGLE_STRIP_ESP) - .sortOnUpload() - .createRenderSetup() + "filled-box-esp", + RenderSetup.builder(RenderPipelines.TRIANGLE_STRIP_ESP).sortOnUpload().createRenderSetup(), ) } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt index c07b319f..2b984cd8 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt @@ -1,6 +1,5 @@ package com.chattriggers.ctjs.api.render -import com.chattriggers.ctjs.MCVertexFormat import com.chattriggers.ctjs.api.client.Client import com.chattriggers.ctjs.api.client.Player import com.chattriggers.ctjs.api.entity.PlayerMP @@ -10,15 +9,9 @@ import com.chattriggers.ctjs.engine.LogType import com.chattriggers.ctjs.engine.printToConsole import com.chattriggers.ctjs.internal.utils.getOrDefault import com.chattriggers.ctjs.internal.utils.toRadians -import com.mojang.blaze3d.opengl.GlStateManager -import com.mojang.blaze3d.opengl.GlTexture -import com.mojang.blaze3d.pipeline.RenderPipeline.Snippet -import gg.essential.universal.UGraphics import gg.essential.universal.UMatrixStack import net.minecraft.client.gui.Font -import net.minecraft.client.renderer.RenderPipelines import net.minecraft.client.player.AbstractClientPlayer -import com.mojang.blaze3d.vertex.DefaultVertexFormat import net.minecraft.client.renderer.entity.EntityRendererProvider import com.mojang.blaze3d.vertex.PoseStack import org.joml.Matrix4f @@ -27,15 +20,10 @@ import org.mozilla.javascript.NativeObject import kotlin.collections.ArrayDeque import kotlin.math.PI import kotlin.math.atan -import kotlin.math.atan2 -import kotlin.math.cos -import kotlin.math.max -import kotlin.math.min import kotlin.math.roundToInt import kotlin.math.sin -import org.lwjgl.opengl.GL13.GL_TEXTURE0 -object Renderer { +object Renderer : GuiRendererBackend() { private val NEWLINE_REGEX = """\n|\r\n?""".toRegex() // The currently-active matrix stack @@ -167,37 +155,6 @@ object Renderer { return intArrayOf(red, green, blue) } - @JvmStatic - fun disableCull() = apply { LegacyPipelineBuilder.disableCull() } - - @JvmStatic - fun enableCull() = apply { LegacyPipelineBuilder.enableCull() } - - @JvmStatic - fun disableLighting() = apply { UGraphics.disableLighting() } - - @JvmStatic - fun enableLighting() = apply { UGraphics.enableLighting() } - - @JvmStatic - fun disableDepth() = apply { LegacyPipelineBuilder.disableDepth() } - - @JvmStatic - fun enableDepth() = apply { LegacyPipelineBuilder.enableDepth() } - - @JvmStatic - fun disableBlend() = apply { LegacyPipelineBuilder.disableBlend() } - - @JvmStatic - fun enableBlend() = apply { LegacyPipelineBuilder.enableBlend() } - - @JvmStatic - @JvmOverloads - fun bindTexture(texture: Image, textureIndex: Int = 0) = apply { - GlStateManager._activeTexture(GL_TEXTURE0 + textureIndex) - GlStateManager._bindTexture((texture.getTexture()?.getTexture() as? GlTexture)?.glId() ?: 0) - } - @JvmStatic fun deleteTexture(texture: Image) = apply { texture.destroy() @@ -224,24 +181,22 @@ object Renderer { @JvmStatic @JvmOverloads fun translate(x: Float, y: Float, z: Float = 0.0F) = apply { - matrixStack.translate(x, y, z) - DrawContextHolder.currentContext?.pose()?.translate(x, y) + DrawContextHolder.currentContext?.pose()?.translate(x, y) ?: matrixStack.translate(x, y, z) } @JvmStatic @JvmOverloads fun scale(scaleX: Float, scaleY: Float = scaleX, scaleZ: Float = 1f) = apply { - matrixStack.scale(scaleX, scaleY, scaleZ) - DrawContextHolder.currentContext?.pose()?.scale(scaleX, scaleY) + DrawContextHolder.currentContext?.pose()?.scale(scaleX, scaleY) ?: matrixStack.scale(scaleX, scaleY, scaleZ) } @JvmStatic @JvmOverloads fun rotate(angle: Float, x: Float = 0f, y: Float = 0f, z: Float = 1f) = apply { - matrixStack.rotate(angle, x, y, z) if (x == 0f && y == 0f && z != 0f) { - DrawContextHolder.currentContext?.pose()?.rotate(angle * z) - } + DrawContextHolder.currentContext?.pose()?.rotate(Math.toRadians((angle * z).toDouble()).toFloat()) + ?: matrixStack.rotate(angle, x, y, z) + } else matrixStack.rotate(angle, x, y, z) } @JvmStatic @@ -257,135 +212,6 @@ object Renderer { else color } - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - @JvmStatic - @JvmOverloads - fun begin( - drawMode: DrawMode = Renderer.DrawMode.QUADS, - vertexFormat: VertexFormat = Renderer.VertexFormat.POSITION, - snippet: Renderer.RenderSnippet = Renderer.RenderSnippet.POSITION_COLOR_SNIPPET - ) = apply { - Renderer3d.begin(drawMode, vertexFormat, snippet) - } - - /** - * Sets a new vertex in the world renderer. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return [Renderer] to allow for method chaining - */ - @JvmStatic - @JvmOverloads - fun pos(x: Float, y: Float, z: Float = 0f) = apply { - val camera = Client.getMinecraft().gameRenderer.mainCamera.position() - Renderer3d.pos(x + camera.x.toFloat(), y + camera.y.toFloat(), z + camera.z.toFloat()) - } - - /** - * Sets the texture location on the last defined vertex. - * - * @param u the u position in the texture - * @param v the v position in the texture - * @return [Renderer] to allow for method chaining - */ - @JvmStatic - fun tex(u: Float, v: Float) = apply { - Renderer3d.tex(u, v) - } - - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer] to allow for method chaining - */ - @JvmStatic - @JvmOverloads - fun color(r: Float, g: Float, b: Float, a: Float = 1f) = apply { - Renderer3d.color(r, g, b, a) - } - - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer] to allow for method chaining - */ - @JvmStatic - @JvmOverloads - fun color(r: Int, g: Int, b: Int, a: Int = 255) = apply { - Renderer3d.color(r, g, b, a) - } - - /** - * Sets the color for the last defined vertex. - * - * @param color the color value, can use [getColor] to get this - * @return [Renderer] to allow for method chaining - */ - @JvmStatic - fun color(color: Long) = apply { - Renderer3d.color(color) - } - - /** - * Sets the normal of the vertex. This is mostly used with [VertexFormat.LINES] - * - * @param x the x position of the normal vector - * @param y the y position of the normal vector - * @param z the z position of the normal vector - * @return [Renderer] to allow for method chaining - */ - @JvmStatic - fun normal(x: Float, y: Float, z: Float) = apply { - Renderer3d.normal(x, y, z) - } - - /** - * Sets the overlay location on the last defined vertex. - * - * @param u the u position in the overlay - * @param v the v position in the overlay - * @return [Renderer] to allow for method chaining - */ - @JvmStatic - fun overlay(u: Int, v: Int) = apply { - Renderer3d.overlay(u, v) - } - - /** - * Sets the light location on the last defined vertex. - * - * @param u the u position in the light - * @param v the v position in the light - * @return [Renderer] to allow for method chaining - */ - @JvmStatic - fun light(u: Int, v: Int) = apply { - Renderer3d.light(u, v) - } - - /** - * Finalizes vertices and draws the world renderer. - */ - @JvmStatic - fun draw() = Renderer3d.draw() - /** * Gets a fixed render position from x, y, and z inputs adjusted with partial ticks * @param x the X coordinate @@ -402,80 +228,6 @@ object Renderer { ) } - @JvmStatic - fun drawRect(color: Long, x: Float, y: Float, width: Float, height: Float) = apply { - DrawContextHolder.currentContext?.let { context -> - val x1 = x.roundToInt() - val y1 = y.roundToInt() - context.fill(x1, y1, (x + width).roundToInt(), (y + height).roundToInt(), color.toInt()) - return@apply - } - - val left = min(x, x + width) - val right = max(x, x + width) - val top = min(y, y + height) - val bottom = max(y, y + height) - - begin(vertexFormat = VertexFormat.POSITION_COLOR) - pos(left, bottom, 0f).color(color) - pos(right, bottom, 0f).color(color) - pos(right, top, 0f).color(color) - pos(left, top, 0f).color(color) - draw() - } - - @JvmStatic - fun drawLine( - color: Long, - x1: Float, - y1: Float, - x2: Float, - y2: Float, - thickness: Float, - ) { - val theta = -atan2(y2 - y1, x2 - x1) - val i = sin(theta) * (thickness / 2) - val j = cos(theta) * (thickness / 2) - - begin(vertexFormat = VertexFormat.POSITION_COLOR) - pos(x1 + i, y1 + j, 0f).color(color) - pos(x2 + i, y2 + j, 0f).color(color) - pos(x2 - i, y2 - j, 0f).color(color) - pos(x1 - i, y1 - j, 0f).color(color) - draw() - } - - @JvmStatic - fun drawCircle( - color: Long, - x: Float, - y: Float, - radius: Float, - steps: Int, - ) { - val theta = 2 * PI / steps - val cos = cos(theta).toFloat() - val sin = sin(theta).toFloat() - - var xHolder: Float - var circleX = 1f - var circleY = 0f - - begin(DrawMode.TRIANGLE_STRIP, VertexFormat.POSITION_COLOR) - - for (i in 0..steps) { - pos(x, y, 0f).color(color) - pos(circleX * radius + x, circleY * radius + y, 0f).color(color) - xHolder = circleX - circleX = cos * circleX - sin * circleY - circleY = sin * xHolder + cos * circleY - - pos(circleX * radius + x, circleY * radius + y, 0f).color(color) - } - - draw() - } - @JvmStatic @JvmOverloads fun drawString( @@ -533,17 +285,13 @@ object Renderer { @JvmStatic fun drawImage(image: Image, x: Float, y: Float, width: Float, height: Float) { - scale(1f, 1f, 50f) - - // FIXME: icba to do this -// RenderSystem.setShaderTexture(0, image.getTexture()?.glTextureView) - - begin(DrawMode.QUADS, VertexFormat.POSITION_TEXTURE_COLOR, snippet = RenderSnippet.POSITION_TEX_COLOR_SNIPPET) - pos(x, y + height, 0f).tex(0f, 1f).color(WHITE) - pos(x + width, y + height, 0f).tex(1f, 1f).color(WHITE) - pos(x + width, y, 0f).tex(1f, 0f).color(WHITE) - pos(x, y, 0f).tex(0f, 0f).color(WHITE) - draw() + val texture = image.getTexture() ?: return + DrawContextHolder.currentContext?.blit( + texture.textureView, + texture.sampler, + x.roundToInt(), y.roundToInt(), width.roundToInt(), height.roundToInt(), + 0f, 0f, 1f, 1f, + ) } /** @@ -723,58 +471,6 @@ object Renderer { } } - enum class DrawMode(private val ucValue: UGraphics.DrawMode) { - LINES(UGraphics.DrawMode.LINES), - LINE_STRIP(UGraphics.DrawMode.LINE_STRIP), - TRIANGLES(UGraphics.DrawMode.TRIANGLES), - TRIANGLE_STRIP(UGraphics.DrawMode.TRIANGLE_STRIP), - TRIANGLE_FAN(UGraphics.DrawMode.TRIANGLE_FAN), - QUADS(UGraphics.DrawMode.QUADS); - - fun toUC() = ucValue - - companion object { - @JvmStatic - fun fromUC(ucValue: UGraphics.DrawMode) = entries.first { it.ucValue == ucValue } - } - } - - enum class VertexFormat(private val mcValue: MCVertexFormat) { - LINES(DefaultVertexFormat.POSITION_COLOR_NORMAL), - POSITION(DefaultVertexFormat.POSITION), - POSITION_COLOR(DefaultVertexFormat.POSITION_COLOR), - POSITION_TEXTURE(DefaultVertexFormat.POSITION_TEX), - POSITION_TEXTURE_COLOR(DefaultVertexFormat.POSITION_TEX_COLOR), - POSITION_COLOR_TEXTURE_LIGHT(DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP), - POSITION_TEXTURE_LIGHT_COLOR(DefaultVertexFormat.POSITION_TEX_LIGHTMAP_COLOR), - POSITION_TEXTURE_COLOR_LIGHT(DefaultVertexFormat.PARTICLE), - POSITION_TEXTURE_COLOR_NORMAL(DefaultVertexFormat.POSITION_TEX_COLOR_NORMAL); - - fun toMC() = mcValue - - companion object { - @JvmStatic - fun fromMC(ucValue: MCVertexFormat) = entries.first { it.mcValue == ucValue } - } - } - - enum class RenderSnippet(val mcSnippet: Snippet) { - TERRAIN_SNIPPET(RenderPipelines.TERRAIN_SNIPPET), - ENTITY_SNIPPET(RenderPipelines.ENTITY_SNIPPET), - RENDERTYPE_BEACON_BEAM_SNIPPET(RenderPipelines.BEACON_BEAM_SNIPPET), - TEXT_SNIPPET(RenderPipelines.TEXT_SNIPPET), - RENDERTYPE_END_PORTAL_SNIPPET(RenderPipelines.END_PORTAL_SNIPPET), - RENDERTYPE_CLOUDS_SNIPPET(RenderPipelines.CLOUDS_SNIPPET), - RENDERTYPE_LINES_SNIPPET(RenderPipelines.LINES_SNIPPET), - POSITION_COLOR_SNIPPET(RenderPipelines.DEBUG_FILLED_SNIPPET), - PARTICLE_SNIPPET(RenderPipelines.PARTICLE_SNIPPET), - WEATHER_SNIPPET(RenderPipelines.WEATHER_SNIPPET), - GUI_SNIPPET(RenderPipelines.GUI_SNIPPET), - POSITION_TEX_COLOR_SNIPPET(RenderPipelines.GUI_TEXTURED_SNIPPET), - RENDERTYPE_OUTLINE_SNIPPET(RenderPipelines.OUTLINE_SNIPPET), - POST_EFFECT_PROCESSOR_SNIPPET(RenderPipelines.POST_PROCESSING_SNIPPET), - } - class ScreenWrapper { fun getWidth(): Int = Client.getMinecraft().window.guiScaledWidth diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer3d.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer3d.kt deleted file mode 100644 index b29221d6..00000000 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer3d.kt +++ /dev/null @@ -1,339 +0,0 @@ -package com.chattriggers.ctjs.api.render - -import com.chattriggers.ctjs.api.client.Client -import com.chattriggers.ctjs.api.vec.Vec3f -import com.chattriggers.ctjs.internal.utils.get -import com.mojang.blaze3d.systems.RenderSystem -import gg.essential.universal.UGraphics -import net.minecraft.client.gui.Font -import net.minecraft.util.LightCoordsUtil -import com.mojang.blaze3d.vertex.Tesselator -import org.joml.Vector3f -import org.mozilla.javascript.NativeObject - -object Renderer3d { - private var firstVertex = true - private var began = false - - private val tessellator = Tesselator.getInstance() - private val worldRenderer = UGraphics.getFromTessellator() - - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - @JvmStatic - @JvmOverloads - fun begin( - drawMode: Renderer.DrawMode = Renderer.DrawMode.QUADS, - vertexFormat: Renderer.VertexFormat = Renderer.VertexFormat.POSITION, - snippet: Renderer.RenderSnippet = Renderer.RenderSnippet.POSITION_COLOR_SNIPPET - ) = apply { - Renderer.pushMatrix() - .enableBlend() - .disableCull() - worldRenderer.beginRenderLayer(LegacyPipelineBuilder.begin(drawMode, vertexFormat, snippet).layer()) - - firstVertex = true - began = true - } - - /** - * Sets a new vertex in the world renderer. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return [Renderer3d] to allow for method chaining - */ - @JvmStatic - fun pos(x: Float, y: Float, z: Float) = apply { - if (!began) - begin() - if (!firstVertex) - worldRenderer.endVertex() - val camera = Client.getMinecraft().gameRenderer.mainCamera.position() - worldRenderer.pos(Renderer.matrixStack, x.toDouble() - camera.x, y.toDouble() - camera.y, z.toDouble() - camera.z) - firstVertex = false - } - - /** - * Sets the texture location on the last defined vertex. - * - * @param u the u position in the texture - * @param v the v position in the texture - * @return [Renderer3d] to allow for method chaining - */ - @JvmStatic - fun tex(u: Float, v: Float) = apply { - worldRenderer.tex(u.toDouble(), v.toDouble()) - } - - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer3d] to allow for method chaining - */ - @JvmStatic - @JvmOverloads - fun color(r: Float, g: Float, b: Float, a: Float = 1f) = apply { - worldRenderer.color(r, g, b, a) - } - - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer3d] to allow for method chaining - */ - @JvmStatic - @JvmOverloads - fun color(r: Int, g: Int, b: Int, a: Int = 255) = apply { - worldRenderer.color(r, g, b, a) - } - - /** - * Sets the color for the last defined vertex. - * - * @param color the color value, can use [Renderer.getColor] to get this - * @return [Renderer3d] to allow for method chaining - */ - @JvmStatic - fun color(color: Long) = apply { - color( - ((color ushr 16) and 0xFF).toInt(), - ((color ushr 8) and 0xFF).toInt(), - (color and 0xFF).toInt(), - ((color ushr 24) and 0xFF).toInt(), - ) - } - - /** - * Sets the normal of the vertex. This is mostly used with [Renderer.VertexFormat.LINES] - * - * @param x the x position of the normal vector - * @param y the y position of the normal vector - * @param z the z position of the normal vector - * @return [Renderer3d] to allow for method chaining - */ - @JvmStatic - fun normal(x: Float, y: Float, z: Float) = apply { - worldRenderer.norm(Renderer.matrixStack, x, y, z) - } - - /** - * Sets the overlay location on the last defined vertex. - * - * @param u the u position in the overlay - * @param v the v position in the overlay - * @return [Renderer3d] to allow for method chaining - */ - @JvmStatic - fun overlay(u: Int, v: Int) = apply { - worldRenderer.overlay(u, v) - } - - /** - * Sets the light location on the last defined vertex. - * - * @param u the u position in the light - * @param v the v position in the light - * @return [Renderer3d] to allow for method chaining - */ - @JvmStatic - fun light(u: Int, v: Int) = apply { - worldRenderer.light(u, v) - } - - /** - * Finalizes vertices and draws the world renderer. - */ - @JvmStatic - fun draw() { - if (!began) - return - began = false - - worldRenderer.endVertex() - - worldRenderer.drawDirect() - Renderer.disableBlend() - .enableCull() - .popMatrix() - } - - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - @JvmStatic - @JvmOverloads - fun drawString( - text: String, - x: Float, - y: Float, - z: Float, - color: Long = Renderer.WHITE, - renderBlackBox: Boolean = true, - scale: Float = 1f, - increase: Boolean = false, - centered: Boolean = true, - renderThroughBlocks: Boolean = true, - ) { - val (lines, width, height) = Renderer.splitText(text) - - val fontRenderer = Renderer.getFontRenderer() - val camera = Client.getMinecraft().gameRenderer.mainCamera - val renderPos = Vec3f( - x - camera.position().x.toFloat(), - y - camera.position().y.toFloat(), - z - camera.position().z.toFloat(), - ) - - val lScale = scale * if (increase) { - renderPos.magnitude() / 120f //mobs only render ~120 blocks away - } else { - 0.025f - } - - Renderer.pushMatrix() - Renderer.translate(renderPos.x, renderPos.y, renderPos.z) - Renderer.multiply(camera.rotation()) - Renderer.scale(lScale, -lScale, lScale) - - val opacity = (Client.getMinecraft().options.getBackgroundOpacity(0.25f) * 255).toInt() shl 24 - - val xShift = -width / 2 - val yShift = -height / 2 - - val vertexConsumers = Client.getMinecraft().renderBuffers().bufferSource() - var yOffset = 0 - val textLayer = if (renderThroughBlocks) Font.DisplayMode.SEE_THROUGH else Font.DisplayMode.NORMAL - - for (line in lines) { - val centerShift = if (centered) { - xShift + (fontRenderer.width(line) / 2f) - } else 0f - - Renderer.pushMatrix() - val matrix = Renderer.matrixStack.toMC().last().pose() - - if (renderBlackBox) { - fontRenderer.drawInBatch( - line, - xShift - centerShift, - yShift + yOffset, - 0x20FFFFFF, - false, - matrix, - vertexConsumers, - textLayer, - opacity, - LightCoordsUtil.FULL_BRIGHT - ) - Renderer.translate(0f, 0f, -0.03f) - } - - fontRenderer.drawInBatch( - line, - xShift - centerShift, - yShift + yOffset, - color.toInt(), - false, - matrix, - vertexConsumers, - textLayer, - 0, - LightCoordsUtil.FULL_BRIGHT - ) - vertexConsumers.endBatch() - Renderer.popMatrix() - - yOffset += fontRenderer.lineHeight + 1 - } - - Renderer.popMatrix() - } - - /** - * A variant of drawString that takes an object instead of positional parameters - */ - @JvmStatic - fun drawString(obj: NativeObject) { - drawString( - obj.get("text") ?: error("Expected \"text\" property in object passed to Renderer3d.drawString"), - obj.get("x")?.toFloat() - ?: error("Expected \"x\" property in object passed to Renderer3d.drawString"), - obj.get("y")?.toFloat() - ?: error("Expected \"y\" property in object passed to Renderer3d.drawString"), - obj.get("z")?.toFloat() - ?: error("Expected \"z\" property in object passed to Renderer3d.drawString"), - obj.get("color")?.toLong() ?: Renderer.WHITE, - obj.get("renderBlackBox") ?: true, - obj.get("scale")?.toFloat() ?: 1f, - obj.get("increase") ?: false, - obj.get("centered") ?: true, - obj.get("renderThroughBlocks") ?: true, - ) - } - - /** - * Draws a line in the world from (x1, y1, z1) to (x2, y2, z2) - * - * @param color the color of the line - * @param x1 the starting x coordinate - * @param y1 the starting y coordinate - * @param z1 the starting z coordinate - * @param x2 the ending x coordinate - * @param y2 the ending y coordinate - * @param z2 the ending z coordinate - */ - @JvmStatic - fun drawLine( - color: Long, - x1: Float, - y1: Float, - z1: Float, - x2: Float, - y2: Float, - z2: Float, - ) { - Renderer.pushMatrix() - .disableDepth() - .disableCull() - - val normalVec = Vector3f(x2 - x1, y2 - y1, z2 - z1).normalize() - - begin(Renderer.DrawMode.LINES, Renderer.VertexFormat.LINES, Renderer.RenderSnippet.RENDERTYPE_LINES_SNIPPET) - pos(x1, y1, z1).color(color).normal(normalVec.x, normalVec.y, normalVec.z) - pos(x2, y2, z2).color(color).normal(normalVec.x, normalVec.y, normalVec.z) - draw() - - Renderer - .enableCull() - .enableDepth() - .popMatrix() - } -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Shape.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Shape.kt deleted file mode 100644 index bba12c00..00000000 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Shape.kt +++ /dev/null @@ -1,125 +0,0 @@ -package com.chattriggers.ctjs.api.render - -import com.chattriggers.ctjs.api.vec.Vec2f -import kotlin.math.PI -import kotlin.math.atan2 -import kotlin.math.cos -import kotlin.math.sin - -class Shape(private var color: Long) { - private val vertexes = mutableListOf() - private val reversedVertexes = vertexes.asReversed() - private var drawMode = Renderer.DrawMode.QUADS - private var area = 0f - - fun copy(): Shape = clone() - - fun clone(): Shape { - val clone = Shape(color) - clone.vertexes.addAll(vertexes) - clone.setDrawMode(drawMode) - return clone - } - - fun getColor(): Long = color - - fun setColor(color: Long) = apply { this.color = Renderer.fixAlpha(color) } - - fun getDrawMode(): Renderer.DrawMode = drawMode - - /** - * Sets the GL draw mode of the shape - */ - fun setDrawMode(drawMode: Renderer.DrawMode) = apply { this.drawMode = drawMode } - - fun getVertexes(): List = vertexes - - fun addVertex(x: Float, y: Float) = apply { - vertexes.add(Vec2f(x, y)) - updateArea() - } - - fun insertVertex(index: Int, x: Float, y: Float) = apply { - vertexes.add(index, Vec2f(x, y)) - updateArea() - } - - fun removeVertex(index: Int) = apply { - vertexes.removeAt(index) - updateArea() - } - - fun clearVertices() = apply { - vertexes.clear() - area = 0f - } - - /** - * Sets the shape as a line pointing from [x1, y1] to [x2, y2] with a thickness - */ - fun setLine(x1: Float, y1: Float, x2: Float, y2: Float, thickness: Float) = apply { - vertexes.clear() - - val theta = -atan2(y2 - y1, x2 - x1) - val i = sin(theta) * (thickness / 2) - val j = cos(theta) * (thickness / 2) - - vertexes.add(Vec2f(x1 + i, y1 + j)) - vertexes.add(Vec2f(x2 + i, y2 + j)) - vertexes.add(Vec2f(x2 - i, y2 - j)) - vertexes.add(Vec2f(x1 - i, y1 - j)) - updateArea() - - drawMode = Renderer.DrawMode.QUADS - } - - /** - * Sets the shape as a circle with a center at [x, y] - * with radius and number of steps around the circle - */ - fun setCircle(x: Float, y: Float, radius: Float, steps: Int) = apply { - vertexes.clear() - - val theta = 2 * PI / steps - val cos = cos(theta).toFloat() - val sin = sin(theta).toFloat() - - var xHolder: Float - var circleX = 1f - var circleY = 0f - - for (i in 0..steps) { - vertexes.add(Vec2f(x, y)) - vertexes.add(Vec2f(circleX * radius + x, circleY * radius + y)) - xHolder = circleX - circleX = cos * circleX - sin * circleY - circleY = sin * xHolder + cos * circleY - vertexes.add(Vec2f(circleX * radius + x, circleY * radius + y)) - } - - updateArea() - drawMode = Renderer.DrawMode.TRIANGLE_STRIP - } - - fun draw() = apply { - Renderer.apply { - begin(drawMode, Renderer.VertexFormat.POSITION_COLOR) - - if (area < 0) { - vertexes.forEach { pos(it.x, it.y).color(color) } - } else { - reversedVertexes.forEach { pos(it.x, it.y).color(color) } - } - - draw() - } - } - - private fun updateArea() { - area = vertexes.indices.sumOf { i -> - val p1 = vertexes[i] - val p2 = vertexes[(i + 1) % vertexes.size] - (p1.x * p2.y - p2.x * p1.y).toDouble() - }.toFloat() / 2 - } -} diff --git a/src/main/resources/assets/ctjs/js/moduleProvidedLibs.js b/src/main/resources/assets/ctjs/js/moduleProvidedLibs.js index 3c2fac41..c9405de9 100644 --- a/src/main/resources/assets/ctjs/js/moduleProvidedLibs.js +++ b/src/main/resources/assets/ctjs/js/moduleProvidedLibs.js @@ -38,9 +38,8 @@ global.Priority = Java.class("com.chattriggers.ctjs.api.triggers.Trigger").Priority; global.Console = Java.type("com.chattriggers.ctjs.engine.Console").INSTANCE; + global.Renderer = Java.class("com.chattriggers.ctjs.api.render.Renderer").INSTANCE; const JSErrorReporter = Java.type("com.chattriggers.ctjs.internal.engine.JSErrorReporter").INSTANCE; - global.NVG = Java.class("com.chattriggers.ctjs.api.render.NVGRenderer").INSTANCE; - global.cancel = event => { if (event instanceof CancellableEvent) { event.setCanceled(true); diff --git a/src/main/resources/assets/v5/font/default.json b/src/main/resources/assets/v5/font/default.json new file mode 100644 index 00000000..f9f3ca8d --- /dev/null +++ b/src/main/resources/assets/v5/font/default.json @@ -0,0 +1,11 @@ +{ + "providers": [ + { + "type": "ttf", + "file": "v5:font.ttf", + "size": 9, + "oversample": 4, + "shift": [0, 0] + } + ] +} diff --git a/src/main/resources/assets/v5/font/font.ttf b/src/main/resources/assets/v5/font/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0a6b8298043e8e19daebe96e6e9d3168d15d390c GIT binary patch literal 528296 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%0Ax9vQjH*yU7Z;{BaAn)PT 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 z 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�<;h<0%KJ->Oo7;QnU;$M=Q`uCJ3!UtI--zcixBAq5I*y z*9~YR+JrWvEodvmr`?Wrpq=Oev_mpVXzxa!sgflTjJr^3Xj0nAfee}@X){x*bzJ7 zk=Pl#U{~x0`~76*2~bbEGiRCinGdiB_QYP;8~b1>_Qf*nhvnEG2jD;)goAMi4#i6Y zfEVILcrotAJ$MOTikIQ#cm-aGS7ET(;I;TZCI+v=_rr-F>+uG>5pTkq@fIcyZ^hg2 zcDw`cWa9Ay%y)2<-3$0Zyc_Sqy?8I)habZG@x%B4J_u_1NAV&27=9c-fuF=rF$uU2 zA7;MBARXc(AnZMdpT|e(u7h8|FXET*%lH-iDt?WbijU#r_;vgSK7mg%P54dx7CwdF zW~ShG@VodlehP@!=K|T_zV0c zzKXxXU*m7^xA+?V7yb@k$2aiz_y_zW{t5q#f5E@v-|+AF5Bw+oi^+iVyKiAF94SMv zp81~9unY@_%`t?IcC0&CjX9;_$p1*QTYz-arjGS-ikv;J%V8^{K+!E6W{%7(Gw zYy^|dM#7n5QLK_xv1&G&jbUTiI3|aUXA{^&2Er_{$!rRn%BHdDYzC9dYS>IRi_K

2n)of*Z>U}v%|Y%4p9ZDZS+(d=xtgPp_9W#_T; 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/v5/font/segoe_bold.json b/src/main/resources/assets/v5/font/segoe_bold.json new file mode 100644 index 00000000..9105baec --- /dev/null +++ b/src/main/resources/assets/v5/font/segoe_bold.json @@ -0,0 +1,11 @@ +{ + "providers": [ + { + "type": "ttf", + "file": "v5:segoe_bold.ttf", + "size": 9, + "oversample": 4, + "shift": [0, 0] + } + ] +} diff --git a/src/main/resources/assets/v5/font/segoe_bold.ttf b/src/main/resources/assets/v5/font/segoe_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5844cc182654d603fe27238bc6a2fed6087a6b7a GIT binary patch literal 53488 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/v5/font/segoe_regular.json b/src/main/resources/assets/v5/font/segoe_regular.json new file mode 100644 index 00000000..9fa69de3 --- /dev/null +++ b/src/main/resources/assets/v5/font/segoe_regular.json @@ -0,0 +1,11 @@ +{ + "providers": [ + { + "type": "ttf", + "file": "v5:segoe_regular.ttf", + "size": 9, + "oversample": 4, + "shift": [0, 0] + } + ] +} diff --git a/src/main/resources/assets/v5/font/segoe_regular.ttf b/src/main/resources/assets/v5/font/segoe_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..17ddde34753d1f0453cc99d6545934d144511c26 GIT binary patch literal 50028 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

2n)of*Z>U}v%|Y%4p9ZDZS+(d=xtgPp_9W#_T; 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 diff --git a/src/main/resources/assets/v5/font/segoe_bold.json b/src/main/resources/assets/v5/font/segoe_bold.json deleted file mode 100644 index 9105baec..00000000 --- a/src/main/resources/assets/v5/font/segoe_bold.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "providers": [ - { - "type": "ttf", - "file": "v5:segoe_bold.ttf", - "size": 9, - "oversample": 4, - "shift": [0, 0] - } - ] -} diff --git a/src/main/resources/assets/v5/font/segoe_bold.ttf b/src/main/resources/assets/v5/font/segoe_bold.ttf deleted file mode 100644 index 5844cc182654d603fe27238bc6a2fed6087a6b7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53488 zcmce<30xFM_BdYE-7|xT2Oyw=Far$tJq*Kr-1>?wRhYSFc{Zt6sfA7$Gzg zEkZ0RkB`qun^thJ7NPTz@U2ZkY+O82!WBAS41dNZWK7J)-#k|Y_pJz-r6y$OMxX9H zO%VF$1^C@(Vz#$m*`-O-5yDg8zPzfTV!GRrF)awmP9ns9Ke>KR?WqILyaN?(KxlL9 zl$wfaE1zNsJbMq0fGP0B=ueE!!uyVJ?>MEQ^@)2eixc7geS{?U>YJ)6*t@QG5E{N6 zA?86t#S_!G^g0JHgdo~hJZ{_X z$?Vp$QK5gJVMg!;Lhmp1rS+ljH@$nIGmuyfyC`dcXN?d;zlDGBp6n{ILdaO&8Q5tw z>>^*1@SE_!Jo*iuhpLfG_(JbT;gaP}Gv|;58A-NDRPd~waAvQd+4!On!wffKI0i8c zy9=SCk?5Ogx)OY&vSW}Ojd;XJIdTB2WmoZCIYMjc?;MhBgWu$ckyxVb43x_x!Epj@ zW_fO=^9YOPD94eOFMtMvZ{GU2s^kr%|Hh9JtFx2Yj6%3iP`bnzEoXm3$r2-g_bf_g zTah(?{T*7)Jcne=bDc-Im2h2%mdmD~<=l^O`~}a$d-OSW3B3OhO=EqL0)Cs#O+`{^ zD>CC2py6C)XD53XSwp?`%rSHo&UsM(J3QWxphJN3wcK)~fwKqy`yZ%{eHZ1+%-~!M z@SH(G6le6Fc^9c!TQrm2LqE)hqm5Y%ZFmUqIPo|x#s7e3LeN_F3`(T$%1)rkvVWi& z*WlC`3TC;^)Ks)9NjwK1GSh^m@@G-Psavr?{$9>(wy^B)dy(HN^%)!A(#{j>Aa&%IF@^#z&+&@OZc9mZ+62`|9w@JGxC%uRLyyMcX$ zy@(+eNm&%FUsyAh9fa#Tt9YeiUC;xmcF@Biz~9`FrQTIx9Ob z!0~41+0HjQ_jT4IL~1&AYL9B4N9bSg{;Lq7+ith*Z;$)tKi|BH(5)*_Ke`op3*_{T zeK(%IA*J_1+xaW~KLK4g{`^&7*F8cxa9xNh`EQ;Szh8t_Kv5w$6z&^QtMDz3!|8aU zc%6YWaTYw2jdO4=ob&J`oG<=XfXl_JSPYs7{fA>P=umhvuLU7oB7BQx;X2_8PsI)5 zRU`CDvv}QtTk%XJWsK=PbSCZ3zW??Ai~jQr&;%$5ND4ZM5gG>6FdUgcFOEc`&}d|e z%#b-6gDj9GvO;6gI5Zxp%?3?Cw#W{8T7m451A-BSoRBkeL9WORxg!tciM)_E@m33|E;O@_XjiFTj{R0n<4f~ElW+t6k_ z6-~#0f6yOWaSilVE%f;`G!@OkvFIiAI*gnORFCU$Ag;$TXd0S}3qT`Wh?bxYcmy6v z>4T>TpbqpJo{r9AUtEIAa1k!1J&7klk7warT!_e{Hx4mQGp;mlGG1u>-f%Qr zJ$%;iSBGCWaW+XcnPIZu~>(U-K&SCFZZ0KN@2^#&1m4 zn5Hr7#=Jb{`j~bLUyCO#zP0qSEU|pX@|@KOt1_!stUeiQH#T}~)!3)Uel+&qV;_z) z8<#R}@wgAin~yIX|C046>$%q3t^aFdW0Pbv&*mRCzfX`)Xqj-)c8qPE?N@dgb{FLu z`7-&3icyLJ#aoIm6~EY<*eBR;v%llu;xNVGkmD%F7RN)5KP%AnYi&-;Gr`^eAHFTrn#-%EZc z{k~H9smfI=Rj;eQRQ>5c(%->9#DAiHt^Yj#7yU2#f9tPRJE+sut?C`>_tk#}$OF;> zmIZvM8Kz0oyr%gxP!U)W_*~#W13QBz1?>$+!CAqt1pgV58L~U%e8~OK(VXkC90o?46y|{+a-lpOq!PMeZwcv6;U*H&YX+ z3CPY02*BsruiF1e^78ifPE7QIe_%496YPC9M{-E05j(I7da&y2cG!yK-I#za+57k$ ziN|N)S!d7<4oKDlzqEr|9b_t*1M6VU9~za$L8CHPvHT&CsWjZuH#8r6zL)+*(zWC- z63!^ksXw&8oP0C+TI!ADH?)nK&jZ;x4^EPOxR4$vADqP1WIH`hK6n7o%=0A`I=5SvaVjoSmFaEv+oAOz9QhT#Z^~A$~)D!BUGc@H_T*HVxp?rqsQ^yRxP> zEo{b&qFosoZtl~kpW2;TS?Rv%r5j~s+IQxSAD@5~3m4+m`>JcKzP!qg8|R8`ecU~a za6@o#a9Y~b7n&MP&%P!#A2W{px4?odn^;rBtg&g)D3wZLR31XUumM?9+<8yBUvdN_ zj2%c16-WRc;vPL>&_jS}1?%tZcs-X8()kH!jQ3T<{)00lBr$!YRC_DM?pI>_W`j@oAL}oYJ3~!Hw8!MT!%vqzGCu@o_s&;GJXF(s^&i8RG`}+Z0caDP%BJ6dsh z{*Elfi!b4&Wd0?1-nEm#Z=nw8TO?7KE3h|duf-~Y+u^sh_#|_Y0gnPg=4yq-T1JIW z-n>a`Deb(2Z)0DIBc%cT;@g_QybO&-6Ofms(X34I^z!je0Jh@kiE!s9oo4JQo-@9nV5L zJ)sVfdntfB^Q?;wbTzHcLEUv}FVod5)=fDY=ec1cc~CWFN_c!pN&dWu@QlngPcK}W z5bv+9UB5D^ysUh~w5frCscFwXUs#B@y+3o7g@qhj``gI_)P-eg|6hH53bMVtYVk0q zF=ISEGqWZyD=D#;m=_g8F8~MU>Y;~>kr^NaB#lCifrKouzs3QEw1T}r{;6Hf6yf+o z#F1kxEXifi?|jL}*!MklcgGXAnY|(Y0dnF9*xU{+^@Xw&P!eSbyd;9Q>NgK6Fy&Fp z`NqaATC~5crY2<1j=8b1DXFV8=UF%H@8Q1RELw=KuA0#t7H)24jm;}ULMGP)2AZ?> zgphwpTERqNfYS=pV+;DYUTvlz_xP?eZN`8x*IrF_| z=Fa=7F)TDBv~p^4atvkipur<99oi0-nF1&sNRG)Sdoj^gv43(~FtZv)RWiVw1C(F~ zmV`!tnwJctl~kVTL^e-zwBG^jE{UKgAp*FZHEXmtSFFHJPew#8Uw-xa;>B_C&#unR zCGTDPdvNfi5{<^e(<=c4{NBBI@tX~e)25xkXs$$+lT-ilv}x7VyXNHN1aYpFRr6m= zPurWWQmOoy&SZCYFR%FJv^5Nh2S^hDQYWx(gt4hlwHjU53UZgnF%NDJp~WS{7 zg^lIo#!a32&oG4|D6pn_(Z<%6h={DLjhkFslar!j>ZV3UhK2x~JYV8WczN54Gno#^ zsR9FYK^N-HwV1Ujo}NBFaRLj2Iw;5d4(i}_EXp%`=~w~}bn4S2?9r)c}$ZaY4^%tn|J~rk)VxNW@;aSRw zF&y_n`?F`iX3kx{Owuo1fJll)cT5iTyPvBufPy1e|+3&~zO z`QQa`J>3~A^98w_4py(;D0UVJOaKoUu|_3|WF0FJ^do4)Xe&#FpT?g##ytX zqe@d_zWg#E&cSiov{$w-m>&_5U$A561#)-iuA;Y6s;Z71`~H^?-fw8go3wM+-8^^q zs_K=+n!s8RMGW{SkYo>V5gC=Vpw3g}5Y#D|6fT`ORV^{AA?p}pyc!sbpE1k6h|9JO z#}VZ3l5Op^+!HDj6Jm`2We1eA5BSlKP?9;wHdg_+4#1UkGEL+!Abd{eUa@?7u#>V+y?cSZ2S6OlV z_^s-y%BbB(7T45h0-KvJo<5*fj|;}i5xz#;nQ@YB`kH_x$wa`CQp6I~f^<@h+BeiN5cE;#DO#Ll zV(Hp-YssDuKdi1kefp>BrpAJ!KQEd*IWVxk{$gV^xy>|J2G~2i`6kZ1dGu&Sxv8lg z`N!mtkotx-*XPZ%!{ad{wo9^FXqT={^vs25&y&MAn~BCbOrrL*WSjOP6WU%YU;;mc zH&_7^`*1cTJ6e`Q=N;Areldj`s>yXr3sX}CYqESfA?mPjS7mUp>ouIk1d(sIJ#S)S ziZv4~EpZ|^@P*PP#ZU&Ne5?W;i9!>gp#y+@os?oz6AG5;2>cvgMNAkwrpe4f3omG! zoX0SE+8ixaVEEpmkVtgB1yC~PVCK|!^^J^L%;TXJKr>(#DuCK7Eogn%(u&q-D*3=@ zj6_O~kRM>maipa&C_Q(v(#pze0#@RiY+>t)a`Q1AzU(`W^#|5<+>vbSI1)a)ET7HL z;Yo4<>Hv#CfpsO*_Hfg*$3tc0O+1Zhk>Dt{tt@GI$31vE>;OBCVv?a_Msgjf!3wNw zeU3OFYm;0rEZnpAlS?n|E+{B0eCeg@AMV;YDUWO~F4_HZMP)_Bu9wQnn9sjDbf~nn zsA%85D_+MW1~7bYmh_UPzYvuC%nS5`GPhK3OsEG;cRHv|TfD85Bx8{eXFJRbt;kf{LW z-DZ0~>VxF^%vo0$yo+R#&(Ck&nwwWxu}>AV-fnW-y7=LG=Ig(bH%A>rw#|1q<*HKt(J%$oU;krtL7p3lEk zTf1`yHvZ~hT6J~l?5HSz)r#MyOvdY%mX)j3CG9e{F(J=)I zj`N62b!1=f2(t^1wPXJVH2^Gui^VFyJjU$VzeWxpA(cHOGw=t%g*IOv zZ!&u9zws=Rh0oxt<2>C)jV32(0l>;2D5S0_bNB zYxA%(vmeayhfmPo6QK-mu?)4!)B&vL#H&~F9dhOaN%{v5<@A}4m`d(fplK;W!x#sw z!t5{Pd-7)|K5`7d%TzKE+P||I9ml}-?QK?Z9RGN9qo1;4bs!rR;AL!TG>zzwjAKO0JD*1RFk1&0CZz;2~g?8 z!_Z}4Ql}9Gg}bnD;k9$6N1H)vQ{RnN_x^swyBLG^C;a*}}v`C!9*oXaWmsf`T*wm8HQ! z^OK#N!oylxUfjQEVO*@eeGrq;K8A^?j*iaCUb8$YDLrk04uWQAs}0qFfF}r@X+e7( zRG}^tz|z7(DKbbI-Y`64;?nZU%7lbz^$Wcl7A@NK>$0Wf5)+^)niL)}67OpW z3L0zWa@XF{^697l+Ocq9Li~b-zqGwo6B-g8QAX(yh8f!?<#<^qa9#@q->=}2q4ffN zv2F2bxgMT)ENB9!zW#dV%&(erxQEv6?wJj@I&QIwTMOT;s2)OBW#p?By)eox-S;witDvIN|LB%2`T2nvnU(Xasx_LWORt_P1Js_@XbNhA zgF}K#^Fl*@Aa~ZSH#N1!lB(RC=agx#ZsB1~O)I`%v3zzJNiB{DkBe_^ij0bmuBPo= z4xFSB`q%<`n0hC9Ap_(qdSWb0SqG(4W|prnCD`V74i^_O@za9>!y_s|{kx}q?#23s zOWJ2?UjcVv>;PjDT9&{e46WfePGBFy)J*45 za*!{{oVN~i-Xb;M`D)5~49jICn!xgk{BYUlDvJ$$*rm0-n3r-{7Kc*larl- za&l(jJSK6L+CL_yTKhJWemx>$y7oN|txogu^zqFs@^B~B+NHX_Y=wG38u#o=3%(N8 z)yX+G!_SWvKjTwe%mgh642*~@*PiCk+5@CeyHXtUN1zN-%3pLcof14X5BqTB9NDrJ zj2p6X)7Gtc*n#;^#>9{#8cox*(6Er;8TEl0W@IN?zhU+2zqD)CL`Kb?z5A)O)YP<9 z&!wfOrBbR{P7ZPxpuW+3eS&X+b^?G5752eB7cKtmG|xR}eEREw{gzp6AOM8`Wj zpWnWS#7c6X*#nGoL1JQZ%IvKAXv#SGad?nh40T!Z`m?DhJM{Pn2(?~gk5va|WRxwb ztP0SC1OqoaJBjkLz`#i`-~t1SN<%})LHtRI(kV2w71-Irh4Jx=Cbu7C*VM$uWM{8k zoRX59%-f1E(%3wXMiwBd;TqBcn>WtKN6`=-PP@l5J-s;4iTTE4`0%9Ur-&7YUMltU z7zwmB4Y>a?XaiLvL{E&fT4apWQ=`)v0ecou2R~H-KU-O{$J*NNC6tvV$JI}pnBwZ{ z=00zCO3IQYH=o+Ja?3V_ylz!=w4(zK+Fn#NYSh?A&bD^r#(Mcrn4t7YPOe*DSm6G1 zTDhCGjf0nqi<-Ktkpdtok_1C^1jr%LCj^62rKUc0K?el+Q{*$aY5kJDzczAl+1$^t)jWY7?Es~$Bbh4*q&IV~(%^}KlyX1`;$U&5y^pYJ1{ZV?N zqy(q9xn}10c;l3n*{*JljaQke+7oqwf#G45OmYV;4fGJM21*0#T%l791I!i759DdG z5m%ltH|Aurw{Zc7v`@#zTie<)2jDF*6{VH%7R1JidL>o+6y`8i!M|q(ez0G*`lpZNMN>8hyW6<1 zH#~vYqYiSlP##DtbNenj0L_`#CZVm=KO~d3&zh+8_qPl6_a9Hnal@M?!=*CWdpL<~ zi;9gaDIo`KI?YT>tgU@mqFw74ZEbDMEb9o~o|)z1LZPOz@GYnX^kF4*EohrmXS%@D zxwxLCHC-ik_?DFVv#3^UdKH@xJ0tV}Vn;B70+<&73aXRY(;6v(szLjraHuIvFaXum z;l)G2ys*{Xy|`p&fuqBY9ZIL%f7jHwxy9j+&)!*^n&zlH>)~E>?dMP~`mf7HZmwr@ za^L^1+Jo2Q-@&W7hb#x$D599Aeo^|NV_W8+gR|Ku*4;;L$FSV~%1U!{Ux3QPBk@3Gg{i5(wX3IRBJi$lWC}AD#y#(8HU~m9 zlz~T-c(n6K5UW`*-9~5h1IQHW7M2W;hiQCIa7220`%o@;sPhI(BrCzo0oZ|&E6$h; z+7v%e4#p;Ru0Vr$_Q8^b#^Wnz%m|NI{?x7G)8h(?%X7)L3|~JluSr*2NB`}#aZL1# z>8t*;Zk_ejkB2#tA7V_j7fnO(cjIGXW=>5=06iJz4}tRQ!8U+luA=(68e%teij-j7 zg3B2`w5woxaf+wMp+gJiUukRb3<*^qgTDRU-94UJeA^~2c53VOv+vEFqauIVT3LR- z<9c3JTAI(V&@v7Bn48GmggF#%XqhwZ4wy4_pe<85Ypke5(OAh;bmq>1PX6=##1jBe z277L8!@Ri-Yd5UIF)?`6hP4fI=QXTdzY@pA;g#g;xcIX2nAq5u^76R2k5`9;uX75H*o|z?r&TFM%u9yPRwFrlj*{YfOd9MzF^To0Fgld zztb_mF6>y$tz=s|R?^;X>pahHmRyDCvt)pRVwaA+Zpp#xpuF4wEb*w~1#b^Kf{G6- zOPL^D1eyq7H@mnbI$K#aG`^k$Ge&2ZY2@-HuYgk+7fzjeI4~t8JS8eBB7D5HnW>#^ z&BmDM&M{-Wyz_&7edmTSe@{$GQak$ixNRsX7&FFJJKfsaGf|T`DX-FV0r6R&>$ z)v@E1RW&uQp1ASp@nf|$8(}7Q?crl<)?{R6WUO0zCVsqamK8WdVOJ>fQrZd-qFE+ z4G{xvm$b)Vi1z5=`2VGkG0*fJXp9AwDRh*9h!g#V7L*R8tEWsk@#@v?KK|nP@v185 zhqn+QdrDx zj~Z(=ZoH>UaB#%D<*PC?MvSz!c6Hr_aXORu{Jn5DS8q2P>j@KrzR8S>pY7r7;^OM& zwh98&p`JEI#oUB?K%VGn+XBz*8Jp4Na}qn>lDSz~wJ$6x%4<%2jFWQj{5f%sjuUMC z>uTJS5<^yGW;i(~X8U-vv2#*WVY=#UDrjGm_l+CpvQb3#Bn%w?)Uafb3>#+AJYl8fr8K-Kg^RXM7|LGMgFU;Fnbl9Tf%En(E$ zgGWa6U}HyRWzJucowb{PA45zKtPi4nYruzl#so1vf`XuCHMl-+01V(m;5j%bwIaG@ zLJS|ik(alv+{Go_di-S1bCdl19)O>Tdsb#?IU$;TJxk)|2Boa!>EjsHSk1v(DFd5C zWwGnnn|R+LCh-uy;d&}p8_UyrB6FIphaMght+Vy@^>3c3o7&WL_SCd#51pNp6W!on zVxo%+7xDU(DOFXkzFJdLU467LP^0p%p6aL41oYx#JQt(xWB8v%?tsn@k!?6>2l)Y~ zky9AvybRbFaHz?!$}T}d+cN^Ri3$3x;%yVq;dm!7#O7#ZtZEkD(kO`jn}?b2zay=< z9Gf=6T!roai+b&+6L^oTjvafJ8LNG`9lxarB)?FJR|B=hiM4@4rW=E_EbC^dV)gIK6#+Q2wWPVn#GSr6~xg~vKJ|7qts1k%$Gee zIi#`M0Reoyam*kE$zW4JpI6YR3oBlaph~fz0E?P85Wdbyp=+y7n^E}r&d9R0#bfLp z(n@S?J=_x@=%T2&?z1^_n3vT7xj6w4Y?7N9sEMyFE-s1o@=Ar6i^RmJG#}r{P*=Cr z8e{P!g$e;0--*0;6t^Yyux+K)px?Q3fn@e}9n%3i2Lygc+V*0SEXb zRc|R>4N|%}@U{L*AH}n~z6&=fncD3JaGN{J9KdAiukfu~H(iCbMgQ%q_yY%eLT}6C z2IPTZ9l9P8rK1DomAqmon1Aa2D#xus!PWUWuH&u8*_)fc5E5J+?(VJ}KX&W{M^n?@ z5Ha7cPDydM7%{@yI$&jLs+pO^$l=57?0|^49{A;Lp#EUgQIVmJ+%JsJ^shVj0b=n0 z+B8oC()%!{W<&K$0Ya4^S_HwZ!WbO8xfPamQC|@l_Yw2{sel+-z)Y zCjfuOz*$m2+Km!CrvMYC!c+KQpi1^O30zO+G1s_UF|K25$EFDKJuVPh-yPz?t=H~_ z@={3Z-R9R~{K;Lf~!vC`8+PtuVew{Gn_@+Cb;=IIryCj|F9 zojZ%=eFnntaWI@2jBsA>qJC@LhsqBp}~?g?XIpi%%^`lZa|$E{%@ zfb)GoumT+5Z|ebvFjn;oxw2)`CqH5if+4yQExFe{GKI2ip-t8hJ=vo))KlwNV7F^+2IZI#W%4@D908f_wIUK3^dvm{QjcdT?r`=>5oN-o z@KEO;@aJRxNtmOcxB|x^&hSfT#`BA~$`LG%_+r9%S906(Bn4i!Hloeu?|(_1#fK#<%U0z|q|(xcZB zh7Of(B=tvQLjl(zI0%Hko4(NZ&z24k&R9=m6u@&!i*+C5`|cz!oTx6We6V zQ=$e|mkt@%x>oh48w{mY9{n?rK^w*G>6g1;^e3w1KIGJ*AIKSF4F;PDbWsSyJG2?+ zkVETnKF(W9j^Lb1dbr>Os=XxqVl3d7je0C z*-?nN#MwvnLoOMzvau;FoInKX)$W)}@D;%v>rIH$&~%k*ueT1znV+1|`S_qZJr}pm zv1!TOjEtH(b;XpK6_Y0Vc;^@FX@~%$B|g{Fi=2!IpEc{HHTCr&!AZ%jC(6t5rYCD_ zRsIfmc&NXsbXH8X!&w`h5Gsx6g1B+DYfV15P%4{` z4vfZm`GJ(zg~{;ZRN31T-80h590tlzqrHv_5oSXT`eJ_JBhmh^5b|cl5aZGCaDD_n z4uoA8yu)J}|;HEbpJ`4Yir<-2ND$*iLEQ|7YzqoNyRw zJMq^^$#r#cafu0aO|h{rjDv7o2-3H50~f)NoB0u}2nr1;ujbeDIoa62e58xD^#qvF zW>IkG9hn?Fc>a*hBL#RVOp#LC2G$#a>MwT|4FL6MWlwG;x9XZQw6Ktfh5&W_$)sH| zj9he&7{;SdhRkSQ2mWRJH*6CeJTGJMk|Y|oiif2~R8`gPXle=$YERe2uYUX)H@~ky z$D>(Z-dS1eaDc+H(%s!r=}v=MpNVi%hK4pZZE3641-AN+G&|WH2boNQ_-Iq!lOY6d zP&(B2Waw*8!lHY<`5|^^#mhi&x!ped*BTo83`SL|hXqN!^gS8eVaF9K&i5UiDy*1n z1_?o9Lm@uZ5dT6v18;cgMTb(sFq8<M3_$UFsV`8kf9oc;SB{`rm}x#H&_ea z?vKYYo!3D@lK|~WsK-Z$b!DM5X?*Li0_E_Lt(-1uT?WrzFnAt%pFY2U@7%7(;la*d z;m>8s9Vi{VrDExVIHoU{iya`oBBGh?{0!duH$+3w_*pEPeVp7C*XrREfu1my1X919GoRI2#2OUP}1ldSaCO6k3j@*PsheCSnyK&s#Or5 zJAGy2B)MAcO}@*7Q3nDj51W3bfl$OknV$Wu~YrqM8}15YhaPFcIAeaoCD zVxpshVxpC6*Rrzs)vp|<#4!U`(m#4V*WZm_7^n*tFI6nxA2=<%+{ zg8(RZPzX*4M&kg{zZ3u}M=1pz0cxihpy7t%I-&tEAdH1UL5LCu%D`CAjUN$?>pUD$ zLxDp#w)#^%2L*8JKtwbE=D5lIkQ4ZS1Z6DeBXL!(doa~>0 z42b(T`eU#_759-h9o(=Ap6qw`2#$1fcXNx1aCPO}+`_`$ zJ>1qYFyscS0PZ<~j}N!B z5LRkH2qDkTU^r@M)FAH}>h=n8AuXG?kOzNT@$`bHr$P|?@B`1RTtE(wCQEQ|#qU!C zGg@L|N8%Q?eEpl`5rkr`n!b9&`A2Klrf+B>ma+b%*^|j~NuRhY!38e^PQ^z+13$2$ zQMcVTo9F}r{gTE&Q@?Q^anRap!m#f%9=b~w4Xp+k<9*aX()nTCZv`NN#1`Cv7T6BZ z0@1we9n4Mkio>>_O1j3Y(2kR$r?X#N8B&QMb@$QAs{ZM@PoVk_AB60Xu)d)d`jgLx zHBgK;o&6ppPWus${DGpiC4W(#Dz2)4wJC3kaLycPWT{wumDa;SE0JX1JSdzSfyhmD_umwEARR=^lFh?eMzWT(0s zZ_@UM0h~L$q-68f;u7xdVGxlO;O;i84}|==Dl2=^q_!A)dxZj&e;sbF@wkc9=MmJ` z*wb33Apr)fID3OPR7^3Ey}%tR<~YY5jeu+%q)qY$cxU-_maoyNzfWL5?S7B=^ttfL~x&eGCugTmW8udtyvB4J#olQwPv_#FHY#ar)M zAJ0q5ndk!*H?+mEJ%Ai4`Y2E0Gk(ZCVAX*$jf&`Fe$*hJ1+|X{%lkp*@;q_C^dH;` zV2Zq@!X5xl%3??l#1hiyH1ANl(bXMNv6O z^L3WEfP=%JYxA1+;5ZQHUk6@9d|3oyKs<;b=%_#exByFRC{$o5zXzj;|H9H42=Mpz zj!p3N7!Wa%pdg6#bqNfG6-Q2#LP2+CcS77VACor(>=^2!15(R&eYgg|6^9I<5~xS@ z7}TR+Rge{FFhr5pNym@ZH*UHqfX`Ya zIRa9PX7B;cQk)Tk`LOQz5-O~K+tSu|g_!6En9$&oU&Si>O6kM?N307dL0Sa*6J7aE zV@z~>RnM^jp3Xj2i(-h&8Or*1rtC^HmJeYSJTnrXquBrdGroq}kiS6d<@`K3EYpH1 zN5~q{Hx|@}QF>}7@(-K}OLI^5P6Hs-&jG+S-+bYPn~zrY!op|T%RLeSh|yx8rS*_P!XCj|p>#!q&MTV!c)nsjGsO_H31ovBIB-G%CK$lb#k_e#D&WWd?r1!NA(pp?bhxzV?DGoeT?v&8_K6yG`#pZe?5BWN*&gv zx5D}yeIBPzAzdS3!MhTNZe`YVwDT`ZmJX0(BXrd8cvY8T3)zSKEtWs^@7_5#bhO|G zv|!eAe1I>4@^pO?cvEEK`fZhbC&(&Yzd!CQh)~Orx;ss*ez2Yn)=5tqk2evdmy$+3 z^Lo#qx!lBAnIWWfBP&H6Y_QyJ%xRr22solyNkE>{tR%qz)Bli{MAQ!-D?N#|2wZSmU;U0{Q@?jpo*LeJb+55lX*Swcpcq~-! z?$wH+Bb`0jvpqugxrs76z&%8h3=Q{&JbVb4C(HF2>0nrAC+l-k9nR@0b3VWN|AO;g z_QvDn-m%mN{xOhktltdK6jDjBnD-H8wugvo&^(8LU+u#yxmZ3JULOsEjXQKSEVbeB zNk`oO!Xs3y;<2dq{FO5D&12y15qVC~tt6{~zw)v}UuKG2R6lhku@!lcehy2?-7YRu z4YP%fu+NP&&uThO{o@ZllM^|mOYJ16;_X5*r|tw#TraRvRi+y5%Durq6{w868 zdZ1;@e6TON)@@L~FSLWWQF{WGKJa#gkmITq)=cZo`_m_B{ltPP6sP2=&B1j31%Fr6|6@+ z0`xs{cJZ1bekijC+?orxHRRfWSz~=(%y;7RJ-93e|2IT&z^ZA94xX|5xFNMzt$882m1Fqjy2JSP* z9EV7tF2|f;5t)F`T;w-YE>OQT&>ds0eV=zf3+am`cX>}UV3diG)pqkS7M_O8bRP(h zLVh}_gD^t~xZ;Fd$b1BoP_nsDGD)Eg5enuT0C=c@i!b?XcQ9)BHE4iPDES5cQ7Bl% z7hQ{IDxtf%c9jeJ{|M!tqdqU8SPp?(i;v4;kLZ_5{bx`r9?w4t#qtl*(Fo-V@B+UQ zd?$U3dB!}p=cuQto!OEe<6fwB7GJB#Jq-0!3c;Qp1py@N82w@}#99atL5>5+Fkq^o zEK_MJp|I`Sy^n+a&#cL9jxooV^RP)C^LOp-jpWbGWV4WK8Zy=}tpEdLHlaiX@55h> zDgG}xwR9;?S#+ zHjz@61N5yh8^Y@!Jro3*dJj?(^79`CQBT^3e388aoM>4});>gV8iF4({~C!J||8B`%l4&kSntu|sDWPOhj!~(h z*4IG=660EJY`kCgQbd1oXloNAdA-1%pNLX@3O}28aV=eRxfiVnUV&^H#QW z?WqEC&k1?xXq1Hz(WRp7UHD+#ayB}%&zaf8HpP6fW9Otv1^IjTd=}9ZY{OdVwl3&+ zcH-Q<6%~~gJ15r~k18&HdEZC3jvOv48#N4;VgHRhAm>RtSEpLM%SZ?@hJQE!_Lp)3= z&^c@1Eo`2SOJiC&&7erT(n7!-zp$)#=1{UsVAO^QM0Y@`&??~4x?J}|Y!z_YK{DPS zql|apMztTLUIkvK5;LKKEz?)4_*t|*TE+3q-LO&Z0Z^>2uiW{*f;iG4^p(h$2WeQc z&ec0$N`GdOP99|OeJ09-zFMag>+Pd~Kk7t+VH-1i#e5H;jPXV zfE7+c^xJ@0m3dAzG;}ud01ge89cKhiDbVPI{{xMRTJ2+@a+!|fJsvjMPqFWT1Hj+^ zFBB^B#-X897d|q?tkp2^MV(y%^eOCbBHCY6IpX_L+~q|31?{cwy-ps!Oev-FXP^{U zKIb*~S$V%aUF*^->os4JYhRhK$r4&_pZTw~5kj9sL?-tV*eEhsNzU7bJZvIfMDR$M z*hSqC!p`f0&G0isZ@5ZhATn`47|p3eq)!+lsQJ(*i0pH`1;IlIRvuWs5SOo0E&1fO zg}9V%5<@1#c{e%4jJ}EY(Y<0w;Z5y*W;8UY^C$2vxd0BK6c+s6T^YkI`1HU0nBzkg zC}!1WU+5BtcO?%O(TZQWbXZ6qe)y6P%^&`gkW_p!)i8u?0X|?iL6n(pMTveU1)cAp zKaX-BxdQGE;9%}Edja0mkCR&$BYz!i7vPUwaWyowUsQkTdSmcEiFh}lJjxczi!`#>ukpzJ={*YR(ru+MhzsY`YJ z?h7!3UfUPUz2jW^XhA3HI}Lle8UCSePD#_>~}47pO|@dfOXS+|HJxlYPS!8`ul^j51jqg zFOYrXZehPrVzd$ByXnqWA|1(khsw|dZsLFy_PUxm^JgQyz?gV)@44sn_r1Ec{RMk7 zy-=9U(qXUE zl?<}z1!syi4z$8W@|O;mELg&{UAE9JVgF<5knY}JY_KFby|dJO-T$H+!^}00`deqi zP|p;19_&_{!4}cQ=zJG?Pwu-3EM6AC8`3D0<+W(4Pc=Q6s>0LMXc%E}iVwajzaQ>d!3b zAiZc%t^o4{D3>Zt-7pJ!U=L7h$fF;xZ`yQS4@yqd#0BW?2&HsGC&ttD0O~tYqtpQu zBIwE(Wsr|KC&@m3O{D07lF1+*mkL6Z|5j+~P@WS9t0Du-L`xKLyk5>i;$ z;E@X(X9LSDs9R-eJ$?GY(j;#EFcT98$LOa&*B+TuSs9?Q{ByjI&r~Mz^NoiqDxj-$ z8DkavN~ON?x{B6KKbzk^sk38x=cGN4-S@$il5Q>1|C}X9RLh5&$Y-($(NNdTK(Zm; zV!_A(vb7W7kW!!qfp0JlB4glmJPjjA2+lI%Qvztr7@egc%qhUWiBQtJ5J>=YNWHZo z=G|U;hk=R#e*SuxpEv^kX3+n2)^Zn}AJHdniMs(+yF%S#LG}+R+cq<{UwJO+S9H_d zt8MrUWDuuwWW6LPPSlr_J>()ZhQ}WVu_t=_N%UtSu-pK;cE1b$fnzvAAI*~72HKNB zm0*R@gPD8l8kTBTeRCB{0J}i2I0Bw^hWVdX&_X1XYpQ@{!Ye`>V=`k8aR%1&MoRq78D!U z-~)bAh;Bn&>SD>Qf`TKsRJ*0d-+zLQr&mTsWo>4br`H4y6a`WgNG08{2yN6EXlPf^2f@bp_Xf`l6FV@;ivw=DXR%<#=iwPb2*;`7NXJm+N z1fe--8#}^zNjiY~#>>_rwGZkWq;j%n0v$M^fG*e#DPb_k2gV|4>L2X>P>cIb?xM?R=+SpZ zL!jB-x}p}gbEDg}8Y+guaM0<-Ls<M!H{66@;Gr26ON54j4fy+(y3s+f_as1tZwQ4f6j8zflezOI>E- zZ^fN<_$PFOz9*r-d41A??QRRJxS&jSJ^vo%{j}7slCd|ref|?#28rckW1tRpZ`ZRr zIr06cGq6ItOIM%xEY!)a;_HNR`C6$=xqM|hw%6_w>*pT@jvIk~Wk-Wd;XR+Qvj^;t z0Urxy?Cl2+Za-j8YQvegj^P0E;V}TQ>uHFT;dcTNJa+sW4iK%%zeV4B@PKiLB-cSl zzI_$DlWVVjdxXBd8;@hIvk`r13e5GK+}4>{*;!e$T61$4&t}-8C~Nxk%*=@ybga+m zyeqwiRlKI)EyNS(`z#EHwBfzR8vd@P=HT982H3#4~;qDRa zQ?U;-qwF2RU=u3`hlpS&C)UQnfo^GKZyyot?DTN5y+d#${VfcB!%fHPrdCw!Jy|!U zr1bF7sr35z)Tt$N+HV+6WD^#g`eI}QvRB&D72iI(Pkw5I_ zT2bQb=j#JK4tq8+&$D#TCUM6myp-RcX)N8VscT~sN*nr5Dlm+9em9hK*!~iBLlK{Z z=Q@GYv!{SwVLYh-d%?n99PkB5*Dxl5wSh}xp27@vL1B*c+^>WA%V4V$jG8*XTmG}S&@T z6Kv1ViixqE;L=H3l+JRJHfWIvm3A0*-(_hMb#rqSZ1P42D`-KtHf&zL_wJ_MH#+18 z4>86pho2`kcn7IuHjz|(QahEg)_%uW&zncFJQG*Ru5-(g5!@)OWRNylrjT84A9kRP zG~#t_2PA(n>kmAI*Wq;UR8U+n#m{$$xgY z;q~yWHI%(jDBD~igM7@e-IBHBuLEs(9cgSk&^}DBXpBn8Wp=UDla>sw94OgYhS|kp z$>nW(BtN!W?rtLu6bs%khp}366TEL-^M~C&OHn&jiNi)F-0NoAyBu`^+-h&{{QQLr zcU*3r85jG+>`nQhp`J`&(7d3mtl+5Cn}1udfV9E%xF$9v#NJ-1469B~X1DEl`{L4N zF|jkIzq4ok`s{35+vxYRvn{RUBy#OK?WH((x4^*SlG0Ki-#K$AzV;DU$u;ON%Fn3= z4Igf?_6c%W;!Rwog%9`1W;|F8&uNIe#0Z`Pu4}Hw5dLFIY2H-Blxoj%o3$bMckO+a zA?}CSG0cP4$U|*~HcW^VypO-*K4Okh`lnftAj=U=Wkl;Pral#jAq0#n95B#^IaaYw zSILFfal>7#xyD@Iuf4@R2X7{#Gtx}sfvs0@2*Rzs%kpg(9rR$IxsLf)z8n*cj98^ zKfZox^P2sGf|62weVN2*#U*NWNXWct;So(ur|OG}0@U~G!(fBzmrH$p12oxL0Rbno zH31h&;7$!~+z*@I8bj1HUGXhOzX&W>7apwx+=A_l_K8y}XU@D>9UB(_S8D&t%B8i@ zT>Drzx6DVr$EQuRd@#Y?Et9)4qoBao*YbBtY44z8u!ASfGaL;y=&+*ma~SU7*|i|6 z*8@7P0K0tVO516_S)bJ6v7d-z6vkLIWC^QNn32*~gC}2xX=G3!19YGB?r-j6Vu1CQf zdsvz*s031*nPTbas;a|n>FHixX=w!|IoeWbRrPE0 z(*DOedVbQ8e3E`Mv!$rWgDb%v2$Ifsj+2#3eSkv) z0N9yfC6-oZ=4MJ+c}Eku{H=Nsj(0il%cC+5=4Cn}>u+;Fdz*YZ{z^h2UajgY%&Cgn!v+zj%$25vF@=(|-)&utL0M(FhzZ zUUP6=FJ1%9;&tM+6q(@D;CyyoCKL%fzCOFUP+mZGtE zhj=Xmf_z83HbO4!O7YqlFJk{8UJpls(oy2I2`ZM-wFMNO5t7}~-^A;YD1KBOibZv> zPhA~qg<~%4Ay*ANwHj5xeFa=qp(ZpP%|XrlQ&ZquIeG;SU(f@CK+4PEnbt7a&N{-q_?!Br!yYnMZ&!+QA0QC3&^E&N>#yj=rN&*CBS zLMXOwa$RfP+?r~6bwz81ysByXoaVa8Q(EP($bEx?H1gIaxu1`ZzdWt3s=2A9skT)f z)6_h@skx%HuBp*W9#vm2&!W$_$g^r%YMN)&R70WJQ2Jzmr3UKEL3!{+&E%#Uc@A7f z!`JnI2o&8^4}T4xq;f}mK=+RPai7fNTi7CEgW}YSYP5MZ%`E`4+}8_ky6dIzc^cH3 zljmtzDcxMN4v;73yRVf;cr{ei0Qb#k8hlSX<#D=64)0Mk(NbG^kOd;CgD#}qKLx&% zqg((!oA1&LzKd(%S4u1uaHb@c(+4CI0g_rMw~8-8_audM4!lvxe>+g!^u1=Nr2@*J zur!I#G{f~&G!uTKFjw<6=!mWbU=+G}zr3zRULkL7uBfhQsA!%hZ>sH^dgRSDlj~Yq zYnp-h>Kf&(Q)=Y7UfEvqjEdHp##VVnW3@b|tB{GcwRKfB{FeZx++SfEdW>)z)M?2aYoxF2ZOb*p@X7Ys%jdmp#(iDM}TCZGrFlp zpldmxnT|NxA+><620%$YkL1~KM~Q`2BJhDm_=b*2+65E{Is)tA_vvu{f1RBReACx; z$L}RZ2HDuAO_O$kM1*9CTi2kF88AunFg7xE9Pk74a2~QO*$T2`WC_Qp2~R=SS4LhW zbPF%@OyY%C>!us);(3d=DcwGFW9#az%-hms+N<00VOxgwJ^w3NGB^pT_4)b!CH?QY z=lssO=br!l%a%A&B#B}V;qH2C*2p}*dc-!)lL_QdnK49~M0*FC7+JkMlK_%1iSQ5| z+HjnNnP`<6%a6w0yc?Q?(zrv9KG%yM~H;w54r<9 zZTD{U214BglrI!^Jk(gbQtEV#(>8_kNueZ0i+?@_i4;i@J6Y7$8 ze?hSk;?P81ZtR3DkBZDLeD;w;NBUsd&=~G1?~HVDzDyI7BeT;Yvsg*6O4wwwXeJCc z^16hFn*f#IbEE@Ol#?7}!cQ{mwa(#8Zk%UvDdR;jOM)qi>~2Q!Te9V~Om57a6Xh(? zq0Jh%4+&A88Jol-GHJyMnSN11HuqiiB$Qq!lmSmhEOC>9IWGL4UKdXBQLW zDOq|X!x$}$|1(iJFUBJbw*ujQGUXTo}hjY`hE)_H1IEm+uwroU*~XCb9HvldXP<$K*> zuT*PNdTn$EqVBeU*TL%7O)c&-NCZjMaft0m|VT|iS2SRB7%`WsbaF` z^M2TY{yiZo0!jl%TeQa?^!6CdSjVH?BF5+6h^3j+SWCNE|5?Z!YmhGmW-t`7Y>8Y= z7(%*25Etom2R}>@76)WdQMc30SfMs4PoW}fw=W#(${K=F?IA}`sN7Ngq{rJ${R_R_ zUXP!;*Q#yMw#y%hAOib^$}}xy)*u<3=c-CpafHIs6SovUgrZ#3X`&QDi3?1NZ8 zsq0Bpll*9IGH}jy{5AYkKAV)!Ui5S(cmca(Gq`VD%udBj?tOonyBVM1-uI2%yZ;=Y zgt$q~;**{?^En#_d(yY^S>@Zr@5% z1dG@$s8mb%3)6e~7Wn(r{UnnINj*#Xi_;pljGgXUwVdx`s^hw%UOlWy_d>`nBmuc;ra?dm!8 zbM+tUn`)2xsv1&%t^QrTqE4v)Qvb=fQXW*Vs}c1FYJeo=QNKoc^hYGDx78o2AF4lA z3H6TpM^fN<^(X32)o+r_|4r>yf3AL{{tP$#llo`%t6X0CxtJD*1l4|Aw}FL1s!}Nv zHp2OPERCC3R$}TYzA<=E9Z;Lq(`t*_s*>to)SG$=U%8&gw+PyFzWP6PSx?i`wOtpe z6nm3}dWJ6I1C+(OM9Q{TlF?cMC{R_KL#kzTC+R*mUO_9gGp z_v$a{`}F<#0sWw^(o5AF>ZGpLHF}wL=~}&9f0=))@Q|)o|I6;x->JXX59<|rrEcIq zB{b<~KDN`scX+PRYxO$asvpsh>c{ls+O6Bv_q9j2Yp?dHe^BqLBkXZ@s=rVdx!?U0 zHL8B9{!;x7dwBcQx3ynCq1Wqx?$SXW(%tHmI<3B=zN>yuol$4iu-c~H;%{nSRll#! zsozn*r8nrX`UZQa5gpYV)k|uxdRhIeI;@^mzpjp|XVmlR1@%4MtDn?;>Idp~^(Nx| zHT@O+RQ>~9ZuW-!24u@CwpwK zY7db%SQR36&-kHjsmG0ITf1qNGLAcvU!5M1Ee09bR&56KT8+JWytmyuewbgKR>Nyr zTeXqswVHxuSw#vuvd8vi;{xm*~Wr}%^l9`~B z;t#ZYZS1?zxdl&Tj|;z?qe$WU2~T8^ z4F*`d{T^GL+rx5a3s_BIUG8~-oF}$ALr}nK^6IcYFTgKbz3Cq`{p)kO6b5si*y>IH zpdmQu?hf@ts4hCa*Hs5QuJZ;v@*hqcA4(hFU?g+tjDm#?Il>CVIZtd2MsnCRjiy(R z)f6;l2`T8w9v3#{2q=u?Jh3$yF%hfDYZ6CA#8J)0QBmWl=CrQSw64v@QBkXz+8p)= zJEpSlgjLOHr$tR$(2~`npf~4uP0n#&_Sm-8*t5xM>}$uP&c12-FAnQ0@R*@5q0pkrkUe8QhL;wR*L%YP`jo^q%^F)u3DN)NfC*Pq}}}x2Ei$@;-m} zTA%m))XJ$}vDs|5BlAp~inz?A^a`bOX4XNhTUaY7iPfz2&QN>hQDz2(i1F8lr z1GQi!XasqBMarpHf=1Aka$fa{i@Ku_2}M*6v%&4Di>fr0q{^sQPL3;58`Q$os9KbI zMlDXAQ%h1lDvTS|s?-IwI(1&H;hc3GpGysCXUfNTamI5oUYzk<`tj6u>Ys|#59yiU zjD&7T4d`ZclW$1ahj%vfd<)nLwt?+n2Z*QkqQm>>uooTVzwyk)>M|;+3Tm-M#Mfe~ ztV*z%*SCPJU>n#Dc7Oq^W-Ee~5->Nl8~zjOS75Ay`mKubU7WF**SCPJU>n#Dc7S+l zF?G>RNLh*wt>_?;Sb@fikgyJ%1E0Yz_yKc~C-SR!bu-6Xz*evgYzI3)oEX^0`}@HG za1a~<{orsa$vAO~Z~1$kd$Hi&H1EUkK8)>4;C>kHhq1tJ*?tf9SJS%&ECaP*C1?bz z&}MaN5WgqT_XNHg##h7mY8YP)oCW7ngZOt?7m4PoK{r#Q-a&*eP;-P2YTw%#xfGP)E8+>w6EN6ElnRSqCrSs2 zwGdId1Z|UO+mE(GXgi3u3A9b1Z31l*Xq!OW1llIlOZ0yk>;>NjMiYtIzI0UYwKOu3 zP5hvpMEA^e6ux0aVHqPCyT@v3V@m&(%CGlMn z-zD)~5?d13lE9V(wj{76fh`GaNnlF?TN2okAhMF!BR)-XMP_380?{FJFM-Fi*{K0b zLs(jar5n(95Pb(NpEy%z(Dw|prId`Z#L5^;IIc=Hpt}p*UFhyoE~228_Tf~IS^>z4 zsv-3hwz$aSKJvIvweb3C&Rau_u4SBcw5_nap4T?P$7V9~7O)j;1KYt45WoCBd+n!2DL$JbL~ z@I1`@6`AS@&NA758T>AQ-vw$GcFqQK&|z-sMYz5I*B9vVO=9B%xPCXCUxi~I9LL}| z2FEe@jl=IC{K|ZY!S5ja#^84leow*gh_#|T&FZxo*;~L?unlYnJ3yROaVO*LW~^ty zbKrUK0@wrgG3I`702~B|KtDJPjxg3ya10y=C&260DzO0`Wj@8=F$Rw@c#Oeg3?4_| zaReSm;Bf^0Vz6SZN3yC}oH=194m)w!Ny1JNW(JA4*)T8w10ygn0s|v3FoNYHSbf2= zbQ6*IH0N#xTfkPZ4QvNHK%A)Fhm8H;05}K^fqrlp96{Dma10y=C%~($)32e!>#UOl zT!)|JwNv0UI0MdFR*X!rq7^-^x2lQ~=18`(xJce!ieE3{SE>un+DW?`JPV!!&x04h z9xy#c*6go3-*1R$ju&OXTYXSb7P*ZS3n!V^7bH_;W40 zgzGq#xp{Yo$I0Me|Hy}k|h3dyQlBKYY<0g)!a=iiV`mMUGnzJ)n ziAF|)ON=<%^0eXq+C~%YB;p3>o5_Mz)36T-|bwPlo2gbmo28f2V|~Qc!gJ&;G^rT-*wF4bxj`E7mAUehD?VF#O)=Gn6Z;kbSx*XhX90Q+P?NN>W=WkF$Cs`6 zG7jT$d>Lm286XF^nD^PMxA=IED&}!DQcSN_dbQH4l?Z61=UTaDCR>)u7-TyqZ3XWv zqSsN$bE@9)HF+#KXxh|JS(lv6~&}`?&Y82Pv=cs8%Q0$*y5f`@3Yr wb3E$U<)5J*VrSl|>e*3mRu9V#I`=!wUQ!v-bN7-yi;n!Tm&8Y}$B#JpfBBsW4gdfE diff --git a/src/main/resources/assets/v5/font/segoe_regular.json b/src/main/resources/assets/v5/font/segoe_regular.json deleted file mode 100644 index 9fa69de3..00000000 --- a/src/main/resources/assets/v5/font/segoe_regular.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "providers": [ - { - "type": "ttf", - "file": "v5:segoe_regular.ttf", - "size": 9, - "oversample": 4, - "shift": [0, 0] - } - ] -} diff --git a/src/main/resources/assets/v5/font/segoe_regular.ttf b/src/main/resources/assets/v5/font/segoe_regular.ttf deleted file mode 100644 index 17ddde34753d1f0453cc99d6545934d144511c26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50028 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 nC#abHhc7)!66ZovZi)87s*8FBD`E+?{Y diff --git a/src/main/resources/ctjs.mixins.json b/src/main/resources/ctjs.mixins.json index fda31254..e4275cff 100644 --- a/src/main/resources/ctjs.mixins.json +++ b/src/main/resources/ctjs.mixins.json @@ -35,7 +35,6 @@ "AbstractContainerScreenAccessor", "AbstractContainerScreenMixin", "GuiMixin", - "GuiGraphicsExtractorAccessor", "GuiRendererMixin", "ItemInHandRendererMixin", "JoinMultiplayerScreenMixin", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 46a76720..efc8cc1a 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -16,6 +16,7 @@ "environment": "client", "entrypoints": { "preLaunch": [ + "com.chattriggers.ctjs.api.render.skia.SkijaBootstrap", { "value": "com.v5.loader.V5PreLaunch", "adapter": "kotlin" From 2f41d7e95efaa384c4e62ff53899757e522e7060 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 5 Aug 2026 20:45:46 +0100 Subject: [PATCH 07/61] codex: perf(renderer): reduce Skija frame overhead - render checkerboards with a cached tiled shader - skip unnecessary image clipping and use linear sampling - support callback removal and non-blocking surface submission --- .../ctjs/api/render/GuiRendererBackend.kt | 46 ++++++++++++------- .../ctjs/api/render/skia/SkijaSurface.kt | 2 +- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt index 22cf9989..aae300f8 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt @@ -39,6 +39,7 @@ open class GuiRendererBackend { private val alphaStack = ArrayDeque() private val scissorDepths = ArrayDeque() private var canvas: Canvas? = null + private var checkerImage: SkijaImage? = null private var alpha = 1f private var saveDepth = 0 @@ -59,9 +60,9 @@ open class GuiRendererBackend { private data class FontKey(val font: Font, val size: Float) private enum class Gradient { LEFT_TO_RIGHT, TOP_TO_BOTTOM, TL_TO_BR, BL_TO_TR } - fun registerV5Render(callback: Runnable) { callbacks += callback } + fun registerV5Render(callback: Runnable) = callback.also(callbacks::add) fun unregisterV5Render(callback: Runnable) { callbacks -= callback } - fun registerV5PreRender(callback: Runnable) { preCallbacks += callback } + fun registerV5PreRender(callback: Runnable) = callback.also(preCallbacks::add) fun unregisterV5PreRender(callback: Runnable) { preCallbacks -= callback } fun clearCallbacks() { callbacks.clear(); preCallbacks.clear() } @@ -200,19 +201,18 @@ open class GuiRendererBackend { @JvmOverloads fun drawCheckerboard(x: Float, y: Float, width: Float, height: Float, radius: Float, size: Float = 4f) { val active = canvas ?: return + val step = size.coerceAtLeast(0.1f) active.save() active.clipRRect(RRect.makeXYWH(x, y, width, height, radius), true) - val step = size.coerceAtLeast(0.1f) - var row = 0 - var py = y - while (py < y + height) { - var column = 0 - var px = x - while (px < x + width) { - drawRect(px, py, step, step, if ((row + column) % 2 == 0) 0xff404040.toInt() else 0xff737373.toInt()) - px += step; column++ + checkerImage().makeShader( + FilterTileMode.REPEAT, + FilterTileMode.REPEAT, + SamplingMode.DEFAULT, + Matrix33.makeScale(step), + ).use { shader -> + Paint().setShader(shader).setAlphaf(alpha).use { + active.drawRect(Rect.makeXYWH(x, y, width, height), it) } - py += step; row++ } active.restore() } @@ -317,6 +317,7 @@ open class GuiRendererBackend { fun destroy() { clearImageCache() + checkerImage?.close(); checkerImage = null fonts.values.forEach(io.github.humbleui.skija.Font::close); fonts.clear() typefaces.values.forEach(Typeface::close); typefaces.clear() } @@ -324,14 +325,27 @@ open class GuiRendererBackend { private fun drawImage(image: SkijaImage, x: Float, y: Float, width: Float, height: Float, radius: Float, imageAlpha: Float) { Paint().setAntiAlias(true).setAlphaf(alpha * imageAlpha.coerceIn(0f, 1f)).use { paint -> val active = canvas ?: return - active.save() - active.clipRRect(RRect.makeXYWH(x, y, width, height, radius), true) + if (radius > 0f) { + active.save() + active.clipRRect(RRect.makeXYWH(x, y, width, height, radius), true) + } active.drawImageRect( image, Rect.makeWH(image.width.toFloat(), image.height.toFloat()), Rect.makeXYWH(x, y, width, height), - SamplingMode.MITCHELL, paint, true, + SamplingMode.LINEAR, paint, true, ) - active.restore() + if (radius > 0f) active.restore() + } + } + + private fun checkerImage() = checkerImage ?: Surface.makeRaster( + ImageInfo(2, 2, ColorType.N32, ColorAlphaType.PREMUL, ColorSpace.getSRGB()), + ).use { surface -> + Paint().setColor(0xff404040.toInt()).use { surface.canvas.drawRect(Rect.makeWH(2f, 2f), it) } + Paint().setColor(0xff737373.toInt()).use { + surface.canvas.drawRect(Rect.makeXYWH(1f, 0f, 1f, 1f), it) + surface.canvas.drawRect(Rect.makeXYWH(0f, 1f, 1f, 1f), it) } + surface.makeImageSnapshot().also { checkerImage = it } } private fun processDownloads() { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt index 6ace24bf..576325f0 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt @@ -47,7 +47,7 @@ internal class SkijaSurface : AutoCloseable { directContext.resetGLAll() val skijaSurface = surface(width, height, colorTexture.glId(), directContext) draw(skijaSurface.canvas) - directContext.flushAndSubmit(skijaSurface, true) + directContext.flushAndSubmit(skijaSurface, false) } finally { context?.resetGLAll() state.restore() From 1651119d6b876f32e38e69711aeb8bd63ac98608 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 5 Aug 2026 23:26:27 +0100 Subject: [PATCH 08/61] codex: optimise pathfinder by 2-3x. --- NativeSrc/src/common.hpp | 40 +++-- NativeSrc/src/lazy_section_array.hpp | 45 +++++ NativeSrc/src/path_simplifier.cpp | 8 - NativeSrc/src/pathfinder.cpp | 152 +++++++++++----- NativeSrc/src/pathfinder_heap.hpp | 4 + NativeSrc/src/pathfinder_runtime.hpp | 77 ++++++--- NativeSrc/src/pathfinder_runtime_common.inl | 181 ++++++++------------ NativeSrc/src/pathfinder_runtime_fly.inl | 7 +- NativeSrc/src/pathfinder_runtime_walk.inl | 33 ++-- NativeSrc/src/world_voxel_cursor.hpp | 63 +++---- 10 files changed, 358 insertions(+), 252 deletions(-) create mode 100644 NativeSrc/src/lazy_section_array.hpp diff --git a/NativeSrc/src/common.hpp b/NativeSrc/src/common.hpp index 3be5cdef..3a15332a 100644 --- a/NativeSrc/src/common.hpp +++ b/NativeSrc/src/common.hpp @@ -49,6 +49,23 @@ inline uint64_t chunkKey(const int x, const int z) { return (px << 32) | pz; } +constexpr std::array makeFallTimes() { + std::array fallTimes{}; + double currentDistance = 0.0; + int tick = 0; + double velocity = 0.0; + + for (int targetDistance = 1; targetDistance <= 256; targetDistance++) { + while (currentDistance < targetDistance) { + velocity = (velocity - 0.08) * 0.98; + currentDistance -= velocity; + tick++; + } + fallTimes[static_cast(targetDistance)] = static_cast(tick); + } + return fallTimes; +} + struct ActionCosts { static constexpr double INF_COST = 1e6; static constexpr double FLY_ONE_BLOCK_TIME = 1.0 / 0.7; @@ -62,27 +79,12 @@ struct ActionCosts { static constexpr double LAND_RECOVERY_TIME = 2.0; static constexpr double JUMP_UP_ONE_BLOCK_TIME = 28.0 + MOMENTUM_LOSS_PENALTY + SPRINT_ONE_BLOCK_TIME; - std::array fallTimes{}; - - ActionCosts() { - double currentDistance = 0.0; - int tick = 0; - double velocity = 0.0; - - for (int targetDistance = 1; targetDistance <= 256; targetDistance++) { - while (currentDistance < targetDistance) { - velocity = (velocity - 0.08) * 0.98; - currentDistance -= velocity; - tick++; - } - fallTimes[static_cast(targetDistance)] = static_cast(tick); - } - } + inline static constexpr auto FALL_TIMES = makeFallTimes(); - [[nodiscard]] double getFallTime(const int blocks) const { + [[nodiscard]] static double getFallTime(const int blocks) { if (blocks <= 0) return 0.0; - if (blocks >= static_cast(fallTimes.size())) return INF_COST; - return fallTimes[static_cast(blocks)] + LAND_RECOVERY_TIME; + if (blocks >= static_cast(FALL_TIMES.size())) return INF_COST; + return FALL_TIMES[static_cast(blocks)] + LAND_RECOVERY_TIME; } }; diff --git a/NativeSrc/src/lazy_section_array.hpp b/NativeSrc/src/lazy_section_array.hpp new file mode 100644 index 00000000..ef02bd42 --- /dev/null +++ b/NativeSrc/src/lazy_section_array.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "common.hpp" + +#include +#include +#include + +namespace v5pf::detail { + +template +class LazySectionArray { + public: + T& at(const int x, const int y, const int z) { + const uint64_t key = coordKey(x >> 4, y >> 4, z >> 4); + const size_t cursorIdx = static_cast((key ^ (key >> 26) ^ (key >> 38)) & 3ULL); + auto& cursor = cursors_[cursorIdx]; + if (cursor.section == nullptr || cursor.key != key) { + auto [it, inserted] = sections_.try_emplace(key); + if (inserted) it->second = std::make_unique

(); + cursor = {key, it->second.get()}; + } + + const size_t index = static_cast(((y & 15) << 8) | ((z & 15) << 4) | (x & 15)); + return (*cursor.section)[index]; + } + + void clear() { + sections_.clear(); + cursors_ = {}; + } + + private: + using Section = std::array; + + struct Cursor { + uint64_t key = 0; + Section* section = nullptr; + }; + + std::unordered_map> sections_; + std::array cursors_{}; +}; + +} // namespace v5pf::detail diff --git a/NativeSrc/src/path_simplifier.cpp b/NativeSrc/src/path_simplifier.cpp index 532a4a15..c3115e2a 100644 --- a/NativeSrc/src/path_simplifier.cpp +++ b/NativeSrc/src/path_simplifier.cpp @@ -106,14 +106,6 @@ std::vector extractKeyPoints( if (canSimplify) { if (isFly) { canSimplify = canFlyDirectly(world, start, end); - } else { - for (int i = from + 1; i < to; i++) { - const Int3& p = points[static_cast(i)]; - if (!isWalkSafeVoxel(world, p.x, p.y, p.z)) { - canSimplify = false; - break; - } - } } } diff --git a/NativeSrc/src/pathfinder.cpp b/NativeSrc/src/pathfinder.cpp index 569b1753..9ba4a436 100644 --- a/NativeSrc/src/pathfinder.cpp +++ b/NativeSrc/src/pathfinder.cpp @@ -1,6 +1,7 @@ #include "pathfinder.hpp" #include "path_annotations.hpp" +#include "lazy_section_array.hpp" #include "path_simplifier.hpp" #include "path_signature.hpp" #include "pathfinder_heap.hpp" @@ -11,10 +12,84 @@ #include #include #include -#include namespace v5pf { +namespace { + +struct NodeIndexEntry { + uint32_t generation = 0; + int index = -1; +}; + +class NodeIndexTable { + public: + void reset() { + if (++generation_ == 0) { + entries_.clear(); + generation_ = 1; + } + } + + std::pair getOrInsert(const int x, const int y, const int z, const int index) { + auto& entry = entries_.at(x, y, z); + if (entry.generation == generation_) return {entry.index, false}; + entry = {generation_, index}; + return {index, true}; + } + + private: + uint32_t generation_ = 0; + detail::LazySectionArray entries_; +}; + +struct SearchWorkspace { + std::vector nodeX; + std::vector nodeY; + std::vector nodeZ; + std::vector nodeG; + std::vector nodeF; + std::vector nodeParent; + std::vector nodeStartIndex; + std::vector nodeHeapPos; + NodeIndexTable coordToNode; + detail::Heap heap; + + SearchWorkspace() + : heap(nodeF, nodeHeapPos) { + } + + void reset(const size_t reserveSize, const int heapCapacity) { + nodeX.clear(); + nodeY.clear(); + nodeZ.clear(); + nodeG.clear(); + nodeF.clear(); + nodeParent.clear(); + nodeStartIndex.clear(); + nodeHeapPos.clear(); + coordToNode.reset(); + heap.clear(); + + nodeX.reserve(reserveSize); + nodeY.reserve(reserveSize); + nodeZ.reserve(reserveSize); + nodeG.reserve(reserveSize); + nodeF.reserve(reserveSize); + nodeParent.reserve(reserveSize); + nodeStartIndex.reserve(reserveSize); + nodeHeapPos.reserve(reserveSize); + heap.reserve(heapCapacity); + } +}; + +SearchWorkspace& searchWorkspace() { + static thread_local SearchWorkspace workspace; + return workspace; +} + +} // namespace + std::optional findPath( const WorldSnapshot& world, const SearchParams& params, @@ -39,54 +114,46 @@ std::optional findPath( const int reserveTarget = std::clamp(params.maxIterations / 2, 16384, 262144); const size_t reserveSize = static_cast(reserveTarget); + auto& workspace = searchWorkspace(); + workspace.reset(reserveSize, reserveTarget); + auto& nodeX = workspace.nodeX; + auto& nodeY = workspace.nodeY; + auto& nodeZ = workspace.nodeZ; + auto& nodeG = workspace.nodeG; + auto& nodeF = workspace.nodeF; + auto& nodeParent = workspace.nodeParent; + auto& nodeStartIndex = workspace.nodeStartIndex; + auto& nodeHeapPos = workspace.nodeHeapPos; + auto& coordToNode = workspace.coordToNode; + auto& heap = workspace.heap; - std::vector nodeX; - std::vector nodeY; - std::vector nodeZ; - std::vector nodeG; - std::vector nodeH; - std::vector nodeF; - std::vector nodeParent; - std::vector nodeStartIndex; - std::vector nodeHeapPos; - - nodeX.reserve(reserveSize); - nodeY.reserve(reserveSize); - nodeZ.reserve(reserveSize); - nodeG.reserve(reserveSize); - nodeH.reserve(reserveSize); - nodeF.reserve(reserveSize); - nodeParent.reserve(reserveSize); - nodeStartIndex.reserve(reserveSize); - nodeHeapPos.reserve(reserveSize); - - std::unordered_map coordToNode; - coordToNode.reserve(reserveSize); + const double weight = (std::isfinite(params.heuristicWeight) && params.heuristicWeight > 0.0) + ? params.heuristicWeight + : 1.0; + const bool isFly = params.isFly; auto getOrCreateNode = [&](const int x, const int y, const int z) { const int idx = static_cast(nodeX.size()); - const auto [it, inserted] = coordToNode.try_emplace(coordKey(x, y, z), idx); - if (!inserted) return std::pair{it->second, false}; + const auto [nodeIdx, inserted] = coordToNode.getOrInsert(x, y, z, idx); + if (!inserted) return std::pair{nodeIdx, false}; nodeX.push_back(x); nodeY.push_back(y); nodeZ.push_back(z); nodeG.push_back(std::numeric_limits::infinity()); - nodeH.push_back(runtime.heuristic(x, y, z)); - nodeF.push_back(std::numeric_limits::infinity()); + nodeF.push_back(runtime.heuristic(x, y, z) * weight); nodeParent.push_back(-1); nodeStartIndex.push_back(-1); nodeHeapPos.push_back(-1); return std::pair{idx, true}; }; - detail::Heap heap(nodeF, nodeHeapPos); - heap.reserve(reserveTarget); - - const double weight = (std::isfinite(params.heuristicWeight) && params.heuristicWeight > 0.0) - ? params.heuristicWeight - : 1.0; - const bool isFly = params.isFly; + auto setNodeCost = [&](const int nodeIdx, const double cost) { + const size_t idx = static_cast(nodeIdx); + const double weightedHeuristic = std::isfinite(nodeG[idx]) ? nodeF[idx] - nodeG[idx] : nodeF[idx]; + nodeG[idx] = cost; + nodeF[idx] = cost + weightedHeuristic; + }; std::array walkMovesOrdered = detail::WALK_MOVES; const int walkOffset = params.moveOrderOffset >= 0 ? (params.moveOrderOffset % static_cast(walkMovesOrdered.size())) : 0; @@ -106,8 +173,7 @@ std::optional findPath( if (startPenalty < nodeG[static_cast(nodeIdx)]) { nodeParent[static_cast(nodeIdx)] = -1; nodeStartIndex[static_cast(nodeIdx)] = static_cast(i); - nodeG[static_cast(nodeIdx)] = startPenalty; - nodeF[static_cast(nodeIdx)] = startPenalty + nodeH[static_cast(nodeIdx)] * weight; + setNodeCost(nodeIdx, startPenalty); } if (nodeHeapPos[static_cast(nodeIdx)] == -1) { @@ -119,7 +185,7 @@ std::optional findPath( int iterations = 0; while (!heap.empty() && iterations < params.maxIterations) { - if (cancelFlag.load()) { + if ((iterations & 63) == 0 && cancelFlag.load(std::memory_order_relaxed)) { return std::nullopt; } @@ -180,15 +246,13 @@ std::optional findPath( if (inserted) { nodeParent[static_cast(nIdx)] = currIdx; nodeStartIndex[static_cast(nIdx)] = currStartIdx; - nodeG[static_cast(nIdx)] = newCost; - nodeF[static_cast(nIdx)] = newCost + nodeH[static_cast(nIdx)] * weight; + setNodeCost(nIdx, newCost); heap.add(nIdx); } else { if (newCost < nodeG[static_cast(nIdx)]) { nodeParent[static_cast(nIdx)] = currIdx; nodeStartIndex[static_cast(nIdx)] = currStartIdx; - nodeG[static_cast(nIdx)] = newCost; - nodeF[static_cast(nIdx)] = newCost + nodeH[static_cast(nIdx)] * weight; + setNodeCost(nIdx, newCost); if (nodeHeapPos[static_cast(nIdx)] != -1) { heap.relocate(nIdx); @@ -211,15 +275,13 @@ std::optional findPath( if (inserted) { nodeParent[static_cast(nIdx)] = currIdx; nodeStartIndex[static_cast(nIdx)] = currStartIdx; - nodeG[static_cast(nIdx)] = newCost; - nodeF[static_cast(nIdx)] = newCost + nodeH[static_cast(nIdx)] * weight; + setNodeCost(nIdx, newCost); heap.add(nIdx); } else { if (newCost < nodeG[static_cast(nIdx)]) { nodeParent[static_cast(nIdx)] = currIdx; nodeStartIndex[static_cast(nIdx)] = currStartIdx; - nodeG[static_cast(nIdx)] = newCost; - nodeF[static_cast(nIdx)] = newCost + nodeH[static_cast(nIdx)] * weight; + setNodeCost(nIdx, newCost); if (nodeHeapPos[static_cast(nIdx)] != -1) { heap.relocate(nIdx); diff --git a/NativeSrc/src/pathfinder_heap.hpp b/NativeSrc/src/pathfinder_heap.hpp index ba9ebf82..98cf5fb3 100644 --- a/NativeSrc/src/pathfinder_heap.hpp +++ b/NativeSrc/src/pathfinder_heap.hpp @@ -15,6 +15,10 @@ class Heap { return size_ == 0; } + void clear() { + size_ = 0; + } + void reserve(const int capacity) { if (capacity <= 0) return; const size_t needed = static_cast(capacity + 1); diff --git a/NativeSrc/src/pathfinder_runtime.hpp b/NativeSrc/src/pathfinder_runtime.hpp index 52090ac9..e957ae13 100644 --- a/NativeSrc/src/pathfinder_runtime.hpp +++ b/NativeSrc/src/pathfinder_runtime.hpp @@ -1,10 +1,10 @@ #pragma once +#include "lazy_section_array.hpp" #include "pathfinder.hpp" #include "world_voxel_cursor.hpp" #include -#include namespace v5pf::detail { @@ -56,6 +56,14 @@ inline bool hasFlag(const uint16_t flags, const uint16_t bit) { return (flags & bit) != 0; } +inline bool isPassableFlags(const uint16_t flags) { + return hasFlag(flags, VF_PASSABLE) || hasFlag(flags, VF_CARPET_LIKE); +} + +inline bool isFlyPassableFlags(const uint16_t flags) { + return isPassableFlags(flags) || hasFlag(flags, VF_PASSABLE_FLY); +} + struct MoveOut { Int3 pos{}; double cost = ActionCosts::INF_COST; @@ -69,6 +77,52 @@ struct FlyEnvironment { uint8_t computed = 0; }; +template +struct StampedValue { + uint32_t generation = 0; + T value{}; +}; + +struct VoxelClassifications { + uint8_t computed = 0; + uint8_t values = 0; +}; + +struct RuntimeCache { + std::shared_ptr snapshotData; + int snapshotMinY = 0; + int snapshotMaxY = 0; + uint32_t worldGeneration = 0; + uint32_t searchGeneration = 0; + LazySectionArray> classifications; + LazySectionArray> penalties; + LazySectionArray> flyEnvironments; + LazySectionArray> avoidPenalties; + + void begin(const WorldSnapshot& world) { + if (++searchGeneration == 0) { + avoidPenalties.clear(); + searchGeneration = 1; + } + + if (snapshotData == world.data && snapshotMinY == world.minY && snapshotMaxY == world.maxY) return; + snapshotData = world.data; + snapshotMinY = world.minY; + snapshotMaxY = world.maxY; + if (++worldGeneration == 0) { + classifications.clear(); + penalties.clear(); + flyEnvironments.clear(); + worldGeneration = 1; + } + } +}; + +inline RuntimeCache& runtimeCache() { + static thread_local RuntimeCache cache; + return cache; +} + class Runtime { public: Runtime(const WorldSnapshot& world, const SearchParams& params); @@ -85,34 +139,18 @@ class Runtime { private: const WorldSnapshot& world_; const SearchParams& params_; - ActionCosts costs_{}; mutable WorldVoxelCursor voxelCursor_; - - std::unordered_map safeCache_; - std::unordered_map flyClearCache_; - std::unordered_map flyEnvironmentCache_; - std::unordered_map penaltyCache_; - mutable std::unordered_map avoidPenaltyCache_; + RuntimeCache& cache_; bool avoidPenaltyCacheEnabled_ = false; - int walkStartX_ = 0; - int walkStartZ_ = 0; - Int3 startFly_{0, 0, 0}; int flyMinY_ = 0; int flyMaxY_ = 0; [[nodiscard]] uint16_t flagsAt(int x, int y, int z) const; - [[nodiscard]] bool isSolid(int x, int y, int z) const; [[nodiscard]] bool isPassable(int x, int y, int z) const; [[nodiscard]] bool isPassableForFlying(int x, int y, int z) const; - [[nodiscard]] bool isBottomSlab(int x, int y, int z) const; - [[nodiscard]] bool isTopSlab(int x, int y, int z) const; - [[nodiscard]] bool isFenceLike(int x, int y, int z) const; - [[nodiscard]] bool isStairsBottom(int x, int y, int z) const; - [[nodiscard]] bool isBlockingWall(int x, int y, int z) const; - [[nodiscard]] bool isFluid(int x, int y, int z) const; [[nodiscard]] bool isSafe(int x, int y, int z); [[nodiscard]] bool isFlyColumnClear(int x, int y, int z); @@ -125,15 +163,12 @@ class Runtime { [[nodiscard]] int directionMask(int x, int y, int z); [[nodiscard]] bool isStepDirection(int x, int y, int z, int dx, int dz); - [[nodiscard]] bool isStepSurface(int x, int y, int z); [[nodiscard]] bool isEdge(int x, int y, int z); [[nodiscard]] bool isWall(int x, int y, int z); [[nodiscard]] int scanForEdge(int x, int y, int z, int dx, int dz); [[nodiscard]] int scanForWall(int x, int y, int z, int dx, int dz); - [[nodiscard]] int edgeDistance(int x, int y, int z); - [[nodiscard]] int wallDistance(int x, int y, int z); [[nodiscard]] int edgeDistanceWithMask(int x, int y, int z, int mask); [[nodiscard]] int wallDistanceWithMask(int x, int y, int z, int mask); [[nodiscard]] double combinedPenalty(int edgeDist, int wallDist) const; diff --git a/NativeSrc/src/pathfinder_runtime_common.inl b/NativeSrc/src/pathfinder_runtime_common.inl index edad3429..c2306d5f 100644 --- a/NativeSrc/src/pathfinder_runtime_common.inl +++ b/NativeSrc/src/pathfinder_runtime_common.inl @@ -10,23 +10,10 @@ inline Runtime::Runtime(const WorldSnapshot& world, const SearchParams& params) : world_(world), params_(params), voxelCursor_(world), - walkStartX_(params.starts.empty() ? 0 : params.starts.front().x), - walkStartZ_(params.starts.empty() ? 0 : params.starts.front().z) { - const int reserveTarget = std::clamp(params_.maxIterations / 2, 4096, 262144); - const size_t cacheReserve = static_cast(reserveTarget); + cache_(runtimeCache()) { + cache_.begin(world); avoidPenaltyCacheEnabled_ = params_.avoidZones.size() >= 3; - if (params_.isFly) { - flyClearCache_.reserve(cacheReserve); - flyEnvironmentCache_.reserve(cacheReserve); - } else { - safeCache_.reserve(cacheReserve); - penaltyCache_.reserve(cacheReserve); - } - if (avoidPenaltyCacheEnabled_) { - avoidPenaltyCache_.reserve(cacheReserve); - } - flyMinY_ = world_.minY; flyMaxY_ = world_.maxY - 2; @@ -68,11 +55,8 @@ inline double Runtime::transientAvoidPenalty(const int x, const int y, const int return penalty; } - const uint64_t key = coordKey(x, y, z); - const auto cached = avoidPenaltyCache_.find(key); - if (cached != avoidPenaltyCache_.end()) { - return cached->second; - } + auto& cached = cache_.avoidPenalties.at(x, y, z); + if (cached.generation == cache_.searchGeneration) return cached.value; double penalty = 0.0; for (const auto& zone : params_.avoidZones) { @@ -87,7 +71,7 @@ inline double Runtime::transientAvoidPenalty(const int x, const int y, const int const double falloff = std::max(0.2, 1.0 - normalized); penalty += zone.penalty * falloff; } - avoidPenaltyCache_.emplace(key, penalty); + cached = {cache_.searchGeneration, penalty}; return penalty; } @@ -123,78 +107,48 @@ inline uint16_t Runtime::flagsAt(const int x, const int y, const int z) const { return voxelCursor_.getFlags(x, y, z); } -inline bool Runtime::isSolid(const int x, const int y, const int z) const { - return hasFlag(flagsAt(x, y, z), VF_SOLID); -} - inline bool Runtime::isPassable(const int x, const int y, const int z) const { - const uint16_t flags = flagsAt(x, y, z); - return hasFlag(flags, VF_PASSABLE) || hasFlag(flags, VF_CARPET_LIKE); + return isPassableFlags(flagsAt(x, y, z)); } inline bool Runtime::isPassableForFlying(const int x, const int y, const int z) const { - const uint16_t flags = flagsAt(x, y, z); - return hasFlag(flags, VF_PASSABLE) || hasFlag(flags, VF_PASSABLE_FLY) || hasFlag(flags, VF_CARPET_LIKE); -} - -inline bool Runtime::isBottomSlab(const int x, const int y, const int z) const { - return hasFlag(flagsAt(x, y, z), VF_SLAB_BOTTOM); -} - -inline bool Runtime::isTopSlab(const int x, const int y, const int z) const { - return hasFlag(flagsAt(x, y, z), VF_SLAB_TOP); -} - -inline bool Runtime::isFenceLike(const int x, const int y, const int z) const { - return hasFlag(flagsAt(x, y, z), VF_FENCE_LIKE); -} - -inline bool Runtime::isStairsBottom(const int x, const int y, const int z) const { - return hasFlag(flagsAt(x, y, z), VF_STAIRS_BOTTOM); -} - -inline bool Runtime::isBlockingWall(const int x, const int y, const int z) const { - return hasFlag(flagsAt(x, y, z), VF_BLOCKING_WALL); -} - -inline bool Runtime::isFluid(const int x, const int y, const int z) const { - return hasFlag(flagsAt(x, y, z), VF_FLUID); + return isFlyPassableFlags(flagsAt(x, y, z)); } inline bool Runtime::isSafe(const int x, const int y, const int z) { - const uint64_t key = coordKey(x, y, z); - const auto it = safeCache_.find(key); - if (it != safeCache_.end()) { - return it->second == 1; - } - - const bool safe = isSolid(x, y - 1, z) && - isPassable(x, y, z) && - isPassable(x, y + 1, z); - - safeCache_[key] = safe ? 1 : 0; + constexpr uint8_t bit = 1u << 0; + auto& cached = cache_.classifications.at(x, y, z); + if (cached.generation != cache_.worldGeneration) cached = {cache_.worldGeneration, {}}; + if ((cached.value.computed & bit) != 0) return (cached.value.values & bit) != 0; + + const bool safe = hasFlag(flagsAt(x, y - 1, z), VF_SOLID) && + isPassableFlags(flagsAt(x, y, z)) && + isPassableFlags(flagsAt(x, y + 1, z)); + cached.value.computed |= bit; + if (safe) cached.value.values |= bit; return safe; } inline bool Runtime::isFlyColumnClear(const int x, const int y, const int z) { - const uint64_t key = coordKey(x, y, z); - const auto it = flyClearCache_.find(key); - if (it != flyClearCache_.end()) { - return it->second == 1; - } - - const bool clear = isPassableForFlying(x, y, z) && - !isTopSlab(x, y + 1, z) && - isPassableForFlying(x, y + 1, z); - - flyClearCache_[key] = clear ? 1 : 0; + constexpr uint8_t bit = 1u << 3; + auto& cached = cache_.classifications.at(x, y, z); + if (cached.generation != cache_.worldGeneration) cached = {cache_.worldGeneration, {}}; + if ((cached.value.computed & bit) != 0) return (cached.value.values & bit) != 0; + + const uint16_t feet = flagsAt(x, y, z); + const uint16_t head = flagsAt(x, y + 1, z); + const bool clear = isFlyPassableFlags(feet) && + !hasFlag(head, VF_SLAB_TOP) && + isFlyPassableFlags(head); + cached.value.computed |= bit; + if (clear) cached.value.values |= bit; return clear; } inline double Runtime::fluidPenalty(const int x, const int y, const int z) const { double penalty = 0.0; - if (isFluid(x, y, z)) penalty += 20.0; - if (isFluid(x, y + 1, z)) penalty += 20.0; + if (hasFlag(flagsAt(x, y, z), VF_FLUID)) penalty += 20.0; + if (hasFlag(flagsAt(x, y + 1, z), VF_FLUID)) penalty += 20.0; return penalty; } @@ -203,7 +157,7 @@ inline double Runtime::walkHeuristic(const int x, const int y, const int z) cons const double sprintCost = ActionCosts::SPRINT_ONE_BLOCK_TIME; const double diagonalCost = ActionCosts::SPRINT_DIAGONAL_TIME; - const double fallCostPerBlock = costs_.getFallTime(2) * 0.5; + const double fallCostPerBlock = ActionCosts::getFallTime(2) * 0.5; const double jumpCostPerBlock = ActionCosts::JUMP_UP_ONE_BLOCK_TIME; const double verticalReluctance = sprintCost * 0.35; @@ -247,38 +201,58 @@ inline bool Runtime::isStepDirection(const int x, const int y, const int z, cons const int nx = x + dx; const int nz = z + dz; - if (isStepSurface(nx, y, nz) && isSolid(nx, y, nz) && isPassable(nx, y + 1, nz) && isPassable(nx, y + 2, nz)) { + const uint16_t upperSurface = flagsAt(nx, y, nz); + if ((hasFlag(upperSurface, VF_STAIRS_BOTTOM) || hasFlag(upperSurface, VF_SLAB_BOTTOM)) && + hasFlag(upperSurface, VF_SOLID) && + isPassableFlags(flagsAt(nx, y + 1, nz)) && + isPassableFlags(flagsAt(nx, y + 2, nz))) { return true; } - if (isStepSurface(nx, y - 2, nz) && isSolid(nx, y - 2, nz) && isPassable(nx, y - 1, nz) && isPassable(nx, y, nz)) { + const uint16_t lowerSurface = flagsAt(nx, y - 2, nz); + if ((hasFlag(lowerSurface, VF_STAIRS_BOTTOM) || hasFlag(lowerSurface, VF_SLAB_BOTTOM)) && + hasFlag(lowerSurface, VF_SOLID) && + isPassableFlags(flagsAt(nx, y - 1, nz)) && + isPassableFlags(upperSurface)) { return true; } return false; } -inline bool Runtime::isStepSurface(const int x, const int y, const int z) { - return isStairsBottom(x, y, z) || isBottomSlab(x, y, z); -} - inline bool Runtime::isEdge(const int x, const int y, const int z) { - if (isSolid(x, y, z)) return false; - if (isSolid(x, y - 1, z)) return false; - if (isSolid(x, y - 2, z)) return false; - return true; + constexpr uint8_t bit = 1u << 1; + auto& cached = cache_.classifications.at(x, y, z); + if (cached.generation != cache_.worldGeneration) cached = {cache_.worldGeneration, {}}; + if ((cached.value.computed & bit) != 0) return (cached.value.values & bit) != 0; + + const bool edge = !hasFlag(flagsAt(x, y, z), VF_SOLID) && + !hasFlag(flagsAt(x, y - 1, z), VF_SOLID) && + !hasFlag(flagsAt(x, y - 2, z), VF_SOLID); + cached.value.computed |= bit; + if (edge) cached.value.values |= bit; + return edge; } inline bool Runtime::isWall(const int x, const int y, const int z) { - if (isBlockingWall(x, y + 1, z)) return true; - - if (isSolid(x, y + 1, z)) { - if (isTopSlab(x, y + 1, z)) return true; - if (isBottomSlab(x, y, z) || isStairsBottom(x, y, z)) return false; - return true; + constexpr uint8_t bit = 1u << 2; + auto& cached = cache_.classifications.at(x, y, z); + if (cached.generation != cache_.worldGeneration) cached = {cache_.worldGeneration, {}}; + if ((cached.value.computed & bit) != 0) return (cached.value.values & bit) != 0; + + const uint16_t head = flagsAt(x, y + 1, z); + bool wall = hasFlag(head, VF_BLOCKING_WALL); + if (!wall && hasFlag(head, VF_SOLID)) { + const uint16_t feet = flagsAt(x, y, z); + wall = hasFlag(head, VF_SLAB_TOP) || + (!hasFlag(feet, VF_SLAB_BOTTOM) && !hasFlag(feet, VF_STAIRS_BOTTOM)); + } else if (!wall) { + wall = hasFlag(flagsAt(x, y, z), VF_BLOCKING_WALL); } - return isBlockingWall(x, y, z); + cached.value.computed |= bit; + if (wall) cached.value.values |= bit; + return wall; } inline int Runtime::scanForEdge(const int x, const int y, const int z, const int dx, const int dz) { @@ -325,14 +299,6 @@ inline int Runtime::wallDistanceWithMask(const int x, const int y, const int z, return dist; } -inline int Runtime::edgeDistance(const int x, const int y, const int z) { - return edgeDistanceWithMask(x, y, z, directionMask(x, y, z)); -} - -inline int Runtime::wallDistance(const int x, const int y, const int z) { - return wallDistanceWithMask(x, y, z, directionMask(x, y, z)); -} - inline double Runtime::combinedPenalty(const int edgeDist, const int wallDist) const { const int edgeIdx = std::clamp(edgeDist, 0, OPEN_SPACE_SOFT_CAP); const int wallIdx = std::clamp(wallDist, 0, OPEN_SPACE_SOFT_CAP); @@ -340,17 +306,14 @@ inline double Runtime::combinedPenalty(const int edgeDist, const int wallDist) c } inline double Runtime::pathPenalty(const int x, const int y, const int z) { - const uint64_t key = coordKey(x, y, z); - const auto cached = penaltyCache_.find(key); - if (cached != penaltyCache_.end()) { - return cached->second; - } + auto& cached = cache_.penalties.at(x, y, z); + if (cached.generation == cache_.worldGeneration) return cached.value; const int mask = directionMask(x, y, z); const int edgeDist = edgeDistanceWithMask(x, y, z, mask); const int wallDist = wallDistanceWithMask(x, y, z, mask); const double value = combinedPenalty(edgeDist, wallDist); - penaltyCache_[key] = value; + cached = {cache_.worldGeneration, value}; return value; } diff --git a/NativeSrc/src/pathfinder_runtime_fly.inl b/NativeSrc/src/pathfinder_runtime_fly.inl index 4ab671cd..89e7f1e6 100644 --- a/NativeSrc/src/pathfinder_runtime_fly.inl +++ b/NativeSrc/src/pathfinder_runtime_fly.inl @@ -89,8 +89,11 @@ inline bool Runtime::moveFly(const Int3& current, const int dx, const int dy, co static constexpr std::array baseDistances = {0.0, 1.0, 1.4142135623730951, 1.7320508075688772}; double cost = baseDistances[static_cast(axisCount)] * ActionCosts::FLY_ONE_BLOCK_TIME; - auto environmentIt = flyEnvironmentCache_.try_emplace(coordKey(destX, destY, destZ)).first; - auto& environment = environmentIt->second; + auto& cachedEnvironment = cache_.flyEnvironments.at(destX, destY, destZ); + if (cachedEnvironment.generation != cache_.worldGeneration) { + cachedEnvironment = {cache_.worldGeneration, {}}; + } + auto& environment = cachedEnvironment.value; uint8_t needed = FLY_ENV_GROUND; if (progress <= 0.92) needed |= FLY_ENV_CONFINED; if (progress <= 0.88) needed |= FLY_ENV_HORIZONTAL; diff --git a/NativeSrc/src/pathfinder_runtime_walk.inl b/NativeSrc/src/pathfinder_runtime_walk.inl index 0b288861..58de07c0 100644 --- a/NativeSrc/src/pathfinder_runtime_walk.inl +++ b/NativeSrc/src/pathfinder_runtime_walk.inl @@ -18,12 +18,11 @@ inline bool Runtime::moveDiagonal(const Int3& current, const int dx, const int d const int destX = current.x + dx; const int destZ = current.z + dz; - if (!isSafe(destX, current.y, destZ)) return false; - if (!isPassable(destX, current.y, current.z)) return false; if (!isPassable(current.x, current.y, destZ)) return false; if (!isPassable(destX, current.y + 1, current.z)) return false; if (!isPassable(current.x, current.y + 1, destZ)) return false; + if (!isSafe(destX, current.y, destZ)) return false; out.pos = {destX, current.y, destZ}; out.cost = ActionCosts::SPRINT_DIAGONAL_TIME + @@ -36,21 +35,21 @@ inline bool Runtime::moveAscend(const Int3& current, const int dx, const int dz, const int destX = current.x + dx; const int destZ = current.z + dz; - if (!isPassable(current.x, current.y + 2, current.z)) return false; + if (!isPassableFlags(flagsAt(current.x, current.y + 2, current.z))) return false; - if (!isSolid(destX, current.y, destZ)) return false; - if (isFenceLike(destX, current.y, destZ)) return false; + const uint16_t destSupport = flagsAt(destX, current.y, destZ); + if (!hasFlag(destSupport, VF_SOLID) || hasFlag(destSupport, VF_FENCE_LIKE)) return false; + if (!isPassableFlags(flagsAt(destX, current.y + 1, destZ))) return false; + if (!isPassableFlags(flagsAt(destX, current.y + 2, destZ))) return false; - if (!isPassable(destX, current.y + 1, destZ)) return false; - if (!isPassable(destX, current.y + 2, destZ)) return false; - - const bool srcBottom = isBottomSlab(current.x, current.y - 1, current.z); - const bool destBottom = isBottomSlab(destX, current.y, destZ); + const uint16_t srcSupport = flagsAt(current.x, current.y - 1, current.z); + const bool srcBottom = hasFlag(srcSupport, VF_SLAB_BOTTOM); + const bool destBottom = hasFlag(destSupport, VF_SLAB_BOTTOM); if (srcBottom && !destBottom) return false; - const bool srcStair = isStairsBottom(current.x, current.y - 1, current.z); - const bool destStair = isStairsBottom(destX, current.y, destZ); + const bool srcStair = hasFlag(srcSupport, VF_STAIRS_BOTTOM); + const bool destStair = hasFlag(destSupport, VF_STAIRS_BOTTOM); out.pos = {destX, current.y + 1, destZ}; double baseCost = ActionCosts::JUMP_UP_ONE_BLOCK_TIME; @@ -77,19 +76,17 @@ inline bool Runtime::moveDescend(const Int3& current, const int dx, const int dz for (int dropBlocks = 1; dropBlocks <= maxFallHeight; dropBlocks++) { const int floorY = current.y - dropBlocks - 1; - if (isPassable(destX, floorY, destZ)) { + const uint16_t floorFlags = flagsAt(destX, floorY, destZ); + if (isPassableFlags(floorFlags)) { continue; } - if (!isSolid(destX, floorY, destZ)) { + if (!hasFlag(floorFlags, VF_SOLID)) { return false; } const int destY = floorY + 1; - if (!isPassable(destX, destY, destZ)) return false; - if (!isPassable(destX, destY + 1, destZ)) return false; - - double totalCost = ActionCosts::WALK_OFF_EDGE_TIME + costs_.getFallTime(dropBlocks); + double totalCost = ActionCosts::WALK_OFF_EDGE_TIME + ActionCosts::getFallTime(dropBlocks); if (dropBlocks > 3) { const int excess = dropBlocks - 3; totalCost += static_cast(excess * excess) * 2.0; diff --git a/NativeSrc/src/world_voxel_cursor.hpp b/NativeSrc/src/world_voxel_cursor.hpp index 7245c21f..4ce50465 100644 --- a/NativeSrc/src/world_voxel_cursor.hpp +++ b/NativeSrc/src/world_voxel_cursor.hpp @@ -2,6 +2,8 @@ #include "world_state.hpp" +#include +#include #include namespace v5pf { @@ -19,51 +21,52 @@ class WorldVoxelCursor { const int chunkX = x >> 4; const int chunkZ = z >> 4; - if (chunkX != cachedChunkX_ || chunkZ != cachedChunkZ_) { - cachedChunkX_ = chunkX; - cachedChunkZ_ = chunkZ; - cachedChunk_ = nullptr; - cachedSectionIdx_ = std::numeric_limits::min(); - cachedSection_ = nullptr; + const int sectionY = (y - world_.minY) >> 4; + const uint32_t cursorHash = static_cast(chunkX) ^ + (static_cast(chunkZ) << 1) ^ static_cast(sectionY); + auto& entry = entries_[static_cast(cursorHash & 3u)]; + if (chunkX != entry.chunkX || chunkZ != entry.chunkZ || y < entry.sectionMinY || y >= entry.sectionMaxY) { + entry = {}; + entry.chunkX = chunkX; + entry.chunkZ = chunkZ; const auto& chunks = world_.chunks(); const auto it = chunks.find(chunkKey(chunkX, chunkZ)); if (it == chunks.end() || it->second == nullptr) { - return VF_SOLID | VF_BLOCKING_WALL; + entry.sectionMinY = world_.minY; + entry.sectionMaxY = world_.maxY; + entry.fallback = VF_SOLID | VF_BLOCKING_WALL; + return entry.fallback; } - cachedChunk_ = it->second.get(); + const ChunkData* chunk = it->second.get(); + if (y < chunk->minY || y >= chunk->maxY) return VF_AIR_DEFAULT; + const int sectionIdx = (y - chunk->minY) >> 4; + entry.sectionMinY = chunk->minY + (sectionIdx << 4); + entry.sectionMaxY = std::min(entry.sectionMinY + 16, chunk->maxY); + entry.section = chunk->sectionData(sectionIdx); } - if (cachedChunk_ == nullptr) { - return VF_SOLID | VF_BLOCKING_WALL; - } - - if (y < cachedChunk_->minY || y >= cachedChunk_->maxY) { - return VF_AIR_DEFAULT; - } - - const int sectionIdx = (y - cachedChunk_->minY) >> 4; - if (sectionIdx != cachedSectionIdx_) { - cachedSectionIdx_ = sectionIdx; - cachedSection_ = cachedChunk_->sectionData(sectionIdx); - } - - if (cachedSection_ == nullptr) { - return VF_AIR_DEFAULT; + if (entry.section == nullptr) { + return entry.fallback; } const int index = ((y & 15) << 8) | ((z & 15) << 4) | (x & 15); - return cachedSection_[static_cast(index)]; + return entry.section[static_cast(index)]; } private: + struct Entry { + int chunkX = std::numeric_limits::min(); + int chunkZ = std::numeric_limits::min(); + int sectionMinY = std::numeric_limits::max(); + int sectionMaxY = std::numeric_limits::min(); + const uint16_t* section = nullptr; + uint16_t fallback = VF_AIR_DEFAULT; + }; + const WorldSnapshot& world_; - mutable int cachedChunkX_ = std::numeric_limits::min(); - mutable int cachedChunkZ_ = std::numeric_limits::min(); - mutable const ChunkData* cachedChunk_ = nullptr; - mutable int cachedSectionIdx_ = std::numeric_limits::min(); - mutable const uint16_t* cachedSection_ = nullptr; + mutable std::array entries_{}; }; } // namespace v5pf From 2bb1813de242bbf12a45556da53245a642ffef97 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 5 Aug 2026 22:28:21 +0000 Subject: [PATCH 09/61] codex: optimise pathfinder by 2-3x. [skip-native-auto] --- .../v5/natives/linux/x86_64/V5PathJNI.so | Bin 224368 -> 231144 bytes .../v5/natives/macos/arm64/V5PathJNI.dylib | Bin 187216 -> 189504 bytes .../v5/natives/macos/x86_64/V5PathJNI.dylib | Bin 170392 -> 176640 bytes .../v5/natives/windows/x86_64/V5PathJNI.dll | Bin 174080 -> 184320 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so b/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so index 32c32daa38f9c84425e63fa146738b475d8ca982..b1eb2a33967e3764f7bf57fa45886dec21d784d2 100644 GIT binary patch delta 90939 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 diff --git a/src/main/resources/assets/v5/natives/macos/arm64/V5PathJNI.dylib b/src/main/resources/assets/v5/natives/macos/arm64/V5PathJNI.dylib index 18c42f3f510e3b693cdbc6c0b779aa7f2b76dfef..931179ea5ff0f62760e23b646ed176953edb0bf9 100755 GIT binary patch delta 46435 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 WmxI@7)>OWj#&$_lzG=oT@&5qZgvP}H delta 39508 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 PZo)9U`N8$}OzZyuf3|ww delta 59013 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 Odh2Fh;5P1w@cci{18Bwo From 1553f5fbd623714012ad19132535ef7b75165f59 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 5 Aug 2026 23:43:29 +0100 Subject: [PATCH 10/61] fix cache invalidation sorta --- .../com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt index ec93cc9b..de0f5087 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt @@ -101,6 +101,7 @@ object CachedWorld { val key = chunkKey(pos.x shr 4, pos.z shr 4) val chunk = chunks[key]?.takeIf { it.ready } ?: return val flags = NativeStateEncoder.flagsForState(state).toShort() + if (chunk.getFlags(pos.x and 15, pos.y, pos.z and 15) == flags) return chunk.setFlags(pos.x and 15, pos.y, pos.z and 15, flags) queueNativeUpdate(pos.x, pos.y, pos.z, flags.toInt() and 0xFFFF) if (cacheKey == key) { From 65ffff5626a2507d3fbf7e2e89df3429fedb901d Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Thu, 6 Aug 2026 00:18:04 +0100 Subject: [PATCH 11/61] codex: further optimise pathfinder --- NativeSrc/src/etherwarp_search.cpp | 2 +- NativeSrc/src/pathfinder.cpp | 21 ++- NativeSrc/src/pathfinder_heap.hpp | 57 ++++---- NativeSrc/src/pathfinder_runtime.hpp | 43 +++--- NativeSrc/src/pathfinder_runtime_common.inl | 129 +++++++----------- NativeSrc/src/pathfinder_runtime_fly.inl | 28 ++-- NativeSrc/src/pathfinder_runtime_walk.inl | 11 +- NativeSrc/src/world_state.cpp | 66 ++++++++- NativeSrc/src/world_state.hpp | 6 + .../v5/natives/linux/x86_64/V5PathJNI.so | Bin 231144 -> 248480 bytes 10 files changed, 199 insertions(+), 164 deletions(-) diff --git a/NativeSrc/src/etherwarp_search.cpp b/NativeSrc/src/etherwarp_search.cpp index 94db3ae0..b2b6d234 100644 --- a/NativeSrc/src/etherwarp_search.cpp +++ b/NativeSrc/src/etherwarp_search.cpp @@ -104,7 +104,7 @@ struct SimplifiedEtherwarpPath { struct SharedState { explicit SharedState(const int reserveTarget) - : heap(nodeF, nodeHeapPos) { + : heap(nodeF, nodeH, nodeG, nodeHeapPos) { nodeX.reserve(static_cast(reserveTarget)); nodeY.reserve(static_cast(reserveTarget)); nodeZ.reserve(static_cast(reserveTarget)); diff --git a/NativeSrc/src/pathfinder.cpp b/NativeSrc/src/pathfinder.cpp index 9ba4a436..a152db70 100644 --- a/NativeSrc/src/pathfinder.cpp +++ b/NativeSrc/src/pathfinder.cpp @@ -48,7 +48,9 @@ struct SearchWorkspace { std::vector nodeY; std::vector nodeZ; std::vector nodeG; + std::vector nodeH; std::vector nodeF; + std::vector nodeAvoidPenalty; std::vector nodeParent; std::vector nodeStartIndex; std::vector nodeHeapPos; @@ -56,7 +58,7 @@ struct SearchWorkspace { detail::Heap heap; SearchWorkspace() - : heap(nodeF, nodeHeapPos) { + : heap(nodeF, nodeH, nodeG, nodeHeapPos) { } void reset(const size_t reserveSize, const int heapCapacity) { @@ -64,7 +66,9 @@ struct SearchWorkspace { nodeY.clear(); nodeZ.clear(); nodeG.clear(); + nodeH.clear(); nodeF.clear(); + nodeAvoidPenalty.clear(); nodeParent.clear(); nodeStartIndex.clear(); nodeHeapPos.clear(); @@ -75,7 +79,9 @@ struct SearchWorkspace { nodeY.reserve(reserveSize); nodeZ.reserve(reserveSize); nodeG.reserve(reserveSize); + nodeH.reserve(reserveSize); nodeF.reserve(reserveSize); + nodeAvoidPenalty.reserve(reserveSize); nodeParent.reserve(reserveSize); nodeStartIndex.reserve(reserveSize); nodeHeapPos.reserve(reserveSize); @@ -120,7 +126,9 @@ std::optional findPath( auto& nodeY = workspace.nodeY; auto& nodeZ = workspace.nodeZ; auto& nodeG = workspace.nodeG; + auto& nodeH = workspace.nodeH; auto& nodeF = workspace.nodeF; + auto& nodeAvoidPenalty = workspace.nodeAvoidPenalty; auto& nodeParent = workspace.nodeParent; auto& nodeStartIndex = workspace.nodeStartIndex; auto& nodeHeapPos = workspace.nodeHeapPos; @@ -141,7 +149,9 @@ std::optional findPath( nodeY.push_back(y); nodeZ.push_back(z); nodeG.push_back(std::numeric_limits::infinity()); - nodeF.push_back(runtime.heuristic(x, y, z) * weight); + nodeH.push_back(runtime.heuristic(x, y, z) * weight); + nodeF.push_back(nodeH.back()); + nodeAvoidPenalty.push_back(runtime.transientAvoidPenalty(x, y, z)); nodeParent.push_back(-1); nodeStartIndex.push_back(-1); nodeHeapPos.push_back(-1); @@ -150,9 +160,8 @@ std::optional findPath( auto setNodeCost = [&](const int nodeIdx, const double cost) { const size_t idx = static_cast(nodeIdx); - const double weightedHeuristic = std::isfinite(nodeG[idx]) ? nodeF[idx] - nodeG[idx] : nodeF[idx]; nodeG[idx] = cost; - nodeF[idx] = cost + weightedHeuristic; + nodeF[idx] = cost + nodeH[idx]; }; std::array walkMovesOrdered = detail::WALK_MOVES; @@ -241,8 +250,8 @@ std::optional findPath( if (!runtime.flyMove(curr, move, currFlyProgress, out)) continue; if (out.cost >= ActionCosts::INF_COST) continue; - const double newCost = currCost + out.cost + runtime.transientAvoidPenalty(out.pos.x, out.pos.y, out.pos.z); const auto [nIdx, inserted] = getOrCreateNode(out.pos.x, out.pos.y, out.pos.z); + const double newCost = currCost + out.cost + nodeAvoidPenalty[static_cast(nIdx)]; if (inserted) { nodeParent[static_cast(nIdx)] = currIdx; nodeStartIndex[static_cast(nIdx)] = currStartIdx; @@ -270,8 +279,8 @@ std::optional findPath( if (!runtime.walkMove(curr, move, out)) continue; if (out.cost >= ActionCosts::INF_COST) continue; - const double newCost = currCost + out.cost + runtime.transientAvoidPenalty(out.pos.x, out.pos.y, out.pos.z); const auto [nIdx, inserted] = getOrCreateNode(out.pos.x, out.pos.y, out.pos.z); + const double newCost = currCost + out.cost + nodeAvoidPenalty[static_cast(nIdx)]; if (inserted) { nodeParent[static_cast(nIdx)] = currIdx; nodeStartIndex[static_cast(nIdx)] = currStartIdx; diff --git a/NativeSrc/src/pathfinder_heap.hpp b/NativeSrc/src/pathfinder_heap.hpp index 98cf5fb3..b8031fb2 100644 --- a/NativeSrc/src/pathfinder_heap.hpp +++ b/NativeSrc/src/pathfinder_heap.hpp @@ -1,13 +1,18 @@ #pragma once +#include #include namespace v5pf::detail { class Heap { public: - explicit Heap(std::vector& fCost, std::vector& heapPos) - : fCost_(fCost), heapPos_(heapPos) { + explicit Heap( + const std::vector& fCost, + const std::vector& hCost, + const std::vector& gCost, + std::vector& heapPos + ) : fCost_(fCost), hCost_(hCost), gCost_(gCost), heapPos_(heapPos) { items_.resize(1); } @@ -69,18 +74,27 @@ class Heap { std::vector items_; int size_ = 0; - std::vector& fCost_; + const std::vector& fCost_; + const std::vector& hCost_; + const std::vector& gCost_; std::vector& heapPos_; + [[nodiscard]] bool less(const int left, const int right) const { + const size_t lhs = static_cast(left); + const size_t rhs = static_cast(right); + if (fCost_[lhs] != fCost_[rhs]) return fCost_[lhs] < fCost_[rhs]; + if (hCost_[lhs] != hCost_[rhs]) return hCost_[lhs] < hCost_[rhs]; + if (gCost_[lhs] != gCost_[rhs]) return gCost_[lhs] > gCost_[rhs]; + return left < right; + } + void siftUp(int pos) { const int node = items_[static_cast(pos)]; - const double cost = fCost_[static_cast(node)]; while (pos > 1) { - const int parent = pos >> 1; + const int parent = (pos - 2) / 4 + 1; const int parentNode = items_[static_cast(parent)]; - const double parentCost = fCost_[static_cast(parentNode)]; - if (cost >= parentCost) break; + if (!less(node, parentNode)) break; items_[static_cast(pos)] = parentNode; heapPos_[static_cast(parentNode)] = pos; @@ -93,26 +107,21 @@ class Heap { void siftDown(int pos) { const int node = items_[static_cast(pos)]; - const double cost = fCost_[static_cast(node)]; - const int half = size_ >> 1; - - while (pos <= half) { - int child = pos << 1; - int childNode = items_[static_cast(child)]; - double childCost = fCost_[static_cast(childNode)]; - - const int right = child + 1; - if (right <= size_) { - const int rightNode = items_[static_cast(right)]; - const double rightCost = fCost_[static_cast(rightNode)]; - if (rightCost < childCost) { - child = right; - childNode = rightNode; - childCost = rightCost; + + while (true) { + const int firstChild = (pos - 1) * 4 + 2; + if (firstChild > size_) break; + + int child = firstChild; + const int lastChild = std::min(firstChild + 3, size_); + for (int candidate = firstChild + 1; candidate <= lastChild; candidate++) { + if (less(items_[static_cast(candidate)], items_[static_cast(child)])) { + child = candidate; } } - if (cost <= childCost) break; + const int childNode = items_[static_cast(child)]; + if (!less(childNode, node)) break; items_[static_cast(pos)] = childNode; heapPos_[static_cast(childNode)] = pos; diff --git a/NativeSrc/src/pathfinder_runtime.hpp b/NativeSrc/src/pathfinder_runtime.hpp index e957ae13..92ff3d74 100644 --- a/NativeSrc/src/pathfinder_runtime.hpp +++ b/NativeSrc/src/pathfinder_runtime.hpp @@ -73,7 +73,6 @@ struct FlyEnvironment { double groundCost = 0.0; double horizontalCost = 0.0; double enclosureCost = 0.0; - bool confined = false; uint8_t computed = 0; }; @@ -89,32 +88,22 @@ struct VoxelClassifications { }; struct RuntimeCache { - std::shared_ptr snapshotData; + std::shared_ptr worldIdentity; int snapshotMinY = 0; int snapshotMaxY = 0; - uint32_t worldGeneration = 0; - uint32_t searchGeneration = 0; LazySectionArray> classifications; LazySectionArray> penalties; LazySectionArray> flyEnvironments; - LazySectionArray> avoidPenalties; void begin(const WorldSnapshot& world) { - if (++searchGeneration == 0) { - avoidPenalties.clear(); - searchGeneration = 1; - } - - if (snapshotData == world.data && snapshotMinY == world.minY && snapshotMaxY == world.maxY) return; - snapshotData = world.data; + const auto identity = world.data != nullptr ? world.data->identity : nullptr; + if (worldIdentity == identity && snapshotMinY == world.minY && snapshotMaxY == world.maxY) return; + worldIdentity = identity; snapshotMinY = world.minY; snapshotMaxY = world.maxY; - if (++worldGeneration == 0) { - classifications.clear(); - penalties.clear(); - flyEnvironments.clear(); - worldGeneration = 1; - } + classifications.clear(); + penalties.clear(); + flyEnvironments.clear(); } }; @@ -142,20 +131,17 @@ class Runtime { mutable WorldVoxelCursor voxelCursor_; RuntimeCache& cache_; - bool avoidPenaltyCacheEnabled_ = false; - Int3 startFly_{0, 0, 0}; int flyMinY_ = 0; int flyMaxY_ = 0; [[nodiscard]] uint16_t flagsAt(int x, int y, int z) const; + [[nodiscard]] uint32_t cacheGenerationAt(int x, int z) const; [[nodiscard]] bool isPassable(int x, int y, int z) const; [[nodiscard]] bool isPassableForFlying(int x, int y, int z) const; [[nodiscard]] bool isSafe(int x, int y, int z); [[nodiscard]] bool isFlyColumnClear(int x, int y, int z); - [[nodiscard]] double fluidPenalty(int x, int y, int z) const; - [[nodiscard]] double walkHeuristic(int x, int y, int z) const; [[nodiscard]] double flyHeuristic(int x, int y, int z) const; [[nodiscard]] const Int3& closestFlyGoal(int x, int y, int z) const; @@ -166,11 +152,7 @@ class Runtime { [[nodiscard]] bool isEdge(int x, int y, int z); [[nodiscard]] bool isWall(int x, int y, int z); - [[nodiscard]] int scanForEdge(int x, int y, int z, int dx, int dz); - [[nodiscard]] int scanForWall(int x, int y, int z, int dx, int dz); - - [[nodiscard]] int edgeDistanceWithMask(int x, int y, int z, int mask); - [[nodiscard]] int wallDistanceWithMask(int x, int y, int z, int mask); + void directionalDistances(int x, int y, int z, int mask, int& edgeDist, int& wallDist); [[nodiscard]] double combinedPenalty(int edgeDist, int wallDist) const; [[nodiscard]] double pathPenalty(int x, int y, int z); @@ -181,6 +163,13 @@ class Runtime { [[nodiscard]] bool moveFly(const Int3& current, int dx, int dy, int dz, double progress, MoveOut& out); void populateFlyEnvironment(int x, int y, int z, uint8_t needed, FlyEnvironment& environment); + + struct ChunkGenerationCursor { + int chunkX = std::numeric_limits::min(); + int chunkZ = std::numeric_limits::min(); + uint32_t generation = 0; + }; + mutable std::array chunkGenerationCursors_{}; }; } // namespace v5pf::detail diff --git a/NativeSrc/src/pathfinder_runtime_common.inl b/NativeSrc/src/pathfinder_runtime_common.inl index c2306d5f..9c512e45 100644 --- a/NativeSrc/src/pathfinder_runtime_common.inl +++ b/NativeSrc/src/pathfinder_runtime_common.inl @@ -12,7 +12,6 @@ inline Runtime::Runtime(const WorldSnapshot& world, const SearchParams& params) voxelCursor_(world), cache_(runtimeCache()) { cache_.begin(world); - avoidPenaltyCacheEnabled_ = params_.avoidZones.size() >= 3; flyMinY_ = world_.minY; flyMaxY_ = world_.maxY - 2; @@ -36,28 +35,6 @@ inline double Runtime::heuristic(const int x, const int y, const int z) const { } inline double Runtime::transientAvoidPenalty(const int x, const int y, const int z) const { - if (params_.avoidZones.empty()) return 0.0; - - if (!avoidPenaltyCacheEnabled_) { - double penalty = 0.0; - for (const auto& zone : params_.avoidZones) { - if (std::abs(y - zone.y) > zone.maxYDiff) continue; - - const int dx = x - zone.x; - const int dz = z - zone.z; - const long long distSq = static_cast(dx) * dx + static_cast(dz) * dz; - if (distSq > zone.radiusSq) continue; - - const double normalized = zone.radiusSq <= 1 ? 0.0 : static_cast(distSq) / static_cast(zone.radiusSq); - const double falloff = std::max(0.2, 1.0 - normalized); - penalty += zone.penalty * falloff; - } - return penalty; - } - - auto& cached = cache_.avoidPenalties.at(x, y, z); - if (cached.generation == cache_.searchGeneration) return cached.value; - double penalty = 0.0; for (const auto& zone : params_.avoidZones) { if (std::abs(y - zone.y) > zone.maxYDiff) continue; @@ -71,7 +48,6 @@ inline double Runtime::transientAvoidPenalty(const int x, const int y, const int const double falloff = std::max(0.2, 1.0 - normalized); penalty += zone.penalty * falloff; } - cached = {cache_.searchGeneration, penalty}; return penalty; } @@ -107,6 +83,17 @@ inline uint16_t Runtime::flagsAt(const int x, const int y, const int z) const { return voxelCursor_.getFlags(x, y, z); } +inline uint32_t Runtime::cacheGenerationAt(const int x, const int z) const { + const int chunkX = x >> 4; + const int chunkZ = z >> 4; + const uint32_t hash = static_cast(chunkX) ^ (static_cast(chunkZ) << 1); + auto& cursor = chunkGenerationCursors_[static_cast(hash & 3u)]; + if (cursor.chunkX != chunkX || cursor.chunkZ != chunkZ) { + cursor = {chunkX, chunkZ, world_.cacheGenerationForChunk(chunkX, chunkZ)}; + } + return cursor.generation; +} + inline bool Runtime::isPassable(const int x, const int y, const int z) const { return isPassableFlags(flagsAt(x, y, z)); } @@ -118,7 +105,8 @@ inline bool Runtime::isPassableForFlying(const int x, const int y, const int z) inline bool Runtime::isSafe(const int x, const int y, const int z) { constexpr uint8_t bit = 1u << 0; auto& cached = cache_.classifications.at(x, y, z); - if (cached.generation != cache_.worldGeneration) cached = {cache_.worldGeneration, {}}; + const uint32_t generation = cacheGenerationAt(x, z); + if (cached.generation != generation) cached = {generation, {}}; if ((cached.value.computed & bit) != 0) return (cached.value.values & bit) != 0; const bool safe = hasFlag(flagsAt(x, y - 1, z), VF_SOLID) && @@ -132,7 +120,8 @@ inline bool Runtime::isSafe(const int x, const int y, const int z) { inline bool Runtime::isFlyColumnClear(const int x, const int y, const int z) { constexpr uint8_t bit = 1u << 3; auto& cached = cache_.classifications.at(x, y, z); - if (cached.generation != cache_.worldGeneration) cached = {cache_.worldGeneration, {}}; + const uint32_t generation = cacheGenerationAt(x, z); + if (cached.generation != generation) cached = {generation, {}}; if ((cached.value.computed & bit) != 0) return (cached.value.values & bit) != 0; const uint16_t feet = flagsAt(x, y, z); @@ -145,13 +134,6 @@ inline bool Runtime::isFlyColumnClear(const int x, const int y, const int z) { return clear; } -inline double Runtime::fluidPenalty(const int x, const int y, const int z) const { - double penalty = 0.0; - if (hasFlag(flagsAt(x, y, z), VF_FLUID)) penalty += 20.0; - if (hasFlag(flagsAt(x, y + 1, z), VF_FLUID)) penalty += 20.0; - return penalty; -} - inline double Runtime::walkHeuristic(const int x, const int y, const int z) const { if (params_.goals.empty()) return 0.0; @@ -223,7 +205,8 @@ inline bool Runtime::isStepDirection(const int x, const int y, const int z, cons inline bool Runtime::isEdge(const int x, const int y, const int z) { constexpr uint8_t bit = 1u << 1; auto& cached = cache_.classifications.at(x, y, z); - if (cached.generation != cache_.worldGeneration) cached = {cache_.worldGeneration, {}}; + const uint32_t generation = cacheGenerationAt(x, z); + if (cached.generation != generation) cached = {generation, {}}; if ((cached.value.computed & bit) != 0) return (cached.value.values & bit) != 0; const bool edge = !hasFlag(flagsAt(x, y, z), VF_SOLID) && @@ -237,7 +220,8 @@ inline bool Runtime::isEdge(const int x, const int y, const int z) { inline bool Runtime::isWall(const int x, const int y, const int z) { constexpr uint8_t bit = 1u << 2; auto& cached = cache_.classifications.at(x, y, z); - if (cached.generation != cache_.worldGeneration) cached = {cache_.worldGeneration, {}}; + const uint32_t generation = cacheGenerationAt(x, z); + if (cached.generation != generation) cached = {generation, {}}; if ((cached.value.computed & bit) != 0) return (cached.value.values & bit) != 0; const uint16_t head = flagsAt(x, y + 1, z); @@ -255,48 +239,33 @@ inline bool Runtime::isWall(const int x, const int y, const int z) { return wall; } -inline int Runtime::scanForEdge(const int x, const int y, const int z, const int dx, const int dz) { - int cx = x + dx; - int cz = z + dz; - for (int d = 1; d <= MAX_DIST; d++) { - if (isEdge(cx, y, cz)) return d - 1; - cx += dx; - cz += dz; - } - return MAX_DIST; -} - -inline int Runtime::scanForWall(const int x, const int y, const int z, const int dx, const int dz) { - int cx = x + dx; - int cz = z + dz; - for (int d = 1; d <= MAX_DIST; d++) { - if (isWall(cx, y, cz)) return d - 1; - cx += dx; - cz += dz; - } - return MAX_DIST; -} - -inline int Runtime::edgeDistanceWithMask(const int x, const int y, const int z, const int mask) { - int dist = MAX_DIST; +inline void Runtime::directionalDistances( + const int x, + const int y, + const int z, + const int mask, + int& edgeDist, + int& wallDist +) { + edgeDist = MAX_DIST; + wallDist = MAX_DIST; for (int dir = 0; dir < 8; dir++) { if ((mask & (1 << dir)) == 0) continue; - const int d = scanForEdge(x, y, z, DX[static_cast(dir)], DZ[static_cast(dir)]); - if (d < dist) dist = d; - if (dist == 0) break; - } - return dist; -} -inline int Runtime::wallDistanceWithMask(const int x, const int y, const int z, const int mask) { - int dist = MAX_DIST; - for (int dir = 0; dir < 8; dir++) { - if ((mask & (1 << dir)) == 0) continue; - const int d = scanForWall(x, y, z, DX[static_cast(dir)], DZ[static_cast(dir)]); - if (d < dist) dist = d; - if (dist == 0) break; + int rayEdge = MAX_DIST; + int rayWall = MAX_DIST; + int cx = x; + int cz = z; + for (int d = 1; d <= MAX_DIST && (rayEdge == MAX_DIST || rayWall == MAX_DIST); d++) { + cx += DX[static_cast(dir)]; + cz += DZ[static_cast(dir)]; + if (rayEdge == MAX_DIST && isEdge(cx, y, cz)) rayEdge = d - 1; + if (rayWall == MAX_DIST && isWall(cx, y, cz)) rayWall = d - 1; + } + edgeDist = std::min(edgeDist, rayEdge); + wallDist = std::min(wallDist, rayWall); + if (edgeDist == 0 && wallDist == 0) break; } - return dist; } inline double Runtime::combinedPenalty(const int edgeDist, const int wallDist) const { @@ -307,13 +276,17 @@ inline double Runtime::combinedPenalty(const int edgeDist, const int wallDist) c inline double Runtime::pathPenalty(const int x, const int y, const int z) { auto& cached = cache_.penalties.at(x, y, z); - if (cached.generation == cache_.worldGeneration) return cached.value; + const uint32_t generation = cacheGenerationAt(x, z); + if (cached.generation == generation) return cached.value; const int mask = directionMask(x, y, z); - const int edgeDist = edgeDistanceWithMask(x, y, z, mask); - const int wallDist = wallDistanceWithMask(x, y, z, mask); - const double value = combinedPenalty(edgeDist, wallDist); - cached = {cache_.worldGeneration, value}; + int edgeDist; + int wallDist; + directionalDistances(x, y, z, mask, edgeDist, wallDist); + double value = combinedPenalty(edgeDist, wallDist); + if (hasFlag(flagsAt(x, y, z), VF_FLUID)) value += 20.0; + if (hasFlag(flagsAt(x, y + 1, z), VF_FLUID)) value += 20.0; + cached = {generation, value}; return value; } diff --git a/NativeSrc/src/pathfinder_runtime_fly.inl b/NativeSrc/src/pathfinder_runtime_fly.inl index 89e7f1e6..4ae8abcc 100644 --- a/NativeSrc/src/pathfinder_runtime_fly.inl +++ b/NativeSrc/src/pathfinder_runtime_fly.inl @@ -5,9 +5,8 @@ namespace v5pf::detail { constexpr uint8_t FLY_ENV_GROUND = 1u << 0; -constexpr uint8_t FLY_ENV_CONFINED = 1u << 1; -constexpr uint8_t FLY_ENV_HORIZONTAL = 1u << 2; -constexpr uint8_t FLY_ENV_ENCLOSURE = 1u << 3; +constexpr uint8_t FLY_ENV_HORIZONTAL = 1u << 1; +constexpr uint8_t FLY_ENV_ENCLOSURE = 1u << 2; constexpr double groundClearanceCost(const int distance) { return static_cast(6 - distance) * 2.0; @@ -90,12 +89,12 @@ inline bool Runtime::moveFly(const Int3& current, const int dx, const int dy, co double cost = baseDistances[static_cast(axisCount)] * ActionCosts::FLY_ONE_BLOCK_TIME; auto& cachedEnvironment = cache_.flyEnvironments.at(destX, destY, destZ); - if (cachedEnvironment.generation != cache_.worldGeneration) { - cachedEnvironment = {cache_.worldGeneration, {}}; + const uint32_t generation = cacheGenerationAt(destX, destZ); + if (cachedEnvironment.generation != generation) { + cachedEnvironment = {generation, {}}; } auto& environment = cachedEnvironment.value; uint8_t needed = FLY_ENV_GROUND; - if (progress <= 0.92) needed |= FLY_ENV_CONFINED; if (progress <= 0.88) needed |= FLY_ENV_HORIZONTAL; if (progress <= 0.94) needed |= FLY_ENV_ENCLOSURE; populateFlyEnvironment(destX, destY, destZ, needed, environment); @@ -141,16 +140,12 @@ inline void Runtime::populateFlyEnvironment( environment.computed |= FLY_ENV_GROUND; } - const bool needConfined = (missing & FLY_ENV_CONFINED) != 0; const bool needHorizontal = (missing & FLY_ENV_HORIZONTAL) != 0; const bool needEnclosure = (missing & FLY_ENV_ENCLOSURE) != 0; - if (!needConfined && !needHorizontal && !needEnclosure) return; + if (!needHorizontal && !needEnclosure) return; - const bool ceilingClear = isPassableForFlying(x, y + 2, z); - const bool scanExtended = needHorizontal || (needConfined && ceilingClear); - const int scanDistance = scanExtended ? 5 : 1; + const int scanDistance = needHorizontal ? 5 : 1; int minClearance = 5; - int blockedCardinals = 0; int blockedImmediate = 0; for (int i = 0; i < 4; i++) { int nx = x; @@ -160,20 +155,12 @@ inline void Runtime::populateFlyEnvironment( nz += DZ[static_cast(i)]; if (!isFlyColumnClear(nx, y, nz)) { minClearance = std::min(minClearance, d - 1); - blockedCardinals++; if (d == 1) blockedImmediate++; break; } } } - if (needConfined) { - environment.confined = !ceilingClear || - blockedCardinals >= 3 || - (blockedCardinals >= 2 && minClearance <= 1); - environment.computed |= FLY_ENV_CONFINED; - } - if (needHorizontal) { double diagonalTouchPenalty = 0.0; if (minClearance > 0) { @@ -196,6 +183,7 @@ inline void Runtime::populateFlyEnvironment( } if (needEnclosure) { + const bool ceilingClear = isPassableForFlying(x, y + 2, z); if (!ceilingClear) { environment.enclosureCost = 10.0; } else if (!isPassableForFlying(x, y + 3, z)) { diff --git a/NativeSrc/src/pathfinder_runtime_walk.inl b/NativeSrc/src/pathfinder_runtime_walk.inl index 58de07c0..2246164c 100644 --- a/NativeSrc/src/pathfinder_runtime_walk.inl +++ b/NativeSrc/src/pathfinder_runtime_walk.inl @@ -9,8 +9,7 @@ inline bool Runtime::moveTraverse(const Int3& current, const int dx, const int d out.pos = {destX, current.y, destZ}; out.cost = ActionCosts::SPRINT_ONE_BLOCK_TIME + - pathPenalty(destX, current.y, destZ) + - fluidPenalty(destX, current.y, destZ); + pathPenalty(destX, current.y, destZ); return true; } @@ -26,8 +25,7 @@ inline bool Runtime::moveDiagonal(const Int3& current, const int dx, const int d out.pos = {destX, current.y, destZ}; out.cost = ActionCosts::SPRINT_DIAGONAL_TIME + - pathPenalty(destX, current.y, destZ) + - fluidPenalty(destX, current.y, destZ); + pathPenalty(destX, current.y, destZ); return true; } @@ -58,8 +56,7 @@ inline bool Runtime::moveAscend(const Int3& current, const int dx, const int dz, } out.cost = baseCost + - pathPenalty(destX, current.y + 1, destZ) + - fluidPenalty(destX, current.y + 1, destZ); + pathPenalty(destX, current.y + 1, destZ); return true; } @@ -92,7 +89,7 @@ inline bool Runtime::moveDescend(const Int3& current, const int dx, const int dz totalCost += static_cast(excess * excess) * 2.0; } - totalCost += pathPenalty(destX, destY, destZ) + fluidPenalty(destX, destY, destZ); + totalCost += pathPenalty(destX, destY, destZ); out.pos = {destX, destY, destZ}; out.cost = totalCost; diff --git a/NativeSrc/src/world_state.cpp b/NativeSrc/src/world_state.cpp index 7a3370cc..b2a101e1 100644 --- a/NativeSrc/src/world_state.cpp +++ b/NativeSrc/src/world_state.cpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace v5pf { @@ -19,6 +20,35 @@ constexpr int64_t kMaxAllowedWorldSpan = 4096; static_cast(maxY) - static_cast(minY) <= kMaxAllowedWorldSpan; } +[[nodiscard]] bool chunksEqual(const ChunkData& left, const ChunkData& right) { + return left.minY == right.minY && + left.maxY == right.maxY && + left.sectionOffsets == right.sectionOffsets && + left.voxels == right.voxels; +} + +void invalidateChunkNeighborhood( + WorldData& world, + const int chunkX, + const int chunkZ, + const uint32_t generation +) { + for (int dx = -1; dx <= 1; dx++) { + for (int dz = -1; dz <= 1; dz++) { + world.chunkCacheGenerations[chunkKey(chunkX + dx, chunkZ + dz)] = generation; + } + } +} + +uint32_t nextCacheGeneration(WorldData& world) { + if (++world.latestCacheGeneration == 0) { + world.identity = std::make_shared(); + world.latestCacheGeneration = 1; + world.chunkCacheGenerations.clear(); + } + return world.latestCacheGeneration; +} + } // namespace void ChunkData::ensureLayout() { @@ -138,6 +168,12 @@ uint16_t WorldSnapshot::getFlags(const int x, const int y, const int z) const { return it->second->getFlags(x & 15, y, z & 15); } +uint32_t WorldSnapshot::cacheGenerationForChunk(const int chunkX, const int chunkZ) const { + if (data == nullptr) return 1; + const auto it = data->chunkCacheGenerations.find(chunkKey(chunkX, chunkZ)); + return it == data->chunkCacheGenerations.end() ? 1 : it->second; +} + void WorldState::setWorld(std::string worldKey, const int minY, const int maxY) { if (!isValidWorldBounds(minY, maxY)) { return; @@ -155,6 +191,9 @@ void WorldState::clear() { std::lock_guard lock(mutex_); auto next = std::make_shared(*data_); next->chunks.clear(); + next->identity = std::make_shared(); + next->latestCacheGeneration = 1; + next->chunkCacheGenerations.clear(); data_ = std::move(next); } @@ -193,10 +232,20 @@ void WorldState::upsertChunk( } std::lock_guard lock(mutex_); + const auto key = chunkKey(chunkX, chunkZ); + const auto existing = data_->chunks.find(key); + if (data_->minY == minY && data_->maxY == maxY && + existing != data_->chunks.end() && existing->second != nullptr && + chunksEqual(*existing->second, chunk)) { + return; + } + auto next = std::make_shared(*data_); next->minY = minY; next->maxY = maxY; - next->chunks[chunkKey(chunkX, chunkZ)] = std::make_shared(std::move(chunk)); + next->chunks[key] = std::make_shared(std::move(chunk)); + const uint32_t generation = nextCacheGeneration(*next); + invalidateChunkNeighborhood(*next, chunkX, chunkZ, generation); data_ = std::move(next); } @@ -208,7 +257,9 @@ void WorldState::applyUpdates(const std::vector& updates) { std::lock_guard lock(mutex_); auto next = std::make_shared(*data_); std::unordered_map> mutableChunks; + std::unordered_set changedChunks; mutableChunks.reserve(updates.size()); + changedChunks.reserve(updates.size()); for (const auto& update : updates) { const int chunkX = update.x >> 4; @@ -218,6 +269,10 @@ void WorldState::applyUpdates(const std::vector& updates) { if (it == next->chunks.end() || it->second == nullptr) { continue; } + if (update.y < it->second->minY || update.y >= it->second->maxY || + it->second->getFlags(update.x & 15, update.y, update.z & 15) == update.flags) { + continue; + } std::shared_ptr chunk; const auto mutableIt = mutableChunks.find(key); @@ -230,8 +285,17 @@ void WorldState::applyUpdates(const std::vector& updates) { } chunk->setFlags(update.x & 15, update.y, update.z & 15, update.flags); + changedChunks.insert(key); } + if (changedChunks.empty()) return; + + const uint32_t generation = nextCacheGeneration(*next); + for (const uint64_t key : changedChunks) { + const int chunkX = static_cast(static_cast(key >> 32)); + const int chunkZ = static_cast(static_cast(key)); + invalidateChunkNeighborhood(*next, chunkX, chunkZ, generation); + } data_ = std::move(next); } diff --git a/NativeSrc/src/world_state.hpp b/NativeSrc/src/world_state.hpp index f8727392..694e044a 100644 --- a/NativeSrc/src/world_state.hpp +++ b/NativeSrc/src/world_state.hpp @@ -49,11 +49,16 @@ struct ChunkData { using SharedChunkData = std::shared_ptr; using ChunkMap = std::unordered_map; +struct WorldIdentity {}; + struct WorldData { std::string worldKey = "runtime_memory"; int minY = -64; int maxY = 320; // exclusive ChunkMap chunks; + std::shared_ptr identity = std::make_shared(); + uint32_t latestCacheGeneration = 1; + std::unordered_map chunkCacheGenerations; }; struct WorldSnapshot { @@ -64,6 +69,7 @@ struct WorldSnapshot { [[nodiscard]] const ChunkMap& chunks() const; [[nodiscard]] uint16_t getFlags(int x, int y, int z) const; + [[nodiscard]] uint32_t cacheGenerationForChunk(int chunkX, int chunkZ) const; }; class WorldState { diff --git a/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so b/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so index b1eb2a33967e3764f7bf57fa45886dec21d784d2..f8e95e30bbd581bc9edda781efa5db7962a7e842 100644 GIT binary patch literal 248480 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

93xy848=y&mtgFZHt6 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

Eo>?ftDgEMP#J+j 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 LGs)w68^Hep_#HDH From b88f75fdc5bdc8920c92e2b9bf055ae11f20e928 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 5 Aug 2026 23:20:36 +0000 Subject: [PATCH 12/61] codex: further optimise pathfinder [skip-native-auto] --- .../v5/natives/linux/x86_64/V5PathJNI.so | Bin 248480 -> 236328 bytes .../v5/natives/macos/arm64/V5PathJNI.dylib | Bin 189504 -> 191392 bytes .../v5/natives/macos/x86_64/V5PathJNI.dylib | Bin 176640 -> 182584 bytes .../v5/natives/windows/x86_64/V5PathJNI.dll | Bin 184320 -> 189440 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so b/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so index f8e95e30bbd581bc9edda781efa5db7962a7e842..60cc7d312eacbe735bb779b62c5c952f10797e57 100644 GIT binary patch literal 236328 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%0AZp2up0~z;sebP$}zMnfalyd~A}r0( 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

-1MYhjl<9op817hQkMnRki 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

{07 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 diff --git a/src/main/resources/assets/v5/natives/macos/x86_64/V5PathJNI.dylib b/src/main/resources/assets/v5/natives/macos/x86_64/V5PathJNI.dylib index fc0d0833c1b61b3de7315f773a570a60fef2618e..072d8cdc4adcb236373d623f30074b295538d7e7 100644 GIT binary patch delta 59675 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 ) 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 xw^wY3p_fh^{5E857{9@@!Mh>2!LiY`v2r6riK Date: Fri, 7 Aug 2026 10:37:02 +0100 Subject: [PATCH 13/61] codex: change double to float for performance improvements in pathfinding --- NativeSrc/src/common.hpp | 38 ++++----- NativeSrc/src/etherwarp_search.cpp | 2 +- NativeSrc/src/jni_bridge.cpp | 6 +- NativeSrc/src/pathfinder.cpp | 28 +++---- NativeSrc/src/pathfinder.hpp | 6 +- NativeSrc/src/pathfinder_heap.hpp | 13 +-- NativeSrc/src/pathfinder_runtime.hpp | 34 ++++---- NativeSrc/src/pathfinder_runtime_common.inl | 50 ++++++------ NativeSrc/src/pathfinder_runtime_fly.inl | 74 +++++++++--------- NativeSrc/src/pathfinder_runtime_walk.inl | 6 +- .../v5/natives/linux/x86_64/V5PathJNI.so | Bin 236328 -> 244328 bytes 11 files changed, 129 insertions(+), 128 deletions(-) diff --git a/NativeSrc/src/common.hpp b/NativeSrc/src/common.hpp index 3a15332a..6b2cd41b 100644 --- a/NativeSrc/src/common.hpp +++ b/NativeSrc/src/common.hpp @@ -49,40 +49,40 @@ inline uint64_t chunkKey(const int x, const int z) { return (px << 32) | pz; } -constexpr std::array makeFallTimes() { - std::array fallTimes{}; - double currentDistance = 0.0; +constexpr std::array makeFallTimes() { + std::array fallTimes{}; + float currentDistance = 0.0f; int tick = 0; - double velocity = 0.0; + float velocity = 0.0f; for (int targetDistance = 1; targetDistance <= 256; targetDistance++) { while (currentDistance < targetDistance) { - velocity = (velocity - 0.08) * 0.98; + velocity = (velocity - 0.08f) * 0.98f; currentDistance -= velocity; tick++; } - fallTimes[static_cast(targetDistance)] = static_cast(tick); + fallTimes[static_cast(targetDistance)] = static_cast(tick); } return fallTimes; } struct ActionCosts { - static constexpr double INF_COST = 1e6; - static constexpr double FLY_ONE_BLOCK_TIME = 1.0 / 0.7; - static constexpr double SPRINT_ONE_BLOCK_TIME = 1.0 / 0.2806; - static constexpr double SPRINT_DIAGONAL_TIME = SPRINT_ONE_BLOCK_TIME * 1.4142135623730951; - static constexpr double MOMENTUM_LOSS_PENALTY = 6.0; - static constexpr double JUMP_PENALTY = 2.0; - static constexpr double GAP_JUMP_REWARD_OFFSET = 1.5; - static constexpr double SLAB_ASCENT_TIME = SPRINT_ONE_BLOCK_TIME * 1.1; - static constexpr double WALK_OFF_EDGE_TIME = SPRINT_ONE_BLOCK_TIME * 0.5; - static constexpr double LAND_RECOVERY_TIME = 2.0; - static constexpr double JUMP_UP_ONE_BLOCK_TIME = 28.0 + MOMENTUM_LOSS_PENALTY + SPRINT_ONE_BLOCK_TIME; + static constexpr float INF_COST = 1e6f; + static constexpr float FLY_ONE_BLOCK_TIME = 1.0f / 0.7f; + static constexpr float SPRINT_ONE_BLOCK_TIME = 1.0f / 0.2806f; + static constexpr float SPRINT_DIAGONAL_TIME = SPRINT_ONE_BLOCK_TIME * 1.41421356f; + static constexpr float MOMENTUM_LOSS_PENALTY = 6.0f; + static constexpr float JUMP_PENALTY = 2.0f; + static constexpr float GAP_JUMP_REWARD_OFFSET = 1.5f; + static constexpr float SLAB_ASCENT_TIME = SPRINT_ONE_BLOCK_TIME * 1.1f; + static constexpr float WALK_OFF_EDGE_TIME = SPRINT_ONE_BLOCK_TIME * 0.5f; + static constexpr float LAND_RECOVERY_TIME = 2.0f; + static constexpr float JUMP_UP_ONE_BLOCK_TIME = 28.0f + MOMENTUM_LOSS_PENALTY + SPRINT_ONE_BLOCK_TIME; inline static constexpr auto FALL_TIMES = makeFallTimes(); - [[nodiscard]] static double getFallTime(const int blocks) { - if (blocks <= 0) return 0.0; + [[nodiscard]] static float getFallTime(const int blocks) { + if (blocks <= 0) return 0.0f; if (blocks >= static_cast(FALL_TIMES.size())) return INF_COST; return FALL_TIMES[static_cast(blocks)] + LAND_RECOVERY_TIME; } diff --git a/NativeSrc/src/etherwarp_search.cpp b/NativeSrc/src/etherwarp_search.cpp index b2b6d234..e304d0e1 100644 --- a/NativeSrc/src/etherwarp_search.cpp +++ b/NativeSrc/src/etherwarp_search.cpp @@ -135,7 +135,7 @@ struct SharedState { std::vector nodePitch; std::vector nodeHeapPos; std::unordered_map coordToNode; - detail::Heap heap; + detail::Heap heap; int iterations = 0; int activeExpanders = 0; diff --git a/NativeSrc/src/jni_bridge.cpp b/NativeSrc/src/jni_bridge.cpp index 1d12f9b8..2c95d168 100644 --- a/NativeSrc/src/jni_bridge.cpp +++ b/NativeSrc/src/jni_bridge.cpp @@ -344,7 +344,7 @@ JNIEXPORT jobject JNICALL Java_com_chattriggers_ctjs_api_world_pathfinding_Nativ avoidMetaFlat[base + 2], avoidMetaFlat[base + 3], avoidMetaFlat[base + 4], - avoidPenaltyFlat[i], + static_cast(avoidPenaltyFlat[i]), }); } } @@ -355,8 +355,8 @@ JNIEXPORT jobject JNICALL Java_com_chattriggers_ctjs_api_world_pathfinding_Nativ params.goals = goals; params.isFly = isFly == JNI_TRUE; params.maxIterations = static_cast(maxIterations); - params.heuristicWeight = static_cast(heuristicWeight); - params.nonPrimaryStartPenalty = static_cast(nonPrimaryStartPenalty); + params.heuristicWeight = static_cast(heuristicWeight); + params.nonPrimaryStartPenalty = static_cast(nonPrimaryStartPenalty); params.moveOrderOffset = static_cast(moveOrderOffset); params.avoidZones = std::move(avoidZones); diff --git a/NativeSrc/src/pathfinder.cpp b/NativeSrc/src/pathfinder.cpp index a152db70..c01bd55c 100644 --- a/NativeSrc/src/pathfinder.cpp +++ b/NativeSrc/src/pathfinder.cpp @@ -47,15 +47,15 @@ struct SearchWorkspace { std::vector nodeX; std::vector nodeY; std::vector nodeZ; - std::vector nodeG; - std::vector nodeH; - std::vector nodeF; - std::vector nodeAvoidPenalty; + std::vector nodeG; + std::vector nodeH; + std::vector nodeF; + std::vector nodeAvoidPenalty; std::vector nodeParent; std::vector nodeStartIndex; std::vector nodeHeapPos; NodeIndexTable coordToNode; - detail::Heap heap; + detail::Heap heap; SearchWorkspace() : heap(nodeF, nodeH, nodeG, nodeHeapPos) { @@ -135,9 +135,9 @@ std::optional findPath( auto& coordToNode = workspace.coordToNode; auto& heap = workspace.heap; - const double weight = (std::isfinite(params.heuristicWeight) && params.heuristicWeight > 0.0) + const float weight = (std::isfinite(params.heuristicWeight) && params.heuristicWeight > 0.0f) ? params.heuristicWeight - : 1.0; + : 1.0f; const bool isFly = params.isFly; auto getOrCreateNode = [&](const int x, const int y, const int z) { @@ -148,7 +148,7 @@ std::optional findPath( nodeX.push_back(x); nodeY.push_back(y); nodeZ.push_back(z); - nodeG.push_back(std::numeric_limits::infinity()); + nodeG.push_back(std::numeric_limits::infinity()); nodeH.push_back(runtime.heuristic(x, y, z) * weight); nodeF.push_back(nodeH.back()); nodeAvoidPenalty.push_back(runtime.transientAvoidPenalty(x, y, z)); @@ -158,7 +158,7 @@ std::optional findPath( return std::pair{idx, true}; }; - auto setNodeCost = [&](const int nodeIdx, const double cost) { + auto setNodeCost = [&](const int nodeIdx, const float cost) { const size_t idx = static_cast(nodeIdx); nodeG[idx] = cost; nodeF[idx] = cost + nodeH[idx]; @@ -175,7 +175,7 @@ std::optional findPath( for (size_t i = 0; i < params.starts.size(); i++) { const auto& start = params.starts[i]; - const double startPenalty = i == 0 ? 0.0 : std::max(0.0, params.nonPrimaryStartPenalty); + const float startPenalty = i == 0 ? 0.0f : std::max(0.0f, params.nonPrimaryStartPenalty); const int nodeIdx = getOrCreateNode(start.x, start.y, start.z).first; @@ -239,19 +239,19 @@ std::optional findPath( return result; } - const double currCost = nodeG[static_cast(currIdx)]; + const float currCost = nodeG[static_cast(currIdx)]; const int currStartIdx = nodeStartIndex[static_cast(currIdx)]; if (isFly) { - const double currFlyProgress = runtime.flyHorizontalProgress(curr.x, curr.y, curr.z); + const float currFlyProgress = runtime.flyHorizontalProgress(curr.x, curr.y, curr.z); for (const auto& move : detail::FLY_MOVES) { detail::MoveOut out; if (!runtime.flyMove(curr, move, currFlyProgress, out)) continue; if (out.cost >= ActionCosts::INF_COST) continue; const auto [nIdx, inserted] = getOrCreateNode(out.pos.x, out.pos.y, out.pos.z); - const double newCost = currCost + out.cost + nodeAvoidPenalty[static_cast(nIdx)]; + const float newCost = currCost + out.cost + nodeAvoidPenalty[static_cast(nIdx)]; if (inserted) { nodeParent[static_cast(nIdx)] = currIdx; nodeStartIndex[static_cast(nIdx)] = currStartIdx; @@ -280,7 +280,7 @@ std::optional findPath( if (out.cost >= ActionCosts::INF_COST) continue; const auto [nIdx, inserted] = getOrCreateNode(out.pos.x, out.pos.y, out.pos.z); - const double newCost = currCost + out.cost + nodeAvoidPenalty[static_cast(nIdx)]; + const float newCost = currCost + out.cost + nodeAvoidPenalty[static_cast(nIdx)]; if (inserted) { nodeParent[static_cast(nIdx)] = currIdx; nodeStartIndex[static_cast(nIdx)] = currStartIdx; diff --git a/NativeSrc/src/pathfinder.hpp b/NativeSrc/src/pathfinder.hpp index 56145024..f55d3d86 100644 --- a/NativeSrc/src/pathfinder.hpp +++ b/NativeSrc/src/pathfinder.hpp @@ -13,7 +13,7 @@ struct AvoidZone { int z; int radiusSq; int maxYDiff; - double penalty; + float penalty; }; struct SearchParams { @@ -21,8 +21,8 @@ struct SearchParams { std::vector goals; bool isFly = false; int maxIterations = 500000; - double heuristicWeight = 1.05; - double nonPrimaryStartPenalty = 0.0; + float heuristicWeight = 1.05f; + float nonPrimaryStartPenalty = 0.0f; int moveOrderOffset = 0; std::vector avoidZones; }; diff --git a/NativeSrc/src/pathfinder_heap.hpp b/NativeSrc/src/pathfinder_heap.hpp index b8031fb2..d34780b6 100644 --- a/NativeSrc/src/pathfinder_heap.hpp +++ b/NativeSrc/src/pathfinder_heap.hpp @@ -5,12 +5,13 @@ namespace v5pf::detail { +template class Heap { public: explicit Heap( - const std::vector& fCost, - const std::vector& hCost, - const std::vector& gCost, + const std::vector& fCost, + const std::vector& hCost, + const std::vector& gCost, std::vector& heapPos ) : fCost_(fCost), hCost_(hCost), gCost_(gCost), heapPos_(heapPos) { items_.resize(1); @@ -74,9 +75,9 @@ class Heap { std::vector items_; int size_ = 0; - const std::vector& fCost_; - const std::vector& hCost_; - const std::vector& gCost_; + const std::vector& fCost_; + const std::vector& hCost_; + const std::vector& gCost_; std::vector& heapPos_; [[nodiscard]] bool less(const int left, const int right) const { diff --git a/NativeSrc/src/pathfinder_runtime.hpp b/NativeSrc/src/pathfinder_runtime.hpp index 92ff3d74..0a7c4cee 100644 --- a/NativeSrc/src/pathfinder_runtime.hpp +++ b/NativeSrc/src/pathfinder_runtime.hpp @@ -11,7 +11,7 @@ namespace v5pf::detail { constexpr int MAX_DIST = 6; constexpr int OPEN_SPACE_SOFT_CAP = MAX_DIST; -inline constexpr std::array EDGE_PENALTIES = { +inline constexpr std::array EDGE_PENALTIES = { 24.0, 19.5, 16.0, @@ -21,7 +21,7 @@ inline constexpr std::array EDGE_PENALTIES = { 0.5, }; -inline constexpr std::array WALL_PENALTIES = { +inline constexpr std::array WALL_PENALTIES = { 17.0, 13.5, 11.0, @@ -66,13 +66,13 @@ inline bool isFlyPassableFlags(const uint16_t flags) { struct MoveOut { Int3 pos{}; - double cost = ActionCosts::INF_COST; + float cost = ActionCosts::INF_COST; }; struct FlyEnvironment { - double groundCost = 0.0; - double horizontalCost = 0.0; - double enclosureCost = 0.0; + float groundCost = 0.0f; + float horizontalCost = 0.0f; + float enclosureCost = 0.0f; uint8_t computed = 0; }; @@ -92,7 +92,7 @@ struct RuntimeCache { int snapshotMinY = 0; int snapshotMaxY = 0; LazySectionArray> classifications; - LazySectionArray> penalties; + LazySectionArray> penalties; LazySectionArray> flyEnvironments; void begin(const WorldSnapshot& world) { @@ -117,13 +117,13 @@ class Runtime { Runtime(const WorldSnapshot& world, const SearchParams& params); [[nodiscard]] bool isAtGoal(int x, int y, int z) const; - [[nodiscard]] double heuristic(int x, int y, int z) const; - [[nodiscard]] double transientAvoidPenalty(int x, int y, int z) const; - [[nodiscard]] double flyHorizontalProgress(int x, int y, int z) const; + [[nodiscard]] float heuristic(int x, int y, int z) const; + [[nodiscard]] float transientAvoidPenalty(int x, int y, int z) const; + [[nodiscard]] float flyHorizontalProgress(int x, int y, int z) const; [[nodiscard]] bool walkMove(const Int3& current, const Int3& delta, MoveOut& out); [[nodiscard]] bool flyMove(const Int3& current, const Int3& delta, MoveOut& out); - [[nodiscard]] bool flyMove(const Int3& current, const Int3& delta, double progress, MoveOut& out); + [[nodiscard]] bool flyMove(const Int3& current, const Int3& delta, float progress, MoveOut& out); private: const WorldSnapshot& world_; @@ -142,10 +142,10 @@ class Runtime { [[nodiscard]] bool isSafe(int x, int y, int z); [[nodiscard]] bool isFlyColumnClear(int x, int y, int z); - [[nodiscard]] double walkHeuristic(int x, int y, int z) const; - [[nodiscard]] double flyHeuristic(int x, int y, int z) const; + [[nodiscard]] float walkHeuristic(int x, int y, int z) const; + [[nodiscard]] float flyHeuristic(int x, int y, int z) const; [[nodiscard]] const Int3& closestFlyGoal(int x, int y, int z) const; - [[nodiscard]] double calculateProgress(int x, int z, const Int3& goal) const; + [[nodiscard]] float calculateProgress(int x, int z, const Int3& goal) const; [[nodiscard]] int directionMask(int x, int y, int z); [[nodiscard]] bool isStepDirection(int x, int y, int z, int dx, int dz); @@ -153,15 +153,15 @@ class Runtime { [[nodiscard]] bool isEdge(int x, int y, int z); [[nodiscard]] bool isWall(int x, int y, int z); void directionalDistances(int x, int y, int z, int mask, int& edgeDist, int& wallDist); - [[nodiscard]] double combinedPenalty(int edgeDist, int wallDist) const; - [[nodiscard]] double pathPenalty(int x, int y, int z); + [[nodiscard]] float combinedPenalty(int edgeDist, int wallDist) const; + [[nodiscard]] float pathPenalty(int x, int y, int z); [[nodiscard]] bool moveTraverse(const Int3& current, int dx, int dz, MoveOut& out); [[nodiscard]] bool moveDiagonal(const Int3& current, int dx, int dz, MoveOut& out); [[nodiscard]] bool moveAscend(const Int3& current, int dx, int dz, MoveOut& out); [[nodiscard]] bool moveDescend(const Int3& current, int dx, int dz, MoveOut& out); - [[nodiscard]] bool moveFly(const Int3& current, int dx, int dy, int dz, double progress, MoveOut& out); + [[nodiscard]] bool moveFly(const Int3& current, int dx, int dy, int dz, float progress, MoveOut& out); void populateFlyEnvironment(int x, int y, int z, uint8_t needed, FlyEnvironment& environment); struct ChunkGenerationCursor { diff --git a/NativeSrc/src/pathfinder_runtime_common.inl b/NativeSrc/src/pathfinder_runtime_common.inl index 9c512e45..60a66ea1 100644 --- a/NativeSrc/src/pathfinder_runtime_common.inl +++ b/NativeSrc/src/pathfinder_runtime_common.inl @@ -30,12 +30,12 @@ inline bool Runtime::isAtGoal(const int x, const int y, const int z) const { return false; } -inline double Runtime::heuristic(const int x, const int y, const int z) const { +inline float Runtime::heuristic(const int x, const int y, const int z) const { return params_.isFly ? flyHeuristic(x, y, z) : walkHeuristic(x, y, z); } -inline double Runtime::transientAvoidPenalty(const int x, const int y, const int z) const { - double penalty = 0.0; +inline float Runtime::transientAvoidPenalty(const int x, const int y, const int z) const { + float penalty = 0.0f; for (const auto& zone : params_.avoidZones) { if (std::abs(y - zone.y) > zone.maxYDiff) continue; @@ -44,14 +44,14 @@ inline double Runtime::transientAvoidPenalty(const int x, const int y, const int const long long distSq = static_cast(dx) * dx + static_cast(dz) * dz; if (distSq > zone.radiusSq) continue; - const double normalized = zone.radiusSq <= 1 ? 0.0 : static_cast(distSq) / static_cast(zone.radiusSq); - const double falloff = std::max(0.2, 1.0 - normalized); + const float normalized = zone.radiusSq <= 1 ? 0.0f : static_cast(distSq) / static_cast(zone.radiusSq); + const float falloff = std::max(0.2f, 1.0f - normalized); penalty += zone.penalty * falloff; } return penalty; } -inline double Runtime::flyHorizontalProgress(const int x, const int y, const int z) const { +inline float Runtime::flyHorizontalProgress(const int x, const int y, const int z) const { return calculateProgress(x, z, closestFlyGoal(x, y, z)); } @@ -75,7 +75,7 @@ inline bool Runtime::flyMove(const Int3& current, const Int3& delta, MoveOut& ou return moveFly(current, delta.x, delta.y, delta.z, calculateProgress(current.x, current.z, goal), out); } -inline bool Runtime::flyMove(const Int3& current, const Int3& delta, const double progress, MoveOut& out) { +inline bool Runtime::flyMove(const Int3& current, const Int3& delta, const float progress, MoveOut& out) { return moveFly(current, delta.x, delta.y, delta.z, progress, out); } @@ -134,16 +134,16 @@ inline bool Runtime::isFlyColumnClear(const int x, const int y, const int z) { return clear; } -inline double Runtime::walkHeuristic(const int x, const int y, const int z) const { - if (params_.goals.empty()) return 0.0; +inline float Runtime::walkHeuristic(const int x, const int y, const int z) const { + if (params_.goals.empty()) return 0.0f; - const double sprintCost = ActionCosts::SPRINT_ONE_BLOCK_TIME; - const double diagonalCost = ActionCosts::SPRINT_DIAGONAL_TIME; - const double fallCostPerBlock = ActionCosts::getFallTime(2) * 0.5; - const double jumpCostPerBlock = ActionCosts::JUMP_UP_ONE_BLOCK_TIME; - const double verticalReluctance = sprintCost * 0.35; + const float sprintCost = ActionCosts::SPRINT_ONE_BLOCK_TIME; + const float diagonalCost = ActionCosts::SPRINT_DIAGONAL_TIME; + const float fallCostPerBlock = ActionCosts::getFallTime(2) * 0.5f; + const float jumpCostPerBlock = ActionCosts::JUMP_UP_ONE_BLOCK_TIME; + const float verticalReluctance = sprintCost * 0.35f; - double best = std::numeric_limits::infinity(); + float best = std::numeric_limits::infinity(); for (const auto& goal : params_.goals) { const long long dx = std::llabs(static_cast(x) - goal.x); const long long dz = std::llabs(static_cast(z) - goal.z); @@ -152,12 +152,12 @@ inline double Runtime::walkHeuristic(const int x, const int y, const int z) cons const long long minHoriz = std::min(dx, dz); const long long maxHoriz = std::max(dx, dz); - double horizontal = static_cast(minHoriz) * diagonalCost + - static_cast(maxHoriz - minHoriz) * sprintCost; + float horizontal = static_cast(minHoriz) * diagonalCost + + static_cast(maxHoriz - minHoriz) * sprintCost; if (dy != 0) { - const double absDy = static_cast(std::llabs(dy)); - horizontal += (dy > 0 ? static_cast(dy) * fallCostPerBlock : absDy * jumpCostPerBlock); + const float absDy = static_cast(std::llabs(dy)); + horizontal += (dy > 0 ? static_cast(dy) * fallCostPerBlock : absDy * jumpCostPerBlock); horizontal += absDy * verticalReluctance; } @@ -166,7 +166,7 @@ inline double Runtime::walkHeuristic(const int x, const int y, const int z) cons } } - return std::isfinite(best) ? best : 0.0; + return std::isfinite(best) ? best : 0.0f; } inline int Runtime::directionMask(const int x, const int y, const int z) { @@ -268,13 +268,13 @@ inline void Runtime::directionalDistances( } } -inline double Runtime::combinedPenalty(const int edgeDist, const int wallDist) const { +inline float Runtime::combinedPenalty(const int edgeDist, const int wallDist) const { const int edgeIdx = std::clamp(edgeDist, 0, OPEN_SPACE_SOFT_CAP); const int wallIdx = std::clamp(wallDist, 0, OPEN_SPACE_SOFT_CAP); return EDGE_PENALTIES[static_cast(edgeIdx)] + WALL_PENALTIES[static_cast(wallIdx)]; } -inline double Runtime::pathPenalty(const int x, const int y, const int z) { +inline float Runtime::pathPenalty(const int x, const int y, const int z) { auto& cached = cache_.penalties.at(x, y, z); const uint32_t generation = cacheGenerationAt(x, z); if (cached.generation == generation) return cached.value; @@ -283,9 +283,9 @@ inline double Runtime::pathPenalty(const int x, const int y, const int z) { int edgeDist; int wallDist; directionalDistances(x, y, z, mask, edgeDist, wallDist); - double value = combinedPenalty(edgeDist, wallDist); - if (hasFlag(flagsAt(x, y, z), VF_FLUID)) value += 20.0; - if (hasFlag(flagsAt(x, y + 1, z), VF_FLUID)) value += 20.0; + float value = combinedPenalty(edgeDist, wallDist); + if (hasFlag(flagsAt(x, y, z), VF_FLUID)) value += 20.0f; + if (hasFlag(flagsAt(x, y + 1, z), VF_FLUID)) value += 20.0f; cached = {generation, value}; return value; } diff --git a/NativeSrc/src/pathfinder_runtime_fly.inl b/NativeSrc/src/pathfinder_runtime_fly.inl index 4ae8abcc..ea5fa9cd 100644 --- a/NativeSrc/src/pathfinder_runtime_fly.inl +++ b/NativeSrc/src/pathfinder_runtime_fly.inl @@ -8,23 +8,23 @@ constexpr uint8_t FLY_ENV_GROUND = 1u << 0; constexpr uint8_t FLY_ENV_HORIZONTAL = 1u << 1; constexpr uint8_t FLY_ENV_ENCLOSURE = 1u << 2; -constexpr double groundClearanceCost(const int distance) { - return static_cast(6 - distance) * 2.0; +constexpr float groundClearanceCost(const int distance) { + return static_cast(6 - distance) * 2.0f; } -static_assert(groundClearanceCost(1) == 10.0 && groundClearanceCost(5) == 2.0); +static_assert(groundClearanceCost(1) == 10.0f && groundClearanceCost(5) == 2.0f); -inline double Runtime::flyHeuristic(const int x, const int y, const int z) const { +inline float Runtime::flyHeuristic(const int x, const int y, const int z) const { const auto& goal = closestFlyGoal(x, y, z); - const double dx = static_cast(x) - static_cast(goal.x); - const double dy = static_cast(y) - static_cast(goal.y); - const double dz = static_cast(z) - static_cast(goal.z); - - double h = std::sqrt(dx * dx + dy * dy + dz * dz) * ActionCosts::FLY_ONE_BLOCK_TIME; - const double crossProduct = std::abs( - dx * (static_cast(startFly_.z) - static_cast(goal.z)) - - dz * (static_cast(startFly_.x) - static_cast(goal.x)) + const float dx = static_cast(static_cast(x) - goal.x); + const float dy = static_cast(static_cast(y) - goal.y); + const float dz = static_cast(static_cast(z) - goal.z); + + float h = std::sqrt(dx * dx + dy * dy + dz * dz) * ActionCosts::FLY_ONE_BLOCK_TIME; + const float crossProduct = std::abs( + dx * static_cast(static_cast(startFly_.z) - goal.z) - + dz * static_cast(static_cast(startFly_.x) - goal.x) ); - h += crossProduct * 0.001; + h += crossProduct * 0.001f; return h; } @@ -45,7 +45,7 @@ inline const Int3& Runtime::closestFlyGoal(const int x, const int y, const int z return *best; } -inline double Runtime::calculateProgress(const int x, const int z, const Int3& goal) const { +inline float Runtime::calculateProgress(const int x, const int z, const Int3& goal) const { const long long dxStart = static_cast(x) - startFly_.x; const long long dzStart = static_cast(z) - startFly_.z; const long long dxGoal = static_cast(x) - goal.x; @@ -55,10 +55,10 @@ inline double Runtime::calculateProgress(const int x, const int z, const Int3& g const long long distToGoalSq = dxGoal * dxGoal + dzGoal * dzGoal; const long long totalSq = distFromStartSq + distToGoalSq; - return totalSq > 0 ? static_cast(distFromStartSq) / static_cast(totalSq) : 0.5; + return totalSq > 0 ? static_cast(distFromStartSq) / static_cast(totalSq) : 0.5f; } -inline bool Runtime::moveFly(const Int3& current, const int dx, const int dy, const int dz, const double progress, MoveOut& out) { +inline bool Runtime::moveFly(const Int3& current, const int dx, const int dy, const int dz, const float progress, MoveOut& out) { const int destX = current.x + dx; const int destY = current.y + dy; const int destZ = current.z + dz; @@ -85,8 +85,8 @@ inline bool Runtime::moveFly(const Int3& current, const int dx, const int dy, co } const int axisCount = (dx != 0 ? 1 : 0) + (dy != 0 ? 1 : 0) + (dz != 0 ? 1 : 0); - static constexpr std::array baseDistances = {0.0, 1.0, 1.4142135623730951, 1.7320508075688772}; - double cost = baseDistances[static_cast(axisCount)] * ActionCosts::FLY_ONE_BLOCK_TIME; + static constexpr std::array baseDistances = {0.0f, 1.0f, 1.41421356f, 1.73205081f}; + float cost = baseDistances[static_cast(axisCount)] * ActionCosts::FLY_ONE_BLOCK_TIME; auto& cachedEnvironment = cache_.flyEnvironments.at(destX, destY, destZ); const uint32_t generation = cacheGenerationAt(destX, destZ); @@ -95,23 +95,23 @@ inline bool Runtime::moveFly(const Int3& current, const int dx, const int dy, co } auto& environment = cachedEnvironment.value; uint8_t needed = FLY_ENV_GROUND; - if (progress <= 0.88) needed |= FLY_ENV_HORIZONTAL; - if (progress <= 0.94) needed |= FLY_ENV_ENCLOSURE; + if (progress <= 0.88f) needed |= FLY_ENV_HORIZONTAL; + if (progress <= 0.94f) needed |= FLY_ENV_ENCLOSURE; populateFlyEnvironment(destX, destY, destZ, needed, environment); if (dy != 0) { - cost += (diagonalHorizontal || dx != 0 || dz != 0) ? 0.2 : 1.2; + cost += (diagonalHorizontal || dx != 0 || dz != 0) ? 0.2f : 1.2f; } cost += environment.groundCost; - if (progress <= 0.88) { - const double scale = progress > 0.84 ? 0.45 : (progress > 0.72 ? 0.7 : 1.0); + if (progress <= 0.88f) { + const float scale = progress > 0.84f ? 0.45f : (progress > 0.72f ? 0.7f : 1.0f); cost += environment.horizontalCost * scale; } - if (progress <= 0.94) { - const double scale = progress > 0.84 ? 0.5 : (progress > 0.72 ? 0.75 : 1.0); + if (progress <= 0.94f) { + const float scale = progress > 0.84f ? 0.5f : (progress > 0.72f ? 0.75f : 1.0f); cost += environment.enclosureCost * scale; } @@ -162,21 +162,21 @@ inline void Runtime::populateFlyEnvironment( } if (needHorizontal) { - double diagonalTouchPenalty = 0.0; + float diagonalTouchPenalty = 0.0f; if (minClearance > 0) { for (int i = 4; i < 8; i++) { if (!isFlyColumnClear(x + DX[static_cast(i)], y, z + DZ[static_cast(i)])) { - diagonalTouchPenalty += 3.5; + diagonalTouchPenalty += 3.5f; } } } switch (minClearance) { - case 0: environment.horizontalCost = 16.0; break; - case 1: environment.horizontalCost = 9.0; break; - case 2: environment.horizontalCost = 4.0; break; - case 3: environment.horizontalCost = 1.5; break; - default: environment.horizontalCost = 0.0; break; + case 0: environment.horizontalCost = 16.0f; break; + case 1: environment.horizontalCost = 9.0f; break; + case 2: environment.horizontalCost = 4.0f; break; + case 3: environment.horizontalCost = 1.5f; break; + default: environment.horizontalCost = 0.0f; break; } environment.horizontalCost += diagonalTouchPenalty; environment.computed |= FLY_ENV_HORIZONTAL; @@ -185,13 +185,13 @@ inline void Runtime::populateFlyEnvironment( if (needEnclosure) { const bool ceilingClear = isPassableForFlying(x, y + 2, z); if (!ceilingClear) { - environment.enclosureCost = 10.0; + environment.enclosureCost = 10.0f; } else if (!isPassableForFlying(x, y + 3, z)) { - environment.enclosureCost = 4.0; + environment.enclosureCost = 4.0f; } - environment.enclosureCost += static_cast(blockedImmediate) * 2.2; - if (blockedImmediate >= 3) environment.enclosureCost += 7.5; - if (blockedImmediate == 4) environment.enclosureCost += 12.0; + environment.enclosureCost += static_cast(blockedImmediate) * 2.2f; + if (blockedImmediate >= 3) environment.enclosureCost += 7.5f; + if (blockedImmediate == 4) environment.enclosureCost += 12.0f; environment.computed |= FLY_ENV_ENCLOSURE; } } diff --git a/NativeSrc/src/pathfinder_runtime_walk.inl b/NativeSrc/src/pathfinder_runtime_walk.inl index 2246164c..f941b6be 100644 --- a/NativeSrc/src/pathfinder_runtime_walk.inl +++ b/NativeSrc/src/pathfinder_runtime_walk.inl @@ -50,7 +50,7 @@ inline bool Runtime::moveAscend(const Int3& current, const int dx, const int dz, const bool destStair = hasFlag(destSupport, VF_STAIRS_BOTTOM); out.pos = {destX, current.y + 1, destZ}; - double baseCost = ActionCosts::JUMP_UP_ONE_BLOCK_TIME; + float baseCost = ActionCosts::JUMP_UP_ONE_BLOCK_TIME; if (destBottom || srcStair || destStair) { baseCost = ActionCosts::SLAB_ASCENT_TIME; } @@ -83,10 +83,10 @@ inline bool Runtime::moveDescend(const Int3& current, const int dx, const int dz } const int destY = floorY + 1; - double totalCost = ActionCosts::WALK_OFF_EDGE_TIME + ActionCosts::getFallTime(dropBlocks); + float totalCost = ActionCosts::WALK_OFF_EDGE_TIME + ActionCosts::getFallTime(dropBlocks); if (dropBlocks > 3) { const int excess = dropBlocks - 3; - totalCost += static_cast(excess * excess) * 2.0; + totalCost += static_cast(excess * excess) * 2.0f; } totalCost += pathPenalty(destX, destY, destZ); diff --git a/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so b/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so index 60cc7d312eacbe735bb779b62c5c952f10797e57..b7e7c31f8434701aa02e37a65c23ed6731412c41 100644 GIT binary patch literal 244328 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%0D(+8?OE0ReE$2+2P? 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

+Ly!BY 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 literal 236328 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%0AZp2up0~z;sebP$}zMnfalyd~A}r0( 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 Date: Fri, 7 Aug 2026 09:38:32 +0000 Subject: [PATCH 14/61] codex: change double to float for performance improvements in pathfinding [skip-native-auto] --- .../v5/natives/linux/x86_64/V5PathJNI.so | Bin 244328 -> 232288 bytes .../v5/natives/macos/arm64/V5PathJNI.dylib | Bin 191392 -> 191504 bytes .../v5/natives/macos/x86_64/V5PathJNI.dylib | Bin 182584 -> 182696 bytes .../v5/natives/windows/x86_64/V5PathJNI.dll | Bin 189440 -> 188928 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so b/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so index b7e7c31f8434701aa02e37a65c23ed6731412c41..9cc5c6d26d18d171f075fb53fdb80a532b0036b6 100644 GIT binary patch literal 232288 zcmeFa3wTu3)jvE5i39~tP{h>Q8g-q-}gM< z^Efk<7e#RQQ!FS2#$Pv%k|VHtg>dt2lY&-!3cN{he;* zv%lTtJhr%9-(IVn{mnY~A=`ZJt9{JFk807g)Zm%?L8y%7-2B;aIt$^GF8=p;Y(5LE za$TEb1Kr5YwvjhQESw3HLCO8x20dC1b_87cA>Am26kn~c9{_?wQu8TjMp$N0M*e>3rSBmRo; zSAxG;_$$R<75;8nduR3XH=oJ))8wpsp2|8jzU9Y_OIE#?v;48SrH4b=BE3Nu@uNU#2h_Jb=gSu!l~w!t6&&*gu9?I#!Ak?^M@BaZHwFtz*F z`pV!1uN{7RaQbz-KK=XF-+g-h_W3uxJ2m01U*@GWYd$3{?EaGZ}jKEkb1*^ z0_J zKG_F;Y9IB!(1)Fj>Z9Iuec+$zL;eTgTza#sBYntcW*_|ju8(@>KnK0a=cj$x+mt@& zF9M&v(b?Pwog4a)=e2#vv%C*Jr}lxr7((k!ZXJEt$-n!cbGVQEo$xBX(T||N^oD=B zkAC#VNxjRh4n%sB=j(m&d1oJT-rWbCQ~Iz6wGX_v4>{1+_r~XpKK#JDebD)`4>=U| z(XPMsfj_AayMkGH((&j1Tn0V%#(!!bcAnmcd@k*y-Wh%1|JsM0Ks>$jIlK>iLmzzp zypMj=(uX~)6Z$&YQyi8OnhU!8RNDC4CA`hTpN9bC9M8#~HGh@(2pPv`_=yr0_n0n%8-yoTPSA)!N(+>!Jo$N`q_(65z)8FDJ z^={^rjm0XzR zS@jmct|-s#mOO3z8{n7iZM{ck?2^Sinvj30C*7iRkwxd1NN4_ZOFp() zvbOrxqFE(nMJ2VhB@2t@m)}}6w|xHWP~`&Tx&G?Op=@8#MBcW%gc&F zC9_8tO)d&m+H z2TD;kyA;%mLbWATp}Ih6{^Sz;m!CbdsGz8{dOq^imxl7^m3~VySs+teUNg6(v^;;_ zyuwMPl)$&(#|JtkH8th)%knKE5M!1tMk%Xf61^Vjj?wtna@E_o9w*&7pzq)o_$=sqUxYH7n zFRYrJU6h}nS98sj|B@!yrSe0S<+Zn#)Yh;^{dW`$Yn!`p9GW+0YE2o8yY9b3mfQ*^ zrPY9NLsbYO7VbQ|sGuGQ3=ehXfuK{8Ba4FIq^PEPZdK{R{E_+jEE1p>|Idm{yBdy+ zx+$4ewICZ>EGnH_Qdd_LT3AyKJyui;!W>#I;V4vET|YmB5$Hc)=-ZU*$rb&3T~)7) zp~b%PhSKtyP*t^XSCb}(FsPQ5hv4l|uCTUhUO5Jy%96TDOIX>XV5#%V(Flpga3n`# zHr_EB(~{xWMPIHh7YPNPk*1PiT)eBRkE1 zI{J#yuCA_X_WblPwZnJ0Z~RnNW}LRSu9Os51Ys^+2>ijJD^ zG_2mbXh?L?dDl$}aeRoy60jT5AAAzUYAgS`Ny4H1AJ`3g7VM@WR5WW20->Igtw7@|zMYf2Zqk43 zCPn0A`)8}_ULEjtlfcwByWk3k3+_SN^8JE#nWYMA)O88K&iS93mh}EGEtjc&U8}xj zn@SOB&#%6?Xxhl^k?0~NWeed_&^0ffUwtbhxT4V9x}w?Tp`wzqvRbQKTm3lZm0{kO zNF3Z+2uNtF^kn7N8MaqH9uxsvX5qu zhRc?7d5M5%v$HJTYC^Svt0xy({g^4EY!_DsRfNg|!d40=ELb3et9V^@88Cp6moxC# zB)+14eyMN)rDzH}?38IJ7aR9|a@Jifr``C!ykuVAlW$RPkMg6Pv-Vl_72i}At%?^x zU40a>RFhLxT_-}j@zSeJnFjYGYeY(KbqNlq{NJ?@rN5z)QJe|q7xvy5%pNR5fVGv( zEf?lN%c$lsZ%sw!<-;zkF~g81BXbJxED*7V$KCn2RGFZOnRQ*Ltn`8lM$}c0xWof+ zUhHXhDJI>7vWYLX@MRayt(sroaA8BvB^O>YipY_kX`?wWz(N2(&&2WLi!L6K<(U`^ zj2mAxa>T{)r;)M8QL(4&_~XbCqdnti%j-pwlCt&52dv#a0t6aAdYKv-5ex$auRhwyI{kM|&=+t_fXKi7r%L7OJkE zTUt_DS$>h215YWRSC8ea3)Sin)@4FPHmXuF~ zzU{waY;17-G#!71=Pkra?CG9gS(_cC+2BY&wW@7h3Quf1869 z>H(fH7F;IMQ#=zbI9I?Yc&1tKEdoyVlv{8p^B$~xCwW2^Tr1N1c^U!plK|aMvv?)k zBIJ?kx!cOWR>1u|zp`K{pTwAa>~lM)M0}b{f;lT=gcDe9{R{n!7{4Q%B zpv#4C{DY+9vC?h&Yb<<<3*T(vQ(gF03!mn~XFVwCXSncP7M$h6*I0CNT=-QMKG%g$ zUoGjYZoE}*p$p$((J6M}Q?2t)l`ee82aY8SrI!mn}Rb1#RPwIDq17G97U+%zrcpv~DY&XK!$3H0!ytO4M5>p-c z?d<{G|O^?ZBUABk{e)fgkF?w>a?EIPk3w{OJz-b_d?xt7meD z1Am4i|4s+~`wsjr2mVY4-f-Z5=)fOz;Lmd4yBzpJ2i`L{ZvW{He2N2qwgaE)z@Ov5 zr#bNFI`HWZJkOEZp9}}yYa{WU<-iYf;By@K^BnkG2R_4rR~`6F2fomOzrcZ?;lK}f z;ENsj3my1M2R_SzuW{hB9ry+Zeu@L%=)jjd@XHcDSz;BRo?I~@2N2Y#mmf1Lxr%Ynbzfj1m@ zp96o;fxpaw?{eVBIPe~8T%Zpg>%gZt@K-qSsSf;=4t$ye?|0zS9r$q$e1-!*-ht0@ z;PV{#90$JAfzNf|^Bs8Af#+FD`%~z^2W%w1XE^Ya9Qf}Zzmvds68KI6-$~#*34AAk z?xuE+Uw<0p{*F%!OBTM;zvYtGOu-bD`CIG!ApY)O;WgbD`9{Ck}Ig)Vw1O za{<(>jl*2{G-t(OZa|pV#bGXhn&aXy7e39AahMC9<~ebg8%yRXahMCAW?~%Xf~R@t zt62Nf3Ga@>T*x$c#9=OAnw#P<7cR|5<1iN{%?IKz7bMMl;xHE?%{$`o`GjlZFc&1v zS#g*Pk>+)Am>VhPxH!xONpoZz=0c=-P8{X}qBvhWghx6)_yKbn!DpL z7bMLcahMB>=B7Bzg+uevILrk@^MN?bg+lY5ILw7W^Nu*o1wgYl4s(IeoE3+;P-k8j zhq*v!j*G+Gm@!AjVJ_5}=fq(y(3z*iVJ^&>iE)?TPh%+CJ!(4zfABe+TU^DND!xISK5r-!du8qSg;aPE*3vT9hahMxd=D0Y_g*S6# z4DKFw*RzS93gs;DLI2e~?63>o?}GQZ;J01y>n`|37re~{Z*;-yT<~9A@E=|9Z(Q&% zT(G-+%UtQVyWj;bc)km+aKSgZ;At-SY8O1g1z+KUFLA*mT=01=_=hfds0%*X1)t!8 zk3HkkzYE^)g7>)Kw_Wh-F8Db5tJEk0~ypl zG+q~pi@XhL^kHunQ??MJ9Wb7EPJ6YFV) zQDZ$78x`WI$(w@6uS~rlX&6WB`V>`r$M^@r3gbMa`=|P+1hh}5PFA%qRP7A}p$%oK zF0-myp0`rf6V>QkZ%TJzYEat)X4U8vZ~uU{)%a5pUSt#<-BN*o6>ZoFlEG-1H$&C7 zv9+t=>4VySK5h_6bG@oaI$%Ua(nl!VubhS7F@B9;D+nTwVYp+7hwx3Jzvs6OHe&pT z3OfTLT-G+Tz#YiY**}K((745kAc^ARNJtU1p!LSNObl;nn0cfB2LFwl{ZphM!g~vQ zNI}hR6+#egC((y)5^aA=uz$dK3$&bVfB17YV>cRjPMK`rdPJ9O*bX$E1fJzL8m7h@ zc4cRdqaA-nhFHT`V&!oqWIGO`3C2t&hPM>59h=p#kx>5weN(EY3fo~hj;a}~E_Az*CMm81 zMK<*Bs7uwGM7M~wvA#}Sx@9G-P|DkXlfTH^1wtg)0-34NMc!QFuXrkm>NVRSW@|)}(TTPGW%A)^h&Y*j;yTIU+}ga%e4 zsCTY1bV+%nq)c&~3cYpy&KQYYb|WiDtw((quz|mIh->_DS%eH00d0H;ksG@ychvqf zY=g7#EEWKKVjmJ2$C8hTLhl$;SqNfFiMJSHJ7D~PnU)KUZde05GM*CDHWc$Y9fcY< zq(KCp&{$R9ULG7&jNLgvvy+^Q(?}qrhW90eE;SzfOtAWkV#(?i z!f2h&vVM5nxrxqJhboQvvRIKUM%E95tIjRPX{g2KKOmTM5kmu(0&nLTc6=UT9yhX< z?GTW$nNrd>s4zZbHcrUkxscB@@f_41?7(w@winnL#O4#LKSC@}blk>BS*ViF=i#|= zaf>IEiqzG>Y|C%)7+JG~_6oH9#^`CHhGu3qaSjF9R*62fb`8I5-TzRiZbKt*Mj~i- z4pgJkwm!w7D->!Vffo6^iqB&t7c2RkC7-wR`CjA+YTd@2;`>M-yf-0qwsG>OLM?-f zq;LHbgll|`I`gylnWdNo8T&pF84lhgGEf2akXYxxY`MN5q~!IMnkOcNW;r zG@;kqa*PcnY{qRls$Q2H@O@SP19qwzOx51m*vjzY`vB;rA0wHzJ^hRmf#}>R7LrtL zvoQ&Hq;KRJhq0gSf$En5X=H=R^85DzJ`-);CG)Q>8Mp&)B1 z5X_EGSEDrv#ws8?UkOG_bC`4rSmpPx?jy^KyeY;SqzfilWu2gK#CVeu1I2!zgc=ul z(_~GPQ4@>*gXz6E;8(z*aRrF5@OfklWh+s(KFFt3;|@{qDQ`2{qw0@)*{+zOe8xl! zNe#wBa1k6fRwFs?tQ4|X!z!M;2WIq$@hS>zXfl3up&AP1e-HWMo@|@9e{BbjVgbc#M&UgeS5R$g#+%HF>wQ0KQxK z4N;`2zV^@nq1+2Wm}dH#LjZ7(Lj@<4`65tdr3T8znT9c?3}@%b-U0qqZ7QQh!hpI9(>A6fABU(1LB>2Rym6j4RgE^J z8P|y}3n6V(nTdijZfCZCifqaEtWWeb=6FJBdVWf@up6Wq+&n^c&b}5h|9yCS_d%sC zvC|N-n_ivDKo)Ffs`}#8pk6LyeBwq=BZN1M&D0JEs}5=(7^ea5+@b2@vG97i8XYJ^ zoZb4#U+C+{r{OPE1XRtjesM8XB!sIsq*8kp<>x*o9%dYXOUPu2CPpuO2CtGrzqbft+8iKB_io5kt8d-#>%`s$)P+Y@*(6&`|Mz&qhkl) zNW9S`o>$UB)o4p2^k=+GKNSxhY#RCi{G$K zSMweKL0ZAbXuWX*d4nX=)wr;76FkN!fnVfJmy#MLKo_a{Ygx-*Kn4SBfp*Mzda|_E zC&c%M1=^>^!+2z6qb#0=_r_EGAohCd$9NtpHrn~$CZX*9T+vrl{Z?3KyPCPp{58;< zRsA@8n0OBKSB*?y;w{DenkHJ>_kr$j2dn zXRC2J=vt2Hfbm1YQxCfnUHy+JXbfh~G!$iHKHV?nn&xr}isFem_<%k!E1)k)$Mg>wd&FV)fQSf)TXOdJ#B3nX4l>@kwpQ<}f}2>J{QNq9nYzyK*<6&&t%{h56&3VHb>Tx0rg*sn~7V%r7 zsav)*9%*JbL+WTmXhE7?K-*@V0>#mPok;F`be^VUaAZcvmM*1!0(EAQJQ4oPd{_kQ z8-)G&a2{Ih9zwvXWeE7nJ{;6OiA6(RFo&@k^hA!eBBK_WK}d_R(I_n@lCfCmY*}e5 zy7{CZDMbW3haumW*5E zGxcYb%jaf3SJ9H&A!&|VHFQ9O)^mqeEN~pa<}X}+E+>J7v2e5kt>s9#9NFRySxgN& zMXM}ATNtwz3u>x%th=N0G2?O;1vb}sH^_G7d1u5a2mR<;~hwmX<@ zp8;yHiDYD_Z7kj+8C#9$!Il3y=HI~ldh&j}C0>onfk_RwVl2$_<`}IqQDdS$#v4z# z6x0LY)Cg*2-mIXuC<)P0^0mkZ1C!Zggk;>G5Y@mz%CjZn5 z%dX7WhfG*sJ@C*q4AV6yONy!jzost?PXk?466OO+mVV|fu?MO0n8 z5VNJAR*Zmn4g%Wb(uYx8>j&Xvw+5qgDnC&lQlsP3gW8;&r#YyqPuAiER(vNEgG)5$ z^XV)wDP3(JpT-SuRjWG>Nm+mqz<50E<7Z&fd!=zb7*L~wo_mO`XLSg$HGGX;`X~rQ z$NmMobts3W<#3B2GZ|~irzIh=J=_QcX{lP6rlYopIVcNEdw3-t`2lv7ctD+DMsBPY z$Tb!ck0i{Gs$F<7Yt?=*ieKR^DRMc_j6e@`d;x8XS%)|Xn|o5^VDRUEC!fhbe?XP%-;ScEErJU7B%A2ik07mONPCo$h9#4m?Lke_nugItbK1EoL6JT$(F-*stn4rZoK)0^{<% zWC^n#ae!n(N>Cr6>Q}1z6J1kLRNxf_fy5L^ENUB=~%=Ag2=RM>z~f$UdB z^M;{n%%;$N+;w_L>GoMzd1rHO6(o9LuA=#>XwvzLHLMI(wZZzd6z$p+^HOjq_M?@^ z06YftdQ^3(U$0NmZcPyrS4$tVe2U036?sng>r+#-=_%%C7~Wt<0WtT@_xK@3Ek8w^ zdf~Yp<6KxB(*4u@+L4WzuX+5_s6xN?>iP=-P0iOn5IZqT_oj(Wo7hfFli0=KHpElj zRN8X1$(t^08m^v>6tmSPkzy2~4na*+zyU)Rz*+(n-R>Ec<-3H%TLG!sBJT_qhcKH& zx{;3J`h|zCN%ROJEYEVRxDekPvGDHEGDx6U5Ww;+%QB7B3XOMmQ*{!fRVL(VAGGZ| z%YWqG`HH$%Gjf%6`~2ar1}Mvt;7IXQsw~@n5}uZR^&y(9EXyEz=~v461pENbE@dPln5xtQmm;7QS@R!L<-Mc!Tg;Jfo5CVdsDVa^) zEa-u#1wawbb-{%$80)S*^4GZFMi<=df>*iVH7>Z-1$VgMT~2s#lh*{?*`M~Ar+uVW z?Kmsad2Jr{b=p1}Hs{&0%DOM%(+(xHVgXNC*OZin63V*ANAWv%Ih=z(I<4Cu z-k-QU?=;WSqtxB4k1aha6#CO6I0)tsZ_UbEJ`WXqm9KpjvxftI?Lgch)}6|XG>B}c zK@<)F+BS$E065MdHnE1KUrB?wkJ)=Mh~LRf(jYz=ZanPM4)j3~xOLs!HNqFES3 z9>OtLL=KIe7~{x0(jo{@{j=f1T^3OWl+z+?xX{vo4HvuM8W-H?f}36NDi^%Q1-H83 z4i~)33ELJiC_d!;zhW2D9d^NJHz#{X_F;cZ8l@c_lr)j+RSq^Ve0%uNYuPl?TXvf_JIY1#v; zWz`+bqccFeSLR2crr#;i?YW|6RlnEUg>2h$!2uR=58^op9(Uq95KT%A`i?41huJJ& zlb}(D<#hzd9QWTqoXC}7dM>Q-D&gNikZOx;Y4?@E%vROcq1>_I6kx661Pseoq8WF}LTFAJGh1yCylYwUn$-)MWQK6p zS<139Q9lMB6j`5+c0r_Nago*-|NAeB^kHwVV8|A!JQ-n&^!JuXvjme;q$0l*sX#kK zIs@5kkrv{aBF(|K6sf5+T}*lqDQVQ5MXQ4aL8f(VGh|u}ypZX?UkXa9{ zQ>KISVrJT4j28?&>|G@ok}_4bhs8M*Tc+<|=%Z;i3nryZMSdw$fp*BW1=(zwuE8^9 zx)R@%sp^AFUxGzbrlcWd3Or=mO<6;xt-uSJp4_WUvlP&@j><47Y}_ejx{JjeGVLHN zWtt^q`UK4$wkZ>&OhqBIZ6`B-olHfBaMvJZ**?_Iu1_-S#S|<$diyv_rcK^PNZHu? z22J%3UJv}F8nsRJ58i`#Q>Q6+1c*YYUqVv8Iz3cK<68{2XtpchgItS)yKgu_k#!>1;GbjZQ+Zh9^8p)sg8Z z@CCK#2VF{2KOxh8sy+@G7-84JFj1oCYPqcIkrx&WWGky*SQ?*==2!isW3t%BKGUkB6wj^wm;js*f85>(+@uAlt z6Duq>-{(fFRWe$W_ze;D6DZ2K=^{EXi-a?rJ|B2z@MObu^AS`=*#36SXfKu)> zv%G|3F~KA96fvk3em1-&CC_Z;B5Xplx32==kKP&=JyWf6&e-*G6s8OxqoafDnawHt zhk$p=-i8aUw%Ty93$Ag&jV`#^1+Q|!Yg}-v3+`~iyPR-L_MWekdz7NWz+cF4(;m!? zGbl|6y;1hCSaeh)`k;u8#7G{wqzf6tn-T&VmbtoA?c?z0Dasu`$6Vg8y`24wKm2Z& z_ENYFt0zfU6lh78<@uhe-Ou_mg3%;JP59U>M_zkf3HTZ0!yW*QdtQ}%>~itZ5$8jU zevw2hG#}3ge+cdy_{g&Ph$63pk79eY5OT4Hi$uW>hKnfnyY(6f0%Hao(&rfWu@aza zr^-lovNcxZI7eOcB``_9!uG4SygOiP#$R5M?M!#IGd12$c<+yuNG;WMoV=Gp@88hQ zbi18Xk=JUcU#t;q{L7PY(#M}-4gx8;4odzI^T+r*1`&Kq{`Nrr;E(dyOZN_WV90_z zUI1kN6aU5J5w8!&V!v&D=YXPBUk2J^&w3&!0x*Z-KiZR&|A(>my$GxMmhHPyoG23Q zdjgMapNO*}D*>5*z<+4paRwN^hb`kN3BnS`K(MQml*kBJWTaJT>O^JAy4uv-<#nm6 z6P2b}NY`4GCqn&?RcN7vV+9CcIWg z)z0`&xCDQ!;x|yS<;AZM6&FO4hN=mN%o1cfo*wwS)aLJWR@+HOqSw+frs7Dvo_A?i zP|M5iQloWg96G{#y41{%6SfC3w}*FiLEN>c;~PVW_6)|4YxE&0S8GE~_O)^NfK+SH zF}}v-ncS}ax^&|k(r0i$iB3!4coseYy}`JZNEs9y*`YMyeijs8BNPuamkAsY%p{~Z zLXU4;Hfwzz`K^${{E`P4Vi9A!>_OCj{2FY;D#}#z&)7iqZ-kk9Ho`c$C}`5K`~ngV zn5c))fnBI{k*i0+i0JuP6QQbJ?^9LJQdPUV#E9>~dJCS9Q`gJ2`_1=ZnNYme3UYd= z|Ci_)UkV*Q3`_Tm#ccEEf_*NgoAubE)N4|;9U}Yb$UYd^A=*D9*3fpKcb(4OH5k1M z$a@)pVBXc^R)-Qf8;ZiV*`ABB2x(tD`QVvevmQpJ$odatjm1Cfd(Zlu$ST*xP-Hoa zAPTKCe%5>bUt9S_*c2T*!^+=aT;E&%`f5Ao0PW!-uQf}(px5lV$d+tzEux5|UbB6V zR7D^W9sBx7$#IRbb2~QtE`GKbiPRe`AR?^j*at-cYu^6{l(9~7n8RRv_H)SbJjU@n z)bV_ZVcst z_ixJcwJGILj*1OwOiOW^Bzp)B+EWph}etZ3Dj^BQ1{&pjJ>)tU5TfauPUVVlLN21inyc z>k~+Xa$d0scX5;zFaxFO3UP!7TiYBLvH`g7<(OvzDfUsZ6Rt$Q5@P5whrnYx<{LP? z010I8Fs`IUfd5?DE_j1fMhPVrnlA}LxzN89tvO5}JVN#B#AzXmk3R!Aj*okRlzdQF zB6JOEpJM?pA$&BY?y~H|hufS1`{6bjz9lhUPZIHZ_}v7h=@+b2hV16g@LbXC*S0e{ z+116tBIr#)q!7@@T#67NJI}YN)z|%-+?~?P_#Llmt`_?dQ!wZHU)+ zd<$C(l~5?SBS^Jk>X?-3Z_j6DPeHUkN!4T@O;^K56GEp4eA{4g;g6DdwCjj*?Pm6k zQQm;wpB*EuKr`~RcX_ZJR|(k$u6F9|+!qAJ>g4!T^9op&F#~m5;xsELt+=?v@ogNF z_`sGM9N^?UZ8N;zYA_WPC&la2v=uWzC{K&tfG>wc^S5WW()US!nD5&z{oz2r_JSX7 zk}k0#7@fCDU%`U(iU*7{cF`;HisP;erB`hEH)XSUl^V@oL!USZXDrr;PIecX-1Dql zWG>xdkGo%DeXbyKSZTT&EW`bww@Zy`kuj(iJ?-w(=qB1DH2^7Wq1((zF+gBd3yVh{ zjAI5o^5C4z%X|38dClJouP4sc1@*P!K%I6lh?5{McLjZi>o4oPQ1-9hE5+f=WsW*v zmhrj^3$&x!Ke4gcEy(8S5eg6fYfUuKqpzhVjMu=@jO#_C-$LJU$*4f`#uiXiFdp2L z3uYd+FUwuJDeiAdg^Z-J=Py^IqhPm@ES6*k5$!XMw6O~Doc#>eI}&l8lvyy7mPZMr zL$XvYzfsjzh&r{Y%@tVN*EUeHp|e%r8?a;T5EhlfA0--EE2#;{RQWlrht}PY?gqqE(gg*kOLZ?d8VHoTstnq@dl#8T{`w{+EjXtbP>G-Y~~uWN8ecQ1_V=sgi(9iT1=(uSd@cmn95`iQxngsRy z)XpJ!+SzJ&bCMcvgZC(4j?m&f{oH_Wd;R<9y`BP$*Xtn_e$Fb$JQn0}v93h!gEsLe zy$i5U()0u^J~{*&51W)bJ|chtERu}m{Oneoxt^$bvnNG^*-0?CC8G-vX++*)E>s-E z=}uN0)berH>EHEX_{I!eeeJP)4r2{!sQM)g@tElGNDaK8aS&}&^?IzH0m9V6i(^@B zLGlO(fzd9ATvpb|)AW7BA+IdZ*(lb}u%1(US-gp8n5sF_Swi`KCVffv) zKtii|A!K34Cu+-=fbdyjXYYJTuFKV@f)%p{NwF=YvmhW)?||Q4LDvu~avyr<-t!S| zMmN|tvDxg#0N3oFCiE>2qX|`Ksrpcd3zdVCJ|V?v0ltpVh3b%$GIw$IVN*Hz_jAFIA2b-2>gbCjZLp$YWLm?q#R8Rx(oE*~LMyHXZxSG5lH$h-VM zy!)8?GQ$0ViNUB>j9&~`ze0P0JnV&2TotM^zZHi%E0npd!OTOnk-Hy+6zGK_FW>>E z!Z6rR^;{Jlc&;)ypLPND9R&Lb8B>&H(;-X$Q=DEhI!o)kgzHDpXPP*zws{~WVU-_)WhTc~fj=8<6*%)^Q5y~5aOb-#JWv(57CY>%Udh}ssUs29{b=Mu0?`h3~v+0oJO4UZ6ZIT|?+5}NBx z3i$TcUu!-CfyLqrZKysKy?q;cdtHh)#haueNVu6;95Qrb4~9b8P&K@Dpp6DGrD-u} zK|?qA1`Cj*&>Qp?)^v z&KUm`q~lUE!kaB=u~2HW@kmUbTg^`~O3C=7LK)JAzqjy*Bal5}6$B~`ux3YxVoU

5MNP_KZlgTV*FAv@8_7IWIj?X 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%0D(+8?OE0ReE$2+2P? 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

+Ly!BY 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 diff --git a/src/main/resources/assets/v5/natives/macos/arm64/V5PathJNI.dylib b/src/main/resources/assets/v5/natives/macos/arm64/V5PathJNI.dylib index 2daf3ea0649cf09f16e9d7f48859d1cb0dd6b9df..30c1568ad46ae387d8af0352996a447ecdd06e1b 100755 GIT binary patch delta 35765 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 pvY#8&Jp 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 diff --git a/src/main/resources/assets/v5/natives/windows/x86_64/V5PathJNI.dll b/src/main/resources/assets/v5/natives/windows/x86_64/V5PathJNI.dll index ee314f4ecfd99d80b50fb7bfd6050fa737506ce7..dc10cc88dca00941256a92795945aa0a15bf08e6 100644 GIT binary patch delta 60312 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 ZL+yr!4eBxfV}ZxAAKUcYC;D{H{{cpi<$3@B delta 60520 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 gMmKskc{k;6@@*>F6y8*~sbSOVO Date: Fri, 14 Aug 2026 12:40:57 +0100 Subject: [PATCH 15/61] Refactor RenderUtils -> Render3D and Renderer -> Render2D --- .../mixins/EntityRenderDispatcherMixin.java | 4 +- .../ctjs/internal/mixins/GuiMixin.java | 6 +- .../internal/mixins/GuiRendererMixin.java | 6 +- src/main/kotlin/com/chattriggers/ctjs/CTJS.kt | 8 +- .../chattriggers/ctjs/api/client/Player.kt | 14 +- .../ctjs/api/client/ScreenHelper.kt | 12 +- .../chattriggers/ctjs/api/entity/Entity.kt | 12 +- .../chattriggers/ctjs/api/entity/Particle.kt | 8 +- .../chattriggers/ctjs/api/entity/PlayerMP.kt | 8 +- .../chattriggers/ctjs/api/message/ChatLib.kt | 8 +- .../com/chattriggers/ctjs/api/render/Gui.kt | 6 +- .../ctjs/api/render/GuiRendererBackend.kt | 2 +- .../com/chattriggers/ctjs/api/render/Image.kt | 2 +- .../chattriggers/ctjs/api/render/Rectangle.kt | 10 +- .../api/render/{Renderer.kt => Render2D.kt} | 10 +- .../render/{RenderUtils.kt => Render3D.kt} | 2 +- .../com/chattriggers/ctjs/api/render/Text.kt | 8 +- .../com/chattriggers/ctjs/api/render/Toast.kt | 2 +- .../ctjs/api/render/skia/SkijaPIP.kt | 6 +- .../ctjs/internal/engine/module/Module.kt | 14 +- .../ctjs/internal/engine/module/ModulesGui.kt | 22 +- .../ctjs/internal/listeners/ClientListener.kt | 16 +- .../ctjs/internal/listeners/WorldListener.kt | 6 +- .../assets/ctjs/js/moduleProvidedLibs.js | 4 +- .../main/resources/provided-types.properties | 6 +- .../src/main/resources/typings.d.ts | 238 +++++++++--------- 26 files changed, 220 insertions(+), 220 deletions(-) rename src/main/kotlin/com/chattriggers/ctjs/api/render/{Renderer.kt => Render2D.kt} (98%) rename src/main/kotlin/com/chattriggers/ctjs/api/render/{RenderUtils.kt => Render3D.kt} (99%) diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/EntityRenderDispatcherMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/EntityRenderDispatcherMixin.java index b3dc7831..9eb43f6e 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/EntityRenderDispatcherMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/EntityRenderDispatcherMixin.java @@ -1,7 +1,7 @@ package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Client; -import com.chattriggers.ctjs.api.render.Renderer; +import com.chattriggers.ctjs.api.render.Render2D; import com.chattriggers.ctjs.internal.IRenderState; import com.chattriggers.ctjs.internal.engine.CTEvents; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; @@ -21,7 +21,7 @@ public abstract class EntityRenderDispatcherMixin { @Inject(method = "onResourceManagerReload", at = @At("TAIL")) private void injectReload(net.minecraft.server.packs.resources.ResourceManager manager, CallbackInfo ci, @com.llamalad7.mixinextras.sugar.Local net.minecraft.client.renderer.entity.EntityRendererProvider.Context context) { - Renderer.initializePlayerRenderers$ctjs(context); + Render2D.initializePlayerRenderers$ctjs(context); } @ModifyExpressionValue( diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java index 57112809..0eee2c21 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java @@ -1,7 +1,7 @@ package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.render.DrawContextHolder; -import com.chattriggers.ctjs.api.render.Renderer; +import com.chattriggers.ctjs.api.render.Render2D; import com.chattriggers.ctjs.api.world.Scoreboard; import com.chattriggers.ctjs.internal.engine.CTEvents; import gg.essential.universal.UMatrixStack; @@ -21,7 +21,7 @@ public class GuiMixin { private void captureContext(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { DrawContextHolder.currentContext = context; if (Minecraft.getInstance().screen == null) - Renderer.INSTANCE.runPreDrawables(context); + Render2D.INSTANCE.runPreDrawables(context); } @Inject(method = "extractScoreboardSidebar", at = @At("HEAD"), cancellable = true) @@ -37,6 +37,6 @@ private void injectRenderScoreboard(GuiGraphicsExtractor matrices, DeltaTracker private void injectRenderOverlay(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { CTEvents.RENDER_OVERLAY.invoker().render(context, new UMatrixStack(context.pose()).toMC(), tickCounter.getGameTimeDeltaTicks()); if (Minecraft.getInstance().screen == null) - Renderer.INSTANCE.runDrawables(context); + Render2D.INSTANCE.runDrawables(context); } } diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java index 25409ee9..16b22a2b 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiRendererMixin.java @@ -1,6 +1,6 @@ package com.chattriggers.ctjs.internal.mixins; -import com.chattriggers.ctjs.api.render.Renderer; +import com.chattriggers.ctjs.api.render.Render2D; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.Screen; import org.spongepowered.asm.mixin.Mixin; @@ -12,7 +12,7 @@ public class GuiRendererMixin { @Inject(method = "extractRenderStateWithTooltipAndSubtitles", at = @At("TAIL")) private void afterExtract(GuiGraphicsExtractor context, int mouseX, int mouseY, float deltaTicks, CallbackInfo ci) { - Renderer.INSTANCE.runPreDrawables(context); - Renderer.INSTANCE.runDrawables(context); + Render2D.INSTANCE.runPreDrawables(context); + Render2D.INSTANCE.runDrawables(context); } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt index 10b50f0a..908aeb4b 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt @@ -8,7 +8,7 @@ import com.chattriggers.ctjs.api.client.WelcomeScreen import com.chattriggers.ctjs.api.commands.DynamicCommands import com.chattriggers.ctjs.api.message.ChatLib import com.chattriggers.ctjs.api.render.Image -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.api.render.skia.SkijaPIP import com.chattriggers.ctjs.api.render.skia.SkijaPrePIP import com.chattriggers.ctjs.api.triggers.TriggerType @@ -49,7 +49,7 @@ class CTJS : ClientModInitializer { autoOpenTriggered = true WelcomeScreen.open() } - ClientLifecycleEvents.CLIENT_STOPPING.register { _ -> Renderer.destroy() } + ClientLifecycleEvents.CLIENT_STOPPING.register { _ -> Render2D.destroy() } SecureLoader.onInitialize() @@ -103,13 +103,13 @@ class CTJS : ClientModInitializer { Register.clearCustomTriggers() StaticCommand.unregisterAll() DynamicCommands.unregisterAll() - Renderer.clearCallbacks() + Render2D.clearCallbacks() if (Config.clearConsoleOnLoad) Console.clear() Client.scheduleTask { - Renderer.destroy() + Render2D.destroy() images.forEach(Image::destroy) sounds.forEach(Sound::destroy) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/Player.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/Player.kt index 86ffa961..5c3b725a 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/Player.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/Player.kt @@ -6,7 +6,7 @@ import com.chattriggers.ctjs.api.entity.Team import com.chattriggers.ctjs.api.inventory.Inventory import com.chattriggers.ctjs.api.inventory.Item import com.chattriggers.ctjs.api.message.TextComponent -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.api.world.PotionEffect import com.chattriggers.ctjs.api.world.Scoreboard import com.chattriggers.ctjs.api.world.World @@ -69,13 +69,13 @@ object Player { fun getLastZ(): Double = toMC()?.zOld ?: 0.0 @JvmStatic - fun getRenderX(): Double = getLastX() + (getX() - getLastX()) * Renderer.partialTicks + fun getRenderX(): Double = getLastX() + (getX() - getLastX()) * Render2D.partialTicks @JvmStatic - fun getRenderY(): Double = getLastY() + (getY() - getLastY()) * Renderer.partialTicks + fun getRenderY(): Double = getLastY() + (getY() - getLastY()) * Render2D.partialTicks @JvmStatic - fun getRenderZ(): Double = getLastZ() + (getZ() - getLastZ()) * Renderer.partialTicks + fun getRenderZ(): Double = getLastZ() + (getZ() - getLastZ()) * Render2D.partialTicks /** * Gets the player's x motion. @@ -310,15 +310,15 @@ object Player { fun getContainer(): Inventory? = (Client.getMinecraft().screen as? AbstractContainerScreen<*>)?.let(::Inventory) /** - * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] + * Draws the player in the GUI. Takes the same parameters as [Render2D.drawPlayer] * minus `player`. * - * @see Renderer.drawPlayer + * @see Render2D.drawPlayer */ @JvmStatic fun draw(obj: NativeObject) = apply { obj["player"] = this - Renderer.drawPlayer(obj) + Render2D.drawPlayer(obj) } class ArmorWrapper { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/ScreenHelper.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/ScreenHelper.kt index 9c47d827..6bc214d9 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/ScreenHelper.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/ScreenHelper.kt @@ -1,7 +1,7 @@ package com.chattriggers.ctjs.api.client import com.chattriggers.ctjs.api.render.Font -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import net.minecraft.util.ARGB object ScreenHelper { @@ -39,17 +39,17 @@ object ScreenHelper { val defaultTextColor = if (hovered) argb(255, 255, 255, 255) else argb(252, 224, 232, 242) val textColor = textColorOverride ?: defaultTextColor - Renderer.drawDropShadow(x, y, width, height, 5f, 14f, 1.3f, argb(60, 0, 10, 28)) - Renderer.drawRoundedRect(x, y, width, height, 5f, bg) - Renderer.drawHollowRect(x, y, width, height, 0.65f, border, 5f) - Renderer.text( + Render2D.drawDropShadow(x, y, width, height, 5f, 14f, 1.3f, argb(60, 0, 10, 28)) + Render2D.drawRoundedRect(x, y, width, height, 5f, bg) + Render2D.drawHollowRect(x, y, width, height, 0.65f, border, 5f) + Render2D.text( label, x + width / 2f, y + height / 2f, 8.7f, textColor, smallerFont, - Renderer.ALIGN_CENTER or Renderer.ALIGN_MIDDLE + Render2D.ALIGN_CENTER or Render2D.ALIGN_MIDDLE ) } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/entity/Entity.kt b/src/main/kotlin/com/chattriggers/ctjs/api/entity/Entity.kt index 584424ad..62b13ec1 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/entity/Entity.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/entity/Entity.kt @@ -2,7 +2,7 @@ package com.chattriggers.ctjs.api.entity import com.chattriggers.ctjs.api.CTWrapper import com.chattriggers.ctjs.api.message.TextComponent -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.api.world.Chunk import com.chattriggers.ctjs.api.world.World import com.chattriggers.ctjs.api.world.block.BlockPos @@ -46,7 +46,7 @@ open class Entity(override val mcValue: MCEntity) : CTWrapper { * * @return the entity's pitch */ - fun getPitch() = Mth.wrapDegrees(mcValue.getViewXRot(Renderer.partialTicks)) + fun getPitch() = Mth.wrapDegrees(mcValue.getViewXRot(Render2D.partialTicks)) /** * Gets the yaw, the vertical direction the entity is facing towards. @@ -54,7 +54,7 @@ open class Entity(override val mcValue: MCEntity) : CTWrapper { * * @return the entity's yaw */ - fun getYaw() = Mth.wrapDegrees(mcValue.getViewYRot(Renderer.partialTicks)) + fun getYaw() = Mth.wrapDegrees(mcValue.getViewYRot(Render2D.partialTicks)) /** * Gets the entity's x motion. @@ -211,10 +211,10 @@ open class Entity(override val mcValue: MCEntity) : CTWrapper { fun isInLava() = mcValue.isInLava @JvmOverloads - fun getLookVector(partialTicks: Float = Renderer.partialTicks) = mcValue.getViewVector(partialTicks) + fun getLookVector(partialTicks: Float = Render2D.partialTicks) = mcValue.getViewVector(partialTicks) @JvmOverloads - fun getEyePosition(partialTicks: Float = Renderer.partialTicks) = mcValue.getEyePosition(partialTicks) + fun getEyePosition(partialTicks: Float = Render2D.partialTicks) = mcValue.getEyePosition(partialTicks) fun canBeCollidedWith() = mcValue.canBeCollidedWith(null) @@ -240,7 +240,7 @@ open class Entity(override val mcValue: MCEntity) : CTWrapper { } private fun renderPosition(previous: Double, current: Double) = - previous + (current - previous) * Renderer.partialTicks + previous + (current - previous) * Render2D.partialTicks enum class DimensionType( override val mcValue: ResourceKey, diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/entity/Particle.kt b/src/main/kotlin/com/chattriggers/ctjs/api/entity/Particle.kt index a6133dac..adedb4e2 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/entity/Particle.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/entity/Particle.kt @@ -1,7 +1,7 @@ package com.chattriggers.ctjs.api.entity import com.chattriggers.ctjs.api.CTWrapper -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.internal.mixins.ParticleAccessor import com.chattriggers.ctjs.MCParticle import com.chattriggers.ctjs.internal.utils.asMixin @@ -45,9 +45,9 @@ class Particle(override val mcValue: MCParticle) : CTWrapper { mixed.zo = value } - val renderX get() = lastX + (x - lastX) * Renderer.partialTicks - val renderY get() = lastY + (y - lastY) * Renderer.partialTicks - val renderZ get() = lastZ + (z - lastZ) * Renderer.partialTicks + val renderX get() = lastX + (x - lastX) * Render2D.partialTicks + val renderY get() = lastY + (y - lastY) * Render2D.partialTicks + val renderZ get() = lastZ + (z - lastZ) * Render2D.partialTicks var motionX get() = mixed.xd diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/entity/PlayerMP.kt b/src/main/kotlin/com/chattriggers/ctjs/api/entity/PlayerMP.kt index 36490bbe..33625eed 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/entity/PlayerMP.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/entity/PlayerMP.kt @@ -2,7 +2,7 @@ package com.chattriggers.ctjs.api.entity import com.chattriggers.ctjs.api.client.Client import com.chattriggers.ctjs.api.message.TextComponent -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.internal.NameTagOverridable import com.chattriggers.ctjs.MCTeam import com.chattriggers.ctjs.internal.utils.asMixin @@ -44,14 +44,14 @@ class PlayerMP(override val mcValue: Player) : LivingEntity(mcValue) { } /** - * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] + * Draws the player in the GUI. Takes the same parameters as [Render2D.drawPlayer] * minus `player`. * - * @see Renderer.drawPlayer + * @see Render2D.drawPlayer */ fun draw(obj: NativeObject) = apply { obj["player"] = this - Renderer.drawPlayer(obj) + Render2D.drawPlayer(obj) } private fun getPlayerName(playerListEntry: PlayerInfo?): TextComponent { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/message/ChatLib.kt b/src/main/kotlin/com/chattriggers/ctjs/api/message/ChatLib.kt index 46d72a1c..780efec2 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/message/ChatLib.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/message/ChatLib.kt @@ -1,7 +1,7 @@ package com.chattriggers.ctjs.api.message import com.chattriggers.ctjs.api.client.Client -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.internal.listeners.ClientListener import com.chattriggers.ctjs.internal.mixins.ChatComponentAccessor import com.chattriggers.ctjs.internal.utils.asMixin @@ -110,7 +110,7 @@ object ChatLib { @JvmOverloads fun getChatBreak(separator: String = "-"): String { if (separator.isEmpty()) return "" - val len = Renderer.getStringWidth(separator) + val len = Render2D.getStringWidth(separator) val times = getChatWidth() / len return separator.repeat(times) } @@ -155,14 +155,14 @@ object ChatLib { */ @JvmStatic fun getCenteredText(text: String): String { - val textWidth = Renderer.getStringWidth(addColor(text)) + val textWidth = Render2D.getStringWidth(addColor(text)) val chatWidth = getChatWidth() if (textWidth >= chatWidth) return text val spaceWidth = (chatWidth - textWidth) / 2f - return " ".repeat((spaceWidth / Renderer.getStringWidth(" ")).roundToInt()) + text + return " ".repeat((spaceWidth / Render2D.getStringWidth(" ")).roundToInt()) + text } /** diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt index 517f7946..ae21b3c3 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt @@ -278,12 +278,12 @@ class Gui @JvmOverloads constructor( @Suppress("UNCHECKED_CAST") val drawContexts = drawContextsField.get(this) as List DrawContextHolder.withContext(drawContexts.last()) { - Renderer.pushMatrix(UMatrixStack(drawContexts.last().pose())) - Renderer.partialTicks = partialTicks + Render2D.pushMatrix(UMatrixStack(drawContexts.last().pose())) + Render2D.partialTicks = partialTicks this.mouseX = mouseX this.mouseY = mouseY onDraw?.trigger(arrayOf(mouseX, mouseY, partialTicks)) - Renderer.popMatrix() + Render2D.popMatrix() } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt index aae300f8..577d6af7 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt @@ -24,7 +24,7 @@ import javax.imageio.metadata.IIOMetadataNode import kotlin.math.max import kotlin.math.roundToInt -/** Skija-backed 2D renderer used by the JavaScript-facing [Renderer] API. */ +/** Skija-backed 2D renderer used by the JavaScript-facing [Render2D] API. */ open class GuiRendererBackend { private val callbacks = CopyOnWriteArrayList() private val preCallbacks = CopyOnWriteArrayList() diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Image.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Image.kt index 50265a44..7494d63b 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Image.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Image.kt @@ -80,7 +80,7 @@ class Image(var image: BufferedImage?) { } if (texture != null) - Renderer.drawImage(this, x, y, drawWidth, drawHeight) + Render2D.drawImage(this, x, y, drawWidth, drawHeight) } private data class Texture(val texture: DynamicTexture, val buffer: ByteBuffer) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Rectangle.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Rectangle.kt index 9912503e..055a04fb 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Rectangle.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Rectangle.kt @@ -15,7 +15,7 @@ class Rectangle( fun getColor(): Long = color - fun setColor(color: Long) = apply { this.color = Renderer.fixAlpha(color) } + fun setColor(color: Long) = apply { this.color = Render2D.fixAlpha(color) } fun getX(): Float = x @@ -82,7 +82,7 @@ class Rectangle( fun draw() = apply { shadow.draw() outline.draw() - Renderer.drawRect(x, y, width, height, color.toInt()) + Render2D.drawRect(x, y, width, height, color.toInt()) } private class Shadow( @@ -93,8 +93,8 @@ class Rectangle( ) { fun draw() { if (!on) return - Renderer.drawRect(rect.x + offset.x, rect.y + rect.height, rect.width, offset.y, color.toInt()) - Renderer.drawRect(rect.x + rect.width, rect.y + offset.y, offset.x, rect.height - offset.y, color.toInt()) + Render2D.drawRect(rect.x + offset.x, rect.y + rect.height, rect.width, offset.y, color.toInt()) + Render2D.drawRect(rect.x + rect.width, rect.y + offset.y, offset.x, rect.height - offset.y, color.toInt()) } } @@ -106,7 +106,7 @@ class Rectangle( ) { fun draw() { if (!on) return - Renderer.drawRect( + Render2D.drawRect( rect.x - thickness, rect.y - thickness, rect.width + thickness * 2, diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render2D.kt similarity index 98% rename from src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt rename to src/main/kotlin/com/chattriggers/ctjs/api/render/Render2D.kt index 109032db..2777e20b 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render2D.kt @@ -23,7 +23,7 @@ import kotlin.math.atan import kotlin.math.roundToInt import kotlin.math.sin -object Renderer : GuiRendererBackend() { +object Render2D : GuiRendererBackend() { private val NEWLINE_REGEX = """\n|\r\n?""".toRegex() // The currently-active matrix stack @@ -453,8 +453,8 @@ object Renderer : GuiRendererBackend() { matrixStack.pop() } - internal fun withMatrix(stack: PoseStack?, partialTicks: Float = Renderer.partialTicks, block: () -> Unit) { - Renderer.partialTicks = partialTicks + internal fun withMatrix(stack: PoseStack?, partialTicks: Float = Render2D.partialTicks, block: () -> Unit) { + Render2D.partialTicks = partialTicks matrixPushCounter = 0 try { @@ -468,9 +468,9 @@ object Renderer : GuiRendererBackend() { } if (matrixPushCounter > 0) { - "Warning: Render function missing a call to Renderer.popMatrix()".printToConsole(LogType.WARN) + "Warning: Render function missing a call to Render2D.popMatrix()".printToConsole(LogType.WARN) } else if (matrixPushCounter < 0) { - "Warning: Render function has too many calls to Renderer.popMatrix()".printToConsole(LogType.WARN) + "Warning: Render function has too many calls to Render2D.popMatrix()".printToConsole(LogType.WARN) } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderUtils.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt similarity index 99% rename from src/main/kotlin/com/chattriggers/ctjs/api/render/RenderUtils.kt rename to src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt index 45c34d0c..ede8f639 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderUtils.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt @@ -9,7 +9,7 @@ import net.minecraft.world.entity.Entity import net.minecraft.world.phys.AABB import net.minecraft.world.phys.Vec3 -object RenderUtils { +object Render3D { private val client = Minecraft.getInstance() data class Color(val r: Int, val g: Int, val b: Int, val a: Int) { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Text.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Text.kt index 8530c165..7653f35a 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Text.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Text.kt @@ -58,7 +58,7 @@ class Text { fun getColor(): Long = color - fun setColor(color: Long) = apply { this.color = Renderer.fixAlpha(color) } + fun setColor(color: Long) = apply { this.color = Render2D.fixAlpha(color) } fun getFormatted(): Boolean = formatted @@ -152,7 +152,7 @@ class Text { ctx.pose().pushMatrix() ctx.pose().scale(scale, scale) - var longestLine = lines.maxOf { Renderer.getStringWidth(it) * scale } + var longestLine = lines.maxOf { Render2D.getStringWidth(it) * scale } if (maxWidth != 0) longestLine = longestLine.coerceAtMost(maxWidth.toFloat()) width = longestLine.toInt() @@ -178,7 +178,7 @@ class Text { } for (i in 0 until minOf(maxLines, lines.size)) { - ctx.text(Renderer.getFontRenderer(), lines[i], xHolder, yHolder, color.toInt(), shadow) + ctx.text(Render2D.getFontRenderer(), lines[i], xHolder, yHolder, color.toInt(), shadow) yHolder += 10 } ctx.pose().popMatrix() @@ -194,7 +194,7 @@ class Text { string.split("\n").forEach { line -> if (maxWidth > 0) { lines.addAll( - Renderer.getFontRenderer().splitter.splitLines(line, maxWidth, Style.EMPTY).map { it.string } + Render2D.getFontRenderer().splitter.splitLines(line, maxWidth, Style.EMPTY).map { it.string } ) } else { lines.add(line) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Toast.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Toast.kt index 35544699..a3a91dff 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Toast.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Toast.kt @@ -110,7 +110,7 @@ class Toast(config: NativeObject) : MCToast { val render = customRenderFunction if (render != null) { DrawContextHolder.withContext(context) { - Renderer.withMatrix(UMatrixStack(context.pose()).toMC()) { + Render2D.withMatrix(UMatrixStack(context.pose()).toMC()) { try { JSLoader.invoke(render, emptyArray(), thisObj = requireNotNull(jsReceiver)) } catch (e: Throwable) { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt index 0e618e78..6b6c44db 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt @@ -1,6 +1,6 @@ package com.chattriggers.ctjs.api.render.skia -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.client.gui.GuiGraphicsExtractor @@ -22,11 +22,11 @@ internal open class SkijaPIP(bufferSource: MultiBufferSource.BufferSource) : Pic surface.render(color.getWidth(0), color.getHeight(0), color.texture()) { canvas -> canvas.resetMatrix() canvas.scale(state.guiScale, state.guiScale) - Renderer.beginSkijaFrame(canvas) + Render2D.beginSkijaFrame(canvas) try { state.callback.run() } finally { - Renderer.endSkijaFrame() + Render2D.endSkijaFrame() } } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/engine/module/Module.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/engine/module/Module.kt index 11c11e30..44026b3e 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/engine/module/Module.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/engine/module/Module.kt @@ -1,7 +1,7 @@ package com.chattriggers.ctjs.internal.engine.module import com.chattriggers.ctjs.api.message.ChatLib -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.api.render.Text import com.chattriggers.ctjs.internal.utils.ModVersion import net.minecraft.client.gui.GuiGraphicsExtractor @@ -26,7 +26,7 @@ class Module(val name: String, var metadata: ModuleMetadata, val folder: File) { ctx.fill(x, y, x + width, y + 13, 0xaa000000.toInt()) ctx.text( - Renderer.getFontRenderer(), + Render2D.getFontRenderer(), metadata.name ?: name, x + 3, y + 3, -1 ) @@ -35,7 +35,7 @@ class Module(val name: String, var metadata: ModuleMetadata, val folder: File) { ctx.pose().pushMatrix() ctx.pose().translate(x + width - 5f, y + 8f) ctx.pose().rotate(Math.PI.toFloat()) - ctx.text(Renderer.getFontRenderer(), "^", 0, 0, -1, false) + ctx.text(Render2D.getFontRenderer(), "^", 0, 0, -1, false) ctx.pose().popMatrix() 16 } else { @@ -43,23 +43,23 @@ class Module(val name: String, var metadata: ModuleMetadata, val folder: File) { val descriptionHeight = gui.description.getHeight().toInt() ctx.fill(x, y + 13, x + width, y + descriptionHeight + 25, 0x50000000) - ctx.text(Renderer.getFontRenderer(), "^", x + width - 10, y + 5, -1, false) + ctx.text(Render2D.getFontRenderer(), "^", x + width - 10, y + 5, -1, false) gui.description.draw(ctx, x + 3, y + 15) if (metadata.version != null) { val versionText = ChatLib.addColor("&8v${metadata.version}") ctx.text( - Renderer.getFontRenderer(), + Render2D.getFontRenderer(), versionText, - x + width - Renderer.getStringWidth(versionText), + x + width - Render2D.getStringWidth(versionText), y + descriptionHeight + 15, -1 ) } ctx.text( - Renderer.getFontRenderer(), + Render2D.getFontRenderer(), ChatLib.addColor( if (metadata.isRequired && requiredBy.isNotEmpty()) { "&8required by $requiredBy" diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/engine/module/ModulesGui.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/engine/module/ModulesGui.kt index 6104b603..91910bf9 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/engine/module/ModulesGui.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/engine/module/ModulesGui.kt @@ -2,7 +2,7 @@ package com.chattriggers.ctjs.internal.engine.module import com.chattriggers.ctjs.api.client.Player import com.chattriggers.ctjs.api.message.ChatLib -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.api.render.Text import net.minecraft.client.input.MouseButtonEvent import net.minecraft.client.gui.GuiGraphicsExtractor @@ -19,20 +19,20 @@ object ModulesGui : Screen(net.minecraft.network.chat.Component.literal("Modules override fun extractRenderState(ctx: GuiGraphicsExtractor, mouseX: Int, mouseY: Int, deltaTicks: Float) { ctx.pose().pushMatrix() - val middle = Renderer.screen.getWidth() / 2 - val width = (Renderer.screen.getWidth() - 100).coerceAtMost(500) + val middle = Render2D.screen.getWidth() / 2 + val width = (Render2D.screen.getWidth() - 100).coerceAtMost(500) ctx.fill(0, 0, ctx.guiWidth(), ctx.guiHeight(), 0x50000000) - if (-window.scroll > window.height - Renderer.screen.getHeight() + 20) - window.scroll = -window.height + Renderer.screen.getHeight() - 20 + if (-window.scroll > window.height - Render2D.screen.getHeight() + 20) + window.scroll = -window.height + Render2D.screen.getHeight() - 20 if (-window.scroll < 0) window.scroll = 0f if (-window.scroll > 0) { - val rx = Renderer.screen.getWidth() - 20 - val ry = Renderer.screen.getHeight() - 20 + val rx = Render2D.screen.getWidth() - 20 + val ry = Render2D.screen.getHeight() - 20 ctx.fill(rx, ry, rx + 20, ry + 20, 0xaa000000.toInt()) - ctx.text(Renderer.getFontRenderer(), "^", Renderer.screen.getWidth() - 12, Renderer.screen.getHeight() - 12, -1, false) + ctx.text(Render2D.getFontRenderer(), "^", Render2D.screen.getWidth() - 12, Render2D.screen.getHeight() - 12, -1, false) } val ox = middle - width / 2 @@ -57,10 +57,10 @@ object ModulesGui : Screen(net.minecraft.network.chat.Component.literal("Modules val mouseX = click.x val mouseY = click.y - val width = (Renderer.screen.getWidth() - 100f).coerceAtMost(500f) - val right = Renderer.screen.getWidth() / 2f + width / 2f + val width = (Render2D.screen.getWidth() - 100f).coerceAtMost(500f) + val right = Render2D.screen.getWidth() / 2f + width / 2f - if (mouseX > Renderer.screen.getWidth() - 20 && mouseY > Renderer.screen.getHeight() - 20) { + if (mouseX > Render2D.screen.getWidth() - 20 && mouseY > Render2D.screen.getHeight() - 20) { window.scroll = 0f return false } diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/listeners/ClientListener.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/listeners/ClientListener.kt index 2e506fc6..59b876ed 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/listeners/ClientListener.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/listeners/ClientListener.kt @@ -7,7 +7,7 @@ import com.chattriggers.ctjs.api.entity.PlayerInteraction import com.chattriggers.ctjs.api.inventory.Item import com.chattriggers.ctjs.api.message.TextComponent import com.chattriggers.ctjs.api.render.DrawContextHolder -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.api.triggers.CancellableEvent import com.chattriggers.ctjs.api.triggers.ChatTrigger import com.chattriggers.ctjs.api.triggers.TriggerType @@ -94,21 +94,21 @@ object ClientListener : Initializer { } ScreenEvents.BEFORE_INIT.register { _, screen, _, _ -> - // TODO: Why does Renderer.drawString not work in here? + // TODO: Why does Render2D.drawString not work in here? ScreenEvents.beforeExtract(screen).register { _, stack, mouseX, mouseY, partialTicks -> if (!JSLoader.hasTriggers(TriggerType.GUI_RENDER)) return@register DrawContextHolder.withContext(stack) { - Renderer.withMatrix(UMatrixStack(stack.pose()).toMC(), partialTicks) { + Render2D.withMatrix(UMatrixStack(stack.pose()).toMC(), partialTicks) { TriggerType.GUI_RENDER.triggerAll(mouseX, mouseY, screen) } } } - // TODO: Why does Renderer.drawString not work in here? + // TODO: Why does Render2D.drawString not work in here? ScreenEvents.afterExtract(screen).register { _, stack, mouseX, mouseY, partialTicks -> if (!JSLoader.hasTriggers(TriggerType.POST_GUI_RENDER)) return@register DrawContextHolder.withContext(stack) { - Renderer.withMatrix(UMatrixStack(stack.pose()).toMC(), partialTicks) { + Render2D.withMatrix(UMatrixStack(stack.pose()).toMC(), partialTicks) { TriggerType.POST_GUI_RENDER.triggerAll(mouseX, mouseY, screen, partialTicks) } } @@ -144,7 +144,7 @@ object ClientListener : Initializer { CTEvents.RENDER_OVERLAY.register { ctx, stack, partialTicks -> if (!JSLoader.hasTriggers(TriggerType.RENDER_OVERLAY)) return@register DrawContextHolder.withContext(ctx) { - Renderer.withMatrix(stack, partialTicks) { + Render2D.withMatrix(stack, partialTicks) { TriggerType.RENDER_OVERLAY.triggerAll(ctx) } } @@ -152,14 +152,14 @@ object ClientListener : Initializer { CTEvents.RENDER_ENTITY.register { stack, entity, partialTicks, ci -> if (!JSLoader.hasTriggers(TriggerType.RENDER_ENTITY)) return@register - Renderer.withMatrix(stack, partialTicks) { + Render2D.withMatrix(stack, partialTicks) { TriggerType.RENDER_ENTITY.triggerAll(Entity.fromMC(entity), partialTicks, ci) } } CTEvents.RENDER_BLOCK_ENTITY.register { stack, blockEntity, partialTicks, ci -> if (!JSLoader.hasTriggers(TriggerType.RENDER_BLOCK_ENTITY)) return@register - Renderer.withMatrix(stack, partialTicks) { + Render2D.withMatrix(stack, partialTicks) { TriggerType.RENDER_BLOCK_ENTITY.triggerAll(BlockEntity(blockEntity), partialTicks, ci) } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/listeners/WorldListener.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/listeners/WorldListener.kt index 215d6ebb..32b5e56a 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/listeners/WorldListener.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/listeners/WorldListener.kt @@ -1,7 +1,7 @@ package com.chattriggers.ctjs.internal.listeners import com.chattriggers.ctjs.MCBlockPos -import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.internal.engine.CTEvents import com.chattriggers.ctjs.api.triggers.CancellableEvent import com.chattriggers.ctjs.api.triggers.TriggerType @@ -24,14 +24,14 @@ object WorldListener { fun triggerRenderStart(ticks: Float) { deltaTicks = ticks if (matrixStack == null || !JSLoader.hasTriggers(TriggerType.PRE_RENDER_WORLD)) return - Renderer.withMatrix(matrixStack, ticks) { + Render2D.withMatrix(matrixStack, ticks) { TriggerType.PRE_RENDER_WORLD.triggerAll(ticks) } } fun triggerRenderLast() { val stack = matrixStack ?: return - if (JSLoader.hasTriggers(TriggerType.POST_RENDER_WORLD)) Renderer.withMatrix(stack, deltaTicks) { + if (JSLoader.hasTriggers(TriggerType.POST_RENDER_WORLD)) Render2D.withMatrix(stack, deltaTicks) { TriggerType.POST_RENDER_WORLD.triggerAll(deltaTicks) } CTEvents.POST_RENDER_WORLD.invoker().render(stack, deltaTicks) diff --git a/src/main/resources/assets/ctjs/js/moduleProvidedLibs.js b/src/main/resources/assets/ctjs/js/moduleProvidedLibs.js index c9405de9..09c95223 100644 --- a/src/main/resources/assets/ctjs/js/moduleProvidedLibs.js +++ b/src/main/resources/assets/ctjs/js/moduleProvidedLibs.js @@ -38,7 +38,7 @@ global.Priority = Java.class("com.chattriggers.ctjs.api.triggers.Trigger").Priority; global.Console = Java.type("com.chattriggers.ctjs.engine.Console").INSTANCE; - global.Renderer = Java.class("com.chattriggers.ctjs.api.render.Renderer").INSTANCE; + global.Render2D = Java.class("com.chattriggers.ctjs.api.render.Render2D").INSTANCE; const JSErrorReporter = Java.type("com.chattriggers.ctjs.internal.engine.JSErrorReporter").INSTANCE; global.cancel = event => { if (event instanceof CancellableEvent) { @@ -79,7 +79,7 @@ return easeOut(this, to, speed, jump); }; - global.easeColor = (start, finish, speed, jump) => Renderer.getColor( + global.easeColor = (start, finish, speed, jump) => Render2D.getColor( easeOut((start >> 16) & 0xFF, (finish >> 16) & 0xFF, speed, jump), easeOut((start >> 8) & 0xFF, (finish >> 8) & 0xFF, speed, jump), easeOut(start & 0xFF, finish & 0xFF, speed, jump), diff --git a/typing-generator/src/main/resources/provided-types.properties b/typing-generator/src/main/resources/provided-types.properties index 60be1fcb..a044612e 100644 --- a/typing-generator/src/main/resources/provided-types.properties +++ b/typing-generator/src/main/resources/provided-types.properties @@ -36,11 +36,11 @@ Display=com.chattriggers.ctjs.api.render.Display Gui=com.chattriggers.ctjs.api.render.Gui Image=com.chattriggers.ctjs.api.render.Image Rectangle=com.chattriggers.ctjs.api.render.Rectangle -Renderer=com.chattriggers.ctjs.api.render.Renderer +Render2D=com.chattriggers.ctjs.api.render.Render2D Text=com.chattriggers.ctjs.api.render.Text Toast=com.chattriggers.ctjs.api.render.Toast -RenderUtils=com.chattriggers.ctjs.api.render.RenderUtils -RenderColor=com.chattriggers.ctjs.api.render.RenderUtils$Color +Render3D=com.chattriggers.ctjs.api.render.Render3D +RenderColor=com.chattriggers.ctjs.api.render.Render3D$Color CancellableEvent=com.chattriggers.ctjs.api.triggers.CancellableEvent Vec2f=com.chattriggers.ctjs.api.vec.Vec2f Vec3f=com.chattriggers.ctjs.api.vec.Vec3f diff --git a/typing-generator/src/main/resources/typings.d.ts b/typing-generator/src/main/resources/typings.d.ts index 3a37c67e..32233362 100644 --- a/typing-generator/src/main/resources/typings.d.ts +++ b/typing-generator/src/main/resources/typings.d.ts @@ -160,16 +160,16 @@ declare global { interface Image extends com.chattriggers.ctjs.api.render.Image {} const Rectangle: typeof com.chattriggers.ctjs.api.render.Rectangle; interface Rectangle extends com.chattriggers.ctjs.api.render.Rectangle {} - const Renderer: typeof com.chattriggers.ctjs.api.render.Renderer; - interface Renderer extends com.chattriggers.ctjs.api.render.Renderer {} + const Render2D: typeof com.chattriggers.ctjs.api.render.Render2D; + interface Render2D extends com.chattriggers.ctjs.api.render.Render2D {} const Text: typeof com.chattriggers.ctjs.api.render.Text; interface Text extends com.chattriggers.ctjs.api.render.Text {} const Toast: typeof com.chattriggers.ctjs.api.render.Toast; interface Toast extends com.chattriggers.ctjs.api.render.Toast {} - const RenderUtils: typeof com.chattriggers.ctjs.api.render.RenderUtils; - interface RenderUtils extends com.chattriggers.ctjs.api.render.RenderUtils {} - const RenderColor: typeof com.chattriggers.ctjs.api.render.RenderUtils.Color; - interface RenderColor extends com.chattriggers.ctjs.api.render.RenderUtils.Color {} + const Render3D: typeof com.chattriggers.ctjs.api.render.Render3D; + interface Render3D extends com.chattriggers.ctjs.api.render.Render3D {} + const RenderColor: typeof com.chattriggers.ctjs.api.render.Render3D.Color; + interface RenderColor extends com.chattriggers.ctjs.api.render.Render3D.Color {} const CancellableEvent: typeof com.chattriggers.ctjs.api.triggers.CancellableEvent; interface CancellableEvent extends com.chattriggers.ctjs.api.triggers.CancellableEvent {} const Vec2f: typeof com.chattriggers.ctjs.api.vec.Vec2f; @@ -48352,10 +48352,10 @@ declare global { */ setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; /** - * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] + * Draws the player in the GUI. Takes the same parameters as [Render2D.drawPlayer] * minus `player`. * - * @see Renderer.drawPlayer + * @see Render2D.drawPlayer */ draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.entity.PlayerMP; } @@ -50490,10 +50490,10 @@ declare global { */ getContainer(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; /** - * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] + * Draws the player in the GUI. Takes the same parameters as [Render2D.drawPlayer] * minus `player`. * - * @see Renderer.drawPlayer + * @see Render2D.drawPlayer */ draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Player; new(): com.chattriggers.ctjs.api.client.Player; @@ -50668,10 +50668,10 @@ declare global { */ getContainer(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; /** - * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] + * Draws the player in the GUI. Takes the same parameters as [Render2D.drawPlayer] * minus `player`. * - * @see Renderer.drawPlayer + * @see Render2D.drawPlayer */ draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Player; new(): com.chattriggers.ctjs.api.client.Player; @@ -51070,9 +51070,9 @@ declare global { setThickness(thickness: number): com.chattriggers.ctjs.api.render.Rectangle; draw(): com.chattriggers.ctjs.api.render.Rectangle; } - const Renderer: { - ScreenWrapper: typeof com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; - screen: com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; + const Render2D: { + ScreenWrapper: typeof com.chattriggers.ctjs.api.render.Render2D$ScreenWrapper; + screen: com.chattriggers.ctjs.api.render.Render2D$ScreenWrapper; getPartialTicks(): number; BLACK: number; DARK_BLUE: number; @@ -51100,20 +51100,20 @@ declare global { getRainbow(step: number, speed: number): number; getRainbowColors(step: number): Array; getRainbowColors(step: number, speed: number): Array; - deleteTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Renderer; - pushMatrix(): com.chattriggers.ctjs.api.render.Renderer; - pushMatrix(stack: gg.essential.universal.UMatrixStack): com.chattriggers.ctjs.api.render.Renderer; - popMatrix(): com.chattriggers.ctjs.api.render.Renderer; - translate(x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - translate(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number, scaleY: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number, scaleY: number, scaleZ: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - multiply(quaternion: org.joml.Quaternionf): com.chattriggers.ctjs.api.render.Renderer; + deleteTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Render2D; + pushMatrix(): com.chattriggers.ctjs.api.render.Render2D; + pushMatrix(stack: gg.essential.universal.UMatrixStack): com.chattriggers.ctjs.api.render.Render2D; + popMatrix(): com.chattriggers.ctjs.api.render.Render2D; + translate(x: number, y: number): com.chattriggers.ctjs.api.render.Render2D; + translate(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Render2D; + scale(scaleX: number): com.chattriggers.ctjs.api.render.Render2D; + scale(scaleX: number, scaleY: number): com.chattriggers.ctjs.api.render.Render2D; + scale(scaleX: number, scaleY: number, scaleZ: number): com.chattriggers.ctjs.api.render.Render2D; + rotate(angle: number): com.chattriggers.ctjs.api.render.Render2D; + rotate(angle: number, x: number): com.chattriggers.ctjs.api.render.Render2D; + rotate(angle: number, x: number, y: number): com.chattriggers.ctjs.api.render.Render2D; + rotate(angle: number, x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Render2D; + multiply(quaternion: org.joml.Quaternionf): com.chattriggers.ctjs.api.render.Render2D; fixAlpha(color: number): number; /** * Gets a fixed render position from x, y, and z inputs adjusted with partial ticks @@ -51153,10 +51153,10 @@ declare global { * @param obj An options bag */ drawPlayer(obj: org.mozilla.javascript.NativeObject): void; - new(): com.chattriggers.ctjs.api.render.Renderer; + new(): com.chattriggers.ctjs.api.render.Render2D; } - interface Renderer extends com.chattriggers.ctjs.api.render.GuiRendererBackend { - screen: com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; + interface Render2D extends com.chattriggers.ctjs.api.render.GuiRendererBackend { + screen: com.chattriggers.ctjs.api.render.Render2D$ScreenWrapper; getPartialTicks(): number; BLACK: number; DARK_BLUE: number; @@ -51184,20 +51184,20 @@ declare global { getRainbow(step: number, speed: number): number; getRainbowColors(step: number): Array; getRainbowColors(step: number, speed: number): Array; - deleteTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Renderer; - pushMatrix(): com.chattriggers.ctjs.api.render.Renderer; - pushMatrix(stack: gg.essential.universal.UMatrixStack): com.chattriggers.ctjs.api.render.Renderer; - popMatrix(): com.chattriggers.ctjs.api.render.Renderer; - translate(x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - translate(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number, scaleY: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number, scaleY: number, scaleZ: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - multiply(quaternion: org.joml.Quaternionf): com.chattriggers.ctjs.api.render.Renderer; + deleteTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Render2D; + pushMatrix(): com.chattriggers.ctjs.api.render.Render2D; + pushMatrix(stack: gg.essential.universal.UMatrixStack): com.chattriggers.ctjs.api.render.Render2D; + popMatrix(): com.chattriggers.ctjs.api.render.Render2D; + translate(x: number, y: number): com.chattriggers.ctjs.api.render.Render2D; + translate(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Render2D; + scale(scaleX: number): com.chattriggers.ctjs.api.render.Render2D; + scale(scaleX: number, scaleY: number): com.chattriggers.ctjs.api.render.Render2D; + scale(scaleX: number, scaleY: number, scaleZ: number): com.chattriggers.ctjs.api.render.Render2D; + rotate(angle: number): com.chattriggers.ctjs.api.render.Render2D; + rotate(angle: number, x: number): com.chattriggers.ctjs.api.render.Render2D; + rotate(angle: number, x: number, y: number): com.chattriggers.ctjs.api.render.Render2D; + rotate(angle: number, x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Render2D; + multiply(quaternion: org.joml.Quaternionf): com.chattriggers.ctjs.api.render.Render2D; fixAlpha(color: number): number; /** * Gets a fixed render position from x, y, and z inputs adjusted with partial ticks @@ -51237,7 +51237,7 @@ declare global { * @param obj An options bag */ drawPlayer(obj: org.mozilla.javascript.NativeObject): void; - new(): com.chattriggers.ctjs.api.render.Renderer; + new(): com.chattriggers.ctjs.api.render.Render2D; } const GuiRendererBackend: { GifData: typeof com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData; @@ -51245,7 +51245,7 @@ declare global { ALIGN_CENTER: number; ALIGN_MIDDLE: number; /** - * Minecraft GUI extraction and GPU resource implementation for [Renderer]. + * Minecraft GUI extraction and GPU resource implementation for [Render2D]. */ new(): com.chattriggers.ctjs.api.render.GuiRendererBackend; } @@ -51317,10 +51317,10 @@ declare global { component4(): Array; copy(width: number, height: number, frameCount: number, delays: Array): com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData; } - const Renderer$ScreenWrapper: { - new(): com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; + const Render2D$ScreenWrapper: { + new(): com.chattriggers.ctjs.api.render.Render2D$ScreenWrapper; } - interface Renderer$ScreenWrapper { + interface Render2D$ScreenWrapper { getWidth(): number; getHeight(): number; getScale(): number; @@ -51711,87 +51711,87 @@ declare global { setDisplayTime(value: number): void; show(): com.chattriggers.ctjs.api.render.Toast; } - const RenderUtils: { - Color: typeof com.chattriggers.ctjs.api.render.RenderUtils$Color; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number, depth: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number, depth: boolean): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + const Render3D: { + Color: typeof com.chattriggers.ctjs.api.render.Render3D$Color; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; - new(): com.chattriggers.ctjs.api.render.RenderUtils; - } - interface RenderUtils { - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number, depth: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number, depth: boolean): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + new(): com.chattriggers.ctjs.api.render.Render3D; + } + interface Render3D { + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; - new(): com.chattriggers.ctjs.api.render.RenderUtils; + new(): com.chattriggers.ctjs.api.render.Render3D; } - const RenderUtils$Color: { - new(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.RenderUtils$Color; + const Render3D$Color: { + new(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Render3D$Color; } - interface RenderUtils$Color { + interface Render3D$Color { getR(): number; getG(): number; getB(): number; @@ -51805,7 +51805,7 @@ declare global { component2(): number; component3(): number; component4(): number; - copy(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.RenderUtils$Color; + copy(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Render3D$Color; } } const Config$ConsoleSettings: { From 296c6ad52a9f63d6a2cd48fbe758ce43a7861049 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Sun, 16 Aug 2026 15:16:51 +0000 Subject: [PATCH 16/61] Merge new renderer into 5.2.0 [skip-native-auto] --- .../v5/natives/windows/x86_64/V5PathJNI.dll | Bin 188928 -> 188928 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/v5/natives/windows/x86_64/V5PathJNI.dll b/src/main/resources/assets/v5/natives/windows/x86_64/V5PathJNI.dll index dc10cc88dca00941256a92795945aa0a15bf08e6..e5497956c15bc941fe0b35dccb326e608948aae7 100644 GIT binary patch delta 36 qcmZoT!rgF$djkg}v+tG0W^TrIZbruK+>A^sqd)@Nw?{L1wgCX&0t_br delta 36 qcmZoT!rgF$djkg}bMx}jW^TrIZbruK+>A^sqd)@Nw?{L1wgCX&BMcz` From d626e3a91d9c64b42b9e32396efdba4c548e3019 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Sun, 16 Aug 2026 15:43:23 +0000 Subject: [PATCH 17/61] Merge remote-tracking branch 'origin/5.2.0' into 5.2.0 [skip-native-auto] --- .../v5/natives/linux/x86_64/V5PathJNI.so | Bin 232288 -> 219904 bytes .../v5/natives/macos/arm64/V5PathJNI.dylib | Bin 191504 -> 191504 bytes .../v5/natives/macos/x86_64/V5PathJNI.dylib | Bin 182696 -> 182696 bytes .../v5/natives/windows/x86_64/V5PathJNI.dll | Bin 188928 -> 189440 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so b/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so index 9cc5c6d26d18d171f075fb53fdb80a532b0036b6..07238203dc8f9eb29e33127c38815a9ac5c009b4 100644 GIT binary patch delta 71055 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%0AAR zjz!o9++QJM{3`}ee?5SF-lQTpA<2m7uxs#a)$FMhXRMu{i{^8%GoPYO!HKEpO7UnX z)hq%PM`^hk9(EDVlWj4-Wv)~R_z~!Pvt{@+31Ve^x|gZDLAf)39TJVH1R$h*yL1WsRJG!|?`F9D|~VlgAI`{le6G2{*Pe&7k@ ziXG6OfJgpq%=BMKua}A)|6#$KgsBgK%K?JV58_{y-6b8oN53fW##h9`NtuY+06g+r z!N&vN4Lq?*fWO1>ap2xk@cYhj0xPysY1fdRe)M^yNFc;`fdCR z&qVx=&Tyljsk(6jr;Ei7(6-9-1W%l2~I~{GK#;mg>f%I@nRq5zcEL+9Hl^ zlDdtMyaWZX!22G4B0;C^B1ExqroFEiyVi39ZHak!JN10NC)nrne? z7$8_jz!)+RJu5w@4;H@Ph#jAPl)5=L3tJ(qS(p}fPFR|D&XH!GVRLJ~&W8-TE5Jd) zo@O=S?5=B`ti(p7Mjzok54B0$^Y=)Y=IL6p8eCB>;wYxc-vDAdsGnx1T}I0}E$p&k z1v&SKs}9@|Jt$q&8Q{svfkU`chtHF(hlRalSg`9}gr`iDe+MHyBAz~7TtVM7eyq7+)qYxa?ansNS zy@3>+KN`0DGt%NXbZiwVe;0_Uyh7&c-z#k!w{H^8`q3u@Z$S1OwfeX>{4us z6cklT&wNDu%VI!1NjOKfWvxWjrtxWA+DqfSEG$>IQY%=pSd^3Ix5|_nmm*dYM(q5| zu$)e4B|a6YU8rqUb}%2&Cw7`_9_VyVwcu^Pke+rhJ9NQC8qBW@3%)^GtrXg3lpMPn z*Fhf4c=Rm1iC zp>C!w9OB0H!NG35es{2&edyp2x8A3JlIBK66ilmISKqL#bk&M=4Yg~^Ynz(tAJon; zceH+dq?`GF#OH^(qYm|?x$jN$uYGh)Q%PC*+`DGhOrA7(QsJSlyWPASw=Hm!POm<- zz|9K`MJif;n+`7|c*+K|9RQ`2zH zZ>IJ;Rc^7%AF`|6;*q<3l8D_Q6CyR5*k!%4+PyV3kt?Dly0zLZ@?F@VPgJ|({tFNo Bx{d$< diff --git a/src/main/resources/assets/v5/natives/macos/arm64/V5PathJNI.dylib b/src/main/resources/assets/v5/natives/macos/arm64/V5PathJNI.dylib index 30c1568ad46ae387d8af0352996a447ecdd06e1b..e63f90b5b9a70d746181b7bf7988160f3371f3a8 100755 GIT binary patch delta 17449 zcmZ`=2V7Lg^WS}kcvKO%qu)`KsvtJN0tZ+TX(Dz!&?t&xZ&(g%>~gO9OkzP}6i%$C zVv7My(b$b8`il`XQKCtHb~zRK&)nOKCjVdd!`%;YT1oA{l*L_+oQyOvxv;C?BK|YwhRH=lR!Az;{Mjx>u z>SUXD;d+$t0||9|dYb*FjVhPPO?Z}*ZAlNkZ>``1hNKncda6%*pKt(P_hPv zPd7BUJ(Cf`LCDKM2J`#Pjkp-12eC!I;mRcdPeRp%@;3VF i0qAM|j*!R9_8>hC= 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 delta 21557 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 S@D#=s(^uD)Iu4?1vi=YM1|SCj diff --git a/src/main/resources/assets/v5/natives/windows/x86_64/V5PathJNI.dll b/src/main/resources/assets/v5/natives/windows/x86_64/V5PathJNI.dll index e5497956c15bc941fe0b35dccb326e608948aae7..dd17c6ffd931c70abfc0880600bffa201cf612d2 100644 GIT binary patch delta 25442 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 delta 25104 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 OS41|jdsp!LF8?1$cye+8 From ba0823f0786f507f4c7c947abb5ff7a154fa7b01 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Mon, 17 Aug 2026 16:07:21 +0100 Subject: [PATCH 18/61] Remove legacy mod loader support --- .../ctjs/internal/launch/CTJSPreLaunch.kt | 2 -- .../internal/launch/LegacyLoaderMigration.kt | 29 ------------------- .../kotlin/com/v5/loader/internal/V5Loader.kt | 18 +++--------- 3 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 src/main/kotlin/com/chattriggers/ctjs/internal/launch/LegacyLoaderMigration.kt diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/launch/CTJSPreLaunch.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/launch/CTJSPreLaunch.kt index fb50f422..27de03c3 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/launch/CTJSPreLaunch.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/launch/CTJSPreLaunch.kt @@ -7,8 +7,6 @@ import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint class CTJSPreLaunch : PreLaunchEntrypoint { override fun onPreLaunch() { - if (LegacyLoaderMigration.stageCachedLoaderIfNeeded()) return - val prevHandler = Thread.getDefaultUncaughtExceptionHandler() Thread.setDefaultUncaughtExceptionHandler { thread, exception -> "Uncaught exception in thread \"${thread.name}\"".printToConsole(LogType.ERROR) diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/launch/LegacyLoaderMigration.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/launch/LegacyLoaderMigration.kt deleted file mode 100644 index 70438acb..00000000 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/launch/LegacyLoaderMigration.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.chattriggers.ctjs.internal.launch - -import java.io.File - -internal object LegacyLoaderMigration { - private val legacyLoaderName = Regex("V5ModLoader.*\\.jar", RegexOption.IGNORE_CASE) - - fun stageCachedLoaderIfNeeded(): Boolean { - val gameDir = System.getProperty("v5.game_dir")?.takeIf(String::isNotBlank)?.let(::File) ?: return false - val legacyLoaders = File(gameDir, "mods").listFiles() - ?.filter { it.isFile && legacyLoaderName.matches(it.name) } - .orEmpty() - if (legacyLoaders.isEmpty()) return false - - val cachedLoader = runCatching { - File(CTJSPreLaunch::class.java.protectionDomain.codeSource.location.toURI()).canonicalFile - }.getOrNull()?.takeIf { it.isFile && it.parentFile?.name == "cache" } ?: return false - - val bytes = runCatching { cachedLoader.readBytes() }.getOrNull() ?: return false - try { - ModLoaderUpdater.stageUpdateAndRelaunch(gameDir, bytes, legacyLoaders + cachedLoader) - println("[V5] Migrating legacy V5ModLoader to V5-Loader. Closing Minecraft now.") - } finally { - bytes.fill(0) - } - Runtime.getRuntime().halt(0) - return true - } -} diff --git a/src/main/kotlin/com/v5/loader/internal/V5Loader.kt b/src/main/kotlin/com/v5/loader/internal/V5Loader.kt index 98aba0aa..e04f9a15 100644 --- a/src/main/kotlin/com/v5/loader/internal/V5Loader.kt +++ b/src/main/kotlin/com/v5/loader/internal/V5Loader.kt @@ -22,7 +22,6 @@ import kotlin.io.path.writeText internal object V5Loader { private const val MOD_ID = "ctjs" private const val DEVELOPER_JAR_NAME = "V5-Loader-DEV.jar" - private val legacyModLoaderName = Regex("V5ModLoader.*\\.jar", RegexOption.IGNORE_CASE) private val secretLock = Any() private var initialized = false private var sessionToken = "" @@ -34,7 +33,6 @@ internal object V5Loader { val fabricLoader = FabricLoader.getInstance() val gameDirPath = fabricLoader.gameDir.toAbsolutePath().toString() - System.setProperty("v5.game_dir", gameDirPath) System.setProperty("v5.minecraft_version", fabricLoader.rawGameVersion) val sessionFilePath = buildSessionFilePath(gameDirPath) val minecraftVersion = resolveMinecraftVersion() @@ -72,9 +70,6 @@ internal object V5Loader { println("[V5] Developer jar detected; skipping integrity check.") return } - val legacyModLoaders = File(gameDir, "mods").listFiles() - ?.filter { it.isFile && legacyModLoaderName.matches(it.name) } - .orEmpty() val hash = V5Crypto.calculateFileSha256(activeJar.absolutePath) if (hash.isEmpty()) throw IllegalStateException("[V5] Failed to hash active loader jar: ${activeJar.absolutePath}") @@ -83,12 +78,8 @@ internal object V5Loader { ?: throw IllegalStateException("[V5] Loader integrity check failed.") when (integrity) { - "valid" -> if (legacyModLoaders.isEmpty()) { - println("[V5] V5-Loader integrity verified.") - } else { - stageSelfUpdate(token, minecraftVersion, gameDir, activeJar, legacyModLoaders) - } - "outdated" -> stageSelfUpdate(token, minecraftVersion, gameDir, activeJar, legacyModLoaders) + "valid" -> println("[V5] V5-Loader integrity verified.") + "outdated" -> stageSelfUpdate(token, minecraftVersion, gameDir, activeJar) "invalid" -> throw IllegalStateException("[V5] V5-Loader integrity is invalid; refusing to run a modified jar.") else -> throw IllegalStateException("[V5] Unknown V5-Loader integrity state: $integrity") } @@ -98,8 +89,7 @@ internal object V5Loader { token: String, minecraftVersion: String, gameDir: File, - activeJar: File, - legacyModLoaders: List + activeJar: File ): Nothing { val bytes = V5Http.httpsGetBytes( V5Http.BACKEND_HOST, @@ -108,7 +98,7 @@ internal object V5Loader { ) ?: throw IllegalStateException("[V5] Failed to download updated V5-Loader.jar.") try { - ModLoaderUpdater.stageUpdateAndRelaunch(gameDir, bytes, listOf(activeJar) + legacyModLoaders) + ModLoaderUpdater.stageUpdateAndRelaunch(gameDir, bytes, listOf(activeJar)) println("[V5] V5-Loader update staged. Closing Minecraft now so the helper can swap jars.") } finally { bytes.fill(0) From 2a85254eeb87341f3b05752667e2ab7c25b38fbd Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Tue, 18 Aug 2026 17:18:16 +0100 Subject: [PATCH 19/61] codex: 26.2 support --- .github/workflows/build.yml | 29 +- .gitignore | 3 +- build.gradle.kts | 37 +- gradle/libs.versions.toml | 5 - settings.gradle.kts | 12 + .../mixins/GameRenderer262Accessor.java | 14 + .../ctjs/internal/mixins/GuiHudMixin.java | 46 ++ .../ctjs/internal/mixins/GuiMixin.java | 11 +- .../ctjs/internal/mixins/GuiScreenMixin.java | 31 + .../mixins/ItemInHandRendererMixin.java | 4 +- .../mixins/JoinMultiplayerScreenMixin.java | 3 +- .../internal/mixins/KeyboardHandlerMixin.java | 2 +- .../mixins/LevelRenderer262Mixin.java | 75 +++ .../internal/mixins/LevelRendererMixin.java | 12 +- .../ctjs/internal/mixins/MinecraftMixin.java | 13 - .../internal/mixins/MinecraftScreenMixin.java | 30 + .../internal/mixins/MouseHandlerMixin.java | 20 +- .../internal/mixins/SystemReportMixin.java | 21 +- .../commands/EntitySelectorAccessor.java | 52 -- src/main/kotlin/com/chattriggers/ctjs/CTJS.kt | 10 +- .../chattriggers/ctjs/api/client/Client.kt | 61 +- .../ctjs/api/client/MinecraftCompat.kt | 66 +++ .../chattriggers/ctjs/api/client/Player.kt | 2 +- .../ctjs/api/client/ProxyScreens.kt | 14 +- .../ctjs/api/client/WelcomeScreen.kt | 6 +- .../ctjs/api/commands/ColorArgumentCompat.kt | 34 ++ .../ctjs/api/commands/DynamicCommands.kt | 33 +- .../com/chattriggers/ctjs/api/entity/Team.kt | 13 +- .../com/chattriggers/ctjs/api/message/Chat.kt | 3 +- .../chattriggers/ctjs/api/message/ChatLib.kt | 15 +- .../com/chattriggers/ctjs/api/render/Book.kt | 3 +- .../com/chattriggers/ctjs/api/render/Gui.kt | 3 +- .../ctjs/api/render/GuiRendererBackend.kt | 3 +- .../chattriggers/ctjs/api/render/Render2D.kt | 27 +- .../chattriggers/ctjs/api/render/Render3D.kt | 8 +- .../com/chattriggers/ctjs/api/render/Toast.kt | 4 +- .../ctjs/api/render/skia/SkijaPIP.kt | 55 +- .../ctjs/api/render/skia/SkijaPIPFactory.kt | 59 ++ .../chattriggers/ctjs/api/world/BossBars.kt | 556 +++++++++--------- .../ctjs/api/world/PotionEffectType.kt | 2 +- .../ctjs/internal/launch/CTMixinPlugin.kt | 2 +- src/main/resources/ctjs.mixins.json | 4 +- stonecutter.gradle.kts | 6 + stonecutter.properties.toml | 5 + 44 files changed, 868 insertions(+), 546 deletions(-) create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/GameRenderer262Accessor.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/GuiHudMixin.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/GuiScreenMixin.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRenderer262Mixin.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftScreenMixin.java delete mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/commands/EntitySelectorAccessor.java create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/client/MinecraftCompat.kt create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/commands/ColorArgumentCompat.kt create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIPFactory.kt create mode 100644 stonecutter.gradle.kts create mode 100644 stonecutter.properties.toml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d6a3972d..ca092958 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,8 +18,11 @@ permissions: jobs: build: - name: Build + name: Build Minecraft ${{ matrix.minecraft }} runs-on: blacksmith-4vcpu-ubuntu-2404 + strategy: + matrix: + minecraft: [26.1.2, 26.2] steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -29,7 +32,7 @@ jobs: - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: temurin - java-version: 21 + java-version: 25 - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: @@ -41,18 +44,18 @@ jobs: ${{ runner.os }}-gradle- - name: Build - run: ./gradlew --no-daemon build -PreleaseBuild + run: ./gradlew --no-daemon :${{ matrix.minecraft }}:build -PreleaseBuild - name: Upload Loader uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: - name: V5-Loader-26.1.2 - path: build/libs/V5-Loader-26.1.2.jar + name: V5-Loader-${{ matrix.minecraft }} + path: versions/${{ matrix.minecraft }}/build/libs/V5-Loader-${{ matrix.minecraft }}.jar if-no-files-found: error publish: needs: build - if: ${{ github.ref == 'refs/heads/26.1.2' }} + if: ${{ github.ref == 'refs/heads/26.1.2' || github.ref == 'refs/heads/26.2' }} runs-on: blacksmith-4vcpu-ubuntu-2404 permissions: contents: write @@ -65,8 +68,9 @@ jobs: - name: Download Loader uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: - name: V5-Loader-26.1.2 + pattern: V5-Loader-* path: build/libs + merge-multiple: true - name: Publish GitHub release env: @@ -82,7 +86,7 @@ jobs: tag="${version}-r$(( ${revision:-0} + 1 ))" gh release create "$tag" --target "$SHA" --title "$tag" --generate-notes fi - gh release upload "$tag" build/libs/V5-Loader-26.1.2.jar --clobber + gh release upload "$tag" build/libs/V5-Loader-*.jar --clobber - name: Setup Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -97,6 +101,9 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} run: | - sha256sum build/libs/V5-Loader-26.1.2.jar | awk '{print $1}' > V5-Loader-26.1.2.jar.sha256 - wrangler r2 object put v5-builds/V5-Loader-26.1.2.jar.sha256 --file V5-Loader-26.1.2.jar.sha256 --remote - wrangler r2 object put v5-builds/V5-Loader-26.1.2.jar --file build/libs/V5-Loader-26.1.2.jar --remote + for jar in build/libs/V5-Loader-*.jar; do + name=$(basename "$jar") + sha256sum "$jar" | awk '{print $1}' > "$name.sha256" + wrangler r2 object put "v5-builds/$name.sha256" --file "$name.sha256" --remote + wrangler r2 object put "v5-builds/$name" --file "$jar" --remote + done diff --git a/.gitignore b/.gitignore index bb226010..8994e314 100644 --- a/.gitignore +++ b/.gitignore @@ -41,5 +41,6 @@ replay_*.log *.jfr versions/*/api/ +versions/*/logs/ -grunt-main.jar \ No newline at end of file +grunt-main.jar diff --git a/build.gradle.kts b/build.gradle.kts index 400f6553..2fb5e081 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.gradle.jvm.toolchain.JavaLanguageVersion +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.apache.tools.ant.filters.ReplaceTokens plugins { alias(libs.plugins.kotlin) @@ -25,16 +26,19 @@ repositories { maven("https://repo.hypixel.net/repository/Hypixel/") maven("https://api.modrinth.com/maven") } +val minecraftVersion = sc.current.version +val fabricApiVersion: String = sc.properties["deps.fabric_api"] +val universalcraftMinecraftVersion = if (minecraftVersion == "26.1.2") "26.1" else minecraftVersion dependencies { - // To change the versions see the gradle/libs.versions.toml - minecraft(libs.minecraft) + // Minecraft-specific versions live in stonecutter.properties.toml. + minecraft("com.mojang:minecraft:$minecraftVersion") implementation(libs.fabric.loader) - implementation(libs.fabric.api) + implementation("net.fabricmc.fabric-api:fabric-api:$fabricApiVersion") implementation(libs.fabric.kotlin) implementation(libs.bundles.included) { include(this) } - implementation(libs.universalcraft) { + implementation("gg.essential:universalcraft-$universalcraftMinecraftVersion-fabric:${libs.versions.universalcraft.get()}") { include(this) exclude("gg.essential", "universalcraft-1.18.1-fabric") } @@ -67,7 +71,7 @@ dependencies { } loom { - accessWidenerPath.set(file("src/main/resources/ctjs.accesswidener")) + accessWidenerPath.set(rootProject.file("src/main/resources/ctjs.accesswidener")) } base { @@ -86,12 +90,12 @@ java { tasks { processResources { - val mcVersion = libs.versions.minecraft.get() + val mcVersion = minecraftVersion val flkVersion = libs.versions.fabric.kotlin.get() - val fapiVersion = libs.versions.fabric.api.get() + val fapiVersion = fabricApiVersion val loaderVersion = libs.versions.loader.get() - from("typing-generator/src/main/resources") { + from(rootProject.file("typing-generator/src/main/resources")) { include("provided-types.properties") } @@ -110,6 +114,17 @@ tasks { "loader_version" to loaderVersion ) } + + filesMatching("ctjs.mixins.json") { + val versionMixins = if (minecraftVersion == "26.1.2") { + listOf("GuiMixin", "MinecraftScreenMixin", "LevelRendererMixin") + } else { + listOf("GuiHudMixin", "GameRenderer262Accessor", "GuiScreenMixin", "LevelRenderer262Mixin") + } + filter("tokens" to mapOf( + "version_mixins" to versionMixins.joinToString("\",\n \"") + )) + } } withType().configureEach { @@ -125,7 +140,7 @@ tasks { } jar { - archiveFileName.set(if (providers.gradleProperty("releaseBuild").isPresent) "V5-Loader-26.1.2.jar" else "V5-Loader-DEV.jar") + archiveFileName.set(if (providers.gradleProperty("releaseBuild").isPresent) "V5-Loader-$minecraftVersion.jar" else "V5-Loader-DEV-$minecraftVersion.jar") exclude("typings.d.ts") } @@ -136,6 +151,6 @@ tasks { from(layout.buildDirectory.dir("generated/ksp/main/resources")) { include("typings.d.ts") } - into(layout.projectDirectory.dir("typing-generator/src/main/resources")) + into(rootProject.layout.projectDirectory.dir("typing-generator/src/main/resources")) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0b733d1e..aecb578c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,8 @@ [versions] # Library versions -minecraft = "26.1.2" skija = "0.143.11" loader = "0.19.3" -fabric-api = "0.153.0+26.1.2" fabric-kotlin = "1.13.9+kotlin.2.3.10" sponge-mixin = "0.17.3+mixin.0.8.7" mixinextras = "0.5.4" @@ -24,10 +22,7 @@ loom = "1.17-SNAPSHOT" ksp = "2.3.9" [libraries] -minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } - fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "loader" } -fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric-api" } fabric-kotlin = { module = "net.fabricmc:fabric-language-kotlin", version.ref = "fabric-kotlin" } sponge-mixin = { module = "net.fabricmc:sponge-mixin", version.ref = "sponge-mixin" } mixinextras = { module = "io.github.llamalad7:mixinextras-fabric", version.ref = "mixinextras" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 5b918876..659959f4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,18 @@ pluginManagement { gradlePluginPortal() mavenCentral() maven("https://maven.fabricmc.net") + maven("https://maven.kikugie.dev/releases") + } +} + +plugins { + id("dev.kikugie.stonecutter") version "0.9.7" +} + +stonecutter { + create(rootProject) { + versions("26.1.2", "26.2") + vcsVersion = "26.2" } } diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GameRenderer262Accessor.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GameRenderer262Accessor.java new file mode 100644 index 00000000..855434bc --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GameRenderer262Accessor.java @@ -0,0 +1,14 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.mixins; + +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.SubmitNodeStorage; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GameRenderer.class) +public interface GameRenderer262Accessor { + @Accessor + SubmitNodeStorage getHandAndScreenSubmitNodeStorage(); +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiHudMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiHudMixin.java new file mode 100644 index 00000000..a4c80854 --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiHudMixin.java @@ -0,0 +1,46 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.api.client.Client; +import com.chattriggers.ctjs.api.render.DrawContextHolder; +import com.chattriggers.ctjs.api.render.Render2D; +import com.chattriggers.ctjs.api.world.Scoreboard; +import com.chattriggers.ctjs.internal.engine.CTEvents; +import gg.essential.universal.UMatrixStack; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(targets = "net.minecraft.client.gui.Hud") +public class GuiHudMixin { + @Inject(method = "extractRenderState", at = @At("HEAD")) + private void captureContext(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { + DrawContextHolder.currentContext = context; + if (Client.getCurrentScreen() == null) { + Render2D.INSTANCE.runPreDrawables(context); + } + } + + @Inject(method = "extractScoreboardSidebar", at = @At("HEAD"), cancellable = true) + private void injectRenderScoreboard(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { + if (!Scoreboard.getShouldRender()) { + ci.cancel(); + } + } + + @Inject(method = "extractRenderState", at = @At("TAIL")) + private void injectRenderOverlay(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { + CTEvents.RENDER_OVERLAY.invoker().render( + context, + new UMatrixStack(context.pose()).toMC(), + tickCounter.getGameTimeDeltaTicks() + ); + if (Client.getCurrentScreen() == null) { + Render2D.INSTANCE.runDrawables(context); + } + } +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java index 0eee2c21..b8b1d4c4 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiMixin.java @@ -1,4 +1,7 @@ -package com.chattriggers.ctjs.internal.mixins; +//? if <26.2 { +/*package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.api.client.Client; import com.chattriggers.ctjs.api.render.DrawContextHolder; import com.chattriggers.ctjs.api.render.Render2D; @@ -7,7 +10,6 @@ import gg.essential.universal.UMatrixStack; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.Gui; -import net.minecraft.client.Minecraft; import net.minecraft.client.DeltaTracker; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -20,7 +22,7 @@ public class GuiMixin { @Inject(method = "extractRenderState", at = @At("HEAD")) private void captureContext(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { DrawContextHolder.currentContext = context; - if (Minecraft.getInstance().screen == null) + if (Client.getCurrentScreen() == null) Render2D.INSTANCE.runPreDrawables(context); } @@ -36,7 +38,8 @@ private void injectRenderScoreboard(GuiGraphicsExtractor matrices, DeltaTracker ) private void injectRenderOverlay(GuiGraphicsExtractor context, DeltaTracker tickCounter, CallbackInfo ci) { CTEvents.RENDER_OVERLAY.invoker().render(context, new UMatrixStack(context.pose()).toMC(), tickCounter.getGameTimeDeltaTicks()); - if (Minecraft.getInstance().screen == null) + if (Client.getCurrentScreen() == null) Render2D.INSTANCE.runDrawables(context); } } +*///?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiScreenMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiScreenMixin.java new file mode 100644 index 00000000..16ce93b0 --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiScreenMixin.java @@ -0,0 +1,31 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.api.client.Client; +import com.chattriggers.ctjs.api.triggers.TriggerType; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.screens.Overlay; +import net.minecraft.client.gui.screens.Screen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Gui.class) +public class GuiScreenMixin { + @Inject(method = "setScreen", at = @At("HEAD")) + private void injectScreenOpened(Screen screen, CallbackInfo ci) { + if (screen != null) { + Client.automatedAttackHeld = false; + TriggerType.GUI_OPENED.triggerAll(screen, ci); + } + } + + @Inject(method = "setOverlay", at = @At("HEAD")) + private void injectOverlayOpened(Overlay overlay, CallbackInfo ci) { + if (overlay != null) { + Client.unpressKeys(); + } + } +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/ItemInHandRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/ItemInHandRendererMixin.java index 504c5675..d64860e1 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/ItemInHandRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/ItemInHandRendererMixin.java @@ -33,7 +33,7 @@ public class ItemInHandRendererMixin { } @Redirect( - method = "renderHandsWithItems", + method = {"renderHandsWithItems", "submitHandsWithItems"}, at = @At( value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;getAttackAnim(F)F")) @@ -43,7 +43,7 @@ public class ItemInHandRendererMixin { } @Redirect( - method = "renderHandsWithItems", + method = {"renderHandsWithItems", "submitHandsWithItems"}, at = @At( value = "FIELD", target = "Lnet/minecraft/client/player/LocalPlayer;swingingArm:Lnet/minecraft/world/InteractionHand;")) diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/JoinMultiplayerScreenMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/JoinMultiplayerScreenMixin.java index d1f8a2f2..4b7ba7ce 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/JoinMultiplayerScreenMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/JoinMultiplayerScreenMixin.java @@ -1,6 +1,7 @@ package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.ProxyManagerScreen; +import com.chattriggers.ctjs.api.client.Client; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; @@ -26,7 +27,7 @@ protected JoinMultiplayerScreenMixin(Component text) { private void init(CallbackInfo ci) { this.v5_proxyButton = Button.builder(Component.literal("V5 Proxies"), b -> { if (this.minecraft != null) { - this.minecraft.setScreen(new ProxyManagerScreen(this)); + Client.setCurrentScreen(new ProxyManagerScreen(this)); } }) .bounds(0, 5, 80, 20) diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/KeyboardHandlerMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/KeyboardHandlerMixin.java index 87069459..4574564b 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/KeyboardHandlerMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/KeyboardHandlerMixin.java @@ -21,7 +21,7 @@ public class KeyboardHandlerMixin { } Minecraft client = Minecraft.getInstance(); - if (!Client.isFreecam() || client.screen != null) { + if (!Client.isFreecam() || Client.getCurrentScreen() != null) { return; } diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRenderer262Mixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRenderer262Mixin.java new file mode 100644 index 00000000..65cea586 --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRenderer262Mixin.java @@ -0,0 +1,75 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.api.client.Client; +import com.chattriggers.ctjs.internal.listeners.WorldListener; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.state.level.BlockOutlineRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import org.joml.Matrix4fc; +import org.joml.Vector4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LevelRenderer.class) +public abstract class LevelRenderer262Mixin { + private float ctjs$tickDelta = 1.0F; + + @Inject(method = "addMainPass", at = @At("HEAD"), cancellable = true) + private void v5$renderMain(CallbackInfo ci) { + if (Client.isMacroEnabled() && Client.getRenderLimiter() == Client.RenderLimiter.NO_RENDER) { + ci.cancel(); + } + } + + @Inject(method = "submitHitOutline", at = @At("HEAD"), cancellable = true) + private void onDrawBlockOutline( + PoseStack matrices, + SubmitNodeCollector collector, + RenderType renderType, + BlockOutlineRenderState outline, + int color, + float lineWidth, + boolean translucent, + CallbackInfo ci + ) { + if (WorldListener.INSTANCE.triggerBlockOutline(outline.pos())) { + ci.cancel(); + } + } + + @Inject(method = "render", at = @At("HEAD")) + private void beforeRender( + GraphicsResourceAllocator allocator, + DeltaTracker tickCounter, + boolean renderBlockOutline, + CameraRenderState camera, + Matrix4fc positionMatrix, + GpuBufferSlice fogBuffer, + Vector4f fogColor, + boolean renderSky, + CallbackInfo ci + ) { + ctjs$tickDelta = tickCounter.getGameTimeDeltaTicks(); + } + + @Inject(method = "submitEntities", at = @At("HEAD")) + private void beforeEntities(PoseStack matrices, net.minecraft.client.renderer.state.level.LevelRenderState state, SubmitNodeCollector collector, CallbackInfo ci) { + WorldListener.INSTANCE.setMatrixStack(matrices); + WorldListener.INSTANCE.triggerRenderStart(ctjs$tickDelta); + } + + @Inject(method = "lambda$addMainPass$0", at = @At("RETURN")) + private void afterMainPass(CallbackInfo ci) { + WorldListener.INSTANCE.triggerRenderLast(); + } +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java index a058b9e7..9724381b 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java @@ -1,7 +1,9 @@ -package com.chattriggers.ctjs.internal.mixins; +//? if <26.2 { +/*package com.chattriggers.ctjs.internal.mixins; import com.chattriggers.ctjs.api.client.Client; import com.chattriggers.ctjs.internal.listeners.WorldListener; +import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.framegraph.FrameGraphBuilder; @@ -10,7 +12,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.state.level.BlockOutlineRenderState; @@ -24,7 +25,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(LevelRenderer.class) public abstract class LevelRendererMixin { @@ -48,10 +48,9 @@ public abstract class LevelRendererMixin { value = "FIELD", target = "Lnet/minecraft/client/renderer/state/level/CameraRenderState;pos:Lnet/minecraft/world/phys/Vec3;" ), - cancellable = true, - locals = LocalCapture.CAPTURE_FAILSOFT + cancellable = true ) - private void onDrawBlockOutline(MultiBufferSource.BufferSource immediate, PoseStack matrices, boolean renderBlockOutline, LevelRenderState renderStates, CallbackInfo ci, BlockOutlineRenderState outlineRenderState) { + private void onDrawBlockOutline(CallbackInfo ci, @Local BlockOutlineRenderState outlineRenderState) { if (WorldListener.INSTANCE.triggerBlockOutline(outlineRenderState.pos())) ci.cancel(); } @@ -79,3 +78,4 @@ private void beforeGizmos(GpuBufferSlice gpuBufferSlice, LevelRenderState worldR WorldListener.INSTANCE.triggerRenderLast(); } } +*///?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftMixin.java index c0dc424f..1a3af1a0 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftMixin.java @@ -173,19 +173,6 @@ private void injectDisconnect(Screen disconnectionScreen, boolean transferring, } } - @Inject(method = "setScreen", at = @At("HEAD")) - private void injectScreenOpened(Screen screen, CallbackInfo ci) { - if (screen != null) { - Client.automatedAttackHeld = false; - TriggerType.GUI_OPENED.triggerAll(screen, ci); - } - } - - @Inject(method = "setOverlay", at = @At("HEAD")) - private void injectOverlayOpened(Overlay overlay, CallbackInfo ci) { - if (overlay != null) - Client.unpressKeys(); - } @Inject(method = "run", at = @At("HEAD")) private void injectRun(CallbackInfo ci) { diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftScreenMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftScreenMixin.java new file mode 100644 index 00000000..dd581a06 --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/MinecraftScreenMixin.java @@ -0,0 +1,30 @@ +//? if <26.2 { +/*package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.api.client.Client; +import com.chattriggers.ctjs.api.triggers.TriggerType; +import net.minecraft.client.gui.screens.Overlay; +import net.minecraft.client.gui.screens.Screen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(targets = "net.minecraft.client.Minecraft") +public class MinecraftScreenMixin { + @Inject(method = "setScreen", at = @At("HEAD")) + private void injectScreenOpened(Screen screen, CallbackInfo ci) { + if (screen != null) { + Client.automatedAttackHeld = false; + TriggerType.GUI_OPENED.triggerAll(screen, ci); + } + } + + @Inject(method = "setOverlay", at = @At("HEAD")) + private void injectOverlayOpened(Overlay overlay, CallbackInfo ci) { + if (overlay != null) { + Client.unpressKeys(); + } + } +} +*///?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/MouseHandlerMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/MouseHandlerMixin.java index 8d14b4a3..7cb5de43 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/MouseHandlerMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/MouseHandlerMixin.java @@ -34,7 +34,8 @@ public class MouseHandlerMixin { @Inject(method = "onButton", at = @At("HEAD"), cancellable = true) private void v5$cancelFreecamClick(long window, MouseButtonInfo button, int action, CallbackInfo ci) { Minecraft client = Minecraft.getInstance(); - if (action == GLFW.GLFW_PRESS && client.screen != null) { + MouseListener.onRawMouseInput(button.button(), action); + if (action == GLFW.GLFW_PRESS && Client.getCurrentScreen() != null) { v5$guiMouseButton = button.button(); } else if (action == GLFW.GLFW_RELEASE) { if (button.button() == v5$guiMouseButton) { @@ -45,7 +46,7 @@ public class MouseHandlerMixin { } if (v5$cameraLookEnabled() - && client.screen == null + && Client.getCurrentScreen() == null && (button.button() == 0 || button.button() == 1)) { ci.cancel(); } @@ -95,7 +96,7 @@ public class MouseHandlerMixin { @Inject(method = "onScroll(JDD)V", at = @At("HEAD"), cancellable = true) private void v5$onMouseScroll(long window, double horizontalScroll, double verticalScroll, CallbackInfo ci) { Minecraft client = Minecraft.getInstance(); - if (Client.isFreelook() && client.screen == null) { + if (Client.isFreelook() && Client.getCurrentScreen() == null) { Client.setFreelookDistance(Client.getFreelookDistance() - verticalScroll); ci.cancel(); return; @@ -105,22 +106,11 @@ public class MouseHandlerMixin { return; } - if (client.screen == null) { + if (Client.getCurrentScreen() == null) { ci.cancel(); } } - @Inject( - method = "onButton", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/client/Minecraft;screen:Lnet/minecraft/client/gui/screens/Screen;", - opcode = Opcodes.GETFIELD - ) - ) - private void injectOnMouseButton(long window, MouseButtonInfo input, int action, CallbackInfo ci) { - MouseListener.onRawMouseInput(input.button(), action); - } @Inject( method = "onScroll", diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/SystemReportMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/SystemReportMixin.java index a4199fb1..1d368b7b 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/SystemReportMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/SystemReportMixin.java @@ -1,32 +1,29 @@ -package com.chattriggers.ctjs.internal.mixins; - +package com.chattriggers.ctjs.internal.mixins; + import com.chattriggers.ctjs.internal.engine.module.Module; import com.chattriggers.ctjs.internal.engine.module.ModuleManager; import net.minecraft.SystemReport; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Comparator; -import java.util.function.Supplier; import java.util.stream.Collectors; - -@Mixin(SystemReport.class) -public abstract class SystemReportMixin { - @Shadow - public abstract void setDetail(String string, Supplier supplier); - + +@Mixin(SystemReport.class) +public abstract class SystemReportMixin { + @Inject(method = "", at = @At("RETURN")) private void addModules(CallbackInfo ci) { - setDetail("ChatTriggers Modules", () -> ModuleManager.INSTANCE.getCachedModules().stream() + String modules = ModuleManager.INSTANCE.getCachedModules().stream() .sorted(Comparator.comparing(Module::getName)) .map(module -> { var version = module.getMetadata().getVersion(); return "\n\t\t" + module.getName() + ": " + (version == null ? "No module version specified" : "v" + version); }) - .collect(Collectors.joining())); + .collect(Collectors.joining()); + ((SystemReport) (Object) this).setDetail("ChatTriggers Modules", modules); } } diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/commands/EntitySelectorAccessor.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/commands/EntitySelectorAccessor.java deleted file mode 100644 index 58f40667..00000000 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/commands/EntitySelectorAccessor.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.chattriggers.ctjs.internal.mixins.commands; - -import net.minecraft.commands.arguments.selector.EntitySelector; -import net.minecraft.world.entity.Entity; -import net.minecraft.advancements.criterion.MinMaxBounds; -import net.minecraft.world.level.entity.EntityTypeTest; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; -import java.util.UUID; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.Predicate; - -@Mixin(EntitySelector.class) -public interface EntitySelectorAccessor { - @Accessor - int getMaxResults(); - - @Accessor - boolean getIncludesEntities(); - - @Accessor - List> getContextFreePredicates(); - - @Accessor - MinMaxBounds.Doubles getRange(); - - @Accessor - Function getPosition(); - - @Accessor - AABB getAabb(); - - @Accessor - BiConsumer> getOrder(); - - @Accessor - boolean getCurrentEntity(); - - @Accessor - String getPlayerName(); - - @Accessor - UUID getEntityUUID(); - - @Accessor - EntityTypeTest getType(); -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt index 908aeb4b..c2b94e95 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt @@ -2,6 +2,7 @@ package com.chattriggers.ctjs import com.chattriggers.ctjs.api.Config import com.chattriggers.ctjs.api.client.Client +import com.chattriggers.ctjs.api.client.screenCompat import com.chattriggers.ctjs.api.client.KeyBind import com.chattriggers.ctjs.api.client.Sound import com.chattriggers.ctjs.api.client.WelcomeScreen @@ -9,8 +10,7 @@ import com.chattriggers.ctjs.api.commands.DynamicCommands import com.chattriggers.ctjs.api.message.ChatLib import com.chattriggers.ctjs.api.render.Image import com.chattriggers.ctjs.api.render.Render2D -import com.chattriggers.ctjs.api.render.skia.SkijaPIP -import com.chattriggers.ctjs.api.render.skia.SkijaPrePIP +import com.chattriggers.ctjs.api.render.skia.createSkijaPIP import com.chattriggers.ctjs.api.triggers.TriggerType import com.chattriggers.ctjs.api.world.Scoreboard import com.chattriggers.ctjs.api.world.World @@ -34,15 +34,15 @@ import kotlin.concurrent.thread class CTJS : ClientModInitializer { override fun onInitializeClient() { - PictureInPictureRendererRegistry.register { SkijaPIP(it.bufferSource()) } - PictureInPictureRendererRegistry.register { SkijaPrePIP(it.bufferSource()) } + PictureInPictureRendererRegistry.register { input -> createSkijaPIP(input, pre = false) } + PictureInPictureRendererRegistry.register { input -> createSkijaPIP(input, pre = true) } Client.referenceSystemTime = System.nanoTime() Initializer.initializers.forEach(Initializer::init) Config.loadData() var autoOpenTriggered = false ClientTickEvents.END_CLIENT_TICK.register { client -> - val currentScreen = client.screen ?: return@register + val currentScreen = client.screenCompat ?: return@register val isMenuScreen = currentScreen is TitleScreen if (autoOpenTriggered || Config.wasWelcomeShown() || !isMenuScreen) return@register diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt index e77d9ff2..968da003 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/Client.kt @@ -14,6 +14,7 @@ import com.chattriggers.ctjs.internal.mixins.KeyMappingAccessor import com.chattriggers.ctjs.internal.mixins.MinecraftAccessor import com.chattriggers.ctjs.internal.utils.asMixin import com.mojang.blaze3d.platform.InputConstants +import com.mojang.blaze3d.pipeline.RenderTarget import gg.essential.universal.UKeyboard import net.minecraft.client.Minecraft import net.minecraft.client.gui.components.ChatComponent @@ -150,13 +151,11 @@ object Client { scheduleTask { World.toMC()?.disconnect(Component.empty()) - getMinecraft().setScreen( - when { - getMinecraft().isLocalServer -> TitleScreen() - getMinecraft().currentServer?.isRealm == true -> RealmsMainScreen(TitleScreen()) - else -> JoinMultiplayerScreen(TitleScreen()) - } - ) + getMinecraft().setScreenCompat(when { + getMinecraft().isLocalServer -> TitleScreen() + getMinecraft().currentServer?.isRealm == true -> RealmsMainScreen(TitleScreen()) + else -> JoinMultiplayerScreen(TitleScreen()) + }) } } @@ -179,19 +178,31 @@ object Client { } } + @JvmStatic + fun getCurrentScreen(): Screen? = getMinecraft().screenCompat + + @JvmStatic + fun setCurrentScreen(screen: Screen?) = getMinecraft().setScreenCompat(screen) + + @JvmStatic + fun getMainRenderTarget(): RenderTarget = MinecraftCompat.mainRenderTarget(getMinecraft()) + + @JvmStatic + fun reloadWorldRenderer() = MinecraftCompat.reloadLevelRenderer(getMinecraft()) + /** * Gets the Minecraft ChatHud object for the chat gui * * @return The GuiNewChat object for the chat gui */ @JvmStatic - fun getChatGui(): ChatComponent? = getMinecraft().gui.chat + fun getChatGui(): ChatComponent? = getMinecraft().gui.chatCompat @JvmStatic - fun isInChat(): Boolean = getMinecraft().screen is ChatScreen + fun isInChat(): Boolean = getMinecraft().screenCompat is ChatScreen @JvmStatic - fun getTabGui(): PlayerTabOverlay? = getMinecraft().gui.tabList + fun getTabGui(): PlayerTabOverlay? = getMinecraft().gui.tabListCompat @JvmStatic fun isInTab(): Boolean = getMinecraft().options.keyPlayerList.isDown @@ -246,7 +257,7 @@ object Client { @JvmStatic fun getCurrentChatMessage(): String { return if (isInChat()) { - val chatGui = getMinecraft().screen as ChatScreen + val chatGui = getMinecraft().screenCompat as ChatScreen chatGui.asMixin().input.value } else "" } @@ -259,14 +270,14 @@ object Client { @JvmStatic fun setCurrentChatMessage(message: String) { if (isInChat()) { - val chatGui = getMinecraft().screen as ChatScreen + val chatGui = getMinecraft().screenCompat as ChatScreen chatGui.asMixin().input.value = message } else currentGui.set(ChatScreen(message, false)) } @JvmStatic fun setSignLine(line: Int, text: String) { - val messages = (getMinecraft().screen as? AbstractSignEditScreen) + val messages = (getMinecraft().screenCompat as? AbstractSignEditScreen) ?.asMixin() ?.messages ?: return if (line in messages.indices) messages[line] = text @@ -288,8 +299,8 @@ object Client { private fun canAutomateInput(minecraft: Minecraft) = minecraft.level != null && minecraft.player != null && - minecraft.screen == null && - minecraft.overlay == null + minecraft.screenCompat == null && + minecraft.overlayCompat == null private fun mutateInput(action: (Minecraft) -> Unit) = getMinecraft().let { it.execute { action(it) } } @@ -390,12 +401,10 @@ object Client { */ @JvmStatic fun showTitle(title: String?, subtitle: String?, fadeIn: Int, time: Int, fadeOut: Int) { - getMinecraft().gui.apply { - setTimes(fadeIn, time, fadeOut) - if (title != null) - setTitle(TextComponent(title)) - if (subtitle != null) - setSubtitle(TextComponent(subtitle)) + getMinecraft().gui.let { gui -> + MinecraftCompat.setTimes(gui, fadeIn, time, fadeOut) + if (title != null) MinecraftCompat.setTitle(gui, TextComponent(title)) + if (subtitle != null) MinecraftCompat.setSubtitle(gui, TextComponent(subtitle)) } } @@ -475,11 +484,11 @@ object Client { * * @return the Minecraft gui */ - fun get(): Screen? = getMinecraft().screen + fun get(): Screen? = getMinecraft().screenCompat fun set(screen: Screen?) { scheduleTask { - getMinecraft().setScreen(screen) + getMinecraft().setScreenCompat(screen) } } @@ -504,10 +513,10 @@ object Client { } class CameraWrapper { - fun getX(): Double = getMinecraft().gameRenderer.mainCamera.position().x + fun getX(): Double = MinecraftCompat.mainCamera(getMinecraft().gameRenderer).position().x - fun getY(): Double = getMinecraft().gameRenderer.mainCamera.position().y + fun getY(): Double = MinecraftCompat.mainCamera(getMinecraft().gameRenderer).position().y - fun getZ(): Double = getMinecraft().gameRenderer.mainCamera.position().z + fun getZ(): Double = MinecraftCompat.mainCamera(getMinecraft().gameRenderer).position().z } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/MinecraftCompat.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/MinecraftCompat.kt new file mode 100644 index 00000000..3734b00e --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/MinecraftCompat.kt @@ -0,0 +1,66 @@ +package com.chattriggers.ctjs.api.client + +//? if >=26.2 { +import com.chattriggers.ctjs.internal.mixins.GameRenderer262Accessor +import com.chattriggers.ctjs.internal.utils.asMixin +//?} +import com.mojang.blaze3d.pipeline.RenderTarget +import net.minecraft.client.Camera +import net.minecraft.client.Minecraft +import net.minecraft.client.gui.Gui +import net.minecraft.client.gui.components.BossHealthOverlay +import net.minecraft.client.gui.components.ChatComponent +import net.minecraft.client.gui.components.PlayerTabOverlay +import net.minecraft.client.gui.components.toasts.ToastManager +import net.minecraft.client.gui.screens.Overlay +import net.minecraft.client.gui.screens.Screen +import net.minecraft.client.renderer.GameRenderer +import net.minecraft.client.renderer.SubmitNodeStorage +import net.minecraft.client.renderer.state.GameRenderState +import net.minecraft.network.chat.Component + +//? if <26.2 { +/*internal object MinecraftCompat { + fun bossOverlay(gui: Gui): BossHealthOverlay = gui.bossOverlay + fun setTimes(gui: Gui, fadeIn: Int, stay: Int, fadeOut: Int) = gui.setTimes(fadeIn, stay, fadeOut) + fun setTitle(gui: Gui, title: Component) = gui.setTitle(title) + fun setSubtitle(gui: Gui, subtitle: Component) = gui.setSubtitle(subtitle) + fun toastManager(minecraft: Minecraft): ToastManager = minecraft.toastManager + fun mainCamera(renderer: GameRenderer): Camera = renderer.mainCamera + fun mainRenderTarget(minecraft: Minecraft): RenderTarget = minecraft.mainRenderTarget + fun reloadLevelRenderer(minecraft: Minecraft) = minecraft.levelRenderer.allChanged() + fun submitNodeStorage(renderer: GameRenderer): SubmitNodeStorage = renderer.submitNodeStorage + fun gameRenderState(renderer: GameRenderer): GameRenderState = renderer.gameRenderState + fun isSingleplayer(minecraft: Minecraft): Boolean = minecraft.isSingleplayer +} + +internal val Minecraft.screenCompat: Screen? get() = screen +internal val Minecraft.overlayCompat: Overlay? get() = overlay +internal fun Minecraft.setScreenCompat(screen: Screen?) = setScreen(screen) +internal val Gui.chatCompat: ChatComponent get() = chat +internal val Gui.tabListCompat: PlayerTabOverlay get() = tabList +*///?} else { +internal object MinecraftCompat { + fun bossOverlay(gui: Gui): BossHealthOverlay = gui.hud.bossOverlay + fun setTimes(gui: Gui, fadeIn: Int, stay: Int, fadeOut: Int) = gui.hud.setTimes(fadeIn, stay, fadeOut) + fun setTitle(gui: Gui, title: Component) = gui.hud.setTitle(title) + fun setSubtitle(gui: Gui, subtitle: Component) = gui.hud.setSubtitle(subtitle) + fun toastManager(minecraft: Minecraft): ToastManager = minecraft.gui.toastManager() + fun mainCamera(renderer: GameRenderer): Camera = renderer.mainCamera() + fun mainRenderTarget(minecraft: Minecraft): RenderTarget = minecraft.gameRenderer.mainRenderTarget() + fun reloadLevelRenderer(minecraft: Minecraft) { + val level = minecraft.level ?: return + minecraft.levelRenderer.invalidateCompiledGeometry(level, minecraft.options, mainCamera(minecraft.gameRenderer), minecraft.blockColors) + } + fun submitNodeStorage(renderer: GameRenderer): SubmitNodeStorage = + renderer.asMixin().handAndScreenSubmitNodeStorage + fun gameRenderState(renderer: GameRenderer): GameRenderState = renderer.gameRenderState() + fun isSingleplayer(minecraft: Minecraft): Boolean = minecraft.hasSingleplayerServer() +} + +internal val Minecraft.screenCompat: Screen? get() = gui.screen() +internal val Minecraft.overlayCompat: Overlay? get() = gui.overlay() +internal fun Minecraft.setScreenCompat(screen: Screen?) = gui.setScreen(screen) +internal val Gui.chatCompat: ChatComponent get() = hud.chat +internal val Gui.tabListCompat: PlayerTabOverlay get() = hud.tabList +//?} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/Player.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/Player.kt index 5c3b725a..d7a42672 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/Player.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/Player.kt @@ -307,7 +307,7 @@ object Player { * @return the currently opened container */ @JvmStatic - fun getContainer(): Inventory? = (Client.getMinecraft().screen as? AbstractContainerScreen<*>)?.let(::Inventory) + fun getContainer(): Inventory? = (Client.getMinecraft().screenCompat as? AbstractContainerScreen<*>)?.let(::Inventory) /** * Draws the player in the GUI. Takes the same parameters as [Render2D.drawPlayer] diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/ProxyScreens.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/ProxyScreens.kt index 2f46fe5a..b5b47cb1 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/ProxyScreens.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/ProxyScreens.kt @@ -32,19 +32,19 @@ class ProxyManagerScreen(private val parent: Screen) : Screen(Component.literal( val buttonY = height - 28 addButton = addRenderableWidget( Button.builder(Component.literal("Add Proxy")) { - minecraft.setScreen(ProxyEditScreen(this, null)) + minecraft.setScreenCompat(ProxyEditScreen(this, null)) }.bounds(width / 2 - 102, buttonY, 100, 20).build() ) backButton = addRenderableWidget( Button.builder(Component.literal("Back")) { - minecraft.setScreen(parent) + minecraft.setScreenCompat(parent) }.bounds(width / 2 + 2, buttonY, 100, 20).build() ) syncRowButtons() } override fun onClose() { - minecraft.setScreen(parent) + minecraft.setScreenCompat(parent) } override fun extractRenderState(context: GuiGraphicsExtractor, mouseX: Int, mouseY: Int, delta: Float) { @@ -157,7 +157,7 @@ class ProxyManagerScreen(private val parent: Screen) : Screen(Component.literal( ) val edit = addRenderableWidget( Button.builder(Component.literal("Edit")) { - minecraft.setScreen(ProxyEditScreen(this, proxy)) + minecraft.setScreenCompat(ProxyEditScreen(this, proxy)) }.bounds(0, 0, 40, 20).build() ) val delete = addRenderableWidget( @@ -303,13 +303,13 @@ class ProxyEditScreen( ) cancelButton = addRenderableWidget( Button.builder(Component.literal("Cancel")) { - minecraft.setScreen(parent) + minecraft.setScreenCompat(parent) }.bounds(centerX + 5, height - 40, 100, 20).build() ) } override fun onClose() { - minecraft.setScreen(parent) + minecraft.setScreenCompat(parent) } private fun createField(centerX: Int, y: Int, placeholder: String, value: String?): EditBox { @@ -339,7 +339,7 @@ class ProxyEditScreen( } parent.refreshList() - minecraft.setScreen(parent) + minecraft.setScreenCompat(parent) } override fun extractRenderState(context: GuiGraphicsExtractor, mouseX: Int, mouseY: Int, delta: Float) { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/WelcomeScreen.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/WelcomeScreen.kt index 5bc8af24..6e00e59b 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/WelcomeScreen.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/WelcomeScreen.kt @@ -33,7 +33,7 @@ class WelcomeScreen : Screen(Component.literal("Welcome Screen")) { @JvmStatic fun open() { val client = Minecraft.getInstance() - client.execute { client.setScreen(WelcomeScreen()) } + client.execute { client.setScreenCompat(WelcomeScreen()) } } } @@ -197,9 +197,9 @@ class WelcomeScreen : Screen(Component.literal("Welcome Screen")) { (x - width / 2.0) / forcedMultiplier to y / forcedMultiplier private fun confirmOpenUrl(url: String) { - minecraft.setScreen(ConfirmLinkScreen({ confirmed -> + minecraft.setScreenCompat(ConfirmLinkScreen({ confirmed -> if (confirmed) Util.getPlatform().openUri(url) - minecraft.setScreen(this) + minecraft.setScreenCompat(this) }, url, true)) } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/commands/ColorArgumentCompat.kt b/src/main/kotlin/com/chattriggers/ctjs/api/commands/ColorArgumentCompat.kt new file mode 100644 index 00000000..88dc5b4a --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/commands/ColorArgumentCompat.kt @@ -0,0 +1,34 @@ +package com.chattriggers.ctjs.api.commands + +import com.mojang.brigadier.StringReader +import com.mojang.brigadier.arguments.ArgumentType +import com.mojang.brigadier.context.CommandContext +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType +import com.mojang.brigadier.suggestion.Suggestions +import com.mojang.brigadier.suggestion.SuggestionsBuilder +import net.minecraft.ChatFormatting +import net.minecraft.commands.SharedSuggestionProvider +import net.minecraft.network.chat.Component +import java.util.concurrent.CompletableFuture + +/** Version-neutral replacement for the removed vanilla ColorArgument in 26.2. */ +internal object ColorArgumentCompat : ArgumentType { + private val colors = ChatFormatting.entries.filter { it <= ChatFormatting.WHITE || it == ChatFormatting.RESET } + private val invalidColor = DynamicCommandExceptionType { + Component.translatableEscape("argument.color.invalid", it) + } + + override fun parse(reader: StringReader): ChatFormatting { + val value = reader.readUnquotedString() + return colors.firstOrNull { it.name.equals(value, ignoreCase = true) } + ?: throw invalidColor.createWithContext(reader, value) + } + + override fun listSuggestions( + context: CommandContext, + builder: SuggestionsBuilder, + ): CompletableFuture = + SharedSuggestionProvider.suggest(colors.map { it.name.lowercase() }, builder) + + override fun getExamples(): Collection = listOf("red", "green") +} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/commands/DynamicCommands.kt b/src/main/kotlin/com/chattriggers/ctjs/api/commands/DynamicCommands.kt index 04d35095..8f56fcc4 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/commands/DynamicCommands.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/commands/DynamicCommands.kt @@ -20,12 +20,10 @@ import com.chattriggers.ctjs.api.world.block.BlockPos import com.chattriggers.ctjs.internal.commands.CommandCollection import com.chattriggers.ctjs.internal.commands.DynamicCommand import com.chattriggers.ctjs.internal.engine.JSLoader -import com.chattriggers.ctjs.internal.mixins.commands.EntitySelectorAccessor import com.chattriggers.ctjs.MCEntity import com.chattriggers.ctjs.MCNbtCompound import com.chattriggers.ctjs.api.client.Client import com.chattriggers.ctjs.api.message.ChatLib -import com.chattriggers.ctjs.internal.utils.asMixin import com.mojang.brigadier.CommandDispatcher import com.mojang.brigadier.ImmutableStringReader import com.mojang.brigadier.StringReader @@ -46,7 +44,6 @@ import net.minecraft.commands.CommandSourceStack import net.minecraft.commands.Commands import net.minecraft.commands.SharedSuggestionProvider import net.minecraft.commands.arguments.AngleArgument -import net.minecraft.commands.arguments.ColorArgument import net.minecraft.commands.arguments.CompoundTagArgument import net.minecraft.commands.arguments.EntityArgument import net.minecraft.commands.arguments.GameModeArgument @@ -73,6 +70,8 @@ import net.minecraft.commands.arguments.item.ItemArgument import net.minecraft.commands.arguments.item.ItemInput import net.minecraft.commands.arguments.item.ItemPredicateArgument import net.minecraft.commands.arguments.selector.EntitySelector +import net.minecraft.ChatFormatting +import net.minecraft.world.level.entity.EntityTypeTest import net.minecraft.data.registries.VanillaRegistries import net.minecraft.network.chat.Component import net.minecraft.server.permissions.PermissionSet @@ -86,6 +85,7 @@ import org.mozilla.javascript.Function import org.mozilla.javascript.NativeObject import org.mozilla.javascript.WrappedException import java.util.concurrent.CompletableFuture +import java.util.UUID import java.util.function.Predicate import kotlin.math.min @@ -373,7 +373,7 @@ object DynamicCommands : CommandCollection() { * @see minecraft:color */ @JvmStatic - fun color() = ColorArgument.color() + fun color(): ArgumentType = ColorArgumentCompat /** * @see minecraft:column_pos @@ -771,8 +771,27 @@ object DynamicCommands : CommandCollection() { override fun toString() = "BlockStateArgument" } + private class EntitySelectorAccess(private val impl: EntitySelector) { + private fun field(name: String): Any? = impl.javaClass.getDeclaredField(name).apply { trySetAccessible() }.get(impl) + val maxResults get() = field("maxResults") as Int + val includesEntities get() = field("includesEntities") as Boolean + @Suppress("UNCHECKED_CAST") + val contextFreePredicates get() = field("contextFreePredicates") as List> + val range get() = field("range")!! + @Suppress("UNCHECKED_CAST") + val position get() = field("position") as java.util.function.Function + val aabb get() = field("aabb") as AABB? + @Suppress("UNCHECKED_CAST") + val order get() = field("order") as java.util.function.BiConsumer> + val playerName get() = field("playerName") as String? + val entityUUID get() = field("entityUUID") as UUID? + @Suppress("UNCHECKED_CAST") + val type get() = field("type") as EntityTypeTest + val currentEntity get() = field("currentEntity") as Boolean + } + class EntitySelectorWrapper(private val impl: EntitySelector) { - private val mixed get() = impl.asMixin() + private val mixed get() = EntitySelectorAccess(impl) fun getEntity(): Entity { val entities = getEntities() @@ -876,8 +895,8 @@ object DynamicCommands : CommandCollection() { val box = mixed.aabb!!.move(pos) predicate = predicate.and { box.intersects(it.boundingBox) } } - if (!mixed.range.isAny) - predicate = predicate.and { mixed.range.matchesSqr(it.distanceToSqr(pos)) } + if (!(mixed.range.javaClass.getMethod("isAny").invoke(mixed.range) as Boolean)) + predicate = predicate.and { mixed.range.javaClass.getMethod("matchesSqr", Double::class.javaPrimitiveType).invoke(mixed.range, it.distanceToSqr(pos)) as Boolean } return predicate } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/entity/Team.kt b/src/main/kotlin/com/chattriggers/ctjs/api/entity/Team.kt index 257d1744..ae878bd2 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/entity/Team.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/entity/Team.kt @@ -81,22 +81,19 @@ class Team(override val mcValue: MCTeam) : CTWrapper { */ fun setSuffix(suffix: String) = setSuffix(TextComponent(suffix)) - fun getColor() = mcValue.color.toString() + fun getColor() = /*? if >=26.2 {*/ mcValue.color.map { ChatFormatting.valueOf(it.name).toString() }.orElse(ChatFormatting.RESET.toString()) /*?} else {*/ /*mcValue.color.toString()*//*?}*/ - /** - * Sets the team color - * @param color a string format of a [Formatting], or a hex value - * @return the team for method chaining - */ + /** Sets the team color using the legacy ChatFormatting name or numeric id. */ fun setColor(color: Any?) = apply { - mcValue.color = when (color) { - is Number -> ChatFormatting.getById(color.toInt()) ?: ChatFormatting.RESET + val formatting = when (color) { + is Number -> "0123456789abcdef".getOrNull(color.toInt())?.let(ChatFormatting::getByCode) ?: ChatFormatting.RESET is CharSequence -> ChatFormatting.entries.find { it.toString() == ChatLib.addColor(color.toString()) } ?: ChatFormatting.RESET null -> ChatFormatting.RESET else -> throw IllegalArgumentException("Could not convert type ${color::class.simpleName} to a Formatting") } + /*? if >=26.2 {*/ mcValue.setColor(java.util.Optional.ofNullable(net.minecraft.world.scores.TeamColor.byName(formatting.name.lowercase()))) /*?} else {*/ /*mcValue.color = formatting*//*?}*/ } /** diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/message/Chat.kt b/src/main/kotlin/com/chattriggers/ctjs/api/message/Chat.kt index b2c8dc3f..f89beee2 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/message/Chat.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/message/Chat.kt @@ -1,5 +1,6 @@ package com.chattriggers.ctjs.api.message +import com.chattriggers.ctjs.api.client.chatCompat import net.minecraft.client.Minecraft import net.minecraft.network.chat.Style import net.minecraft.network.chat.Component @@ -35,6 +36,6 @@ object Chat { finalMessage.append(partText) } - mc.gui.chat.addClientSystemMessage(finalMessage) + mc.gui.chatCompat.addClientSystemMessage(finalMessage) } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/message/ChatLib.kt b/src/main/kotlin/com/chattriggers/ctjs/api/message/ChatLib.kt index 780efec2..8850c80e 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/message/ChatLib.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/message/ChatLib.kt @@ -1,5 +1,8 @@ package com.chattriggers.ctjs.api.message +import com.chattriggers.ctjs.api.client.MinecraftCompat +import com.chattriggers.ctjs.api.client.chatCompat + import com.chattriggers.ctjs.api.client.Client import com.chattriggers.ctjs.api.render.Render2D import com.chattriggers.ctjs.internal.listeners.ClientListener @@ -85,7 +88,11 @@ object ChatLib { @JvmStatic @JvmOverloads fun command(text: String, clientSide: Boolean = false) { - if (clientSide) ClientCommandInternals.executeCommand(text) + if (clientSide) { + val method = ClientCommandInternals::class.java.methods.first { it.name == "executeCommand" } + if (method.parameterCount == 1) method.invoke(null, text) + else method.invoke(null, text, Client.getMinecraft().connection?.suggestionsProvider ?: return, null) + } else Client.scheduleTask { Client.getMinecraft().connection?.sendCommand(text) } } @@ -245,7 +252,7 @@ object ChatLib { private fun editLines(replacements: Array, matcher: (GuiMessage) -> Boolean) { val mc = Client.getMinecraft() - val indicator = if (mc.isSingleplayer) GuiMessageTag.systemSinglePlayer() else GuiMessageTag.system() + val indicator = if (MinecraftCompat.isSingleplayer(mc)) GuiMessageTag.systemSinglePlayer() else GuiMessageTag.system() var edited = false val accessor = chatHudAccessor ?: return val it = accessor.allMessages.listIterator() @@ -371,9 +378,9 @@ object ChatLib { @JvmOverloads fun addToSentMessageHistory(index: Int = -1, message: String) { if (index == -1) { - Client.getMinecraft().gui.chat.addRecentChat(message) + Client.getMinecraft().gui.chatCompat.addRecentChat(message) } else { - Client.getMinecraft().gui.chat.recentChat.add(index, message) + Client.getMinecraft().gui.chatCompat.recentChat.add(index, message) } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Book.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Book.kt index f3becb99..2f2439e0 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Book.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Book.kt @@ -1,6 +1,7 @@ package com.chattriggers.ctjs.api.render import com.chattriggers.ctjs.api.client.Client +import com.chattriggers.ctjs.api.client.setScreenCompat import com.chattriggers.ctjs.api.message.TextComponent import com.chattriggers.ctjs.internal.mixins.BookViewScreenAccessor import com.chattriggers.ctjs.internal.utils.asMixin @@ -71,7 +72,7 @@ class Book { val newScreen = BookViewScreen(customContents) screen = newScreen Client.scheduleTask { - Client.getMinecraft().setScreen(newScreen) + Client.getMinecraft().setScreenCompat(newScreen) newScreen.setPage(pageIndex) } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt index ae21b3c3..32ea263b 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Gui.kt @@ -1,6 +1,7 @@ package com.chattriggers.ctjs.api.render import com.chattriggers.ctjs.api.client.Client +import com.chattriggers.ctjs.api.client.screenCompat import com.chattriggers.ctjs.api.message.TextComponent import com.chattriggers.ctjs.api.triggers.RegularTrigger import com.chattriggers.ctjs.api.triggers.TriggerType @@ -42,7 +43,7 @@ class Gui @JvmOverloads constructor( } - fun isOpen(): Boolean = Client.getMinecraft().screen === this + fun isOpen(): Boolean = Client.getMinecraft().screenCompat === this /** * Registers a method to be run while gui is open. diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt index 577d6af7..34808b18 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt @@ -1,5 +1,6 @@ package com.chattriggers.ctjs.api.render +import com.chattriggers.ctjs.api.client.screenCompat import com.chattriggers.ctjs.api.render.skia.SkijaPIP import io.github.humbleui.skija.* import io.github.humbleui.skija.Image as SkijaImage @@ -72,7 +73,7 @@ open class GuiRendererBackend { fun runDrawables(context: GuiGraphicsExtractor) { if (callbacks.isEmpty()) return - if (Minecraft.getInstance().screen is Gui) context.blurBeforeThisStratum() + if (Minecraft.getInstance().screenCompat is Gui) context.blurBeforeThisStratum() SkijaPIP.draw(context, Runnable { runCallbacks(callbacks) }) } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Render2D.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render2D.kt index 2777e20b..e113d43b 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Render2D.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render2D.kt @@ -1,6 +1,7 @@ package com.chattriggers.ctjs.api.render import com.chattriggers.ctjs.api.client.Client +import com.chattriggers.ctjs.api.client.MinecraftCompat import com.chattriggers.ctjs.api.client.Player import com.chattriggers.ctjs.api.entity.PlayerMP import com.chattriggers.ctjs.api.message.ChatLib @@ -249,25 +250,6 @@ object Render2D : GuiRendererBackend() { } return } - - val immediate = Client.getMinecraft().renderBuffers().bufferSource() - splitText(text).lines.forEach { - fr.drawInBatch( - it, - x, - newY, - color.toInt(), - shadow, - matrixStack.toMC().last().pose(), - immediate, - Font.DisplayMode.NORMAL, - 0, - 0xf000f0, - ) - - newY += fr.lineHeight - } - immediate.endBatch() } @JvmStatic @@ -398,8 +380,6 @@ object Render2D : GuiRendererBackend() { entityRenderDispatcher.camera?.rotation()?.set(pitchModelRotation) } - // entityRenderDispatcher.setRenderShadows(false) - val vertexConsumers = Client.getMinecraft().renderBuffers().bufferSource() // val light = 0xf000f0 @@ -431,13 +411,12 @@ object Render2D : GuiRendererBackend() { entityRenderer.submit( playerEntityRenderState, matrixStack.toMC(), - Client.getMinecraft().gameRenderer.submitNodeStorage, - Client.getMinecraft().gameRenderer.gameRenderState.levelRenderState.cameraRenderState + MinecraftCompat.submitNodeStorage(Client.getMinecraft().gameRenderer), + MinecraftCompat.gameRenderState(Client.getMinecraft().gameRenderer).levelRenderState.cameraRenderState, ) matrixStack.pop() - vertexConsumers.endBatch() // entityRenderDispatcher.setRenderShadows(true) matrixStack.pop() // TODO: find out a way to get Diffuse instance and call setType diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt index ede8f639..71bce492 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt @@ -1,4 +1,5 @@ package com.chattriggers.ctjs.api.render +import com.chattriggers.ctjs.api.client.MinecraftCompat import net.minecraft.client.Minecraft import net.minecraft.gizmos.GizmoStyle @@ -83,7 +84,7 @@ object Render3D { @JvmStatic @JvmOverloads fun drawTracer(targetPos: Vec3, color: Color, thickness: Float = 2f, depth: Boolean = false) { - val camera = client.gameRenderer.mainCamera + val camera = MinecraftCompat.mainCamera(client.gameRenderer) val start = camera.position().add(Vec3.directionFromRotation(camera.xRot(), camera.yRot()).scale(0.1)) drawLine(start, targetPos, color, thickness, depth) } @@ -91,9 +92,10 @@ object Render3D { @JvmStatic @JvmOverloads fun drawText(text: String, pos: Vec3, scale: Float = 1f, backgroundBox: Boolean = false, increase: Boolean = false, seeThrough: Boolean = false, translate: Boolean = true) { - val distanceScale = if (increase) (pos.distanceTo(client.gameRenderer.mainCamera.position()).toFloat() / 120f).coerceAtLeast(0.01f) else 1f + val camera = MinecraftCompat.mainCamera(client.gameRenderer) + val distanceScale = if (increase) (pos.distanceTo(camera.position()).toFloat() / 120f).coerceAtLeast(0.01f) else 1f val style = TextGizmo.Style.whiteAndCentered().withScale(TextGizmo.Style.DEFAULT_SCALE * scale * distanceScale) - Gizmos.billboardText(text, if (translate) pos else client.gameRenderer.mainCamera.position(), style).apply { + Gizmos.billboardText(text, if (translate) pos else camera.position(), style).apply { if (seeThrough) setAlwaysOnTop() } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Toast.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Toast.kt index a3a91dff..7e524ac9 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Toast.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Toast.kt @@ -1,5 +1,7 @@ package com.chattriggers.ctjs.api.render +import com.chattriggers.ctjs.api.client.MinecraftCompat + import com.chattriggers.ctjs.api.client.Client import com.chattriggers.ctjs.api.message.TextComponent import com.chattriggers.ctjs.engine.printTraceToConsole @@ -94,7 +96,7 @@ class Toast(config: NativeObject) : MCToast { fun show() = apply { startTime = null - Client.getMinecraft().toastManager.addToast(this) + MinecraftCompat.toastManager(Client.getMinecraft()).addToast(this) } override fun getWantedVisibility(): MCToast.Visibility = visibility diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt index 6b6c44db..dae97fbc 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt @@ -2,22 +2,30 @@ package com.chattriggers.ctjs.api.render.skia import com.chattriggers.ctjs.api.render.Render2D import com.mojang.blaze3d.systems.RenderSystem -import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.client.gui.GuiGraphicsExtractor import net.minecraft.client.gui.navigation.ScreenRectangle -import net.minecraft.client.gui.render.pip.PictureInPictureRenderer -import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState import org.joml.Matrix3x2f -internal open class SkijaPIP(bufferSource: MultiBufferSource.BufferSource) : PictureInPictureRenderer(bufferSource) { - private val surface = SkijaSurface() - - override fun getTranslateY(height: Int, guiScale: Int) = height / 2f - override fun getRenderStateClass() = State::class.java - override fun getTextureLabel() = "V5 Skija" +internal object SkijaPIP { + @JvmStatic + fun draw(graphics: GuiGraphicsExtractor, callback: Runnable, pre: Boolean = false) { + val width = graphics.guiWidth() + val height = graphics.guiHeight() + val pose = Matrix3x2f(graphics.pose()) + val screen = ScreenRectangle(0, 0, width, height).transformMaxBounds(pose) + val scissor = graphics.scissorStack.peek() + val bounds = scissor?.intersection(screen) ?: screen + if (bounds.width <= 0 || bounds.height <= 0) return + val scale = net.minecraft.client.Minecraft.getInstance().window.guiScale.toFloat() + graphics.guiRenderState.addPicturesInPictureState( + if (pre) PreState(width, height, scale, pose, scissor, bounds, callback) + else State(width, height, scale, pose, scissor, bounds, callback), + ) + } - override fun renderToTexture(state: State, _poseStack: PoseStack) { + @JvmStatic + fun render(surface: SkijaSurface, state: State) { val color = RenderSystem.outputColorTextureOverride ?: return surface.render(color.getWidth(0), color.getHeight(0), color.texture()) { canvas -> canvas.resetMatrix() @@ -31,11 +39,6 @@ internal open class SkijaPIP(bufferSource: MultiBufferSource.BufferSource) : Pic } } - override fun close() { - surface.close() - super.close() - } - open class State( private val width: Int, private val height: Int, @@ -55,23 +58,6 @@ internal open class SkijaPIP(bufferSource: MultiBufferSource.BufferSource) : Pic override fun bounds() = area } - companion object { - fun draw(graphics: GuiGraphicsExtractor, callback: Runnable, pre: Boolean = false) { - val width = graphics.guiWidth() - val height = graphics.guiHeight() - val pose = Matrix3x2f(graphics.pose()) - val screen = ScreenRectangle(0, 0, width, height).transformMaxBounds(pose) - val scissor = graphics.scissorStack.peek() - val bounds = scissor?.intersection(screen) ?: screen - if (bounds.width <= 0 || bounds.height <= 0) return - val scale = net.minecraft.client.Minecraft.getInstance().window.guiScale.toFloat() - graphics.guiRenderState.addPicturesInPictureState( - if (pre) PreState(width, height, scale, pose, scissor, bounds, callback) - else State(width, height, scale, pose, scissor, bounds, callback), - ) - } - } - class PreState( width: Int, height: Int, @@ -82,8 +68,3 @@ internal open class SkijaPIP(bufferSource: MultiBufferSource.BufferSource) : Pic callback: Runnable, ) : State(width, height, guiScale, poseMatrix, scissor, area, callback) } - -internal class SkijaPrePIP(bufferSource: MultiBufferSource.BufferSource) : SkijaPIP(bufferSource) { - @Suppress("UNCHECKED_CAST") - override fun getRenderStateClass() = SkijaPIP.PreState::class.java as Class -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIPFactory.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIPFactory.kt new file mode 100644 index 00000000..843c27d7 --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIPFactory.kt @@ -0,0 +1,59 @@ +package com.chattriggers.ctjs.api.render.skia + +import com.mojang.blaze3d.vertex.PoseStack +import net.minecraft.client.gui.render.pip.PictureInPictureRenderer +//? if <26.2 { +/*import net.minecraft.client.renderer.MultiBufferSource +*///?} else { +import net.minecraft.client.renderer.SubmitNodeCollector +//?} + +//? if <26.2 { +/*internal fun createSkijaPIP(factoryInput: Any?, pre: Boolean): PictureInPictureRenderer<*> { + val buffers = factoryInput!!.javaClass.getMethod("bufferSource").invoke(factoryInput) as MultiBufferSource.BufferSource + return if (pre) SkijaPrePIPRenderer(buffers) else SkijaPIPRenderer(buffers) +} + +private open class SkijaPIPRenderer(buffers: MultiBufferSource.BufferSource) : + PictureInPictureRenderer(buffers) { + private val surface = SkijaSurface() + + override fun getTranslateY(height: Int, guiScale: Int) = height / 2f + override fun getRenderStateClass() = SkijaPIP.State::class.java + override fun getTextureLabel() = "V5 Skija" + override fun renderToTexture(state: SkijaPIP.State, poseStack: PoseStack) = SkijaPIP.render(surface, state) + + override fun close() { + surface.close() + super.close() + } +} + +private class SkijaPrePIPRenderer(buffers: MultiBufferSource.BufferSource) : SkijaPIPRenderer(buffers) { + @Suppress("UNCHECKED_CAST") + override fun getRenderStateClass() = SkijaPIP.PreState::class.java as Class +} +*///?} else { +internal fun createSkijaPIP(factoryInput: Any?, pre: Boolean): PictureInPictureRenderer<*> = + if (pre) SkijaPrePIPRenderer() else SkijaPIPRenderer() + +private open class SkijaPIPRenderer : PictureInPictureRenderer() { + private val surface = SkijaSurface() + + override fun getTranslateY(height: Int, guiScale: Int) = height / 2f + override fun getRenderStateClass() = SkijaPIP.State::class.java + override fun getTextureLabel() = "V5 Skija" + override fun renderToTexture(state: SkijaPIP.State, poseStack: PoseStack, collector: SubmitNodeCollector) = + SkijaPIP.render(surface, state) + + override fun close() { + surface.close() + super.close() + } +} + +private class SkijaPrePIPRenderer : SkijaPIPRenderer() { + @Suppress("UNCHECKED_CAST") + override fun getRenderStateClass() = SkijaPIP.PreState::class.java as Class +} +//?} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/world/BossBars.kt b/src/main/kotlin/com/chattriggers/ctjs/api/world/BossBars.kt index 469bbd17..b4b63e72 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/world/BossBars.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/world/BossBars.kt @@ -1,284 +1,286 @@ -package com.chattriggers.ctjs.api.world - -import com.chattriggers.ctjs.api.CTWrapper -import com.chattriggers.ctjs.api.client.Client -import com.chattriggers.ctjs.api.message.ChatLib -import com.chattriggers.ctjs.api.message.TextComponent -import com.chattriggers.ctjs.internal.mixins.BossHealthOverlayAccessor -import com.chattriggers.ctjs.MCBossBarColor -import com.chattriggers.ctjs.MCBossBarStyle +package com.chattriggers.ctjs.api.world + +import com.chattriggers.ctjs.api.client.MinecraftCompat + +import com.chattriggers.ctjs.api.CTWrapper +import com.chattriggers.ctjs.api.client.Client +import com.chattriggers.ctjs.api.message.ChatLib +import com.chattriggers.ctjs.api.message.TextComponent +import com.chattriggers.ctjs.internal.mixins.BossHealthOverlayAccessor +import com.chattriggers.ctjs.MCBossBarColor +import com.chattriggers.ctjs.MCBossBarStyle import com.chattriggers.ctjs.internal.utils.asMixin import com.chattriggers.ctjs.internal.utils.getOrDefault import com.chattriggers.ctjs.internal.utils.getOption import net.minecraft.client.gui.components.LerpingBossEvent import org.mozilla.javascript.NativeObject import java.util.UUID - -object BossBars { - @JvmStatic - fun toMC() = Client.getMinecraft().gui.bossOverlay - - /** - * Gets the list of currently shown [BossBar]s - * - * @return the currently displayed [BossBar]s - */ - @JvmStatic - fun getBossBars(): List { - return toMC().asMixin().events.values.map(::BossBar) - } - - /** - * Gets all [BossBar]s with a given name - * - * @param name the name to match - * @return the [BossBar]s - */ - @JvmStatic - fun getBossBarsByName(name: String): List { - return getBossBars().filter { it.getName() == name } - } - - /** - * Adds a new [BossBar] to be displayed - * - * Takes a parameter with the following options: - * - name: The name to appear above the BossBar. Defaults to an empty string - * - percent: The percent full the BossBar is. Defaults to 1 (full health) - * - color: The color of the BossBar. Can be any [Color], but defaults to white - * - sections: The number of notches/sections to appear on the BossBar. Can be any [Style], but - * defaults to 1 entire section - * - darkenSky: Whether the BossBar should darken the screen of the player. Defaults to false - * - dragonMusic: Whether the BossBar should play dragon music while in the End. Defaults to false - * - thickenFog: Whether the BossBar should thicken the fog around the player. Defaults to false - * - * @param obj An options bag - * - * @return the [BossBar] for further modification - */ - @JvmStatic - fun addBossBar(obj: NativeObject): BossBar { - val name = obj.getOption("name", "") + +object BossBars { + @JvmStatic + fun toMC() = MinecraftCompat.bossOverlay(Client.getMinecraft().gui) + + /** + * Gets the list of currently shown [BossBar]s + * + * @return the currently displayed [BossBar]s + */ + @JvmStatic + fun getBossBars(): List { + return toMC().asMixin().events.values.map(::BossBar) + } + + /** + * Gets all [BossBar]s with a given name + * + * @param name the name to match + * @return the [BossBar]s + */ + @JvmStatic + fun getBossBarsByName(name: String): List { + return getBossBars().filter { it.getName() == name } + } + + /** + * Adds a new [BossBar] to be displayed + * + * Takes a parameter with the following options: + * - name: The name to appear above the BossBar. Defaults to an empty string + * - percent: The percent full the BossBar is. Defaults to 1 (full health) + * - color: The color of the BossBar. Can be any [Color], but defaults to white + * - sections: The number of notches/sections to appear on the BossBar. Can be any [Style], but + * defaults to 1 entire section + * - darkenSky: Whether the BossBar should darken the screen of the player. Defaults to false + * - dragonMusic: Whether the BossBar should play dragon music while in the End. Defaults to false + * - thickenFog: Whether the BossBar should thicken the fog around the player. Defaults to false + * + * @param obj An options bag + * + * @return the [BossBar] for further modification + */ + @JvmStatic + fun addBossBar(obj: NativeObject): BossBar { + val name = obj.getOption("name", "") val percent = obj.getOrDefault("percent", 1f).toFloat().coerceIn(0f..1f) - val color = Color.from(obj.getOption("color", Color.WHITE)) - val style = Style.from(obj.getOption("sections", Style.ONE)) - val shouldDarkenSky = obj.getOption("darkenSky", false) - val dragonMusic = obj.getOption("dragonMusic", false) - val shouldThickenFog = obj.getOption("thickenFog", false) - - val uuid = UUID.randomUUID() - - val bossBar = LerpingBossEvent( - uuid, - TextComponent(name), - percent, - color.toMC(), - style.toMC(), - shouldDarkenSky, - dragonMusic, - shouldThickenFog - ) - - toMC().asMixin().events[uuid] = bossBar - - return BossBar(bossBar) - } - - /** - * Clears all [BossBar]s on screen - */ - @JvmStatic - fun clearBossBars() { - toMC().reset() - } - - /** - * Removes all [BossBar]s with the given name - * - * @param name the name to match - */ - @JvmStatic - fun removeBossBarsByName(name: String) { - toMC().asMixin().events.values.removeIf { - TextComponent(it.name).formattedText == ChatLib.addColor(name) - } - } - - /** - * Removes the given [BossBar] - * - * @param bossBar the BossBar to remove - */ - @JvmStatic - fun removeBossBar(bossBar: BossBar) { - toMC().asMixin().events.remove(bossBar.getUUID()) - } - - class BossBar(override val mcValue: LerpingBossEvent) : CTWrapper { - /** - * Gets the UUID of this BossBar - * - * @return the uuid - */ - fun getUUID(): UUID { - return mcValue.id - } - - /** - * Gets the name of this BossBar - * - * @return the name - */ - fun getName(): String { - return TextComponent(mcValue.name).formattedText - } - - /** - * Sets the name of this BossBar - * - * @param name the name to set - */ - fun setName(name: String) = apply { - mcValue.name = TextComponent(name) - } - - /** - * Gets how full this BossBar is - * - * @return how full the BossBar is - */ - fun getPercent(): Float = mcValue.progress - - /** - * Sets how full this BossBar is - * - * @param percent how full to set this BossBar. Must be between 0 and 1 - */ - fun setPercent(percent: Float) = apply { - mcValue.setProgress(percent.coerceIn(0f..1f)) - } - - /** - * Gets the [Color] of this BossBar - */ - fun getColor(): Color = Color.fromMC(mcValue.color) - - /** - * Sets the [Color] of this BossBar - * - * @param color the color to set. Can be [Color], [MCBossBarColor], or a string - */ - fun setColor(color: Any) = apply { - mcValue.color = Color.from(color).toMC() - } - - /** - * Gets the style of this BossBar. e.g. how many notches are displayed - */ - fun getStyle(): Style = Style.fromMC(mcValue.overlay) - - /** - * Sets the style of this BossBar - * - * @param style the style to set. Can be [Style], [MCBossBarStyle], a string, - * or a number of how many notches to put - */ - fun setStyle(style: Any) = apply { - mcValue.setOverlay(Style.from(style).toMC()) - } - - /** - * Gets whether this BossBar darkens the sky - */ - fun shouldDarkenSky(): Boolean = mcValue.shouldDarkenScreen() - - /** - * Sets whether this BossBar should darken the sky - * - * @param darken whether to darken the sky - */ - fun setShouldDarkenSky(darken: Boolean) = apply { - mcValue.setDarkenScreen(darken) - } - - /** - * Gets whether this BossBar will play dragon music. - * This will do nothing when the player is not in the end dimension - */ - fun hasDragonMusic(): Boolean = mcValue.shouldPlayBossMusic() - - /** - * Sets whether this BossBar will play dragon music - * - * @param music whether to play dragon music - */ - fun setHasDragonMusic(music: Boolean) = apply { - mcValue.setPlayBossMusic(music) - } - - /** - * Gets whether this BossBar should thicken the fog around the player - */ - fun shouldThickenFog(): Boolean = mcValue.shouldCreateWorldFog() - - /** - * Sets whether this BossBar should thicken the fog around the player - * - * @param fog whether to thicken the fog - */ - fun setShouldThickenFog(fog: Boolean) = apply { - mcValue.setCreateWorldFog(fog) - } - - override fun toString(): String { - return "BossBar{name=${getName()}, percent=${getPercent()}, color=${getColor()}, " + - "style=${getStyle()}, shouldDarkenSky=${shouldDarkenSky()}, " + - "hasDragonMusic=${hasDragonMusic()}, shouldThickenFog=${shouldThickenFog()}}" - } - } - - enum class Color(override val mcValue: MCBossBarColor) : CTWrapper { - PINK(MCBossBarColor.PINK), - BLUE(MCBossBarColor.BLUE), - RED(MCBossBarColor.RED), - GREEN(MCBossBarColor.GREEN), - YELLOW(MCBossBarColor.YELLOW), - PURPLE(MCBossBarColor.PURPLE), - WHITE(MCBossBarColor.WHITE); - - companion object { - @JvmStatic - fun fromMC(mcValue: MCBossBarColor) = entries.first { it.mcValue == mcValue } - - @JvmStatic - fun from(value: Any) = when (value) { - is CharSequence -> valueOf(value.toString()) - is MCBossBarColor -> fromMC(value) - is Color -> value - else -> throw IllegalArgumentException("Cannot create BossBars.Color from $value") - } - } - } - - enum class Style(override val mcValue: MCBossBarStyle, val sections: Int) : CTWrapper { - ONE(MCBossBarStyle.PROGRESS, 1), - SIX(MCBossBarStyle.NOTCHED_6, 6), - TEN(MCBossBarStyle.NOTCHED_10, 10), - TWELVE(MCBossBarStyle.NOTCHED_12, 12), - TWENTY(MCBossBarStyle.NOTCHED_20, 20); - - companion object { - @JvmStatic - fun fromMC(mcValue: MCBossBarStyle) = entries.first { it.mcValue == mcValue } - - @JvmStatic - fun from(value: Any) = when (value) { - is CharSequence -> valueOf(value.toString()) - is MCBossBarStyle -> fromMC(value) - is Style -> value - is Number -> entries.first { it.sections == value } - else -> throw IllegalArgumentException("Cannot create BossBars.Style from $value") - } - } - } -} + val color = Color.from(obj.getOption("color", Color.WHITE)) + val style = Style.from(obj.getOption("sections", Style.ONE)) + val shouldDarkenSky = obj.getOption("darkenSky", false) + val dragonMusic = obj.getOption("dragonMusic", false) + val shouldThickenFog = obj.getOption("thickenFog", false) + + val uuid = UUID.randomUUID() + + val bossBar = LerpingBossEvent( + uuid, + TextComponent(name), + percent, + color.toMC(), + style.toMC(), + shouldDarkenSky, + dragonMusic, + shouldThickenFog + ) + + toMC().asMixin().events[uuid] = bossBar + + return BossBar(bossBar) + } + + /** + * Clears all [BossBar]s on screen + */ + @JvmStatic + fun clearBossBars() { + toMC().reset() + } + + /** + * Removes all [BossBar]s with the given name + * + * @param name the name to match + */ + @JvmStatic + fun removeBossBarsByName(name: String) { + toMC().asMixin().events.values.removeIf { + TextComponent(it.name).formattedText == ChatLib.addColor(name) + } + } + + /** + * Removes the given [BossBar] + * + * @param bossBar the BossBar to remove + */ + @JvmStatic + fun removeBossBar(bossBar: BossBar) { + toMC().asMixin().events.remove(bossBar.getUUID()) + } + + class BossBar(override val mcValue: LerpingBossEvent) : CTWrapper { + /** + * Gets the UUID of this BossBar + * + * @return the uuid + */ + fun getUUID(): UUID { + return mcValue.id + } + + /** + * Gets the name of this BossBar + * + * @return the name + */ + fun getName(): String { + return TextComponent(mcValue.name).formattedText + } + + /** + * Sets the name of this BossBar + * + * @param name the name to set + */ + fun setName(name: String) = apply { + mcValue.name = TextComponent(name) + } + + /** + * Gets how full this BossBar is + * + * @return how full the BossBar is + */ + fun getPercent(): Float = mcValue.progress + + /** + * Sets how full this BossBar is + * + * @param percent how full to set this BossBar. Must be between 0 and 1 + */ + fun setPercent(percent: Float) = apply { + mcValue.setProgress(percent.coerceIn(0f..1f)) + } + + /** + * Gets the [Color] of this BossBar + */ + fun getColor(): Color = Color.fromMC(mcValue.color) + + /** + * Sets the [Color] of this BossBar + * + * @param color the color to set. Can be [Color], [MCBossBarColor], or a string + */ + fun setColor(color: Any) = apply { + mcValue.color = Color.from(color).toMC() + } + + /** + * Gets the style of this BossBar. e.g. how many notches are displayed + */ + fun getStyle(): Style = Style.fromMC(mcValue.overlay) + + /** + * Sets the style of this BossBar + * + * @param style the style to set. Can be [Style], [MCBossBarStyle], a string, + * or a number of how many notches to put + */ + fun setStyle(style: Any) = apply { + mcValue.setOverlay(Style.from(style).toMC()) + } + + /** + * Gets whether this BossBar darkens the sky + */ + fun shouldDarkenSky(): Boolean = mcValue.shouldDarkenScreen() + + /** + * Sets whether this BossBar should darken the sky + * + * @param darken whether to darken the sky + */ + fun setShouldDarkenSky(darken: Boolean) = apply { + mcValue.setDarkenScreen(darken) + } + + /** + * Gets whether this BossBar will play dragon music. + * This will do nothing when the player is not in the end dimension + */ + fun hasDragonMusic(): Boolean = mcValue.shouldPlayBossMusic() + + /** + * Sets whether this BossBar will play dragon music + * + * @param music whether to play dragon music + */ + fun setHasDragonMusic(music: Boolean) = apply { + mcValue.setPlayBossMusic(music) + } + + /** + * Gets whether this BossBar should thicken the fog around the player + */ + fun shouldThickenFog(): Boolean = mcValue.shouldCreateWorldFog() + + /** + * Sets whether this BossBar should thicken the fog around the player + * + * @param fog whether to thicken the fog + */ + fun setShouldThickenFog(fog: Boolean) = apply { + mcValue.setCreateWorldFog(fog) + } + + override fun toString(): String { + return "BossBar{name=${getName()}, percent=${getPercent()}, color=${getColor()}, " + + "style=${getStyle()}, shouldDarkenSky=${shouldDarkenSky()}, " + + "hasDragonMusic=${hasDragonMusic()}, shouldThickenFog=${shouldThickenFog()}}" + } + } + + enum class Color(override val mcValue: MCBossBarColor) : CTWrapper { + PINK(MCBossBarColor.PINK), + BLUE(MCBossBarColor.BLUE), + RED(MCBossBarColor.RED), + GREEN(MCBossBarColor.GREEN), + YELLOW(MCBossBarColor.YELLOW), + PURPLE(MCBossBarColor.PURPLE), + WHITE(MCBossBarColor.WHITE); + + companion object { + @JvmStatic + fun fromMC(mcValue: MCBossBarColor) = entries.first { it.mcValue == mcValue } + + @JvmStatic + fun from(value: Any) = when (value) { + is CharSequence -> valueOf(value.toString()) + is MCBossBarColor -> fromMC(value) + is Color -> value + else -> throw IllegalArgumentException("Cannot create BossBars.Color from $value") + } + } + } + + enum class Style(override val mcValue: MCBossBarStyle, val sections: Int) : CTWrapper { + ONE(MCBossBarStyle.PROGRESS, 1), + SIX(MCBossBarStyle.NOTCHED_6, 6), + TEN(MCBossBarStyle.NOTCHED_10, 10), + TWELVE(MCBossBarStyle.NOTCHED_12, 12), + TWENTY(MCBossBarStyle.NOTCHED_20, 20); + + companion object { + @JvmStatic + fun fromMC(mcValue: MCBossBarStyle) = entries.first { it.mcValue == mcValue } + + @JvmStatic + fun from(value: Any) = when (value) { + is CharSequence -> valueOf(value.toString()) + is MCBossBarStyle -> fromMC(value) + is Style -> value + is Number -> entries.first { it.sections == value } + else -> throw IllegalArgumentException("Cannot create BossBars.Style from $value") + } + } + } +} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/world/PotionEffectType.kt b/src/main/kotlin/com/chattriggers/ctjs/api/world/PotionEffectType.kt index 9d2878e1..e9547cba 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/world/PotionEffectType.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/world/PotionEffectType.kt @@ -14,7 +14,7 @@ class PotionEffectType(val type: MobEffect) { /** * Whether this effect is instant (e.g. instant health) */ - val isInstant get() = type.isInstantenous + val isInstant get() = type./*? if >=26.2 {*/isInstantaneous/*?} else {*//*isInstantenous*//*?}*/ /** * The raw key used for this effect type diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/launch/CTMixinPlugin.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/launch/CTMixinPlugin.kt index 79d4f06d..3d0fc936 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/launch/CTMixinPlugin.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/launch/CTMixinPlugin.kt @@ -25,7 +25,7 @@ class CTMixinPlugin : IMixinConfigPlugin { override fun getRefMapperConfig(): String? = null - override fun shouldApplyMixin(targetClassName: String?, mixinClassName: String?): Boolean = true + override fun shouldApplyMixin(targetClassName: String?, mixinClassName: String?) = true override fun acceptTargets(myTargets: MutableSet?, otherTargets: MutableSet?) {} diff --git a/src/main/resources/ctjs.mixins.json b/src/main/resources/ctjs.mixins.json index 248babc0..1e4487a9 100644 --- a/src/main/resources/ctjs.mixins.json +++ b/src/main/resources/ctjs.mixins.json @@ -34,7 +34,7 @@ "OptionsMixin", "AbstractContainerScreenAccessor", "AbstractContainerScreenMixin", - "GuiMixin", + "@version_mixins@", "GuiGraphicsExtractorMixin", "GuiRendererMixin", "ItemInHandRendererMixin", @@ -51,7 +51,6 @@ "PlayerTabOverlayAccessor", "PlayerTabOverlayMixin", "RenderTickCounterMixin", - "LevelRendererMixin", "VisGraphMixin", "YggdrasilServicesKeyInfoMixin", "commands.ClientSuggestionProviderMixin", @@ -81,7 +80,6 @@ "commands.CommandContextAccessor", "commands.CommandDispatcherMixin", "commands.CommandNodeAccessor", - "commands.EntitySelectorAccessor", "stdio.BootstrapMixin", "stdio.LoggedPrintStreamMixin" ] diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts new file mode 100644 index 00000000..a40f8f85 --- /dev/null +++ b/stonecutter.gradle.kts @@ -0,0 +1,6 @@ +plugins { + id("dev.kikugie.stonecutter") + alias(libs.plugins.kotlin) apply false +} + +stonecutter active "26.2" diff --git a/stonecutter.properties.toml b/stonecutter.properties.toml new file mode 100644 index 00000000..fc0c21a7 --- /dev/null +++ b/stonecutter.properties.toml @@ -0,0 +1,5 @@ +["26.1.2"] +deps.fabric_api = "0.153.0+26.1.2" + +["26.2"] +deps.fabric_api = "0.153.0+26.2" From 22933c77d7451bb75225d9bd9f404acf0323864e Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Tue, 18 Aug 2026 17:18:37 +0100 Subject: [PATCH 20/61] typings grrr --- .../src/main/resources/typings.d.ts | 3743 +++++++++++++++-- 1 file changed, 3397 insertions(+), 346 deletions(-) diff --git a/typing-generator/src/main/resources/typings.d.ts b/typing-generator/src/main/resources/typings.d.ts index 32233362..7fa81a6e 100644 --- a/typing-generator/src/main/resources/typings.d.ts +++ b/typing-generator/src/main/resources/typings.d.ts @@ -4399,6 +4399,82 @@ declare global { isDirectory(): boolean; } } + namespace regex { + const Pattern: { + UNIX_LINES: number; + CASE_INSENSITIVE: number; + COMMENTS: number; + MULTILINE: number; + LITERAL: number; + DOTALL: number; + UNICODE_CASE: number; + CANON_EQ: number; + UNICODE_CHARACTER_CLASS: number; + compile(p0: string): java.util.regex.Pattern; + compile(p0: string, p1: number): java.util.regex.Pattern; + matches(p0: string, p1: kotlin.CharSequence): boolean; + quote(p0: string): string; + } + interface Pattern extends java.io.Serializable { + pattern(): string; + flags(): number; + namedGroups(): Map; + matcher(p0: kotlin.CharSequence): java.util.regex.Matcher; + split(p0: kotlin.CharSequence, p1: number): Array; + split(p0: kotlin.CharSequence): Array; + splitWithDelimiters(p0: kotlin.CharSequence, p1: number): Array; + next(): number; + asPredicate(): unknown; + asMatchPredicate(): unknown; + splitAsStream(p0: kotlin.CharSequence): java.util.stream.Stream; + } + const Matcher: { + quoteReplacement(p0: string): string; + } + interface Matcher extends java.util.regex.MatchResult { + hitEnd(): boolean; + requireEnd(): boolean; + pattern(): java.util.regex.Pattern; + toMatchResult(): java.util.regex.MatchResult; + usePattern(p0: java.util.regex.Pattern): java.util.regex.Matcher; + reset(): java.util.regex.Matcher; + reset(p0: kotlin.CharSequence): java.util.regex.Matcher; + matches(): boolean; + find(): boolean; + find(p0: number): boolean; + lookingAt(): boolean; + appendReplacement(p0: java.lang.StringBuffer, p1: string): java.util.regex.Matcher; + appendReplacement(p0: java.lang.StringBuilder, p1: string): java.util.regex.Matcher; + appendTail(p0: java.lang.StringBuffer): java.lang.StringBuffer; + appendTail(p0: java.lang.StringBuilder): java.lang.StringBuilder; + replaceAll(p0: string): string; + replaceAll(p0: unknown): string; + results(): java.util.stream.Stream; + replaceFirst(p0: string): string; + replaceFirst(p0: unknown): string; + region(p0: number, p1: number): java.util.regex.Matcher; + regionStart(): number; + regionEnd(): number; + hasTransparentBounds(): boolean; + useTransparentBounds(p0: boolean): java.util.regex.Matcher; + hasAnchoringBounds(): boolean; + useAnchoringBounds(p0: boolean): java.util.regex.Matcher; + } + interface MatchResult { + start(): number; + start(p0: number): number; + start(p0: string): number; + end(): number; + end(p0: number): number; + end(p0: string): number; + group(): string; + group(p0: number): string; + group(p0: string): string; + groupCount(): number; + namedGroups(): Map; + hasMatch(): boolean; + } + } const ArrayList: { new(p0: number): java.util.ArrayList; new(): java.util.ArrayList; @@ -37033,13 +37109,6 @@ declare global { name(): string; signature(): net.minecraft.network.chat.MessageSignature; } - const ColorArgument: { - ERROR_INVALID_VALUE: com.mojang.brigadier.exceptions.DynamicCommandExceptionType; - color(): net.minecraft.commands.arguments.ColorArgument; - getColor(context: com.mojang.brigadier.context.CommandContext, name: string): net.minecraft.ChatFormatting; - } - interface ColorArgument extends com.mojang.brigadier.arguments.ArgumentType { - } const RangeArgument$Floats: { new(): net.minecraft.commands.arguments.RangeArgument$Floats; getRange(context: com.mojang.brigadier.context.CommandContext, name: string): net.minecraft.advancements.criterion.MinMaxBounds$Doubles; @@ -46397,6 +46466,7 @@ declare global { getETHER_PASSABLE(): number; getETHER_TELEPORT_CLEAR(): number; getETHER_FEET_BLOCKER(): number; + getETHER_FAKE_FULL_BLOCKER(): number; } const WorldSerializer: { new(): com.chattriggers.ctjs.api.world.pathfinding.WorldSerializer; @@ -48422,9 +48492,7 @@ declare global { setSuffix(suffix: string): com.chattriggers.ctjs.api.entity.Team; getColor(): string; /** - * Sets the team color - * @param color a string format of a [Formatting], or a hex value - * @return the team for method chaining + * Sets the team color using the legacy ChatFormatting name or numeric id. */ setColor(color: any | null | undefined): com.chattriggers.ctjs.api.entity.Team; /** @@ -48577,7 +48645,7 @@ declare global { /** * @see minecraft:color */ - color(): net.minecraft.commands.arguments.ColorArgument; + color(): com.mojang.brigadier.arguments.ArgumentType; /** * @see minecraft:column_pos */ @@ -48947,7 +49015,7 @@ declare global { /** * @see minecraft:color */ - color(): net.minecraft.commands.arguments.ColorArgument; + color(): com.mojang.brigadier.arguments.ArgumentType; /** * @see minecraft:column_pos */ @@ -49973,6 +50041,10 @@ declare global { * @param ip The ip to connect to */ connect(ip: string, port: number): void; + getCurrentScreen(): net.minecraft.client.gui.screens.Screen | null | undefined; + setCurrentScreen(screen: net.minecraft.client.gui.screens.Screen | null | undefined): void; + getMainRenderTarget(): com.mojang.blaze3d.pipeline.RenderTarget; + reloadWorldRenderer(): void; /** * Gets the Minecraft ChatHud object for the chat gui * @@ -50160,6 +50232,10 @@ declare global { * @param ip The ip to connect to */ connect(ip: string, port: number): void; + getCurrentScreen(): net.minecraft.client.gui.screens.Screen | null | undefined; + setCurrentScreen(screen: net.minecraft.client.gui.screens.Screen | null | undefined): void; + getMainRenderTarget(): com.mojang.blaze3d.pipeline.RenderTarget; + reloadWorldRenderer(): void; /** * Gets the Minecraft ChatHud object for the chat gui * @@ -50853,6 +50929,13 @@ declare global { } } namespace render { + namespace skia { + const SkijaBootstrap: { + new(): com.chattriggers.ctjs.api.render.skia.SkijaBootstrap; + } + interface SkijaBootstrap extends net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint { + } + } const Font: { new(name: string, resourcePath: string): com.chattriggers.ctjs.api.render.Font; new(name: string, inputStream: java.io.InputStream): com.chattriggers.ctjs.api.render.Font; @@ -50861,215 +50944,6 @@ declare global { getName(): string; buffer(): java.nio.ByteBuffer; } - const Display: { - Background: typeof com.chattriggers.ctjs.api.render.Display$Background; - Order: typeof com.chattriggers.ctjs.api.render.Display$Order; - new(): com.chattriggers.ctjs.api.render.Display; - new(config: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.render.Display; - } - interface Display { - getTextColor(): number; - /** - * Sets the color of the texts - * - * Overrides the color of the individual texts - */ - setTextColor(textColor: number): com.chattriggers.ctjs.api.render.Display; - getAlign(): com.chattriggers.ctjs.api.render.Text$Align; - /** - * Set the alignment of the texts in the display - * - * Overrides alignment of the individual texts - */ - setAlign(align: any): com.chattriggers.ctjs.api.render.Display; - getOrder(): com.chattriggers.ctjs.api.render.Display$Order; - setOrder(order: any): com.chattriggers.ctjs.api.render.Display; - getBackground(): com.chattriggers.ctjs.api.render.Display$Background; - setBackground(background: any): com.chattriggers.ctjs.api.render.Display; - getBackgroundColor(): number; - setBackgroundColor(backgroundColor: number): com.chattriggers.ctjs.api.render.Display; - setLine(index: number, line: any): com.chattriggers.ctjs.api.render.Display; - getLine(index: number): com.chattriggers.ctjs.api.render.Text; - getLines(): Array; - setLines(lines: Array): com.chattriggers.ctjs.api.render.Display; - addLine(line: any): com.chattriggers.ctjs.api.render.Display; - addLines(lines: any): com.chattriggers.ctjs.api.render.Display; - removeLine(index: number): com.chattriggers.ctjs.api.render.Display; - clearLines(): com.chattriggers.ctjs.api.render.Display; - getX(): number; - setX(x: number): com.chattriggers.ctjs.api.render.Display; - getY(): number; - setY(y: number): com.chattriggers.ctjs.api.render.Display; - getWidth(): number; - getHeight(): number; - getMinWidth(): number; - setMinWidth(minWidth: number): com.chattriggers.ctjs.api.render.Display; - draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor): void; - } - const Text$Align: { - LEFT: com.chattriggers.ctjs.api.render.Text$Align; - CENTER: com.chattriggers.ctjs.api.render.Text$Align; - RIGHT: com.chattriggers.ctjs.api.render.Text$Align; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Text$Align; - } - interface Text$Align extends kotlin.Enum { - } - const Display$Order: { - REVERSED: com.chattriggers.ctjs.api.render.Display$Order; - NORMAL: com.chattriggers.ctjs.api.render.Display$Order; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Order; - } - interface Display$Order extends kotlin.Enum { - } - const Display$Background: { - NONE: com.chattriggers.ctjs.api.render.Display$Background; - FULL: com.chattriggers.ctjs.api.render.Display$Background; - PER_LINE: com.chattriggers.ctjs.api.render.Display$Background; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Background; - } - interface Display$Background extends kotlin.Enum { - } - const Text: { - Align: typeof com.chattriggers.ctjs.api.render.Text$Align; - new(string: string): com.chattriggers.ctjs.api.render.Text; - new(string: string, x: number): com.chattriggers.ctjs.api.render.Text; - new(string: string, x: number, y: number): com.chattriggers.ctjs.api.render.Text; - new(string: string, config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.render.Text; - } - interface Text { - getString(): string; - setString(string: string): com.chattriggers.ctjs.api.render.Text; - getColor(): number; - setColor(color: number): com.chattriggers.ctjs.api.render.Text; - getFormatted(): boolean; - setFormatted(formatted: boolean): com.chattriggers.ctjs.api.render.Text; - getShadow(): boolean; - setShadow(shadow: boolean): com.chattriggers.ctjs.api.render.Text; - getAlign(): com.chattriggers.ctjs.api.render.Text$Align; - setAlign(align: any): com.chattriggers.ctjs.api.render.Text; - getBackground(): boolean; - /** - * Set the background - * - * true: Background is enabled - * false: Background is disabled - */ - setBackground(background: boolean): com.chattriggers.ctjs.api.render.Text; - getBackgroundColor(): number; - setBackgroundColor(backgroundColor: number): com.chattriggers.ctjs.api.render.Text; - getX(): number; - setX(x: number): com.chattriggers.ctjs.api.render.Text; - getY(): number; - setY(y: number): com.chattriggers.ctjs.api.render.Text; - /** - * Gets the width of the text - * This is automatically updated when the text is drawn. - * - * @return the width of the text - */ - getWidth(): number; - getLines(): Array; - getMaxLines(): number; - setMaxLines(maxLines: number): com.chattriggers.ctjs.api.render.Text; - getScale(): number; - setScale(scale: number): com.chattriggers.ctjs.api.render.Text; - /** - * Sets the maximum width of the text, splitting it into multiple lines if necessary. - * - * @param maxWidth the maximum width of the text - * @return the Text object for method chaining - */ - setMaxWidth(maxWidth: number): com.chattriggers.ctjs.api.render.Text; - getMaxWidth(): number; - getHeight(): number; - exceedsMaxLines(): boolean; - draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor): com.chattriggers.ctjs.api.render.Text; - draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor, x: number | null | undefined): com.chattriggers.ctjs.api.render.Text; - draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor, x: number | null | undefined, y: number | null | undefined): com.chattriggers.ctjs.api.render.Text; - } - const DrawContextHolder: { - currentContext: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; - new(): com.chattriggers.ctjs.api.render.DrawContextHolder; - } - interface DrawContextHolder { - currentContext: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; - new(): com.chattriggers.ctjs.api.render.DrawContextHolder; - withContext(context: net.minecraft.client.gui.GuiGraphicsExtractor, block: kotlin.Function0): T; - } - const RenderPipelines: { - LINE_LIST: com.mojang.blaze3d.pipeline.RenderPipeline; - TRIANGLE_STRIP: com.mojang.blaze3d.pipeline.RenderPipeline; - LINE_LIST_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; - TRIANGLE_STRIP_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; - /** - * The only custom world pipelines are the two states vanilla does not expose: no-depth ESP. - */ - new(): com.chattriggers.ctjs.api.render.RenderPipelines; - } - interface RenderPipelines { - LINE_LIST: com.mojang.blaze3d.pipeline.RenderPipeline; - TRIANGLE_STRIP: com.mojang.blaze3d.pipeline.RenderPipeline; - LINE_LIST_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; - TRIANGLE_STRIP_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; - /** - * The only custom world pipelines are the two states vanilla does not expose: no-depth ESP. - */ - new(): com.chattriggers.ctjs.api.render.RenderPipelines; - } - const RenderLayers: { - LINE_LIST: net.minecraft.client.renderer.rendertype.RenderType; - LINE_LIST_ESP: net.minecraft.client.renderer.rendertype.RenderType; - TRIANGLE_STRIP: net.minecraft.client.renderer.rendertype.RenderType; - TRIANGLE_STRIP_ESP: net.minecraft.client.renderer.rendertype.RenderType; - new(): com.chattriggers.ctjs.api.render.RenderLayers; - } - interface RenderLayers { - LINE_LIST: net.minecraft.client.renderer.rendertype.RenderType; - LINE_LIST_ESP: net.minecraft.client.renderer.rendertype.RenderType; - TRIANGLE_STRIP: net.minecraft.client.renderer.rendertype.RenderType; - TRIANGLE_STRIP_ESP: net.minecraft.client.renderer.rendertype.RenderType; - new(): com.chattriggers.ctjs.api.render.RenderLayers; - } - const Rectangle: { - new(color: number, x: number, y: number, width: number, height: number): com.chattriggers.ctjs.api.render.Rectangle; - } - interface Rectangle { - getColor(): number; - setColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; - getX(): number; - setX(x: number): com.chattriggers.ctjs.api.render.Rectangle; - getY(): number; - setY(y: number): com.chattriggers.ctjs.api.render.Rectangle; - getWidth(): number; - setWidth(width: number): com.chattriggers.ctjs.api.render.Rectangle; - getHeight(): number; - setHeight(height: number): com.chattriggers.ctjs.api.render.Rectangle; - isShadow(): boolean; - setShadow(shadow: boolean): com.chattriggers.ctjs.api.render.Rectangle; - setShadow(color: number, x: number, y: number): com.chattriggers.ctjs.api.render.Rectangle; - getShadowOffset(): com.chattriggers.ctjs.api.vec.Vec2f; - getShadowOffsetX(): number; - getShadowOffsetY(): number; - setShadowOffset(x: number, y: number): com.chattriggers.ctjs.api.render.Rectangle; - setShadowOffsetX(x: number): com.chattriggers.ctjs.api.render.Rectangle; - setShadowOffsetY(y: number): com.chattriggers.ctjs.api.render.Rectangle; - getShadowColor(): number; - setShadowColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; - getOutline(): boolean; - setOutline(outline: boolean): com.chattriggers.ctjs.api.render.Rectangle; - setOutline(color: number, thickness: number): com.chattriggers.ctjs.api.render.Rectangle; - getOutlineColor(): number; - setOutlineColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; - getThickness(): number; - setThickness(thickness: number): com.chattriggers.ctjs.api.render.Rectangle; - draw(): com.chattriggers.ctjs.api.render.Rectangle; - } const Render2D: { ScreenWrapper: typeof com.chattriggers.ctjs.api.render.Render2D$ScreenWrapper; screen: com.chattriggers.ctjs.api.render.Render2D$ScreenWrapper; @@ -51245,15 +51119,15 @@ declare global { ALIGN_CENTER: number; ALIGN_MIDDLE: number; /** - * Minecraft GUI extraction and GPU resource implementation for [Render2D]. + * Skija-backed 2D renderer used by the JavaScript-facing [Render2D] API. */ new(): com.chattriggers.ctjs.api.render.GuiRendererBackend; } interface GuiRendererBackend { - registerV5Render(runnable: java.lang.Runnable): void; - unregisterV5Render(runnable: java.lang.Runnable): void; - registerV5PreRender(runnable: java.lang.Runnable): void; - unregisterV5PreRender(runnable: java.lang.Runnable): void; + registerV5Render(callback: java.lang.Runnable): java.lang.Runnable; + unregisterV5Render(callback: java.lang.Runnable): void; + registerV5PreRender(callback: java.lang.Runnable): java.lang.Runnable; + unregisterV5PreRender(callback: java.lang.Runnable): void; clearCallbacks(): void; runPreDrawables(context: net.minecraft.client.gui.GuiGraphicsExtractor): void; runDrawables(context: net.minecraft.client.gui.GuiGraphicsExtractor): void; @@ -51261,25 +51135,25 @@ declare global { save(): void; restore(): void; globalAlpha(value: number): void; - scissor(x: number, y: number, w: number, h: number): void; + scissor(x: number, y: number, width: number, height: number): void; resetScissor(): void; - pushScissor(x: number, y: number, w: number, h: number): void; + pushScissor(x: number, y: number, width: number, height: number): void; popScissor(): void; - drawRect(x: number, y: number, w: number, h: number, color: number): void; - drawRoundedRect(x: number, y: number, w: number, h: number, radius: number, color: number): void; - drawRoundedRectVaried(x: number, y: number, w: number, h: number, color: number, tl: number, tr: number, br: number, bl: number): void; + drawRect(x: number, y: number, width: number, height: number, color: number): void; + drawRoundedRect(x: number, y: number, width: number, height: number, radius: number, color: number): void; + drawRoundedRectVaried(x: number, y: number, width: number, height: number, color: number, tl: number, tr: number, br: number, bl: number): void; drawCircle(x: number, y: number, radius: number, color: number): void; - drawHollowRect(x: number, y: number, w: number, h: number, thickness: number, color: number): void; - drawHollowRect(x: number, y: number, w: number, h: number, thickness: number, color: number, radius: number): void; + drawHollowRect(x: number, y: number, width: number, height: number, thickness: number, color: number): void; + drawHollowRect(x: number, y: number, width: number, height: number, thickness: number, color: number, radius: number): void; drawLine(x1: number, y1: number, x2: number, y2: number, thickness: number, color: number): void; - drawDropShadow(x: number, y: number, w: number, h: number, radius: number, blur: number, spread: number, color: number): void; - drawGradientRect(x: number, y: number, w: number, h: number, color1: number, color2: number, direction: any): void; - drawGradientRect(x: number, y: number, w: number, h: number, color1: number, color2: number, direction: any, radius: number): void; - drawHollowGradientRect(x: number, y: number, w: number, h: number, thickness: number, color1: number, color2: number, direction: any): void; - drawHollowGradientRect(x: number, y: number, w: number, h: number, thickness: number, color1: number, color2: number, direction: any, radius: number): void; - drawCheckerboard(x: number, y: number, w: number, h: number, radius: number): void; - drawCheckerboard(x: number, y: number, w: number, h: number, radius: number, size: number): void; - drawHueBar(x: number, y: number, w: number, h: number, radius: number): void; + drawDropShadow(x: number, y: number, width: number, height: number, radius: number, blur: number, spread: number, color: number): void; + drawGradientRect(x: number, y: number, width: number, height: number, color1: number, color2: number, direction: any): void; + drawGradientRect(x: number, y: number, width: number, height: number, color1: number, color2: number, direction: any, radius: number): void; + drawHollowGradientRect(x: number, y: number, width: number, height: number, thickness: number, color1: number, color2: number, direction: any): void; + drawHollowGradientRect(x: number, y: number, width: number, height: number, thickness: number, color1: number, color2: number, direction: any, radius: number): void; + drawCheckerboard(x: number, y: number, width: number, height: number, radius: number): void; + drawCheckerboard(x: number, y: number, width: number, height: number, radius: number, size: number): void; + drawHueBar(x: number, y: number, width: number, height: number, radius: number): void; getDefaultFont(): com.chattriggers.ctjs.api.render.Font; text(text: string, x: number, y: number, size: number, color: number, align: number): void; text(text: string, x: number, y: number, size: number, color: number, font: com.chattriggers.ctjs.api.render.Font | null | undefined, align: number): void; @@ -51288,17 +51162,17 @@ declare global { loadImage(path: string): string; unloadImage(path: string): void | null | undefined; isImageLoaded(path: string): boolean; - drawImage(path: string, x: number, y: number, w: number, h: number): void; - drawImage(path: string, x: number, y: number, w: number, h: number, radius: number): void; - drawImage(path: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; + drawImage(path: string, x: number, y: number, width: number, height: number): void; + drawImage(path: string, x: number, y: number, width: number, height: number, radius: number): void; + drawImage(path: string, x: number, y: number, width: number, height: number, radius: number, imageAlpha: number): void; + drawImageFromUrl(url: string, x: number, y: number, width: number, height: number): void; + drawImageFromUrl(url: string, x: number, y: number, width: number, height: number, radius: number): void; + drawImageFromUrl(url: string, x: number, y: number, width: number, height: number, radius: number, imageAlpha: number): void; loadGif(path: string): com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData | null | undefined; unloadGif(path: string): void | null | undefined; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number): void; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number): void; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number, alpha: number): void; + drawGif(path: string, x: number, y: number, width: number, height: number, frameIndex: number): void; + drawGif(path: string, x: number, y: number, width: number, height: number, frameIndex: number, radius: number): void; + drawGif(path: string, x: number, y: number, width: number, height: number, frameIndex: number, radius: number, imageAlpha: number): void; clearImageCache(): void; getCacheStats(): string; destroy(): void; @@ -51399,6 +51273,181 @@ declare global { fromUrl(url: string, cachedImageName: string | null | undefined): com.chattriggers.ctjs.api.render.Image; new(): com.chattriggers.ctjs.api.render.Image$Companion; } + const Display: { + Background: typeof com.chattriggers.ctjs.api.render.Display$Background; + Order: typeof com.chattriggers.ctjs.api.render.Display$Order; + new(): com.chattriggers.ctjs.api.render.Display; + new(config: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.render.Display; + } + interface Display { + getTextColor(): number; + /** + * Sets the color of the texts + * + * Overrides the color of the individual texts + */ + setTextColor(textColor: number): com.chattriggers.ctjs.api.render.Display; + getAlign(): com.chattriggers.ctjs.api.render.Text$Align; + /** + * Set the alignment of the texts in the display + * + * Overrides alignment of the individual texts + */ + setAlign(align: any): com.chattriggers.ctjs.api.render.Display; + getOrder(): com.chattriggers.ctjs.api.render.Display$Order; + setOrder(order: any): com.chattriggers.ctjs.api.render.Display; + getBackground(): com.chattriggers.ctjs.api.render.Display$Background; + setBackground(background: any): com.chattriggers.ctjs.api.render.Display; + getBackgroundColor(): number; + setBackgroundColor(backgroundColor: number): com.chattriggers.ctjs.api.render.Display; + setLine(index: number, line: any): com.chattriggers.ctjs.api.render.Display; + getLine(index: number): com.chattriggers.ctjs.api.render.Text; + getLines(): Array; + setLines(lines: Array): com.chattriggers.ctjs.api.render.Display; + addLine(line: any): com.chattriggers.ctjs.api.render.Display; + addLines(lines: any): com.chattriggers.ctjs.api.render.Display; + removeLine(index: number): com.chattriggers.ctjs.api.render.Display; + clearLines(): com.chattriggers.ctjs.api.render.Display; + getX(): number; + setX(x: number): com.chattriggers.ctjs.api.render.Display; + getY(): number; + setY(y: number): com.chattriggers.ctjs.api.render.Display; + getWidth(): number; + getHeight(): number; + getMinWidth(): number; + setMinWidth(minWidth: number): com.chattriggers.ctjs.api.render.Display; + draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor): void; + } + const Text$Align: { + LEFT: com.chattriggers.ctjs.api.render.Text$Align; + CENTER: com.chattriggers.ctjs.api.render.Text$Align; + RIGHT: com.chattriggers.ctjs.api.render.Text$Align; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.render.Text$Align; + } + interface Text$Align extends kotlin.Enum { + } + const Display$Order: { + REVERSED: com.chattriggers.ctjs.api.render.Display$Order; + NORMAL: com.chattriggers.ctjs.api.render.Display$Order; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Order; + } + interface Display$Order extends kotlin.Enum { + } + const Display$Background: { + NONE: com.chattriggers.ctjs.api.render.Display$Background; + FULL: com.chattriggers.ctjs.api.render.Display$Background; + PER_LINE: com.chattriggers.ctjs.api.render.Display$Background; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Background; + } + interface Display$Background extends kotlin.Enum { + } + const Text: { + Align: typeof com.chattriggers.ctjs.api.render.Text$Align; + new(string: string): com.chattriggers.ctjs.api.render.Text; + new(string: string, x: number): com.chattriggers.ctjs.api.render.Text; + new(string: string, x: number, y: number): com.chattriggers.ctjs.api.render.Text; + new(string: string, config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.render.Text; + } + interface Text { + getString(): string; + setString(string: string): com.chattriggers.ctjs.api.render.Text; + getColor(): number; + setColor(color: number): com.chattriggers.ctjs.api.render.Text; + getFormatted(): boolean; + setFormatted(formatted: boolean): com.chattriggers.ctjs.api.render.Text; + getShadow(): boolean; + setShadow(shadow: boolean): com.chattriggers.ctjs.api.render.Text; + getAlign(): com.chattriggers.ctjs.api.render.Text$Align; + setAlign(align: any): com.chattriggers.ctjs.api.render.Text; + getBackground(): boolean; + /** + * Set the background + * + * true: Background is enabled + * false: Background is disabled + */ + setBackground(background: boolean): com.chattriggers.ctjs.api.render.Text; + getBackgroundColor(): number; + setBackgroundColor(backgroundColor: number): com.chattriggers.ctjs.api.render.Text; + getX(): number; + setX(x: number): com.chattriggers.ctjs.api.render.Text; + getY(): number; + setY(y: number): com.chattriggers.ctjs.api.render.Text; + /** + * Gets the width of the text + * This is automatically updated when the text is drawn. + * + * @return the width of the text + */ + getWidth(): number; + getLines(): Array; + getMaxLines(): number; + setMaxLines(maxLines: number): com.chattriggers.ctjs.api.render.Text; + getScale(): number; + setScale(scale: number): com.chattriggers.ctjs.api.render.Text; + /** + * Sets the maximum width of the text, splitting it into multiple lines if necessary. + * + * @param maxWidth the maximum width of the text + * @return the Text object for method chaining + */ + setMaxWidth(maxWidth: number): com.chattriggers.ctjs.api.render.Text; + getMaxWidth(): number; + getHeight(): number; + exceedsMaxLines(): boolean; + draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor): com.chattriggers.ctjs.api.render.Text; + draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor, x: number | null | undefined): com.chattriggers.ctjs.api.render.Text; + draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor, x: number | null | undefined, y: number | null | undefined): com.chattriggers.ctjs.api.render.Text; + } + const DrawContextHolder: { + currentContext: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; + new(): com.chattriggers.ctjs.api.render.DrawContextHolder; + } + interface DrawContextHolder { + currentContext: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; + new(): com.chattriggers.ctjs.api.render.DrawContextHolder; + withContext(context: net.minecraft.client.gui.GuiGraphicsExtractor, block: kotlin.Function0): T; + } + const Rectangle: { + new(color: number, x: number, y: number, width: number, height: number): com.chattriggers.ctjs.api.render.Rectangle; + } + interface Rectangle { + getColor(): number; + setColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; + getX(): number; + setX(x: number): com.chattriggers.ctjs.api.render.Rectangle; + getY(): number; + setY(y: number): com.chattriggers.ctjs.api.render.Rectangle; + getWidth(): number; + setWidth(width: number): com.chattriggers.ctjs.api.render.Rectangle; + getHeight(): number; + setHeight(height: number): com.chattriggers.ctjs.api.render.Rectangle; + isShadow(): boolean; + setShadow(shadow: boolean): com.chattriggers.ctjs.api.render.Rectangle; + setShadow(color: number, x: number, y: number): com.chattriggers.ctjs.api.render.Rectangle; + getShadowOffset(): com.chattriggers.ctjs.api.vec.Vec2f; + getShadowOffsetX(): number; + getShadowOffsetY(): number; + setShadowOffset(x: number, y: number): com.chattriggers.ctjs.api.render.Rectangle; + setShadowOffsetX(x: number): com.chattriggers.ctjs.api.render.Rectangle; + setShadowOffsetY(y: number): com.chattriggers.ctjs.api.render.Rectangle; + getShadowColor(): number; + setShadowColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; + getOutline(): boolean; + setOutline(outline: boolean): com.chattriggers.ctjs.api.render.Rectangle; + setOutline(color: number, thickness: number): com.chattriggers.ctjs.api.render.Rectangle; + getOutlineColor(): number; + setOutlineColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; + getThickness(): number; + setThickness(thickness: number): com.chattriggers.ctjs.api.render.Rectangle; + draw(): com.chattriggers.ctjs.api.render.Rectangle; + } const Book: { new(): com.chattriggers.ctjs.api.render.Book; } @@ -51440,6 +51489,102 @@ declare global { isOpen(): boolean; getCurrentPage(): number; } + const Render3D: { + Color: typeof com.chattriggers.ctjs.api.render.Render3D$Color; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; + new(): com.chattriggers.ctjs.api.render.Render3D; + } + interface Render3D { + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; + new(): com.chattriggers.ctjs.api.render.Render3D; + } + const Render3D$Color: { + new(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Render3D$Color; + } + interface Render3D$Color { + getR(): number; + getG(): number; + getB(): number; + getA(): number; + getRf(): number; + getGf(): number; + getBf(): number; + getAf(): number; + getPacked(): number; + component1(): number; + component2(): number; + component3(): number; + component4(): number; + copy(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Render3D$Color; + } const Gui: { new(): com.chattriggers.ctjs.api.render.Gui; new(title: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; @@ -51711,102 +51856,6 @@ declare global { setDisplayTime(value: number): void; show(): com.chattriggers.ctjs.api.render.Toast; } - const Render3D: { - Color: typeof com.chattriggers.ctjs.api.render.Render3D$Color; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; - new(): com.chattriggers.ctjs.api.render.Render3D; - } - interface Render3D { - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; - new(): com.chattriggers.ctjs.api.render.Render3D; - } - const Render3D$Color: { - new(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Render3D$Color; - } - interface Render3D$Color { - getR(): number; - getG(): number; - getB(): number; - getA(): number; - getRf(): number; - getGf(): number; - getBf(): number; - getAf(): number; - getPacked(): number; - component1(): number; - component2(): number; - component3(): number; - component4(): number; - copy(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Render3D$Color; - } } const Config$ConsoleSettings: { new(clearConsoleOnLoad: boolean, openConsoleOnError: boolean, consoleFiraCodeFont: boolean, consoleFontSize: number, customTheme: boolean, consoleTheme: number, consoleTextColor: java.awt.Color, consoleBackgroundColor: java.awt.Color, consoleErrorColor: java.awt.Color, consoleWarningColor: java.awt.Color): com.chattriggers.ctjs.api.Config$ConsoleSettings; @@ -61229,6 +61278,3008 @@ declare global { } } } + namespace github { + namespace humbleui { + namespace skija { + namespace impl { + const Managed: { + CleanerThunk: typeof io.github.humbleui.skija.impl.Managed$CleanerThunk; + new(p0: number, p1: number): io.github.humbleui.skija.impl.Managed; + new(p0: number, p1: number, p2: boolean): io.github.humbleui.skija.impl.Managed; + _nInvokeFinalizer(p0: number, p1: number): void; + } + interface Managed extends io.github.humbleui.skija.impl.Native, java.lang.AutoCloseable { + _cleanable: io.github.humbleui.skija.impl.Cleanable; + isClosed(): boolean; + } + const Native: { + new(p0: number): io.github.humbleui.skija.impl.Native; + getPtr(p0: io.github.humbleui.skija.impl.Native): number; + } + interface Native { + _ptr: number; + _nativeEquals(p0: io.github.humbleui.skija.impl.Native): boolean; + } + const Cleanable: { + register(p0: any, p1: java.lang.Runnable): io.github.humbleui.skija.impl.Cleanable; + } + interface Cleanable { + clean(): void; + } + const Managed$CleanerThunk: { + new(p0: string, p1: number, p2: number): io.github.humbleui.skija.impl.Managed$CleanerThunk; + } + interface Managed$CleanerThunk extends java.lang.Runnable { + _className: string; + _ptr: number; + _finalizerPtr: number; + } + const RefCnt: { + _FinalizerHolder: typeof io.github.humbleui.skija.impl.RefCnt$_FinalizerHolder; + _nGetFinalizer(): number; + _nGetRefCount(p0: number): number; + } + interface RefCnt extends io.github.humbleui.skija.impl.Managed { + getRefCount(): number; + } + const RefCnt$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.impl.RefCnt$_FinalizerHolder; + } + interface RefCnt$_FinalizerHolder { + } + } + namespace shaper { + const ShapingOptions: { + DEFAULT: io.github.humbleui.skija.shaper.ShapingOptions; + new(p0: io.github.humbleui.skija.FontMgr | null | undefined, p1: Array, p2: boolean, p3: boolean, p4: boolean): io.github.humbleui.skija.shaper.ShapingOptions; + } + interface ShapingOptions { + _fontMgr: io.github.humbleui.skija.FontMgr | null | undefined; + _features: Array; + _leftToRight: boolean; + _approximateSpaces: boolean; + _approximatePunctuation: boolean; + withFeatures(p0: Array): io.github.humbleui.skija.shaper.ShapingOptions; + withFeatures(p0: string | null | undefined): io.github.humbleui.skija.shaper.ShapingOptions; + getFontMgr(): io.github.humbleui.skija.FontMgr | null | undefined; + getFeatures(): Array; + isLeftToRight(): boolean; + isApproximateSpaces(): boolean; + isApproximatePunctuation(): boolean; + withFontMgr(p0: io.github.humbleui.skija.FontMgr | null | undefined): io.github.humbleui.skija.shaper.ShapingOptions; + withLeftToRight(p0: boolean): io.github.humbleui.skija.shaper.ShapingOptions; + withApproximateSpaces(p0: boolean): io.github.humbleui.skija.shaper.ShapingOptions; + withApproximatePunctuation(p0: boolean): io.github.humbleui.skija.shaper.ShapingOptions; + } + } + const Canvas: { + _FinalizerHolder: typeof io.github.humbleui.skija.Canvas$_FinalizerHolder; + new(p0: number, p1: boolean, p2: any): io.github.humbleui.skija.Canvas; + new(p0: io.github.humbleui.skija.Bitmap): io.github.humbleui.skija.Canvas; + new(p0: io.github.humbleui.skija.Bitmap, p1: io.github.humbleui.skija.SurfaceProps): io.github.humbleui.skija.Canvas; + _nGetFinalizer(): number; + _nMakeFromBitmap(p0: number, p1: number, p2: number): number; + _nGetBaseProps(p0: number): io.github.humbleui.skija.SurfaceProps; + _nGetTopProps(p0: number): io.github.humbleui.skija.SurfaceProps; + _nGetSurface(p0: number): number; + _nDrawPoint(p0: number, p1: number, p2: number, p3: number): void; + _nDrawPoints(p0: number, p1: number, p2: kotlin.FloatArray, p3: number): void; + _nDrawLine(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nDrawArc(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: boolean, p8: number): void; + _nDrawRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nDrawOval(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nDrawRRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: kotlin.FloatArray, p6: number): void; + _nQuickReject(p0: number, p1: number, p2: number, p3: number, p4: number): boolean; + _nQuickRejectPath(p0: number, p1: number): boolean; + _nDrawDRRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: kotlin.FloatArray, p6: number, p7: number, p8: number, p9: number, p10: kotlin.FloatArray, p11: number): void; + _nDrawPath(p0: number, p1: number, p2: number): void; + _nDrawImageRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number, p12: boolean): void; + _nDrawImageNine(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number): void; + _nDrawRegion(p0: number, p1: number, p2: number): void; + _nDrawString(p0: number, p1: string, p2: number, p3: number, p4: number, p5: number): void; + _nDrawTextBlob(p0: number, p1: number, p2: number, p3: number, p4: number): void; + _nDrawPicture(p0: number, p1: number, p2: kotlin.FloatArray, p3: number): void; + _nDrawVertices(p0: number, p1: number, p2: kotlin.FloatArray, p3: Array, p4: kotlin.FloatArray, p5: Array, p6: number, p7: number): void; + _nDrawPatch(p0: number, p1: kotlin.FloatArray, p2: Array, p3: kotlin.FloatArray, p4: number, p5: number): void; + _nDrawDrawable(p0: number, p1: number, p2: kotlin.FloatArray): void; + _nDrawColor(p0: number, p1: number, p2: number): void; + _nDrawColor4f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nClear(p0: number, p1: number): void; + _nDrawPaint(p0: number, p1: number): void; + _nSetMatrix(p0: number, p1: kotlin.FloatArray): void; + _nSetMatrix44(p0: number, p1: kotlin.FloatArray): void; + _nGetLocalToDevice(p0: number): kotlin.FloatArray; + _nResetMatrix(p0: number): void; + _nClipRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: boolean): void; + _nClipRRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: kotlin.FloatArray, p6: number, p7: boolean): void; + _nClipPath(p0: number, p1: number, p2: number, p3: boolean): void; + _nClipRegion(p0: number, p1: number, p2: number): void; + _nConcat(p0: number, p1: kotlin.FloatArray): void; + _nConcat44(p0: number, p1: kotlin.FloatArray): void; + _nReadPixels(p0: number, p1: number, p2: number, p3: number): boolean; + _nWritePixels(p0: number, p1: number, p2: number, p3: number): boolean; + _nSave(p0: number): number; + _nSaveLayer(p0: number, p1: number): number; + _nSaveLayerRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nSaveLayerAlpha(p0: number, p1: number): number; + _nSaveLayerAlphaRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nSaveLayerRec(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nSaveLayerRecRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): number; + _nGetSaveCount(p0: number): number; + _nRestore(p0: number): void; + _nRestoreToCount(p0: number, p1: number): void; + } + interface Canvas extends io.github.humbleui.skija.impl.Managed { + _owner: any; + getBaseProps(): io.github.humbleui.skija.SurfaceProps; + getTopProps(): io.github.humbleui.skija.SurfaceProps; + getSurface(): io.github.humbleui.skija.Surface | null | undefined; + drawPoint(p0: number, p1: number, p2: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPoints(p0: Array, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPoints(p0: kotlin.FloatArray, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawLines(p0: Array, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawLines(p0: kotlin.FloatArray, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPolygon(p0: Array, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPolygon(p0: kotlin.FloatArray, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawLine(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawArc(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: boolean, p7: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawRect(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawOval(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawCircle(p0: number, p1: number, p2: number, p3: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawRRect(p0: io.github.humbleui.types.RRect, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + quickReject(p0: io.github.humbleui.types.Rect): boolean; + quickReject(p0: io.github.humbleui.skija.Path): boolean; + drawDRRect(p0: io.github.humbleui.types.RRect, p1: io.github.humbleui.types.RRect, p2: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawRectShadow(p0: io.github.humbleui.types.Rect, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.Canvas; + drawRectShadow(p0: io.github.humbleui.types.Rect, p1: number, p2: number, p3: number, p4: number, p5: number): io.github.humbleui.skija.Canvas; + drawRectShadowNoclip(p0: io.github.humbleui.types.Rect, p1: number, p2: number, p3: number, p4: number, p5: number): io.github.humbleui.skija.Canvas; + drawPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPathOnce(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawImage(p0: io.github.humbleui.skija.Image, p1: number, p2: number): io.github.humbleui.skija.Canvas; + drawImage(p0: io.github.humbleui.skija.Image, p1: number, p2: number, p3: io.github.humbleui.skija.Paint | null | undefined): io.github.humbleui.skija.Canvas; + drawImageRect(p0: io.github.humbleui.skija.Image, p1: io.github.humbleui.types.Rect): io.github.humbleui.skija.Canvas; + drawImageRect(p0: io.github.humbleui.skija.Image, p1: io.github.humbleui.types.Rect, p2: io.github.humbleui.skija.Paint | null | undefined): io.github.humbleui.skija.Canvas; + drawImageRect(p0: io.github.humbleui.skija.Image, p1: io.github.humbleui.types.Rect, p2: io.github.humbleui.types.Rect): io.github.humbleui.skija.Canvas; + drawImageRect(p0: io.github.humbleui.skija.Image, p1: io.github.humbleui.types.Rect, p2: io.github.humbleui.types.Rect, p3: io.github.humbleui.skija.Paint | null | undefined): io.github.humbleui.skija.Canvas; + drawImageRect(p0: io.github.humbleui.skija.Image, p1: io.github.humbleui.types.Rect, p2: io.github.humbleui.types.Rect, p3: io.github.humbleui.skija.Paint | null | undefined, p4: boolean): io.github.humbleui.skija.Canvas; + drawImageRect(p0: io.github.humbleui.skija.Image, p1: io.github.humbleui.types.Rect, p2: io.github.humbleui.types.Rect, p3: io.github.humbleui.skija.SamplingMode, p4: io.github.humbleui.skija.Paint | null | undefined, p5: boolean): io.github.humbleui.skija.Canvas; + drawImageNine(p0: io.github.humbleui.skija.Image, p1: io.github.humbleui.types.IRect, p2: io.github.humbleui.types.Rect, p3: io.github.humbleui.skija.FilterMode, p4: io.github.humbleui.skija.Paint | null | undefined): io.github.humbleui.skija.Canvas; + drawRegion(p0: io.github.humbleui.skija.Region, p1: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawString(p0: string, p1: number, p2: number, p3: io.github.humbleui.skija.Font, p4: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTextBlob(p0: io.github.humbleui.skija.TextBlob, p1: number, p2: number, p3: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTextLine(p0: io.github.humbleui.skija.TextLine, p1: number, p2: number, p3: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPicture(p0: io.github.humbleui.skija.Picture): io.github.humbleui.skija.Canvas; + drawPicture(p0: io.github.humbleui.skija.Picture, p1: io.github.humbleui.skija.Matrix33 | null | undefined, p2: io.github.humbleui.skija.Paint | null | undefined): io.github.humbleui.skija.Canvas; + drawTriangles(p0: Array, p1: Array, p2: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTriangles(p0: Array, p1: Array, p2: Array, p3: Array, p4: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTriangles(p0: Array, p1: Array, p2: Array, p3: Array, p4: io.github.humbleui.skija.BlendMode, p5: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTriangleStrip(p0: Array, p1: Array, p2: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTriangleStrip(p0: Array, p1: Array, p2: Array, p3: Array, p4: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTriangleStrip(p0: Array, p1: Array, p2: Array, p3: Array, p4: io.github.humbleui.skija.BlendMode, p5: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTriangleFan(p0: Array, p1: Array, p2: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTriangleFan(p0: Array, p1: Array, p2: Array, p3: Array, p4: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawTriangleFan(p0: Array, p1: Array, p2: Array, p3: Array, p4: io.github.humbleui.skija.BlendMode, p5: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPatch(p0: Array, p1: Array, p2: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPatch(p0: Array, p1: Array, p2: Array, p3: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawPatch(p0: Array, p1: Array, p2: Array, p3: io.github.humbleui.skija.BlendMode, p4: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + drawDrawable(p0: io.github.humbleui.skija.Drawable): io.github.humbleui.skija.Canvas; + drawDrawable(p0: io.github.humbleui.skija.Drawable, p1: number, p2: number): io.github.humbleui.skija.Canvas; + drawDrawable(p0: io.github.humbleui.skija.Drawable, p1: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Canvas; + drawColor(p0: number): io.github.humbleui.skija.Canvas; + drawColor(p0: number, p1: io.github.humbleui.skija.BlendMode): io.github.humbleui.skija.Canvas; + drawColor(p0: io.github.humbleui.skija.Color4f): io.github.humbleui.skija.Canvas; + drawColor(p0: io.github.humbleui.skija.Color4f, p1: io.github.humbleui.skija.BlendMode): io.github.humbleui.skija.Canvas; + clear(p0: number): io.github.humbleui.skija.Canvas; + drawPaint(p0: io.github.humbleui.skija.Paint): io.github.humbleui.skija.Canvas; + setMatrix(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.Canvas; + setMatrix(p0: io.github.humbleui.skija.Matrix44): io.github.humbleui.skija.Canvas; + resetMatrix(): io.github.humbleui.skija.Canvas; + getLocalToDevice(): io.github.humbleui.skija.Matrix44; + getLocalToDeviceAsMatrix33(): io.github.humbleui.skija.Matrix33; + clipRect(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.ClipMode, p2: boolean): io.github.humbleui.skija.Canvas; + clipRect(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.ClipMode): io.github.humbleui.skija.Canvas; + clipRect(p0: io.github.humbleui.types.Rect, p1: boolean): io.github.humbleui.skija.Canvas; + clipRect(p0: io.github.humbleui.types.Rect): io.github.humbleui.skija.Canvas; + clipRRect(p0: io.github.humbleui.types.RRect, p1: io.github.humbleui.skija.ClipMode, p2: boolean): io.github.humbleui.skija.Canvas; + clipRRect(p0: io.github.humbleui.types.RRect, p1: io.github.humbleui.skija.ClipMode): io.github.humbleui.skija.Canvas; + clipRRect(p0: io.github.humbleui.types.RRect, p1: boolean): io.github.humbleui.skija.Canvas; + clipRRect(p0: io.github.humbleui.types.RRect): io.github.humbleui.skija.Canvas; + clipPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.skija.ClipMode, p2: boolean): io.github.humbleui.skija.Canvas; + clipPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.skija.ClipMode): io.github.humbleui.skija.Canvas; + clipPath(p0: io.github.humbleui.skija.Path, p1: boolean): io.github.humbleui.skija.Canvas; + clipPath(p0: io.github.humbleui.skija.Path): io.github.humbleui.skija.Canvas; + clipRegion(p0: io.github.humbleui.skija.Region, p1: io.github.humbleui.skija.ClipMode): io.github.humbleui.skija.Canvas; + clipRegion(p0: io.github.humbleui.skija.Region): io.github.humbleui.skija.Canvas; + translate(p0: number, p1: number): io.github.humbleui.skija.Canvas; + scale(p0: number, p1: number): io.github.humbleui.skija.Canvas; + rotate(p0: number): io.github.humbleui.skija.Canvas; + skew(p0: number, p1: number): io.github.humbleui.skija.Canvas; + concat(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.Canvas; + concat(p0: io.github.humbleui.skija.Matrix44): io.github.humbleui.skija.Canvas; + readPixels(p0: io.github.humbleui.skija.Bitmap, p1: number, p2: number): boolean; + writePixels(p0: io.github.humbleui.skija.Bitmap, p1: number, p2: number): boolean; + save(): number; + saveLayer(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.skija.Paint | null | undefined): number; + saveLayer(p0: io.github.humbleui.types.Rect | null | undefined, p1: io.github.humbleui.skija.Paint | null | undefined): number; + saveLayer(p0: io.github.humbleui.skija.SaveLayerRec): number; + saveLayerAlpha(p0: io.github.humbleui.types.Rect | null | undefined, p1: number): number; + getSaveCount(): number; + restore(): io.github.humbleui.skija.Canvas; + restoreToCount(p0: number): io.github.humbleui.skija.Canvas; + invalidate(): void; + } + const SurfaceProps: { + new(p0: boolean, p1: number): io.github.humbleui.skija.SurfaceProps; + new(): io.github.humbleui.skija.SurfaceProps; + new(p0: io.github.humbleui.skija.PixelGeometry): io.github.humbleui.skija.SurfaceProps; + new(p0: boolean, p1: io.github.humbleui.skija.PixelGeometry): io.github.humbleui.skija.SurfaceProps; + } + interface SurfaceProps { + _deviceIndependentFonts: boolean; + _pixelGeometry: io.github.humbleui.skija.PixelGeometry; + _getFlags(): number; + _getPixelGeometryOrdinal(): number; + isDeviceIndependentFonts(): boolean; + getPixelGeometry(): io.github.humbleui.skija.PixelGeometry; + withDeviceIndependentFonts(p0: boolean): io.github.humbleui.skija.SurfaceProps; + withPixelGeometry(p0: io.github.humbleui.skija.PixelGeometry): io.github.humbleui.skija.SurfaceProps; + } + const PixelGeometry: { + UNKNOWN: io.github.humbleui.skija.PixelGeometry; + RGB_H: io.github.humbleui.skija.PixelGeometry; + BGR_H: io.github.humbleui.skija.PixelGeometry; + RGB_V: io.github.humbleui.skija.PixelGeometry; + BGR_V: io.github.humbleui.skija.PixelGeometry; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PixelGeometry; + } + interface PixelGeometry extends kotlin.Enum { + } + const Surface: { + new(p0: number): io.github.humbleui.skija.Surface; + new(p0: number, p1: io.github.humbleui.skija.DirectContext): io.github.humbleui.skija.Surface; + new(p0: number, p1: io.github.humbleui.skija.DirectContext, p2: io.github.humbleui.skija.BackendRenderTarget): io.github.humbleui.skija.Surface; + makeRasterDirect(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number): io.github.humbleui.skija.Surface; + makeRasterDirect(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number, p3: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + makeRasterDirect(p0: io.github.humbleui.skija.Pixmap): io.github.humbleui.skija.Surface; + makeRasterDirect(p0: io.github.humbleui.skija.Pixmap, p1: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + wrapPixels(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number): io.github.humbleui.skija.Surface; + wrapPixels(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number, p3: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + wrapPixels(p0: io.github.humbleui.skija.Pixmap): io.github.humbleui.skija.Surface; + wrapPixels(p0: io.github.humbleui.skija.Pixmap, p1: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + makeRaster(p0: io.github.humbleui.skija.ImageInfo): io.github.humbleui.skija.Surface; + makeRaster(p0: io.github.humbleui.skija.ImageInfo, p1: number): io.github.humbleui.skija.Surface; + makeRaster(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + makeFromBackendRenderTarget(p0: io.github.humbleui.skija.DirectContext, p1: io.github.humbleui.skija.BackendRenderTarget, p2: io.github.humbleui.skija.SurfaceOrigin, p3: io.github.humbleui.skija.ColorType, p4: io.github.humbleui.skija.ColorSpace): io.github.humbleui.skija.Surface; + makeFromBackendRenderTarget(p0: io.github.humbleui.skija.DirectContext, p1: io.github.humbleui.skija.BackendRenderTarget, p2: io.github.humbleui.skija.SurfaceOrigin, p3: io.github.humbleui.skija.ColorType, p4: io.github.humbleui.skija.ColorSpace, p5: io.github.humbleui.skija.SurfaceProps): io.github.humbleui.skija.Surface; + wrapBackendRenderTarget(p0: io.github.humbleui.skija.DirectContext, p1: io.github.humbleui.skija.BackendRenderTarget, p2: io.github.humbleui.skija.SurfaceOrigin, p3: io.github.humbleui.skija.ColorType, p4: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.Surface; + wrapBackendRenderTarget(p0: io.github.humbleui.skija.DirectContext, p1: io.github.humbleui.skija.BackendRenderTarget, p2: io.github.humbleui.skija.SurfaceOrigin, p3: io.github.humbleui.skija.ColorType, p4: io.github.humbleui.skija.ColorSpace | null | undefined, p5: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + makeFromMTKView(p0: io.github.humbleui.skija.DirectContext, p1: number, p2: io.github.humbleui.skija.SurfaceOrigin, p3: number, p4: io.github.humbleui.skija.ColorType, p5: io.github.humbleui.skija.ColorSpace | null | undefined, p6: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + wrapMTKView(p0: io.github.humbleui.skija.DirectContext, p1: number, p2: io.github.humbleui.skija.SurfaceOrigin, p3: number, p4: io.github.humbleui.skija.ColorType, p5: io.github.humbleui.skija.ColorSpace | null | undefined, p6: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + makeRasterN32Premul(p0: number, p1: number): io.github.humbleui.skija.Surface; + makeRenderTarget(p0: io.github.humbleui.skija.DirectContext, p1: boolean, p2: io.github.humbleui.skija.ImageInfo): io.github.humbleui.skija.Surface; + makeRenderTarget(p0: io.github.humbleui.skija.DirectContext, p1: boolean, p2: io.github.humbleui.skija.ImageInfo, p3: number, p4: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + makeRenderTarget(p0: io.github.humbleui.skija.DirectContext, p1: boolean, p2: io.github.humbleui.skija.ImageInfo, p3: number, p4: io.github.humbleui.skija.SurfaceOrigin, p5: io.github.humbleui.skija.SurfaceProps | null | undefined): io.github.humbleui.skija.Surface; + makeRenderTarget(p0: io.github.humbleui.skija.DirectContext, p1: boolean, p2: io.github.humbleui.skija.ImageInfo, p3: number, p4: io.github.humbleui.skija.SurfaceOrigin, p5: io.github.humbleui.skija.SurfaceProps | null | undefined, p6: boolean): io.github.humbleui.skija.Surface; + makeNull(p0: number, p1: number): io.github.humbleui.skija.Surface; + _nWrapPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.SurfaceProps): number; + _nWrapPixelsPixmap(p0: number, p1: io.github.humbleui.skija.SurfaceProps): number; + _nMakeRaster(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.SurfaceProps): number; + _nWrapBackendRenderTarget(p0: number, p1: number, p2: number, p3: number, p4: number, p5: io.github.humbleui.skija.SurfaceProps): number; + _nWrapMTKView(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.SurfaceProps): number; + _nMakeRenderTarget(p0: number, p1: boolean, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: io.github.humbleui.skija.SurfaceProps, p10: boolean): number; + _nMakeNull(p0: number, p1: number): number; + _nGetWidth(p0: number): number; + _nGetHeight(p0: number): number; + _nGetImageInfo(p0: number): io.github.humbleui.skija.ImageInfo; + _nGenerationId(p0: number): number; + _nNotifyContentWillChange(p0: number, p1: number): void; + _nGetRecordingContext(p0: number): number; + _nGetCanvas(p0: number): number; + _nMakeSurfaceI(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nMakeSurface(p0: number, p1: number, p2: number): number; + _nMakeImageSnapshot(p0: number): number; + _nMakeImageSnapshotR(p0: number, p1: number, p2: number, p3: number, p4: number): number; + _nDraw(p0: number, p1: number, p2: number, p3: number, p4: number): void; + _nPeekPixels(p0: number, p1: number): boolean; + _nReadPixelsToPixmap(p0: number, p1: number, p2: number, p3: number): boolean; + _nReadPixels(p0: number, p1: number, p2: number, p3: number): boolean; + _nWritePixelsFromPixmap(p0: number, p1: number, p2: number, p3: number): void; + _nWritePixels(p0: number, p1: number, p2: number, p3: number): void; + _nUnique(p0: number): boolean; + } + interface Surface extends io.github.humbleui.skija.impl.RefCnt { + _canvas: io.github.humbleui.skija.Canvas; + _context: io.github.humbleui.skija.DirectContext; + _renderTarget: io.github.humbleui.skija.BackendRenderTarget; + getWidth(): number; + getHeight(): number; + getImageInfo(): io.github.humbleui.skija.ImageInfo; + getGenerationId(): number; + notifyContentWillChange(p0: io.github.humbleui.skija.ContentChangeMode): void; + getRecordingContext(): io.github.humbleui.skija.DirectContext | null | undefined; + getCanvas(): io.github.humbleui.skija.Canvas; + makeSurface(p0: io.github.humbleui.skija.ImageInfo): io.github.humbleui.skija.Surface | null | undefined; + makeSurface(p0: number, p1: number): io.github.humbleui.skija.Surface | null | undefined; + makeImageSnapshot(): io.github.humbleui.skija.Image; + makeImageSnapshot(p0: io.github.humbleui.types.IRect): io.github.humbleui.skija.Image | null | undefined; + draw(p0: io.github.humbleui.skija.Canvas, p1: number, p2: number, p3: io.github.humbleui.skija.Paint): void; + peekPixels(p0: io.github.humbleui.skija.Pixmap): boolean; + readPixels(p0: io.github.humbleui.skija.Pixmap, p1: number, p2: number): boolean; + readPixels(p0: io.github.humbleui.skija.Bitmap, p1: number, p2: number): boolean; + writePixels(p0: io.github.humbleui.skija.Pixmap, p1: number, p2: number): void; + writePixels(p0: io.github.humbleui.skija.Bitmap, p1: number, p2: number): void; + isUnique(): boolean; + } + const DirectContext: { + new(p0: number): io.github.humbleui.skija.DirectContext; + makeGL(): io.github.humbleui.skija.DirectContext; + makeMetal(p0: number, p1: number): io.github.humbleui.skija.DirectContext; + makeDirect3D(p0: number, p1: number, p2: number): io.github.humbleui.skija.DirectContext; + makeVulkan(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): io.github.humbleui.skija.DirectContext; + _nMakeGL(): number; + _nMakeMetal(p0: number, p1: number): number; + _nMakeDirect3D(p0: number, p1: number, p2: number): number; + _nMakeVulkan(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): number; + _nFlush(p0: number): void; + _nSubmit(p0: number, p1: boolean): boolean; + _nFlushAndSubmit(p0: number, p1: boolean): void; + _nFlushSurface(p0: number, p1: number): void; + _nFlushAndSubmitSurface(p0: number, p1: number, p2: boolean): void; + _nReset(p0: number, p1: number): void; + _nAbandon(p0: number): void; + } + interface DirectContext extends io.github.humbleui.skija.impl.RefCnt { + flush(): io.github.humbleui.skija.DirectContext; + flush(p0: io.github.humbleui.skija.Surface): io.github.humbleui.skija.DirectContext; + submit(): boolean; + submit(p0: boolean): boolean; + flushAndSubmit(p0: boolean): io.github.humbleui.skija.DirectContext; + flushAndSubmit(p0: io.github.humbleui.skija.Surface): io.github.humbleui.skija.DirectContext; + flushAndSubmit(p0: io.github.humbleui.skija.Surface, p1: boolean): io.github.humbleui.skija.DirectContext; + resetAll(): io.github.humbleui.skija.DirectContext; + resetGLAll(): io.github.humbleui.skija.DirectContext; + reset(p0: io.github.humbleui.skija.BackendState): io.github.humbleui.skija.DirectContext; + abandon(): void; + } + const BackendState: { + GL_RENDER_TARGET: io.github.humbleui.skija.BackendState; + GL_TEXTURE_BINDING: io.github.humbleui.skija.BackendState; + GL_VIEW: io.github.humbleui.skija.BackendState; + GL_BLEND: io.github.humbleui.skija.BackendState; + GL_MSAA_ENABLE: io.github.humbleui.skija.BackendState; + GL_VERTEX: io.github.humbleui.skija.BackendState; + GL_STENCIL: io.github.humbleui.skija.BackendState; + GL_PIXEL_STORE: io.github.humbleui.skija.BackendState; + GL_PROGRAM: io.github.humbleui.skija.BackendState; + GL_FIXED_FUNCTION: io.github.humbleui.skija.BackendState; + GL_MISC: io.github.humbleui.skija.BackendState; + GL_ALL: io.github.humbleui.skija.BackendState; + ALL: io.github.humbleui.skija.BackendState; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.BackendState; + } + interface BackendState extends kotlin.Enum { + _value: number; + getValue(): number; + } + const BackendRenderTarget: { + _FinalizerHolder: typeof io.github.humbleui.skija.BackendRenderTarget$_FinalizerHolder; + new(p0: number): io.github.humbleui.skija.BackendRenderTarget; + makeGL(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): io.github.humbleui.skija.BackendRenderTarget; + makeMetal(p0: number, p1: number, p2: number): io.github.humbleui.skija.BackendRenderTarget; + makeDirect3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): io.github.humbleui.skija.BackendRenderTarget; + makeVulkan(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): io.github.humbleui.skija.BackendRenderTarget; + _nGetFinalizer(): number; + _nMakeGL(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nMakeMetal(p0: number, p1: number, p2: number): number; + _nMakeDirect3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nMakeVulkan(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): number; + } + interface BackendRenderTarget extends io.github.humbleui.skija.impl.Managed { + } + const BackendRenderTarget$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.BackendRenderTarget$_FinalizerHolder; + } + interface BackendRenderTarget$_FinalizerHolder { + } + const ImageInfo: { + DEFAULT: io.github.humbleui.skija.ImageInfo; + new(p0: number, p1: number, p2: io.github.humbleui.skija.ColorType, p3: io.github.humbleui.skija.ColorAlphaType): io.github.humbleui.skija.ImageInfo; + new(p0: number, p1: number, p2: io.github.humbleui.skija.ColorType, p3: io.github.humbleui.skija.ColorAlphaType, p4: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.ImageInfo; + new(p0: number, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.ImageInfo; + new(p0: io.github.humbleui.skija.ColorInfo, p1: number, p2: number): io.github.humbleui.skija.ImageInfo; + makeN32(p0: number, p1: number, p2: io.github.humbleui.skija.ColorAlphaType): io.github.humbleui.skija.ImageInfo; + makeN32(p0: number, p1: number, p2: io.github.humbleui.skija.ColorAlphaType, p3: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.ImageInfo; + makeS32(p0: number, p1: number, p2: io.github.humbleui.skija.ColorAlphaType): io.github.humbleui.skija.ImageInfo; + makeN32Premul(p0: number, p1: number): io.github.humbleui.skija.ImageInfo; + makeN32Premul(p0: number, p1: number, p2: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.ImageInfo; + makeA8(p0: number, p1: number): io.github.humbleui.skija.ImageInfo; + makeUnknown(p0: number, p1: number): io.github.humbleui.skija.ImageInfo; + } + interface ImageInfo { + _colorInfo: io.github.humbleui.skija.ColorInfo; + _width: number; + _height: number; + getColorType(): io.github.humbleui.skija.ColorType; + withColorType(p0: io.github.humbleui.skija.ColorType): io.github.humbleui.skija.ImageInfo; + getColorAlphaType(): io.github.humbleui.skija.ColorAlphaType; + withColorAlphaType(p0: io.github.humbleui.skija.ColorAlphaType): io.github.humbleui.skija.ImageInfo; + getColorSpace(): io.github.humbleui.skija.ColorSpace | null | undefined; + withColorSpace(p0: io.github.humbleui.skija.ColorSpace): io.github.humbleui.skija.ImageInfo; + isEmpty(): boolean; + isOpaque(): boolean; + getBounds(): io.github.humbleui.types.IRect; + isGammaCloseToSRGB(): boolean; + withWidthHeight(p0: number, p1: number): io.github.humbleui.skija.ImageInfo; + getBytesPerPixel(): number; + getShiftPerPixel(): number; + getMinRowBytes(): number; + computeOffset(p0: number, p1: number, p2: number): number; + computeByteSize(p0: number): number; + computeMinByteSize(): number; + isRowBytesValid(p0: number): boolean; + getColorInfo(): io.github.humbleui.skija.ColorInfo; + getWidth(): number; + getHeight(): number; + withColorInfo(p0: io.github.humbleui.skija.ColorInfo): io.github.humbleui.skija.ImageInfo; + withWidth(p0: number): io.github.humbleui.skija.ImageInfo; + withHeight(p0: number): io.github.humbleui.skija.ImageInfo; + } + const ColorInfo: { + DEFAULT: io.github.humbleui.skija.ColorInfo; + new(p0: io.github.humbleui.skija.ColorType, p1: io.github.humbleui.skija.ColorAlphaType, p2: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.ColorInfo; + } + interface ColorInfo { + _colorType: io.github.humbleui.skija.ColorType; + _alphaType: io.github.humbleui.skija.ColorAlphaType; + _colorSpace: io.github.humbleui.skija.ColorSpace | null | undefined; + isOpaque(): boolean; + getBytesPerPixel(): number; + getShiftPerPixel(): number; + isGammaCloseToSRGB(): boolean; + getColorType(): io.github.humbleui.skija.ColorType; + getAlphaType(): io.github.humbleui.skija.ColorAlphaType; + getColorSpace(): io.github.humbleui.skija.ColorSpace | null | undefined; + withColorType(p0: io.github.humbleui.skija.ColorType): io.github.humbleui.skija.ColorInfo; + withAlphaType(p0: io.github.humbleui.skija.ColorAlphaType): io.github.humbleui.skija.ColorInfo; + withColorSpace(p0: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.ColorInfo; + } + const ColorType: { + UNKNOWN: io.github.humbleui.skija.ColorType; + ALPHA_8: io.github.humbleui.skija.ColorType; + RGB_565: io.github.humbleui.skija.ColorType; + ARGB_4444: io.github.humbleui.skija.ColorType; + RGBA_8888: io.github.humbleui.skija.ColorType; + RGB_888X: io.github.humbleui.skija.ColorType; + BGRA_8888: io.github.humbleui.skija.ColorType; + RGBA_1010102: io.github.humbleui.skija.ColorType; + BGRA_1010102: io.github.humbleui.skija.ColorType; + RGB_101010X: io.github.humbleui.skija.ColorType; + BGR_101010X: io.github.humbleui.skija.ColorType; + BGR_101010X_XR: io.github.humbleui.skija.ColorType; + BGRA_10101010_XR: io.github.humbleui.skija.ColorType; + RGBA_10X6: io.github.humbleui.skija.ColorType; + GRAY_8: io.github.humbleui.skija.ColorType; + RGBA_F16NORM: io.github.humbleui.skija.ColorType; + RGBA_F16: io.github.humbleui.skija.ColorType; + RGB_F16F16F16X: io.github.humbleui.skija.ColorType; + RGBA_F32: io.github.humbleui.skija.ColorType; + R8G8_UNORM: io.github.humbleui.skija.ColorType; + A16_FLOAT: io.github.humbleui.skija.ColorType; + R16G16_FLOAT: io.github.humbleui.skija.ColorType; + A16_UNORM: io.github.humbleui.skija.ColorType; + R16G16_UNORM: io.github.humbleui.skija.ColorType; + R16G16B16A16_UNORM: io.github.humbleui.skija.ColorType; + SRGBA_8888: io.github.humbleui.skija.ColorType; + R8_UNORM: io.github.humbleui.skija.ColorType; + N32: io.github.humbleui.skija.ColorType; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.ColorType; + } + interface ColorType extends kotlin.Enum { + getBytesPerPixel(): number; + getShiftPerPixel(): number; + isAlwaysOpaque(): boolean; + isAlphaOnly(): boolean; + validateAlphaType(p0: io.github.humbleui.skija.ColorAlphaType): io.github.humbleui.skija.ColorAlphaType | null | undefined; + getChannelFlags(): number; + getNumChannels(): number; + computeOffset(p0: number, p1: number, p2: number): number; + getR(p0: number): number; + getR(p0: number): number; + getR(p0: number): number; + getG(p0: number): number; + getG(p0: number): number; + getG(p0: number): number; + getB(p0: number): number; + getB(p0: number): number; + getB(p0: number): number; + getA(p0: number): number; + getA(p0: number): number; + getA(p0: number): number; + } + const ColorAlphaType: { + UNKNOWN: io.github.humbleui.skija.ColorAlphaType; + OPAQUE: io.github.humbleui.skija.ColorAlphaType; + PREMUL: io.github.humbleui.skija.ColorAlphaType; + UNPREMUL: io.github.humbleui.skija.ColorAlphaType; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.ColorAlphaType; + } + interface ColorAlphaType extends kotlin.Enum { + } + const ColorSpace: { + _FinalizerHolder: typeof io.github.humbleui.skija.ColorSpace$_FinalizerHolder; + _DisplayP3Holder: typeof io.github.humbleui.skija.ColorSpace$_DisplayP3Holder; + _SRGBLinearHolder: typeof io.github.humbleui.skija.ColorSpace$_SRGBLinearHolder; + _SRGBHolder: typeof io.github.humbleui.skija.ColorSpace$_SRGBHolder; + new(p0: number): io.github.humbleui.skija.ColorSpace; + new(p0: number, p1: boolean): io.github.humbleui.skija.ColorSpace; + getSRGB(): io.github.humbleui.skija.ColorSpace; + getSRGBLinear(): io.github.humbleui.skija.ColorSpace; + getDisplayP3(): io.github.humbleui.skija.ColorSpace; + makeRGB(p0: io.github.humbleui.skija.TransferFunction, p1: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.ColorSpace | null | undefined; + makeCICP(p0: io.github.humbleui.skija.ColorSpaceNamedPrimaries, p1: io.github.humbleui.skija.ColorSpaceNamedTransferFn): io.github.humbleui.skija.ColorSpace | null | undefined; + makeFromData(p0: io.github.humbleui.skija.Data): io.github.humbleui.skija.ColorSpace | null | undefined; + makeFromICCProfile(p0: Array): io.github.humbleui.skija.ColorSpace | null | undefined; + _nGetFinalizer(): number; + _nMakeSRGB(): number; + _nMakeDisplayP3(): number; + _nMakeSRGBLinear(): number; + _nMakeRGB(p0: io.github.humbleui.skija.TransferFunction, p1: kotlin.FloatArray): number; + _nMakeCICP(p0: number, p1: number): number; + _nConvert(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): kotlin.FloatArray; + _nIsGammaCloseToSRGB(p0: number): boolean; + _nIsGammaLinear(p0: number): boolean; + _nIsSRGB(p0: number): boolean; + _nGetNumericalTransferFn(p0: number): io.github.humbleui.skija.TransferFunction; + _nGetToXYZD50(p0: number): kotlin.FloatArray; + _nGetToXYZD50Hash(p0: number): number; + _nGetTransferFnHash(p0: number): number; + _nGetHash(p0: number): number; + _nMakeLinearGamma(p0: number): number; + _nMakeSRGBGamma(p0: number): number; + _nMakeColorSpin(p0: number): number; + _nSerializeToData(p0: number): number; + _nMakeFromData(p0: number): number; + _nTransferFn(p0: number): io.github.humbleui.skija.TransferFunction; + _nInvTransferFn(p0: number): io.github.humbleui.skija.TransferFunction; + _nGamutTransformTo(p0: number, p1: number): kotlin.FloatArray; + _nEquals(p0: number, p1: number): boolean; + _nMakeFromICCProfile(p0: Array): number; + } + interface ColorSpace extends io.github.humbleui.skija.impl.Managed { + convert(p0: io.github.humbleui.skija.ColorSpace, p1: io.github.humbleui.skija.Color4f): io.github.humbleui.skija.Color4f; + isGammaCloseToSRGB(): boolean; + isGammaLinear(): boolean; + isSRGB(): boolean; + getNumericalTransferFn(): io.github.humbleui.skija.TransferFunction | null | undefined; + getToXYZD50(): io.github.humbleui.skija.Matrix33 | null | undefined; + getToXYZD50Hash(): number; + getTransferFnHash(): number; + getHash(): number; + makeLinearGamma(): io.github.humbleui.skija.ColorSpace; + makeSRGBGamma(): io.github.humbleui.skija.ColorSpace; + makeColorSpin(): io.github.humbleui.skija.ColorSpace; + serializeToData(): io.github.humbleui.skija.Data; + getTransferFn(): io.github.humbleui.skija.TransferFunction; + getInvTransferFn(): io.github.humbleui.skija.TransferFunction; + getGamutTransformTo(p0: io.github.humbleui.skija.ColorSpace): io.github.humbleui.skija.Matrix33; + } + const Color4f: { + new(p0: number, p1: number, p2: number): io.github.humbleui.skija.Color4f; + new(p0: kotlin.FloatArray): io.github.humbleui.skija.Color4f; + new(p0: number): io.github.humbleui.skija.Color4f; + new(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.skija.Color4f; + flattenArray(p0: Array): kotlin.FloatArray; + } + interface Color4f { + _r: number; + _g: number; + _b: number; + _a: number; + toColor(): number; + flatten(): kotlin.FloatArray; + premultiply(): io.github.humbleui.skija.Color4f; + unpremultiply(): io.github.humbleui.skija.Color4f; + makeLerp(p0: io.github.humbleui.skija.Color4f, p1: number): io.github.humbleui.skija.Color4f; + makeLerpPM(p0: io.github.humbleui.skija.Color4f, p1: number): io.github.humbleui.skija.Color4f; + getR(): number; + getG(): number; + getB(): number; + getA(): number; + withR(p0: number): io.github.humbleui.skija.Color4f; + withG(p0: number): io.github.humbleui.skija.Color4f; + withB(p0: number): io.github.humbleui.skija.Color4f; + withA(p0: number): io.github.humbleui.skija.Color4f; + } + const TransferFunction: { + new(p0: kotlin.FloatArray): io.github.humbleui.skija.TransferFunction; + new(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): io.github.humbleui.skija.TransferFunction; + } + interface TransferFunction { + _g: number; + _a: number; + _b: number; + _c: number; + _d: number; + _e: number; + _f: number; + getG(): number; + getA(): number; + getB(): number; + getC(): number; + getD(): number; + getE(): number; + getF(): number; + withG(p0: number): io.github.humbleui.skija.TransferFunction; + withA(p0: number): io.github.humbleui.skija.TransferFunction; + withB(p0: number): io.github.humbleui.skija.TransferFunction; + withC(p0: number): io.github.humbleui.skija.TransferFunction; + withD(p0: number): io.github.humbleui.skija.TransferFunction; + withE(p0: number): io.github.humbleui.skija.TransferFunction; + withF(p0: number): io.github.humbleui.skija.TransferFunction; + } + const Matrix33: { + IDENTITY: io.github.humbleui.skija.Matrix33; + new(p0: number): io.github.humbleui.skija.Matrix33; + makeTranslate(p0: number, p1: number): io.github.humbleui.skija.Matrix33; + makeScale(p0: number): io.github.humbleui.skija.Matrix33; + makeScale(p0: number, p1: number): io.github.humbleui.skija.Matrix33; + makeRotate(p0: number): io.github.humbleui.skija.Matrix33; + makeRotate(p0: number, p1: io.github.humbleui.types.Point): io.github.humbleui.skija.Matrix33; + makeRotate(p0: number, p1: number, p2: number): io.github.humbleui.skija.Matrix33; + makeSkew(p0: number, p1: number): io.github.humbleui.skija.Matrix33; + } + interface Matrix33 { + _mat: kotlin.FloatArray; + makePreScale(p0: number, p1: number): io.github.humbleui.skija.Matrix33; + makeConcat(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.Matrix33; + asMatrix44(): io.github.humbleui.skija.Matrix44; + getMat(): kotlin.FloatArray; + } + const Matrix44: { + IDENTITY: io.github.humbleui.skija.Matrix44; + new(p0: number): io.github.humbleui.skija.Matrix44; + } + interface Matrix44 { + _mat: kotlin.FloatArray; + asMatrix33(): io.github.humbleui.skija.Matrix33; + getMat(): kotlin.FloatArray; + } + const Data: { + _FinalizerHolder: typeof io.github.humbleui.skija.Data$_FinalizerHolder; + new(p0: number): io.github.humbleui.skija.Data; + makeFromBytes(p0: Array): io.github.humbleui.skija.Data; + makeFromBytes(p0: Array, p1: number, p2: number): io.github.humbleui.skija.Data; + makeFromFileName(p0: string): io.github.humbleui.skija.Data | null | undefined; + makeEmpty(): io.github.humbleui.skija.Data; + _nGetFinalizer(): number; + _nSize(p0: number): number; + _nBytes(p0: number, p1: number, p2: number): Array; + _nEquals(p0: number, p1: number): boolean; + _nToByteBuffer(p0: number): java.nio.ByteBuffer; + _nMakeFromBytes(p0: Array, p1: number, p2: number): number; + _nMakeFromFileName(p0: string): number; + _nMakeSubset(p0: number, p1: number, p2: number): number; + _nMakeEmpty(): number; + } + interface Data extends io.github.humbleui.skija.impl.Managed { + getSize(): number; + getBytes(): Array; + getBytes(p0: number, p1: number): Array; + makeSubset(p0: number, p1: number): io.github.humbleui.skija.Data; + makeCopy(): io.github.humbleui.skija.Data; + toByteBuffer(): java.nio.ByteBuffer; + } + const Data$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.Data$_FinalizerHolder; + } + interface Data$_FinalizerHolder { + } + const ColorSpaceNamedPrimaries: { + REC709: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + REC470_SYSTEM_M: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + REC470_SYSTEM_BG: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + REC601: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + SMPTE_ST_240: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + GENERIC_FILM: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + REC2020: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + SMPTE_ST_428_1: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + SMPTE_RP_431_2: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + SMPTE_EG_432_1: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + ITU_T_H273_VALUE22: io.github.humbleui.skija.ColorSpaceNamedPrimaries; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.ColorSpaceNamedPrimaries; + } + interface ColorSpaceNamedPrimaries extends kotlin.Enum { + _value: number; + } + const ColorSpaceNamedTransferFn: { + REC709: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + REC470_SYSTEM_M: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + REC470_SYSTEM_BG: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + REC601: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + SMPTE_ST_240: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + LINEAR: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + IEC61966_2_4: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + SRGB: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + REC2020_10BIT: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + REC2020_12BIT: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + PQ: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + SMPTE_ST_428_1: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + HLG: io.github.humbleui.skija.ColorSpaceNamedTransferFn; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.ColorSpaceNamedTransferFn; + } + interface ColorSpaceNamedTransferFn extends kotlin.Enum { + _value: number; + } + const ColorSpace$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.ColorSpace$_FinalizerHolder; + } + interface ColorSpace$_FinalizerHolder { + } + const ColorSpace$_DisplayP3Holder: { + INSTANCE: io.github.humbleui.skija.ColorSpace; + new(): io.github.humbleui.skija.ColorSpace$_DisplayP3Holder; + } + interface ColorSpace$_DisplayP3Holder { + } + const ColorSpace$_SRGBLinearHolder: { + INSTANCE: io.github.humbleui.skija.ColorSpace; + new(): io.github.humbleui.skija.ColorSpace$_SRGBLinearHolder; + } + interface ColorSpace$_SRGBLinearHolder { + } + const ColorSpace$_SRGBHolder: { + INSTANCE: io.github.humbleui.skija.ColorSpace; + new(): io.github.humbleui.skija.ColorSpace$_SRGBHolder; + } + interface ColorSpace$_SRGBHolder { + } + const ContentChangeMode: { + DISCARD: io.github.humbleui.skija.ContentChangeMode; + RETAIN: io.github.humbleui.skija.ContentChangeMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.ContentChangeMode; + } + interface ContentChangeMode extends kotlin.Enum { + } + const Image: { + new(p0: number): io.github.humbleui.skija.Image; + makeRaster(p0: io.github.humbleui.skija.ImageInfo, p1: Array, p2: number): io.github.humbleui.skija.Image; + makeRaster(p0: io.github.humbleui.skija.ImageInfo, p1: io.github.humbleui.skija.Data, p2: number): io.github.humbleui.skija.Image; + adoptGLTextureFrom(p0: io.github.humbleui.skija.DirectContext, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.SurfaceOrigin, p7: io.github.humbleui.skija.ColorType): io.github.humbleui.skija.Image; + makeRasterFromBytes(p0: io.github.humbleui.skija.ImageInfo, p1: Array, p2: number): io.github.humbleui.skija.Image; + makeRasterFromData(p0: io.github.humbleui.skija.ImageInfo, p1: io.github.humbleui.skija.Data, p2: number): io.github.humbleui.skija.Image; + makeFromBitmap(p0: io.github.humbleui.skija.Bitmap): io.github.humbleui.skija.Image; + makeRasterFromBitmap(p0: io.github.humbleui.skija.Bitmap): io.github.humbleui.skija.Image; + makeFromPixmap(p0: io.github.humbleui.skija.Pixmap): io.github.humbleui.skija.Image; + makeRasterFromPixmap(p0: io.github.humbleui.skija.Pixmap): io.github.humbleui.skija.Image; + makeFromEncoded(p0: Array): io.github.humbleui.skija.Image; + makeDeferredFromEncodedBytes(p0: Array): io.github.humbleui.skija.Image; + makeWithFilter(p0: io.github.humbleui.skija.ImageFilter, p1: io.github.humbleui.skija.Image, p2: io.github.humbleui.types.IRect, p3: io.github.humbleui.types.IRect): io.github.humbleui.skija.ImageWithFilterResult | null | undefined; + makeWithFilter(p0: io.github.humbleui.skija.DirectContext, p1: io.github.humbleui.skija.ImageFilter, p2: io.github.humbleui.skija.Image, p3: io.github.humbleui.types.IRect, p4: io.github.humbleui.types.IRect): io.github.humbleui.skija.ImageWithFilterResult | null | undefined; + _nAdoptGLTextureFrom(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): number; + _nMakeRasterFromBytes(p0: number, p1: number, p2: number, p3: number, p4: number, p5: Array, p6: number): number; + _nMakeRasterFromData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): number; + _nMakeRasterFromBitmap(p0: number): number; + _nMakeRasterFromPixmap(p0: number): number; + _nMakeDeferredFromEncodedBytes(p0: Array): number; + _nGetImageInfo(p0: number): io.github.humbleui.skija.ImageInfo; + _nMakeShader(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): number; + _nPeekPixels(p0: number): java.nio.ByteBuffer; + _nPeekPixelsToPixmap(p0: number, p1: number): boolean; + _nScalePixels(p0: number, p1: number, p2: number, p3: boolean): boolean; + _nMakeScaled(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): number; + _nMakeSubset(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nReadPixelsBitmap(p0: number, p1: number, p2: number, p3: number, p4: number, p5: boolean): boolean; + _nReadPixelsPixmap(p0: number, p1: number, p2: number, p3: number, p4: boolean): boolean; + _nMakeWithFilter(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): io.github.humbleui.skija.ImageWithFilterResult; + _nMakeWithFilterContext(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): io.github.humbleui.skija.ImageWithFilterResult; + } + interface Image extends io.github.humbleui.skija.impl.RefCnt, io.github.humbleui.skija.IHasImageInfo { + _imageInfo: io.github.humbleui.skija.ImageInfo; + encodeToData(): io.github.humbleui.skija.Data; + encodeToData(p0: io.github.humbleui.skija.EncodedImageFormat): io.github.humbleui.skija.Data; + encodeToData(p0: io.github.humbleui.skija.EncodedImageFormat, p1: number): io.github.humbleui.skija.Data; + makeShader(): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode, p2: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode, p2: io.github.humbleui.skija.SamplingMode, p3: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + peekPixels(): java.nio.ByteBuffer | null | undefined; + peekPixels(p0: io.github.humbleui.skija.Pixmap): boolean; + readPixels(p0: io.github.humbleui.skija.Bitmap): boolean; + readPixels(p0: io.github.humbleui.skija.Bitmap, p1: number, p2: number): boolean; + readPixels(p0: io.github.humbleui.skija.DirectContext | null | undefined, p1: io.github.humbleui.skija.Bitmap, p2: number, p3: number, p4: boolean): boolean; + readPixels(p0: io.github.humbleui.skija.Pixmap, p1: number, p2: number, p3: boolean): boolean; + scalePixels(p0: io.github.humbleui.skija.Pixmap, p1: io.github.humbleui.skija.SamplingMode, p2: boolean): boolean; + makeScaled(p0: io.github.humbleui.skija.ImageInfo, p1: io.github.humbleui.skija.SamplingMode): io.github.humbleui.skija.Image | null | undefined; + makeSubset(p0: io.github.humbleui.types.IRect): io.github.humbleui.skija.Image | null | undefined; + makeSubset(p0: io.github.humbleui.skija.DirectContext | null | undefined, p1: io.github.humbleui.types.IRect): io.github.humbleui.skija.Image | null | undefined; + } + interface IHasImageInfo { + getImageInfo(): io.github.humbleui.skija.ImageInfo; + getWidth(): number; + getHeight(): number; + getColorInfo(): io.github.humbleui.skija.ColorInfo; + getColorType(): io.github.humbleui.skija.ColorType; + getAlphaType(): io.github.humbleui.skija.ColorAlphaType; + getColorSpace(): io.github.humbleui.skija.ColorSpace | null | undefined; + getBytesPerPixel(): number; + getShiftPerPixel(): number; + isEmpty(): boolean; + isOpaque(): boolean; + } + const EncodedImageFormat: { + BMP: io.github.humbleui.skija.EncodedImageFormat; + GIF: io.github.humbleui.skija.EncodedImageFormat; + ICO: io.github.humbleui.skija.EncodedImageFormat; + JPEG: io.github.humbleui.skija.EncodedImageFormat; + PNG: io.github.humbleui.skija.EncodedImageFormat; + WBMP: io.github.humbleui.skija.EncodedImageFormat; + WEBP: io.github.humbleui.skija.EncodedImageFormat; + PKM: io.github.humbleui.skija.EncodedImageFormat; + KTX: io.github.humbleui.skija.EncodedImageFormat; + ASTC: io.github.humbleui.skija.EncodedImageFormat; + DNG: io.github.humbleui.skija.EncodedImageFormat; + HEIF: io.github.humbleui.skija.EncodedImageFormat; + AVIF: io.github.humbleui.skija.EncodedImageFormat; + JPEGXL: io.github.humbleui.skija.EncodedImageFormat; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.EncodedImageFormat; + } + interface EncodedImageFormat extends kotlin.Enum { + } + const Shader: { + new(p0: number): io.github.humbleui.skija.Shader; + makeLinearGradient(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: Array): io.github.humbleui.skija.Shader; + makeLinearGradient(p0: number, p1: number, p2: number, p3: number, p4: Array): io.github.humbleui.skija.Shader; + makeLinearGradient(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: Array, p3: kotlin.FloatArray): io.github.humbleui.skija.Shader; + makeLinearGradient(p0: number, p1: number, p2: number, p3: number, p4: Array, p5: kotlin.FloatArray): io.github.humbleui.skija.Shader; + makeLinearGradient(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: Array, p3: kotlin.FloatArray, p4: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeLinearGradient(p0: number, p1: number, p2: number, p3: number, p4: Array, p5: kotlin.FloatArray, p6: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeLinearGradient(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: Array, p3: io.github.humbleui.skija.ColorSpace, p4: kotlin.FloatArray, p5: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeLinearGradient(p0: number, p1: number, p2: number, p3: number, p4: Array, p5: io.github.humbleui.skija.ColorSpace, p6: kotlin.FloatArray, p7: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeRadialGradient(p0: io.github.humbleui.types.Point, p1: number, p2: Array): io.github.humbleui.skija.Shader; + makeRadialGradient(p0: number, p1: number, p2: number, p3: Array): io.github.humbleui.skija.Shader; + makeRadialGradient(p0: io.github.humbleui.types.Point, p1: number, p2: Array, p3: kotlin.FloatArray): io.github.humbleui.skija.Shader; + makeRadialGradient(p0: number, p1: number, p2: number, p3: Array, p4: kotlin.FloatArray): io.github.humbleui.skija.Shader; + makeRadialGradient(p0: io.github.humbleui.types.Point, p1: number, p2: Array, p3: kotlin.FloatArray, p4: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeRadialGradient(p0: number, p1: number, p2: number, p3: Array, p4: kotlin.FloatArray, p5: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeRadialGradient(p0: io.github.humbleui.types.Point, p1: number, p2: Array, p3: io.github.humbleui.skija.ColorSpace, p4: kotlin.FloatArray, p5: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeRadialGradient(p0: number, p1: number, p2: number, p3: Array, p4: io.github.humbleui.skija.ColorSpace, p5: kotlin.FloatArray, p6: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeTwoPointConicalGradient(p0: io.github.humbleui.types.Point, p1: number, p2: io.github.humbleui.types.Point, p3: number, p4: Array): io.github.humbleui.skija.Shader; + makeTwoPointConicalGradient(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): io.github.humbleui.skija.Shader; + makeTwoPointConicalGradient(p0: io.github.humbleui.types.Point, p1: number, p2: io.github.humbleui.types.Point, p3: number, p4: Array, p5: kotlin.FloatArray): io.github.humbleui.skija.Shader; + makeTwoPointConicalGradient(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array, p7: kotlin.FloatArray): io.github.humbleui.skija.Shader; + makeTwoPointConicalGradient(p0: io.github.humbleui.types.Point, p1: number, p2: io.github.humbleui.types.Point, p3: number, p4: Array, p5: kotlin.FloatArray, p6: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeTwoPointConicalGradient(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array, p7: kotlin.FloatArray, p8: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeTwoPointConicalGradient(p0: io.github.humbleui.types.Point, p1: number, p2: io.github.humbleui.types.Point, p3: number, p4: Array, p5: io.github.humbleui.skija.ColorSpace, p6: kotlin.FloatArray, p7: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeTwoPointConicalGradient(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array, p7: io.github.humbleui.skija.ColorSpace, p8: kotlin.FloatArray, p9: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: io.github.humbleui.types.Point, p1: Array): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: number, p1: number, p2: Array): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: io.github.humbleui.types.Point, p1: Array, p2: kotlin.FloatArray): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: number, p1: number, p2: Array, p3: kotlin.FloatArray): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: io.github.humbleui.types.Point, p1: Array, p2: kotlin.FloatArray, p3: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: number, p1: number, p2: Array, p3: kotlin.FloatArray, p4: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: io.github.humbleui.types.Point, p1: number, p2: number, p3: Array, p4: kotlin.FloatArray, p5: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: number, p1: number, p2: number, p3: number, p4: Array, p5: kotlin.FloatArray, p6: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: io.github.humbleui.types.Point, p1: number, p2: number, p3: Array, p4: io.github.humbleui.skija.ColorSpace, p5: kotlin.FloatArray, p6: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeSweepGradient(p0: number, p1: number, p2: number, p3: number, p4: Array, p5: io.github.humbleui.skija.ColorSpace, p6: kotlin.FloatArray, p7: io.github.humbleui.skija.GradientStyle): io.github.humbleui.skija.Shader; + makeFractalNoise(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.types.IPoint | null | undefined): io.github.humbleui.skija.Shader; + makeFractalNoise(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.skija.Shader; + makeTurbulence(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.types.IPoint | null | undefined): io.github.humbleui.skija.Shader; + makeTurbulence(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.skija.Shader; + makeEmpty(): io.github.humbleui.skija.Shader; + makeColor(p0: number): io.github.humbleui.skija.Shader; + makeColor(p0: io.github.humbleui.skija.Color4f, p1: io.github.humbleui.skija.ColorSpace): io.github.humbleui.skija.Shader; + makeBlend(p0: io.github.humbleui.skija.BlendMode, p1: io.github.humbleui.skija.Shader, p2: io.github.humbleui.skija.Shader): io.github.humbleui.skija.Shader; + _nIsOpaque(p0: number): boolean; + _nGetImage(p0: number): number; + _nMakeWithLocalMatrix(p0: number, p1: kotlin.FloatArray): number; + _nMakeWithWorkingColorSpace(p0: number, p1: number, p2: number): number; + _nMakeWithColorFilter(p0: number, p1: number): number; + _nMakeLinearGradient(p0: number, p1: number, p2: number, p3: number, p4: Array, p5: kotlin.FloatArray, p6: number, p7: number, p8: kotlin.FloatArray): number; + _nMakeLinearGradientCS(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray, p5: number, p6: kotlin.FloatArray, p7: number, p8: number, p9: kotlin.FloatArray): number; + _nMakeRadialGradient(p0: number, p1: number, p2: number, p3: Array, p4: kotlin.FloatArray, p5: number, p6: number, p7: kotlin.FloatArray): number; + _nMakeRadialGradientCS(p0: number, p1: number, p2: number, p3: kotlin.FloatArray, p4: number, p5: kotlin.FloatArray, p6: number, p7: number, p8: kotlin.FloatArray): number; + _nMakeTwoPointConicalGradient(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array, p7: kotlin.FloatArray, p8: number, p9: number, p10: kotlin.FloatArray): number; + _nMakeTwoPointConicalGradientCS(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.FloatArray, p7: number, p8: kotlin.FloatArray, p9: number, p10: number, p11: kotlin.FloatArray): number; + _nMakeSweepGradient(p0: number, p1: number, p2: number, p3: number, p4: Array, p5: kotlin.FloatArray, p6: number, p7: number, p8: kotlin.FloatArray): number; + _nMakeSweepGradientCS(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray, p5: number, p6: kotlin.FloatArray, p7: number, p8: number, p9: kotlin.FloatArray): number; + _nMakeFractalNoise(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nMakeTurbulence(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nMakeEmpty(): number; + _nMakeColor(p0: number): number; + _nMakeColorCS(p0: number, p1: number, p2: number, p3: number, p4: number): number; + _nMakeBlend(p0: number, p1: number, p2: number): number; + } + interface Shader extends io.github.humbleui.skija.RuntimeEffectChild { + isOpaque(): boolean; + getImage(): io.github.humbleui.skija.Image | null | undefined; + makeWithLocalMatrix(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.Shader; + makeWithWorkingColorSpace(p0: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.Shader; + makeWithWorkingColorSpace(p0: io.github.humbleui.skija.ColorSpace | null | undefined, p1: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.Shader; + makeWithColorFilter(p0: io.github.humbleui.skija.ColorFilter): io.github.humbleui.skija.Shader; + } + interface RuntimeEffectChild extends io.github.humbleui.skija.impl.RefCnt, io.github.humbleui.skija.Flattenable { + } + interface Flattenable { + } + const ColorFilter: { + _LumaHolder: typeof io.github.humbleui.skija.ColorFilter$_LumaHolder; + _SRGBToLinearGammaHolder: typeof io.github.humbleui.skija.ColorFilter$_SRGBToLinearGammaHolder; + _LinearToSRGBGammaHolder: typeof io.github.humbleui.skija.ColorFilter$_LinearToSRGBGammaHolder; + new(p0: number): io.github.humbleui.skija.ColorFilter; + new(p0: number, p1: boolean): io.github.humbleui.skija.ColorFilter; + makeComposed(p0: io.github.humbleui.skija.ColorFilter, p1: io.github.humbleui.skija.ColorFilter): io.github.humbleui.skija.ColorFilter; + makeBlend(p0: number, p1: io.github.humbleui.skija.BlendMode): io.github.humbleui.skija.ColorFilter; + makeMatrix(p0: io.github.humbleui.skija.ColorMatrix): io.github.humbleui.skija.ColorFilter; + makeHSLAMatrix(p0: io.github.humbleui.skija.ColorMatrix): io.github.humbleui.skija.ColorFilter; + getLinearToSRGBGamma(): io.github.humbleui.skija.ColorFilter; + getSRGBToLinearGamma(): io.github.humbleui.skija.ColorFilter; + makeLerp(p0: io.github.humbleui.skija.ColorFilter, p1: io.github.humbleui.skija.ColorFilter, p2: number): io.github.humbleui.skija.ColorFilter; + makeLighting(p0: number, p1: number): io.github.humbleui.skija.ColorFilter; + makeHighContrast(p0: boolean, p1: io.github.humbleui.skija.InversionMode, p2: number): io.github.humbleui.skija.ColorFilter; + makeTable(p0: Array): io.github.humbleui.skija.ColorFilter; + makeTableARGB(p0: Array, p1: Array, p2: Array, p3: Array): io.github.humbleui.skija.ColorFilter; + makeOverdraw(p0: Array): io.github.humbleui.skija.ColorFilter; + getLuma(): io.github.humbleui.skija.ColorFilter; + _nMakeComposed(p0: number, p1: number): number; + _nMakeBlend(p0: number, p1: number): number; + _nMakeMatrix(p0: kotlin.FloatArray): number; + _nMakeHSLAMatrix(p0: kotlin.FloatArray): number; + _nGetLinearToSRGBGamma(): number; + _nGetSRGBToLinearGamma(): number; + _nMakeLerp(p0: number, p1: number, p2: number): number; + _nMakeLighting(p0: number, p1: number): number; + _nMakeHighContrast(p0: boolean, p1: number, p2: number): number; + _nMakeTable(p0: Array): number; + _nMakeTableARGB(p0: Array, p1: Array, p2: Array, p3: Array): number; + _nMakeOverdraw(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nGetLuma(): number; + } + interface ColorFilter extends io.github.humbleui.skija.RuntimeEffectChild { + } + const BlendMode: { + CLEAR: io.github.humbleui.skija.BlendMode; + SRC: io.github.humbleui.skija.BlendMode; + DST: io.github.humbleui.skija.BlendMode; + SRC_OVER: io.github.humbleui.skija.BlendMode; + DST_OVER: io.github.humbleui.skija.BlendMode; + SRC_IN: io.github.humbleui.skija.BlendMode; + DST_IN: io.github.humbleui.skija.BlendMode; + SRC_OUT: io.github.humbleui.skija.BlendMode; + DST_OUT: io.github.humbleui.skija.BlendMode; + SRC_ATOP: io.github.humbleui.skija.BlendMode; + DST_ATOP: io.github.humbleui.skija.BlendMode; + XOR: io.github.humbleui.skija.BlendMode; + PLUS: io.github.humbleui.skija.BlendMode; + MODULATE: io.github.humbleui.skija.BlendMode; + SCREEN: io.github.humbleui.skija.BlendMode; + OVERLAY: io.github.humbleui.skija.BlendMode; + DARKEN: io.github.humbleui.skija.BlendMode; + LIGHTEN: io.github.humbleui.skija.BlendMode; + COLOR_DODGE: io.github.humbleui.skija.BlendMode; + COLOR_BURN: io.github.humbleui.skija.BlendMode; + HARD_LIGHT: io.github.humbleui.skija.BlendMode; + SOFT_LIGHT: io.github.humbleui.skija.BlendMode; + DIFFERENCE: io.github.humbleui.skija.BlendMode; + EXCLUSION: io.github.humbleui.skija.BlendMode; + MULTIPLY: io.github.humbleui.skija.BlendMode; + HUE: io.github.humbleui.skija.BlendMode; + SATURATION: io.github.humbleui.skija.BlendMode; + COLOR: io.github.humbleui.skija.BlendMode; + LUMINOSITY: io.github.humbleui.skija.BlendMode; + LAST_COEFF_MODE: io.github.humbleui.skija.BlendMode; + LAST_SEPARABLE_MODE: io.github.humbleui.skija.BlendMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.BlendMode; + } + interface BlendMode extends kotlin.Enum { + } + const ColorMatrix: { + new(p0: number): io.github.humbleui.skija.ColorMatrix; + } + interface ColorMatrix { + _mat: kotlin.FloatArray; + getMat(): kotlin.FloatArray; + } + const InversionMode: { + NO: io.github.humbleui.skija.InversionMode; + BRIGHTNESS: io.github.humbleui.skija.InversionMode; + LIGHTNESS: io.github.humbleui.skija.InversionMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.InversionMode; + } + interface InversionMode extends kotlin.Enum { + } + const ColorFilter$_LumaHolder: { + INSTANCE: io.github.humbleui.skija.ColorFilter; + new(): io.github.humbleui.skija.ColorFilter$_LumaHolder; + } + interface ColorFilter$_LumaHolder { + } + const ColorFilter$_SRGBToLinearGammaHolder: { + INSTANCE: io.github.humbleui.skija.ColorFilter; + new(): io.github.humbleui.skija.ColorFilter$_SRGBToLinearGammaHolder; + } + interface ColorFilter$_SRGBToLinearGammaHolder { + } + const ColorFilter$_LinearToSRGBGammaHolder: { + INSTANCE: io.github.humbleui.skija.ColorFilter; + new(): io.github.humbleui.skija.ColorFilter$_LinearToSRGBGammaHolder; + } + interface ColorFilter$_LinearToSRGBGammaHolder { + } + const GradientStyle: { + _INTERPOLATE_PREMUL: number; + DEFAULT: io.github.humbleui.skija.GradientStyle; + new(p0: io.github.humbleui.skija.FilterTileMode, p1: boolean, p2: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.GradientStyle; + } + interface GradientStyle { + _tileMode: io.github.humbleui.skija.FilterTileMode; + _premul: boolean; + _localMatrix: io.github.humbleui.skija.Matrix33; + _getFlags(): number; + _getMatrixArray(): kotlin.FloatArray; + getTileMode(): io.github.humbleui.skija.FilterTileMode; + isPremul(): boolean; + getLocalMatrix(): io.github.humbleui.skija.Matrix33; + withTileMode(p0: io.github.humbleui.skija.FilterTileMode): io.github.humbleui.skija.GradientStyle; + withPremul(p0: boolean): io.github.humbleui.skija.GradientStyle; + withLocalMatrix(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.GradientStyle; + } + const FilterTileMode: { + CLAMP: io.github.humbleui.skija.FilterTileMode; + REPEAT: io.github.humbleui.skija.FilterTileMode; + MIRROR: io.github.humbleui.skija.FilterTileMode; + DECAL: io.github.humbleui.skija.FilterTileMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.FilterTileMode; + } + interface FilterTileMode extends kotlin.Enum { + } + const SamplingMode: { + DEFAULT: io.github.humbleui.skija.SamplingMode; + LINEAR: io.github.humbleui.skija.SamplingMode; + MITCHELL: io.github.humbleui.skija.SamplingMode; + CATMULL_ROM: io.github.humbleui.skija.SamplingMode; + } + interface SamplingMode { + _pack(): number; + } + const Pixmap: { + _FinalizerHolder: typeof io.github.humbleui.skija.Pixmap$_FinalizerHolder; + new(p0: number, p1: boolean): io.github.humbleui.skija.Pixmap; + new(): io.github.humbleui.skija.Pixmap; + make(p0: io.github.humbleui.skija.ImageInfo, p1: java.nio.ByteBuffer, p2: number): io.github.humbleui.skija.Pixmap; + make(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number): io.github.humbleui.skija.Pixmap; + _nGetFinalizer(): number; + _nMakeNull(): number; + _nMake(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): number; + _nReset(p0: number): void; + _nResetWithInfo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; + _nSetColorSpace(p0: number, p1: number): void; + _nExtractSubset(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): boolean; + _nGetImageInfo(p0: number): io.github.humbleui.skija.ImageInfo; + _nGetRowBytes(p0: number): number; + _nGetAddr(p0: number): number; + _nGetRowBytesAsPixels(p0: number): number; + _nComputeByteSize(p0: number): number; + _nComputeIsOpaque(p0: number): boolean; + _nGetColor(p0: number, p1: number, p2: number): number; + _nGetColor4f(p0: number, p1: number, p2: number): io.github.humbleui.skija.Color4f; + _nGetAlphaF(p0: number, p1: number, p2: number): number; + _nGetAddrAt(p0: number, p1: number, p2: number): number; + _nReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): boolean; + _nReadPixelsFromPoint(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): boolean; + _nReadPixelsToPixmap(p0: number, p1: number): boolean; + _nReadPixelsToPixmapFromPoint(p0: number, p1: number, p2: number, p3: number): boolean; + _nScalePixels(p0: number, p1: number, p2: number): boolean; + _nErase(p0: number, p1: number): boolean; + _nEraseSubset(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): boolean; + _nErase4f(p0: number, p1: number, p2: number, p3: number, p4: number): boolean; + _nEraseSubset4f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): boolean; + } + interface Pixmap extends io.github.humbleui.skija.impl.Managed, io.github.humbleui.skija.IHasImageInfo { + _imageInfo: io.github.humbleui.skija.ImageInfo; + reset(): void; + reset(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number): void; + reset(p0: io.github.humbleui.skija.ImageInfo, p1: java.nio.ByteBuffer, p2: number): void; + setColorSpace(p0: io.github.humbleui.skija.ColorSpace): void; + extractSubset(p0: number, p1: io.github.humbleui.types.IRect): boolean; + extractSubset(p0: java.nio.ByteBuffer, p1: io.github.humbleui.types.IRect): boolean; + getRowBytes(): number; + getRowBytesAsPixels(): number; + computeByteSize(): number; + computeIsOpaque(): boolean; + getColor(p0: number, p1: number): number; + getColor4f(p0: number, p1: number): io.github.humbleui.skija.Color4f; + getAlphaF(p0: number, p1: number): number; + getAddr(): number; + getAddrAt(p0: number, p1: number): number; + readPixels(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number): boolean; + readPixels(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number, p3: number, p4: number): boolean; + readPixels(p0: io.github.humbleui.skija.Pixmap): boolean; + readPixels(p0: io.github.humbleui.skija.Pixmap, p1: number, p2: number): boolean; + scalePixels(p0: io.github.humbleui.skija.Pixmap, p1: io.github.humbleui.skija.SamplingMode): boolean; + erase(p0: number): boolean; + erase(p0: number, p1: io.github.humbleui.types.IRect): boolean; + erase(p0: io.github.humbleui.skija.Color4f): boolean; + erase(p0: io.github.humbleui.skija.Color4f, p1: io.github.humbleui.types.IRect): boolean; + getBuffer(): java.nio.ByteBuffer; + } + const Pixmap$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.Pixmap$_FinalizerHolder; + } + interface Pixmap$_FinalizerHolder { + } + const Bitmap: { + _FinalizerHolder: typeof io.github.humbleui.skija.Bitmap$_FinalizerHolder; + new(p0: number): io.github.humbleui.skija.Bitmap; + new(): io.github.humbleui.skija.Bitmap; + makeFromImage(p0: io.github.humbleui.skija.Image): io.github.humbleui.skija.Bitmap; + _nGetFinalizer(): number; + _nMake(): number; + _nMakeClone(p0: number): number; + _nSwap(p0: number, p1: number): void; + _nGetImageInfo(p0: number): io.github.humbleui.skija.ImageInfo; + _nGetRowBytesAsPixels(p0: number): number; + _nIsNull(p0: number): boolean; + _nGetRowBytes(p0: number): number; + _nSetAlphaType(p0: number, p1: number): boolean; + _nSetColorSpace(p0: number, p1: number): void; + _nComputeByteSize(p0: number): number; + _nIsImmutable(p0: number): boolean; + _nSetImmutable(p0: number): void; + _nIsVolatile(p0: number): boolean; + _nSetVolatile(p0: number, p1: boolean): void; + _nReset(p0: number): void; + _nComputeIsOpaque(p0: number): boolean; + _nSetImageInfo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): boolean; + _nAllocPixelsFlags(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): boolean; + _nAllocPixelsRowBytes(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): boolean; + _nInstallPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array, p7: number): boolean; + _nAllocPixels(p0: number): boolean; + _nGetPixelRef(p0: number): number; + _nGetPixelRefOrigin(p0: number): number; + _nSetPixelRef(p0: number, p1: number, p2: number, p3: number): void; + _nIsReadyToDraw(p0: number): boolean; + _nGetGenerationId(p0: number): number; + _nNotifyPixelsChanged(p0: number): void; + _nErase4f(p0: number, p1: number, p2: number, p3: number, p4: number): void; + _nEraseRect4f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; + _nErase(p0: number, p1: number): void; + _nEraseRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nGetColor(p0: number, p1: number, p2: number): number; + _nGetColor4f(p0: number, p1: number, p2: number): io.github.humbleui.skija.Color4f; + _nGetAlphaf(p0: number, p1: number, p2: number): number; + _nExtractSubset(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): boolean; + _nReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): Array; + _nExtractAlpha(p0: number, p1: number, p2: number): io.github.humbleui.types.IPoint; + _nPeekPixels(p0: number): number; + _nMakeShader(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): number; + } + interface Bitmap extends io.github.humbleui.skija.impl.Managed, io.github.humbleui.skija.IHasImageInfo { + _imageInfo: io.github.humbleui.skija.ImageInfo; + makeClone(): io.github.humbleui.skija.Bitmap; + swap(p0: io.github.humbleui.skija.Bitmap): void; + getRowBytesAsPixels(): number; + isNull(): boolean; + drawsNothing(): boolean; + getRowBytes(): number; + setAlphaType(p0: io.github.humbleui.skija.ColorAlphaType): boolean; + setColorSpace(p0: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.Bitmap; + computeByteSize(): number; + isImmutable(): boolean; + setImmutable(): io.github.humbleui.skija.Bitmap; + reset(): io.github.humbleui.skija.Bitmap; + computeIsOpaque(): boolean; + getBounds(): io.github.humbleui.types.IRect; + getSubset(): io.github.humbleui.types.IRect; + setImageInfo(p0: io.github.humbleui.skija.ImageInfo): boolean; + setImageInfo(p0: io.github.humbleui.skija.ImageInfo, p1: number): boolean; + allocPixelsFlags(p0: io.github.humbleui.skija.ImageInfo, p1: boolean): boolean; + allocPixels(p0: io.github.humbleui.skija.ImageInfo, p1: number): boolean; + allocPixels(p0: io.github.humbleui.skija.ImageInfo): boolean; + allocPixels(): boolean; + allocN32Pixels(p0: number, p1: number): boolean; + allocN32Pixels(p0: number, p1: number, p2: boolean): boolean; + installPixels(p0: Array): boolean; + installPixels(p0: io.github.humbleui.skija.ImageInfo, p1: Array, p2: number): boolean; + getPixelRef(): io.github.humbleui.skija.PixelRef | null | undefined; + getPixelRefOrigin(): io.github.humbleui.types.IPoint; + setPixelRef(p0: io.github.humbleui.skija.PixelRef | null | undefined, p1: number, p2: number): io.github.humbleui.skija.Bitmap; + isReadyToDraw(): boolean; + getGenerationId(): number; + notifyPixelsChanged(): io.github.humbleui.skija.Bitmap; + erase(p0: io.github.humbleui.skija.Color4f): io.github.humbleui.skija.Bitmap; + erase(p0: io.github.humbleui.skija.Color4f, p1: io.github.humbleui.types.IRect): io.github.humbleui.skija.Bitmap; + erase(p0: number): io.github.humbleui.skija.Bitmap; + erase(p0: number, p1: io.github.humbleui.types.IRect): io.github.humbleui.skija.Bitmap; + getColor(p0: number, p1: number): number; + getColor4f(p0: number, p1: number): io.github.humbleui.skija.Color4f; + getAlphaf(p0: number, p1: number): number; + extractSubset(p0: io.github.humbleui.skija.Bitmap, p1: io.github.humbleui.types.IRect): boolean; + readPixels(): Array; + readPixels(p0: io.github.humbleui.skija.ImageInfo, p1: number, p2: number, p3: number): Array; + extractAlpha(p0: io.github.humbleui.skija.Bitmap): boolean; + extractAlpha(p0: io.github.humbleui.skija.Bitmap, p1: io.github.humbleui.skija.Paint | null | undefined): io.github.humbleui.types.IPoint | null | undefined; + peekPixels(): io.github.humbleui.skija.Pixmap | null | undefined; + makeShader(): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode, p2: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode, p2: io.github.humbleui.skija.SamplingMode, p3: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + } + const PixelRef: { + new(p0: number): io.github.humbleui.skija.PixelRef; + _nGetWidth(p0: number): number; + _nGetHeight(p0: number): number; + _nGetRowBytes(p0: number): number; + _nGetGenerationId(p0: number): number; + _nNotifyPixelsChanged(p0: number): void; + _nIsImmutable(p0: number): boolean; + _nSetImmutable(p0: number): void; + } + interface PixelRef extends io.github.humbleui.skija.impl.RefCnt { + getWidth(): number; + getHeight(): number; + getRowBytes(): number; + getGenerationId(): number; + notifyPixelsChanged(): io.github.humbleui.skija.PixelRef; + isImmutable(): boolean; + setImmutable(): io.github.humbleui.skija.PixelRef; + } + const Paint: { + _FinalizerHolder: typeof io.github.humbleui.skija.Paint$_FinalizerHolder; + new(p0: number, p1: boolean): io.github.humbleui.skija.Paint; + new(): io.github.humbleui.skija.Paint; + _nGetFinalizer(): number; + _nMake(): number; + _nMakeClone(p0: number): number; + _nEquals(p0: number, p1: number): boolean; + _nReset(p0: number): void; + _nIsAntiAlias(p0: number): boolean; + _nSetAntiAlias(p0: number, p1: boolean): void; + _nIsDither(p0: number): boolean; + _nSetDither(p0: number, p1: boolean): void; + _nGetMode(p0: number): number; + _nSetMode(p0: number, p1: number): void; + _nGetColor(p0: number): number; + _nGetColor4f(p0: number): io.github.humbleui.skija.Color4f; + _nSetColor(p0: number, p1: number): void; + _nSetColor4f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nGetStrokeWidth(p0: number): number; + _nSetStrokeWidth(p0: number, p1: number): void; + _nGetStrokeMiter(p0: number): number; + _nSetStrokeMiter(p0: number, p1: number): void; + _nGetStrokeCap(p0: number): number; + _nSetStrokeCap(p0: number, p1: number): void; + _nGetStrokeJoin(p0: number): number; + _nSetStrokeJoin(p0: number, p1: number): void; + _nGetFillPath(p0: number, p1: number, p2: number): number; + _nGetFillPathCull(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): number; + _nGetShader(p0: number): number; + _nSetShader(p0: number, p1: number): void; + _nGetColorFilter(p0: number): number; + _nSetColorFilter(p0: number, p1: number): void; + _nGetBlender(p0: number): number; + _nSetBlender(p0: number, p1: number): void; + _nGetBlendMode(p0: number): number; + _nSetBlendMode(p0: number, p1: number): void; + _nGetPathEffect(p0: number): number; + _nSetPathEffect(p0: number, p1: number): void; + _nGetMaskFilter(p0: number): number; + _nSetMaskFilter(p0: number, p1: number): void; + _nGetImageFilter(p0: number): number; + _nSetImageFilter(p0: number, p1: number): void; + _nHasNothingToDraw(p0: number): boolean; + } + interface Paint extends io.github.humbleui.skija.impl.Managed { + makeClone(): io.github.humbleui.skija.Paint; + reset(): io.github.humbleui.skija.Paint; + isAntiAlias(): boolean; + setAntiAlias(p0: boolean): io.github.humbleui.skija.Paint; + isDither(): boolean; + setDither(p0: boolean): io.github.humbleui.skija.Paint; + getMode(): io.github.humbleui.skija.PaintMode; + setMode(p0: io.github.humbleui.skija.PaintMode): io.github.humbleui.skija.Paint; + setStroke(p0: boolean): io.github.humbleui.skija.Paint; + getColor(): number; + getColor4f(): io.github.humbleui.skija.Color4f; + setColor(p0: number): io.github.humbleui.skija.Paint; + setColor4f(p0: io.github.humbleui.skija.Color4f): io.github.humbleui.skija.Paint; + setColor4f(p0: io.github.humbleui.skija.Color4f, p1: io.github.humbleui.skija.ColorSpace | null | undefined): io.github.humbleui.skija.Paint; + getAlphaf(): number; + getAlpha(): number; + setAlphaf(p0: number): io.github.humbleui.skija.Paint; + setAlpha(p0: number): io.github.humbleui.skija.Paint; + setARGB(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.skija.Paint; + getStrokeWidth(): number; + setStrokeWidth(p0: number): io.github.humbleui.skija.Paint; + getStrokeMiter(): number; + setStrokeMiter(p0: number): io.github.humbleui.skija.Paint; + getStrokeCap(): io.github.humbleui.skija.PaintStrokeCap; + setStrokeCap(p0: io.github.humbleui.skija.PaintStrokeCap): io.github.humbleui.skija.Paint; + getStrokeJoin(): io.github.humbleui.skija.PaintStrokeJoin; + setStrokeJoin(p0: io.github.humbleui.skija.PaintStrokeJoin): io.github.humbleui.skija.Paint; + getFillPath(p0: io.github.humbleui.skija.Path): io.github.humbleui.skija.Path; + getFillPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.types.Rect | null | undefined, p2: number): io.github.humbleui.skija.Path; + getShader(): io.github.humbleui.skija.Shader | null | undefined; + setShader(p0: io.github.humbleui.skija.Shader | null | undefined): io.github.humbleui.skija.Paint; + getColorFilter(): io.github.humbleui.skija.ColorFilter | null | undefined; + setColorFilter(p0: io.github.humbleui.skija.ColorFilter | null | undefined): io.github.humbleui.skija.Paint; + getBlender(): io.github.humbleui.skija.Blender | null | undefined; + setBlender(p0: io.github.humbleui.skija.Blender | null | undefined): io.github.humbleui.skija.Paint; + getBlendMode(): io.github.humbleui.skija.BlendMode | null | undefined; + isSrcOver(): boolean; + setBlendMode(p0: io.github.humbleui.skija.BlendMode): io.github.humbleui.skija.Paint; + getPathEffect(): io.github.humbleui.skija.PathEffect | null | undefined; + setPathEffect(p0: io.github.humbleui.skija.PathEffect | null | undefined): io.github.humbleui.skija.Paint; + getMaskFilter(): io.github.humbleui.skija.MaskFilter | null | undefined; + setMaskFilter(p0: io.github.humbleui.skija.MaskFilter | null | undefined): io.github.humbleui.skija.Paint; + getImageFilter(): io.github.humbleui.skija.ImageFilter | null | undefined; + setImageFilter(p0: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.Paint; + hasNothingToDraw(): boolean; + } + const PaintMode: { + FILL: io.github.humbleui.skija.PaintMode; + STROKE: io.github.humbleui.skija.PaintMode; + STROKE_AND_FILL: io.github.humbleui.skija.PaintMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PaintMode; + } + interface PaintMode extends kotlin.Enum { + } + const PaintStrokeCap: { + BUTT: io.github.humbleui.skija.PaintStrokeCap; + ROUND: io.github.humbleui.skija.PaintStrokeCap; + SQUARE: io.github.humbleui.skija.PaintStrokeCap; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PaintStrokeCap; + } + interface PaintStrokeCap extends kotlin.Enum { + } + const PaintStrokeJoin: { + MITER: io.github.humbleui.skija.PaintStrokeJoin; + ROUND: io.github.humbleui.skija.PaintStrokeJoin; + BEVEL: io.github.humbleui.skija.PaintStrokeJoin; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PaintStrokeJoin; + } + interface PaintStrokeJoin extends kotlin.Enum { + } + const Path: { + _FinalizerHolder: typeof io.github.humbleui.skija.Path$_FinalizerHolder; + new(): io.github.humbleui.skija.Path; + new(p0: io.github.humbleui.skija.PathFillMode): io.github.humbleui.skija.Path; + new(p0: io.github.humbleui.skija.Path): io.github.humbleui.skija.Path; + new(p0: number): io.github.humbleui.skija.Path; + makeRaw(p0: Array, p1: Array, p2: kotlin.FloatArray, p3: io.github.humbleui.skija.PathFillMode): io.github.humbleui.skija.Path; + makeRaw(p0: Array, p1: Array, p2: kotlin.FloatArray, p3: io.github.humbleui.skija.PathFillMode, p4: boolean): io.github.humbleui.skija.Path; + makeRect(p0: io.github.humbleui.types.Rect): io.github.humbleui.skija.Path; + makeRect(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.Path; + makeRect(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.PathDirection, p2: number): io.github.humbleui.skija.Path; + makeOval(p0: io.github.humbleui.types.Rect): io.github.humbleui.skija.Path; + makeOval(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.Path; + makeCircle(p0: number, p1: number, p2: number): io.github.humbleui.skija.Path; + makeCircle(p0: number, p1: number, p2: number, p3: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.Path; + makeRRect(p0: io.github.humbleui.types.RRect): io.github.humbleui.skija.Path; + makeRRect(p0: io.github.humbleui.types.RRect, p1: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.Path; + makeRRect(p0: io.github.humbleui.types.RRect, p1: io.github.humbleui.skija.PathDirection, p2: number): io.github.humbleui.skija.Path; + makePolygon(p0: Array, p1: boolean): io.github.humbleui.skija.Path; + makePolygon(p0: Array, p1: boolean, p2: io.github.humbleui.skija.PathFillMode): io.github.humbleui.skija.Path; + makePolygon(p0: Array, p1: boolean, p2: io.github.humbleui.skija.PathFillMode, p3: boolean): io.github.humbleui.skija.Path; + makeLine(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point): io.github.humbleui.skija.Path; + makeLine(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.skija.Path; + makeFromSVGString(p0: string): io.github.humbleui.skija.Path; + makeCombining(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.skija.Path, p2: io.github.humbleui.skija.PathOp): io.github.humbleui.skija.Path | null | undefined; + isLineDegenerate(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: boolean): boolean; + isQuadDegenerate(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: io.github.humbleui.types.Point, p3: boolean): boolean; + isCubicDegenerate(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: io.github.humbleui.types.Point, p3: io.github.humbleui.types.Point, p4: boolean): boolean; + convertConicToQuads(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: io.github.humbleui.types.Point, p3: number, p4: number): Array; + makeFromBytes(p0: Array): io.github.humbleui.skija.Path | null | undefined; + _nGetFinalizer(): number; + _nMakeRaw(p0: kotlin.FloatArray, p1: Array, p2: kotlin.FloatArray, p3: number, p4: boolean): number; + _nMakeRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nMakeOval(p0: number, p1: number, p2: number, p3: number, p4: number): number; + _nMakeCircle(p0: number, p1: number, p2: number, p3: number): number; + _nMakeRRect(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray, p5: number, p6: number): number; + _nMakePolygon(p0: kotlin.FloatArray, p1: boolean, p2: number, p3: boolean): number; + _nMakeLine(p0: number, p1: number, p2: number, p3: number): number; + _nMakeFromSVGString(p0: string): number; + _nMake(p0: number): number; + _nMakeCopy(p0: number): number; + _nMakeCombining(p0: number, p1: number, p2: number): number; + _nEquals(p0: number, p1: number): boolean; + _nIsInterpolatable(p0: number, p1: number): boolean; + _nMakeInterpolate(p0: number, p1: number, p2: number): number; + _nGetFillMode(p0: number): number; + _nMakeWithFillMode(p0: number, p1: number): number; + _nIsInverseFillType(p0: number): boolean; + _nMakeToggleInverseFillType(p0: number): number; + _nIsConvex(p0: number): boolean; + _nIsOval(p0: number): io.github.humbleui.types.Rect; + _nIsRRect(p0: number): io.github.humbleui.types.RRect; + _nIsEmpty(p0: number): boolean; + _nIsLastContourClosed(p0: number): boolean; + _nIsFinite(p0: number): boolean; + _nIsVolatile(p0: number): boolean; + _nMakeWithVolatile(p0: number, p1: boolean): number; + _nIsLineDegenerate(p0: number, p1: number, p2: number, p3: number, p4: boolean): boolean; + _nIsQuadDegenerate(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: boolean): boolean; + _nIsCubicDegenerate(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: boolean): boolean; + _nMaybeGetAsLine(p0: number): Array; + _nGetPoints(p0: number): Array; + _nGetVerbs(p0: number): Array; + _nGetConicWeights(p0: number): kotlin.FloatArray; + _nGetPointsCount(p0: number): number; + _nCountVerbs(p0: number): number; + _nGetLastPt(p0: number): io.github.humbleui.types.Point; + _nApproximateBytesUsed(p0: number): number; + _nGetBounds(p0: number): io.github.humbleui.types.Rect; + _nUpdateBoundsCache(p0: number): void; + _nComputeTightBounds(p0: number): io.github.humbleui.types.Rect; + _nConservativelyContainsRect(p0: number, p1: number, p2: number, p3: number, p4: number): boolean; + _nConvertConicToQuads(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): Array; + _nIsRect(p0: number): io.github.humbleui.types.Rect; + _nMakeTransform(p0: number, p1: kotlin.FloatArray): number; + _nMakeOffset(p0: number, p1: number, p2: number): number; + _nMakeScale(p0: number, p1: number, p2: number): number; + _nGetSegmentMasks(p0: number): number; + _nSetVolatile(p0: number, p1: boolean): void; + _nSwap(p0: number, p1: number): void; + _nSetFillMode(p0: number, p1: number): void; + _nReset(p0: number): void; + _nContains(p0: number, p1: number, p2: number): boolean; + _nDump(p0: number): void; + _nDumpHex(p0: number): void; + _nSerializeToBytes(p0: number): Array; + _nMakeFromBytes(p0: Array): number; + _nGetGenerationId(p0: number): number; + _nIsValid(p0: number): boolean; + _nFillWithPaint(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: kotlin.FloatArray): boolean; + } + interface Path extends io.github.humbleui.skija.impl.Managed, kotlin.collections.MutableIterable { + isInterpolatable(p0: io.github.humbleui.skija.Path): boolean; + makeInterpolate(p0: io.github.humbleui.skija.Path, p1: number): io.github.humbleui.skija.Path; + getFillMode(): io.github.humbleui.skija.PathFillMode; + makeWithFillMode(p0: io.github.humbleui.skija.PathFillMode): io.github.humbleui.skija.Path; + isInverseFillType(): boolean; + makeToggleInverseFillType(): io.github.humbleui.skija.Path; + isConvex(): boolean; + isOval(): io.github.humbleui.types.Rect | null | undefined; + isRRect(): io.github.humbleui.types.RRect | null | undefined; + isEmpty(): boolean; + isLastContourClosed(): boolean; + isFinite(): boolean; + isVolatile(): boolean; + makeWithVolatile(p0: boolean): io.github.humbleui.skija.Path; + getAsLine(): Array; + getPoints(): Array; + getVerbs(): Array; + getConicWeights(): kotlin.FloatArray; + getPointsCount(): number; + getVerbsCount(): number; + getLastPt(): io.github.humbleui.types.Point | null | undefined; + getApproximateBytesUsed(): number; + getBounds(): io.github.humbleui.types.Rect; + updateBoundsCache(): io.github.humbleui.skija.Path; + computeTightBounds(): io.github.humbleui.types.Rect; + conservativelyContainsRect(p0: io.github.humbleui.types.Rect): boolean; + isRect(): io.github.humbleui.types.Rect | null | undefined; + makeTransform(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.Path | null | undefined; + makeOffset(p0: number, p1: number): io.github.humbleui.skija.Path | null | undefined; + makeScale(p0: number): io.github.humbleui.skija.Path | null | undefined; + makeScale(p0: number, p1: number): io.github.humbleui.skija.Path | null | undefined; + getSegmentTypes(): Array; + setVolatile(p0: boolean): io.github.humbleui.skija.Path; + swap(p0: io.github.humbleui.skija.Path): io.github.humbleui.skija.Path; + setFillMode(p0: io.github.humbleui.skija.PathFillMode): io.github.humbleui.skija.Path; + reset(): io.github.humbleui.skija.Path; + iterator(p0: boolean): io.github.humbleui.skija.PathSegmentIterator; + contains(p0: number, p1: number): boolean; + contains(p0: io.github.humbleui.types.Point): boolean; + dump(): io.github.humbleui.skija.Path; + dumpHex(): io.github.humbleui.skija.Path; + serializeToBytes(): Array; + getGenerationId(): number; + isValid(): boolean; + fillWithPaint(p0: io.github.humbleui.skija.Paint, p1: io.github.humbleui.skija.PathBuilder, p2: io.github.humbleui.types.Rect | null | undefined, p3: io.github.humbleui.skija.Matrix33): boolean; + fillWithPaint(p0: io.github.humbleui.skija.Paint, p1: io.github.humbleui.skija.PathBuilder, p2: io.github.humbleui.skija.Matrix33): boolean; + fillWithPaint(p0: io.github.humbleui.skija.Paint, p1: io.github.humbleui.skija.PathBuilder): boolean; + fillWithPaint(p0: io.github.humbleui.skija.Paint, p1: io.github.humbleui.skija.PathBuilder, p2: number): boolean; + } + const PathFillMode: { + WINDING: io.github.humbleui.skija.PathFillMode; + EVEN_ODD: io.github.humbleui.skija.PathFillMode; + INVERSE_WINDING: io.github.humbleui.skija.PathFillMode; + INVERSE_EVEN_ODD: io.github.humbleui.skija.PathFillMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PathFillMode; + } + interface PathFillMode extends kotlin.Enum { + isInverse(): boolean; + inverse(): io.github.humbleui.skija.PathFillMode; + } + const PathSegmentIterator: { + _FinalizerHolder: typeof io.github.humbleui.skija.PathSegmentIterator$_FinalizerHolder; + new(p0: io.github.humbleui.skija.Path, p1: number): io.github.humbleui.skija.PathSegmentIterator; + make(p0: io.github.humbleui.skija.Path, p1: boolean): io.github.humbleui.skija.PathSegmentIterator; + _nMake(p0: number, p1: boolean): number; + _nGetFinalizer(): number; + _nNext(p0: number): io.github.humbleui.skija.PathSegment; + } + interface PathSegmentIterator extends io.github.humbleui.skija.impl.Managed, kotlin.collections.MutableIterator { + _path: io.github.humbleui.skija.Path; + _nextSegment: io.github.humbleui.skija.PathSegment; + } + const PathSegment: { + new(): io.github.humbleui.skija.PathSegment; + new(p0: number, p1: number, p2: number, p3: boolean): io.github.humbleui.skija.PathSegment; + new(p0: number, p1: number, p2: number, p3: number, p4: boolean, p5: boolean): io.github.humbleui.skija.PathSegment; + new(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: boolean): io.github.humbleui.skija.PathSegment; + new(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: boolean): io.github.humbleui.skija.PathSegment; + new(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: boolean): io.github.humbleui.skija.PathSegment; + new(p0: io.github.humbleui.skija.PathVerb, p1: io.github.humbleui.types.Point, p2: io.github.humbleui.types.Point, p3: io.github.humbleui.types.Point, p4: io.github.humbleui.types.Point, p5: number, p6: boolean, p7: boolean): io.github.humbleui.skija.PathSegment; + } + interface PathSegment { + _verb: io.github.humbleui.skija.PathVerb; + _p0: io.github.humbleui.types.Point; + _p1: io.github.humbleui.types.Point; + _p2: io.github.humbleui.types.Point; + _p3: io.github.humbleui.types.Point; + _conicWeight: number; + _closeLine: boolean; + _closedContour: boolean; + getVerb(): io.github.humbleui.skija.PathVerb; + getP0(): io.github.humbleui.types.Point; + getP1(): io.github.humbleui.types.Point; + getP2(): io.github.humbleui.types.Point; + getP3(): io.github.humbleui.types.Point; + getConicWeight(): number; + isCloseLine(): boolean; + isClosedContour(): boolean; + } + const PathVerb: { + MOVE: io.github.humbleui.skija.PathVerb; + LINE: io.github.humbleui.skija.PathVerb; + QUAD: io.github.humbleui.skija.PathVerb; + CONIC: io.github.humbleui.skija.PathVerb; + CUBIC: io.github.humbleui.skija.PathVerb; + CLOSE: io.github.humbleui.skija.PathVerb; + DONE: io.github.humbleui.skija.PathVerb; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PathVerb; + } + interface PathVerb extends kotlin.Enum { + } + const PathSegmentIterator$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.PathSegmentIterator$_FinalizerHolder; + } + interface PathSegmentIterator$_FinalizerHolder { + } + const PathBuilder: { + _FinalizerHolder: typeof io.github.humbleui.skija.PathBuilder$_FinalizerHolder; + new(): io.github.humbleui.skija.PathBuilder; + new(p0: io.github.humbleui.skija.PathFillMode): io.github.humbleui.skija.PathBuilder; + new(p0: io.github.humbleui.skija.PathBuilder): io.github.humbleui.skija.PathBuilder; + new(p0: io.github.humbleui.skija.Path): io.github.humbleui.skija.PathBuilder; + new(p0: number, p1: number): io.github.humbleui.skija.PathBuilder; + _nGetFinalizer(): number; + _nMake(): number; + _nMakeFromFillMode(p0: number): number; + _nMakeFromPathBuilder(p0: number): number; + _nMakeFromPath(p0: number): number; + _nEquals(p0: number, p1: number): boolean; + _nGetFillMode(p0: number): number; + _nComputeFiniteBounds(p0: number): io.github.humbleui.types.Rect; + _nComputeTightBounds(p0: number): io.github.humbleui.types.Rect; + _nSnapshot(p0: number, p1: kotlin.FloatArray): number; + _nDetach(p0: number, p1: kotlin.FloatArray): number; + _nSetFillMode(p0: number, p1: number): void; + _nSetVolatile(p0: number, p1: boolean): void; + _nReset(p0: number): void; + _nMoveTo(p0: number, p1: number, p2: number): void; + _nLineTo(p0: number, p1: number, p2: number): void; + _nQuadTo(p0: number, p1: number, p2: number, p3: number, p4: number): void; + _nConicTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nCubicTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; + _nClosePath(p0: number): void; + _nPolylineTo(p0: number, p1: kotlin.FloatArray): void; + _nRMoveTo(p0: number, p1: number, p2: number): void; + _nRLineTo(p0: number, p1: number, p2: number): void; + _nRQuadTo(p0: number, p1: number, p2: number, p3: number, p4: number): void; + _nRConicTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nRCubicTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; + _nREllipticalArcTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; + _nArcTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: boolean): void; + _nTangentArcTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; + _nEllipticalArcTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; + _nAddArc(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; + _nAddRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; + _nAddOval(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; + _nAddRRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: kotlin.FloatArray, p6: number, p7: number): void; + _nAddCircle(p0: number, p1: number, p2: number, p3: number, p4: number): void; + _nAddPolygon(p0: number, p1: kotlin.FloatArray, p2: boolean): void; + _nAddPath(p0: number, p1: number, p2: boolean): void; + _nAddPathOffset(p0: number, p1: number, p2: number, p3: number, p4: boolean): void; + _nAddPathTransform(p0: number, p1: number, p2: kotlin.FloatArray, p3: boolean): void; + _nIncReserve(p0: number, p1: number, p2: number, p3: number): void; + _nOffset(p0: number, p1: number, p2: number): void; + _nTransform(p0: number, p1: kotlin.FloatArray): void; + _nIsFinite(p0: number): boolean; + _nToggleInverseFillType(p0: number): void; + _nIsEmpty(p0: number): boolean; + _nGetLastPt(p0: number): io.github.humbleui.types.Point; + _nSetPoint(p0: number, p1: number, p2: number, p3: number): void; + _nSetLastPt(p0: number, p1: number, p2: number): void; + _nCountPoints(p0: number): number; + _nIsInverseFillType(p0: number): boolean; + _nGetPoints(p0: number): Array; + _nGetVerbs(p0: number): Array; + _nGetConicWeights(p0: number): kotlin.FloatArray; + } + interface PathBuilder extends io.github.humbleui.skija.impl.Managed { + getFillMode(): io.github.humbleui.skija.PathFillMode; + computeFiniteBounds(): io.github.humbleui.types.Rect | null | undefined; + computeTightBounds(): io.github.humbleui.types.Rect | null | undefined; + snapshot(): io.github.humbleui.skija.Path; + snapshot(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.Path; + detach(): io.github.humbleui.skija.Path; + detach(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.Path; + build(): io.github.humbleui.skija.Path; + setFillMode(p0: io.github.humbleui.skija.PathFillMode): io.github.humbleui.skija.PathBuilder; + setVolatile(p0: boolean): io.github.humbleui.skija.PathBuilder; + reset(): io.github.humbleui.skija.PathBuilder; + moveTo(p0: number, p1: number): io.github.humbleui.skija.PathBuilder; + moveTo(p0: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + lineTo(p0: number, p1: number): io.github.humbleui.skija.PathBuilder; + lineTo(p0: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + quadTo(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.skija.PathBuilder; + quadTo(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + conicTo(p0: number, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.PathBuilder; + conicTo(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: number): io.github.humbleui.skija.PathBuilder; + cubicTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): io.github.humbleui.skija.PathBuilder; + cubicTo(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + closePath(): io.github.humbleui.skija.PathBuilder; + polylineTo(p0: kotlin.FloatArray): io.github.humbleui.skija.PathBuilder; + polylineTo(p0: Array): io.github.humbleui.skija.PathBuilder; + rMoveTo(p0: number, p1: number): io.github.humbleui.skija.PathBuilder; + rMoveTo(p0: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + rLineTo(p0: number, p1: number): io.github.humbleui.skija.PathBuilder; + rLineTo(p0: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + rQuadTo(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.skija.PathBuilder; + rQuadTo(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + rConicTo(p0: number, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.PathBuilder; + rConicTo(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: number): io.github.humbleui.skija.PathBuilder; + rCubicTo(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): io.github.humbleui.skija.PathBuilder; + rCubicTo(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + rEllipticalArcTo(p0: number, p1: number, p2: number, p3: io.github.humbleui.skija.PathEllipseArc, p4: io.github.humbleui.skija.PathDirection, p5: number, p6: number): io.github.humbleui.skija.PathBuilder; + arcTo(p0: io.github.humbleui.types.Rect, p1: number, p2: number, p3: boolean): io.github.humbleui.skija.PathBuilder; + tangentArcTo(p0: number, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.PathBuilder; + tangentArcTo(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point, p2: number): io.github.humbleui.skija.PathBuilder; + ellipticalArcTo(p0: number, p1: number, p2: number, p3: io.github.humbleui.skija.PathEllipseArc, p4: io.github.humbleui.skija.PathDirection, p5: number, p6: number): io.github.humbleui.skija.PathBuilder; + ellipticalArcTo(p0: io.github.humbleui.types.Point, p1: number, p2: io.github.humbleui.skija.PathEllipseArc, p3: io.github.humbleui.skija.PathDirection, p4: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + addArc(p0: io.github.humbleui.types.Rect, p1: number, p2: number): io.github.humbleui.skija.PathBuilder; + addLine(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.skija.PathBuilder; + addLine(p0: io.github.humbleui.types.Point, p1: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + addRect(p0: io.github.humbleui.types.Rect): io.github.humbleui.skija.PathBuilder; + addRect(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.PathBuilder; + addRect(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.PathDirection, p2: number): io.github.humbleui.skija.PathBuilder; + addOval(p0: io.github.humbleui.types.Rect): io.github.humbleui.skija.PathBuilder; + addOval(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.PathBuilder; + addOval(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.PathDirection, p2: number): io.github.humbleui.skija.PathBuilder; + addRRect(p0: io.github.humbleui.types.RRect): io.github.humbleui.skija.PathBuilder; + addRRect(p0: io.github.humbleui.types.RRect, p1: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.PathBuilder; + addRRect(p0: io.github.humbleui.types.RRect, p1: io.github.humbleui.skija.PathDirection, p2: number): io.github.humbleui.skija.PathBuilder; + addCircle(p0: number, p1: number, p2: number): io.github.humbleui.skija.PathBuilder; + addCircle(p0: io.github.humbleui.types.Point, p1: number): io.github.humbleui.skija.PathBuilder; + addCircle(p0: number, p1: number, p2: number, p3: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.PathBuilder; + addCircle(p0: io.github.humbleui.types.Point, p1: number, p2: io.github.humbleui.skija.PathDirection): io.github.humbleui.skija.PathBuilder; + addPolygon(p0: Array, p1: boolean): io.github.humbleui.skija.PathBuilder; + addPolygon(p0: kotlin.FloatArray, p1: boolean): io.github.humbleui.skija.PathBuilder; + addPath(p0: io.github.humbleui.skija.Path): io.github.humbleui.skija.PathBuilder; + addPath(p0: io.github.humbleui.skija.Path, p1: boolean): io.github.humbleui.skija.PathBuilder; + addPath(p0: io.github.humbleui.skija.Path, p1: number, p2: number): io.github.humbleui.skija.PathBuilder; + addPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + addPath(p0: io.github.humbleui.skija.Path, p1: number, p2: number, p3: boolean): io.github.humbleui.skija.PathBuilder; + addPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.types.Point, p2: boolean): io.github.humbleui.skija.PathBuilder; + addPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.PathBuilder; + addPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.skija.Matrix33, p2: boolean): io.github.humbleui.skija.PathBuilder; + incReserve(p0: number, p1: number, p2: number): io.github.humbleui.skija.PathBuilder; + incReserve(p0: number): io.github.humbleui.skija.PathBuilder; + offset(p0: number, p1: number): io.github.humbleui.skija.PathBuilder; + offset(p0: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + transform(p0: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.PathBuilder; + isFinite(): boolean; + toggleInverseFillType(): io.github.humbleui.skija.PathBuilder; + isEmpty(): boolean; + getLastPt(): io.github.humbleui.types.Point | null | undefined; + setPoint(p0: number, p1: number, p2: number): io.github.humbleui.skija.PathBuilder; + setPoint(p0: number, p1: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + setLastPt(p0: number, p1: number): io.github.humbleui.skija.PathBuilder; + setLastPt(p0: io.github.humbleui.types.Point): io.github.humbleui.skija.PathBuilder; + countPoints(): number; + isInverseFillType(): boolean; + getPoints(): Array; + getVerbs(): Array; + getConicWeights(): kotlin.FloatArray; + } + const PathEllipseArc: { + SMALLER: io.github.humbleui.skija.PathEllipseArc; + LARGER: io.github.humbleui.skija.PathEllipseArc; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PathEllipseArc; + } + interface PathEllipseArc extends kotlin.Enum { + } + const PathDirection: { + CLOCKWISE: io.github.humbleui.skija.PathDirection; + COUNTER_CLOCKWISE: io.github.humbleui.skija.PathDirection; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PathDirection; + } + interface PathDirection extends kotlin.Enum { + } + const PathBuilder$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.PathBuilder$_FinalizerHolder; + } + interface PathBuilder$_FinalizerHolder { + } + const PathOp: { + DIFFERENCE: io.github.humbleui.skija.PathOp; + INTERSECT: io.github.humbleui.skija.PathOp; + UNION: io.github.humbleui.skija.PathOp; + XOR: io.github.humbleui.skija.PathOp; + REVERSE_DIFFERENCE: io.github.humbleui.skija.PathOp; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PathOp; + } + interface PathOp extends kotlin.Enum { + } + const Path$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.Path$_FinalizerHolder; + } + interface Path$_FinalizerHolder { + } + const Blender: { + new(p0: number): io.github.humbleui.skija.Blender; + makeWithMode(p0: io.github.humbleui.skija.BlendMode): io.github.humbleui.skija.Blender; + makeArithmetic(p0: number, p1: number, p2: number, p3: number, p4: boolean): io.github.humbleui.skija.Blender; + makeRuntime(p0: io.github.humbleui.skija.RuntimeEffect, p1: io.github.humbleui.skija.Data | null | undefined, p2: Array): io.github.humbleui.skija.Blender; + _nMakeWithMode(p0: number): number; + _nMakeArithmetic(p0: number, p1: number, p2: number, p3: number, p4: boolean): number; + _nMakeRuntime(p0: number, p1: number, p2: Array): number; + } + interface Blender extends io.github.humbleui.skija.RuntimeEffectChild { + } + const RuntimeEffect: { + new(p0: number): io.github.humbleui.skija.RuntimeEffect; + makeForColorFilter(p0: string): io.github.humbleui.skija.RuntimeEffect; + makeForColorFilter(p0: string, p1: io.github.humbleui.skija.RuntimeEffectOptions): io.github.humbleui.skija.RuntimeEffect; + makeForShader(p0: string): io.github.humbleui.skija.RuntimeEffect; + makeForShader(p0: string, p1: io.github.humbleui.skija.RuntimeEffectOptions): io.github.humbleui.skija.RuntimeEffect; + makeForBlender(p0: string): io.github.humbleui.skija.RuntimeEffect; + makeForBlender(p0: string, p1: io.github.humbleui.skija.RuntimeEffectOptions): io.github.humbleui.skija.RuntimeEffect; + _nMakeForColorFilter(p0: string, p1: boolean, p2: string): number; + _nMakeForShader(p0: string, p1: boolean, p2: string): number; + _nMakeForBlender(p0: string, p1: boolean, p2: string): number; + _nMakeShader(p0: number, p1: number, p2: Array, p3: kotlin.FloatArray): number; + _nMakeColorFilter(p0: number, p1: number, p2: Array): number; + _nMakeBlender(p0: number, p1: number, p2: Array): number; + _nGetSource(p0: number): string; + _nGetUniformSize(p0: number): number; + _nIsShaderAllowed(p0: number): boolean; + _nIsColorFilterAllowed(p0: number): boolean; + _nIsBlenderAllowed(p0: number): boolean; + _nGetUniforms(p0: number): Array; + _nGetUniform(p0: number, p1: string): io.github.humbleui.skija.RuntimeEffectUniformInfo; + _nGetChildren(p0: number): Array; + _nGetChild(p0: number, p1: string): io.github.humbleui.skija.RuntimeEffectChildInfo; + } + interface RuntimeEffect extends io.github.humbleui.skija.impl.RefCnt { + makeColorFilter(p0: io.github.humbleui.skija.Data | null | undefined, p1: Array): io.github.humbleui.skija.ColorFilter; + makeColorFilter(p0: io.github.humbleui.skija.Data | null | undefined): io.github.humbleui.skija.ColorFilter; + makeShader(p0: io.github.humbleui.skija.Data | null | undefined, p1: Array, p2: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.Data | null | undefined, p1: Array): io.github.humbleui.skija.Shader; + makeBlender(p0: io.github.humbleui.skija.Data | null | undefined, p1: Array): io.github.humbleui.skija.Blender; + makeBlender(p0: io.github.humbleui.skija.Data | null | undefined): io.github.humbleui.skija.Blender; + getSource(): string; + getUniformSize(): number; + isShaderAllowed(): boolean; + isColorFilterAllowed(): boolean; + isBlenderAllowed(): boolean; + getUniforms(): Array; + getUniform(p0: string): io.github.humbleui.skija.RuntimeEffectUniformInfo | null | undefined; + getChildren(): Array; + getChild(p0: string): io.github.humbleui.skija.RuntimeEffectChildInfo | null | undefined; + } + const RuntimeEffectUniformInfo: { + new(p0: string, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.RuntimeEffectUniformInfo; + new(p0: string, p1: number, p2: io.github.humbleui.skija.RuntimeEffectUniformType, p3: number, p4: number): io.github.humbleui.skija.RuntimeEffectUniformInfo; + } + interface RuntimeEffectUniformInfo { + _name: string; + _offset: number; + _type: io.github.humbleui.skija.RuntimeEffectUniformType; + _count: number; + _flags: number; + isArray(): boolean; + isColor(): boolean; + getSizeInBytes(): number; + getName(): string; + getOffset(): number; + getType(): io.github.humbleui.skija.RuntimeEffectUniformType; + getCount(): number; + getFlags(): number; + } + const RuntimeEffectUniformType: { + FLOAT: io.github.humbleui.skija.RuntimeEffectUniformType; + FLOAT2: io.github.humbleui.skija.RuntimeEffectUniformType; + FLOAT3: io.github.humbleui.skija.RuntimeEffectUniformType; + FLOAT4: io.github.humbleui.skija.RuntimeEffectUniformType; + FLOAT2X2: io.github.humbleui.skija.RuntimeEffectUniformType; + FLOAT3X3: io.github.humbleui.skija.RuntimeEffectUniformType; + FLOAT4X4: io.github.humbleui.skija.RuntimeEffectUniformType; + INT: io.github.humbleui.skija.RuntimeEffectUniformType; + INT2: io.github.humbleui.skija.RuntimeEffectUniformType; + INT3: io.github.humbleui.skija.RuntimeEffectUniformType; + INT4: io.github.humbleui.skija.RuntimeEffectUniformType; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.RuntimeEffectUniformType; + } + interface RuntimeEffectUniformType extends kotlin.Enum { + } + const RuntimeEffectChildInfo: { + new(p0: string, p1: number, p2: number): io.github.humbleui.skija.RuntimeEffectChildInfo; + new(p0: string, p1: io.github.humbleui.skija.RuntimeEffectChildType, p2: number): io.github.humbleui.skija.RuntimeEffectChildInfo; + } + interface RuntimeEffectChildInfo { + _name: string; + _type: io.github.humbleui.skija.RuntimeEffectChildType; + _index: number; + getName(): string; + getType(): io.github.humbleui.skija.RuntimeEffectChildType; + getIndex(): number; + } + const RuntimeEffectChildType: { + SHADER: io.github.humbleui.skija.RuntimeEffectChildType; + COLOR_FILTER: io.github.humbleui.skija.RuntimeEffectChildType; + BLENDER: io.github.humbleui.skija.RuntimeEffectChildType; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.RuntimeEffectChildType; + } + interface RuntimeEffectChildType extends kotlin.Enum { + } + const RuntimeEffectOptions: { + DEFAULT: io.github.humbleui.skija.RuntimeEffectOptions; + new(p0: boolean): io.github.humbleui.skija.RuntimeEffectOptions; + new(p0: string | null | undefined): io.github.humbleui.skija.RuntimeEffectOptions; + new(p0: boolean, p1: string | null | undefined): io.github.humbleui.skija.RuntimeEffectOptions; + } + interface RuntimeEffectOptions { + _forceUnoptimized: boolean; + _name: string | null | undefined; + isForceUnoptimized(): boolean; + getName(): string | null | undefined; + } + const PathEffect: { + new(p0: number): io.github.humbleui.skija.PathEffect; + makePath1D(p0: io.github.humbleui.skija.Path, p1: number, p2: number, p3: io.github.humbleui.skija.PathEffect1DStyle): io.github.humbleui.skija.PathEffect; + makePath2D(p0: io.github.humbleui.skija.Matrix33, p1: io.github.humbleui.skija.Path): io.github.humbleui.skija.PathEffect; + makeLine2D(p0: number, p1: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.PathEffect; + makeCorner(p0: number): io.github.humbleui.skija.PathEffect; + makeDash(p0: kotlin.FloatArray, p1: number): io.github.humbleui.skija.PathEffect; + makeDiscrete(p0: number, p1: number, p2: number): io.github.humbleui.skija.PathEffect; + _nMakeSum(p0: number, p1: number): number; + _nMakeCompose(p0: number, p1: number): number; + _nMakePath1D(p0: number, p1: number, p2: number, p3: number): number; + _nMakePath2D(p0: kotlin.FloatArray, p1: number): number; + _nMakeLine2D(p0: number, p1: kotlin.FloatArray): number; + _nMakeCorner(p0: number): number; + _nMakeDash(p0: kotlin.FloatArray, p1: number): number; + _nMakeDiscrete(p0: number, p1: number, p2: number): number; + } + interface PathEffect extends io.github.humbleui.skija.impl.RefCnt, io.github.humbleui.skija.Flattenable { + makeSum(p0: io.github.humbleui.skija.PathEffect): io.github.humbleui.skija.PathEffect; + makeCompose(p0: io.github.humbleui.skija.PathEffect): io.github.humbleui.skija.PathEffect; + } + const PathEffect1DStyle: { + TRANSLATE: io.github.humbleui.skija.PathEffect1DStyle; + ROTATE: io.github.humbleui.skija.PathEffect1DStyle; + MORPH: io.github.humbleui.skija.PathEffect1DStyle; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.PathEffect1DStyle; + } + interface PathEffect1DStyle extends kotlin.Enum { + } + const MaskFilter: { + new(p0: number): io.github.humbleui.skija.MaskFilter; + makeBlur(p0: io.github.humbleui.skija.FilterBlurMode, p1: number): io.github.humbleui.skija.MaskFilter; + makeBlur(p0: io.github.humbleui.skija.FilterBlurMode, p1: number, p2: boolean): io.github.humbleui.skija.MaskFilter; + makeShader(p0: io.github.humbleui.skija.Shader): io.github.humbleui.skija.MaskFilter; + makeTable(p0: Array): io.github.humbleui.skija.MaskFilter; + makeGamma(p0: number): io.github.humbleui.skija.MaskFilter; + makeClip(p0: number, p1: number): io.github.humbleui.skija.MaskFilter; + _nMakeBlur(p0: number, p1: number, p2: boolean): number; + _nMakeShader(p0: number): number; + _nMakeTable(p0: Array): number; + _nMakeGamma(p0: number): number; + _nMakeClip(p0: number, p1: number): number; + } + interface MaskFilter extends io.github.humbleui.skija.impl.RefCnt, io.github.humbleui.skija.Flattenable { + } + const FilterBlurMode: { + NORMAL: io.github.humbleui.skija.FilterBlurMode; + SOLID: io.github.humbleui.skija.FilterBlurMode; + OUTER: io.github.humbleui.skija.FilterBlurMode; + INNER: io.github.humbleui.skija.FilterBlurMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.FilterBlurMode; + } + interface FilterBlurMode extends kotlin.Enum { + } + const ImageFilter: { + new(p0: number): io.github.humbleui.skija.ImageFilter; + makeArithmetic(p0: number, p1: number, p2: number, p3: number, p4: boolean, p5: io.github.humbleui.skija.ImageFilter | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeArithmetic(p0: number, p1: number, p2: number, p3: number, p4: boolean, p5: io.github.humbleui.skija.ImageFilter | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeArithmetic(p0: number, p1: number, p2: number, p3: number, p4: boolean, p5: io.github.humbleui.skija.ImageFilter | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlend(p0: io.github.humbleui.skija.BlendMode, p1: io.github.humbleui.skija.ImageFilter | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlend(p0: io.github.humbleui.skija.BlendMode, p1: io.github.humbleui.skija.ImageFilter | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlend(p0: io.github.humbleui.skija.BlendMode, p1: io.github.humbleui.skija.ImageFilter | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlend(p0: io.github.humbleui.skija.Blender, p1: io.github.humbleui.skija.ImageFilter | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlend(p0: io.github.humbleui.skija.Blender, p1: io.github.humbleui.skija.ImageFilter | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlend(p0: io.github.humbleui.skija.Blender, p1: io.github.humbleui.skija.ImageFilter | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlur(p0: number, p1: number, p2: io.github.humbleui.skija.FilterTileMode, p3: io.github.humbleui.skija.ImageFilter | null | undefined, p4: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlur(p0: number, p1: number, p2: io.github.humbleui.skija.FilterTileMode, p3: io.github.humbleui.skija.ImageFilter | null | undefined, p4: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeBlur(p0: number, p1: number, p2: io.github.humbleui.skija.FilterTileMode): io.github.humbleui.skija.ImageFilter; + makeColorFilter(p0: io.github.humbleui.skija.ColorFilter, p1: io.github.humbleui.skija.ImageFilter | null | undefined, p2: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeColorFilter(p0: io.github.humbleui.skija.ColorFilter, p1: io.github.humbleui.skija.ImageFilter | null | undefined, p2: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeColorFilter(p0: io.github.humbleui.skija.ColorFilter, p1: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeCompose(p0: io.github.humbleui.skija.ImageFilter, p1: io.github.humbleui.skija.ImageFilter): io.github.humbleui.skija.ImageFilter; + makeCrop(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.FilterTileMode, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeCrop(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDisplacementMap(p0: io.github.humbleui.skija.ColorChannel, p1: io.github.humbleui.skija.ColorChannel, p2: number, p3: io.github.humbleui.skija.ImageFilter | null | undefined, p4: io.github.humbleui.skija.ImageFilter | null | undefined, p5: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDisplacementMap(p0: io.github.humbleui.skija.ColorChannel, p1: io.github.humbleui.skija.ColorChannel, p2: number, p3: io.github.humbleui.skija.ImageFilter | null | undefined, p4: io.github.humbleui.skija.ImageFilter | null | undefined, p5: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDisplacementMap(p0: io.github.humbleui.skija.ColorChannel, p1: io.github.humbleui.skija.ColorChannel, p2: number, p3: io.github.humbleui.skija.ImageFilter | null | undefined, p4: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadow(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.skija.Color4f, p5: io.github.humbleui.skija.ColorSpace | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadow(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.skija.Color4f, p5: io.github.humbleui.skija.ColorSpace | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadow(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.skija.Color4f, p5: io.github.humbleui.skija.ColorSpace | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadow(p0: number, p1: number, p2: number, p3: number, p4: number, p5: io.github.humbleui.skija.ImageFilter | null | undefined, p6: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadow(p0: number, p1: number, p2: number, p3: number, p4: number, p5: io.github.humbleui.skija.ImageFilter | null | undefined, p6: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadow(p0: number, p1: number, p2: number, p3: number, p4: number, p5: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadow(p0: number, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.ImageFilter; + makeDropShadowOnly(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.skija.Color4f, p5: io.github.humbleui.skija.ColorSpace | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadowOnly(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.skija.Color4f, p5: io.github.humbleui.skija.ColorSpace | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadowOnly(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.skija.Color4f, p5: io.github.humbleui.skija.ColorSpace | null | undefined, p6: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadowOnly(p0: number, p1: number, p2: number, p3: number, p4: number, p5: io.github.humbleui.skija.ImageFilter | null | undefined, p6: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadowOnly(p0: number, p1: number, p2: number, p3: number, p4: number, p5: io.github.humbleui.skija.ImageFilter | null | undefined, p6: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDropShadowOnly(p0: number, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.ImageFilter; + makeEmpty(): io.github.humbleui.skija.ImageFilter; + makeImage(p0: io.github.humbleui.skija.Image | null | undefined, p1: io.github.humbleui.types.Rect, p2: io.github.humbleui.types.Rect, p3: io.github.humbleui.skija.SamplingMode): io.github.humbleui.skija.ImageFilter; + makeImage(p0: io.github.humbleui.skija.Image | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMagnifier(p0: io.github.humbleui.types.Rect, p1: number, p2: number, p3: io.github.humbleui.skija.SamplingMode, p4: io.github.humbleui.skija.ImageFilter | null | undefined, p5: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMagnifier(p0: io.github.humbleui.types.Rect, p1: number, p2: number, p3: io.github.humbleui.skija.SamplingMode, p4: io.github.humbleui.skija.ImageFilter | null | undefined, p5: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMagnifier(p0: io.github.humbleui.types.Rect, p1: number, p2: number, p3: io.github.humbleui.skija.SamplingMode, p4: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMatrixConvolution(p0: number, p1: number, p2: kotlin.FloatArray, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.FilterTileMode, p8: boolean, p9: io.github.humbleui.skija.ImageFilter | null | undefined, p10: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMatrixConvolution(p0: number, p1: number, p2: kotlin.FloatArray, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.FilterTileMode, p8: boolean, p9: io.github.humbleui.skija.ImageFilter | null | undefined, p10: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMatrixConvolution(p0: number, p1: number, p2: kotlin.FloatArray, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.FilterTileMode, p8: boolean, p9: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMatrixTransform(p0: io.github.humbleui.skija.Matrix33, p1: io.github.humbleui.skija.SamplingMode, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMerge(p0: Array, p1: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMerge(p0: Array, p1: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeMerge(p0: Array): io.github.humbleui.skija.ImageFilter; + makeOffset(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeOffset(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeOffset(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makePicture(p0: io.github.humbleui.skija.Picture | null | undefined, p1: io.github.humbleui.types.Rect): io.github.humbleui.skija.ImageFilter; + makePicture(p0: io.github.humbleui.skija.Picture | null | undefined): io.github.humbleui.skija.ImageFilter; + makeRuntimeShader(p0: io.github.humbleui.skija.RuntimeEffectBuilder, p1: string | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeRuntimeShader(p0: io.github.humbleui.skija.RuntimeEffectBuilder, p1: number, p2: string | null | undefined, p3: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeRuntimeShader(p0: io.github.humbleui.skija.RuntimeEffectBuilder, p1: Array, p2: Array): io.github.humbleui.skija.ImageFilter; + makeRuntimeShader(p0: io.github.humbleui.skija.RuntimeEffectBuilder, p1: number, p2: Array, p3: Array): io.github.humbleui.skija.ImageFilter; + makeShader(p0: io.github.humbleui.skija.Shader, p1: boolean, p2: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeShader(p0: io.github.humbleui.skija.Shader, p1: boolean, p2: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeShader(p0: io.github.humbleui.skija.Shader, p1: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeShader(p0: io.github.humbleui.skija.Shader, p1: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeShader(p0: io.github.humbleui.skija.Shader): io.github.humbleui.skija.ImageFilter; + makeTile(p0: io.github.humbleui.types.Rect, p1: io.github.humbleui.types.Rect, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDilate(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDilate(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDilate(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeErode(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeErode(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeErode(p0: number, p1: number, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDistantLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDistantLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDistantLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makePointLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makePointLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.ImageFilter | null | undefined, p7: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makePointLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeSpotLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: io.github.humbleui.skija.ImageFilter | null | undefined, p12: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeSpotLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: io.github.humbleui.skija.ImageFilter | null | undefined, p12: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeSpotLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDistantLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.ImageFilter | null | undefined, p8: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDistantLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.ImageFilter | null | undefined, p8: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeDistantLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makePointLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.ImageFilter | null | undefined, p8: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makePointLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.ImageFilter | null | undefined, p8: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makePointLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + makeSpotLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number, p12: io.github.humbleui.skija.ImageFilter | null | undefined, p13: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeSpotLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number, p12: io.github.humbleui.skija.ImageFilter | null | undefined, p13: io.github.humbleui.types.IRect | null | undefined): io.github.humbleui.skija.ImageFilter; + makeSpotLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number, p12: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.ImageFilter; + _nMakeArithmetic(p0: number, p1: number, p2: number, p3: number, p4: boolean, p5: number, p6: number, p7: io.github.humbleui.types.Rect): number; + _nMakeBlend(p0: number, p1: number, p2: number, p3: io.github.humbleui.types.Rect): number; + _nMakeBlendBlender(p0: number, p1: number, p2: number, p3: io.github.humbleui.types.Rect): number; + _nMakeBlur(p0: number, p1: number, p2: number, p3: number, p4: io.github.humbleui.types.Rect): number; + _nMakeColorFilter(p0: number, p1: number, p2: io.github.humbleui.types.Rect): number; + _nMakeCompose(p0: number, p1: number): number; + _nMakeCrop(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): number; + _nMakeDisplacementMap(p0: number, p1: number, p2: number, p3: number, p4: number, p5: io.github.humbleui.types.Rect): number; + _nMakeDropShadowCS(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: io.github.humbleui.types.Rect): number; + _nMakeDropShadow(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.types.Rect): number; + _nMakeDropShadowOnlyCS(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: io.github.humbleui.types.Rect): number; + _nMakeDropShadowOnly(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: io.github.humbleui.types.Rect): number; + _nMakeEmpty(): number; + _nMakeImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): number; + _nMakeMagnifier(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: io.github.humbleui.types.Rect): number; + _nMakeMatrixConvolution(p0: number, p1: number, p2: kotlin.FloatArray, p3: number, p4: number, p5: number, p6: number, p7: number, p8: boolean, p9: number, p10: io.github.humbleui.types.Rect): number; + _nMakeMatrixTransform(p0: kotlin.FloatArray, p1: number, p2: number): number; + _nMakeMerge(p0: Array, p1: io.github.humbleui.types.Rect): number; + _nMakeOffset(p0: number, p1: number, p2: number, p3: io.github.humbleui.types.Rect): number; + _nMakePicture(p0: number, p1: number, p2: number, p3: number, p4: number): number; + _nMakePicture(p0: number): number; + _nMakeShader(p0: number, p1: boolean, p2: io.github.humbleui.types.Rect): number; + _nMakeTile(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): number; + _nMakeDilate(p0: number, p1: number, p2: number, p3: io.github.humbleui.types.Rect): number; + _nMakeErode(p0: number, p1: number, p2: number, p3: io.github.humbleui.types.Rect): number; + _nMakeDistantLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.types.Rect): number; + _nMakePointLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: io.github.humbleui.types.Rect): number; + _nMakeSpotLitDiffuse(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number, p12: io.github.humbleui.types.Rect): number; + _nMakeDistantLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: io.github.humbleui.types.Rect): number; + _nMakePointLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: io.github.humbleui.types.Rect): number; + _nMakeSpotLitSpecular(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number, p12: number, p13: io.github.humbleui.types.Rect): number; + _nMakeRuntimeShader(p0: number, p1: number, p2: Array, p3: Array): number; + } + interface ImageFilter extends io.github.humbleui.skija.impl.RefCnt, io.github.humbleui.skija.Flattenable { + } + const ColorChannel: { + R: io.github.humbleui.skija.ColorChannel; + G: io.github.humbleui.skija.ColorChannel; + B: io.github.humbleui.skija.ColorChannel; + A: io.github.humbleui.skija.ColorChannel; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.ColorChannel; + } + interface ColorChannel extends kotlin.Enum { + } + const Picture: { + new(p0: number): io.github.humbleui.skija.Picture; + makeFromData(p0: io.github.humbleui.skija.Data): io.github.humbleui.skija.Picture | null | undefined; + makePlaceholder(p0: io.github.humbleui.types.Rect): io.github.humbleui.skija.Picture; + _nMakeFromData(p0: number): number; + _nPlayback(p0: number, p1: number, p2: unknown): void; + _nGetCullRect(p0: number): io.github.humbleui.types.Rect; + _nGetUniqueId(p0: number): number; + _nSerializeToData(p0: number): number; + _nMakePlaceholder(p0: number, p1: number, p2: number, p3: number): number; + _nGetApproximateOpCount(p0: number): number; + _nGetApproximateBytesUsed(p0: number): number; + _nMakeShader(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray, p5: io.github.humbleui.types.Rect): number; + } + interface Picture extends io.github.humbleui.skija.impl.RefCnt { + playback(p0: io.github.humbleui.skija.Canvas): io.github.humbleui.skija.Picture; + playback(p0: io.github.humbleui.skija.Canvas, p1: unknown): io.github.humbleui.skija.Picture; + getCullRect(): io.github.humbleui.types.Rect; + getUniqueId(): number; + serializeToData(): io.github.humbleui.skija.Data; + getApproximateOpCount(): number; + getApproximateBytesUsed(): number; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode, p2: io.github.humbleui.skija.FilterMode): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode, p2: io.github.humbleui.skija.FilterMode, p3: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.FilterTileMode, p1: io.github.humbleui.skija.FilterTileMode, p2: io.github.humbleui.skija.FilterMode, p3: io.github.humbleui.skija.Matrix33 | null | undefined, p4: io.github.humbleui.types.Rect | null | undefined): io.github.humbleui.skija.Shader; + } + const FilterMode: { + NEAREST: io.github.humbleui.skija.FilterMode; + LINEAR: io.github.humbleui.skija.FilterMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.FilterMode; + } + interface FilterMode extends kotlin.Enum { + } + const RuntimeEffectBuilder: { + _FinalizerHolder: typeof io.github.humbleui.skija.RuntimeEffectBuilder$_FinalizerHolder; + new(p0: io.github.humbleui.skija.RuntimeEffect): io.github.humbleui.skija.RuntimeEffectBuilder; + new(p0: io.github.humbleui.skija.RuntimeEffect, p1: io.github.humbleui.skija.Data): io.github.humbleui.skija.RuntimeEffectBuilder; + new(p0: io.github.humbleui.skija.RuntimeEffectBuilder): io.github.humbleui.skija.RuntimeEffectBuilder; + _nGetFinalizer(): number; + _nMake(p0: number): number; + _nMakeWithUniforms(p0: number, p1: number): number; + _nMakeCopy(p0: number): number; + _nMakeShader(p0: number, p1: kotlin.FloatArray): number; + _nMakeColorFilter(p0: number): number; + _nMakeBlender(p0: number): number; + _nGetUniforms(p0: number): number; + _nSetUniformFloats(p0: number, p1: string, p2: kotlin.FloatArray): void; + _nSetUniformInts(p0: number, p1: string, p2: Array): void; + _nSetChild(p0: number, p1: string, p2: number): void; + } + interface RuntimeEffectBuilder extends io.github.humbleui.skija.impl.Managed { + _effect: io.github.humbleui.skija.RuntimeEffect; + _uniforms: io.github.humbleui.skija.Data; + makeShader(): io.github.humbleui.skija.Shader; + makeShader(p0: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Shader; + makeColorFilter(): io.github.humbleui.skija.ColorFilter; + makeBlender(): io.github.humbleui.skija.Blender; + setUniform(p0: string, p1: number): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: number, p2: number): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: number, p2: number, p3: number): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: kotlin.FloatArray): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: io.github.humbleui.skija.Matrix33): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: io.github.humbleui.skija.Matrix44): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: number): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: number, p2: number): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: number, p2: number, p3: number): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.skija.RuntimeEffectBuilder; + setUniform(p0: string, p1: Array): io.github.humbleui.skija.RuntimeEffectBuilder; + setChild(p0: string, p1: io.github.humbleui.skija.RuntimeEffectChild | null | undefined): io.github.humbleui.skija.RuntimeEffectBuilder; + getEffect(): io.github.humbleui.skija.RuntimeEffect; + getUniforms(): io.github.humbleui.skija.Data; + } + const RuntimeEffectBuilder$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.RuntimeEffectBuilder$_FinalizerHolder; + } + interface RuntimeEffectBuilder$_FinalizerHolder { + } + const Paint$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.Paint$_FinalizerHolder; + } + interface Paint$_FinalizerHolder { + } + const Bitmap$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.Bitmap$_FinalizerHolder; + } + interface Bitmap$_FinalizerHolder { + } + const SurfaceOrigin: { + TOP_LEFT: io.github.humbleui.skija.SurfaceOrigin; + BOTTOM_LEFT: io.github.humbleui.skija.SurfaceOrigin; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.SurfaceOrigin; + } + interface SurfaceOrigin extends kotlin.Enum { + } + const ImageWithFilterResult: { + new(p0: io.github.humbleui.skija.Image, p1: io.github.humbleui.types.IRect, p2: io.github.humbleui.types.IPoint): io.github.humbleui.skija.ImageWithFilterResult; + } + interface ImageWithFilterResult extends java.lang.AutoCloseable { + _image: io.github.humbleui.skija.Image; + _subset: io.github.humbleui.types.IRect; + _offset: io.github.humbleui.types.IPoint; + getImage(): io.github.humbleui.skija.Image; + getSubset(): io.github.humbleui.types.IRect; + getOffset(): io.github.humbleui.types.IPoint; + } + const Region: { + _FinalizerHolder: typeof io.github.humbleui.skija.Region$_FinalizerHolder; + new(): io.github.humbleui.skija.Region; + _nMake(): number; + _nGetFinalizer(): number; + _nSet(p0: number, p1: number): boolean; + _nIsEmpty(p0: number): boolean; + _nIsRect(p0: number): boolean; + _nIsComplex(p0: number): boolean; + _nGetBounds(p0: number): io.github.humbleui.types.IRect; + _nComputeRegionComplexity(p0: number): number; + _nGetBoundaryPath(p0: number): number; + _nSetEmpty(p0: number): boolean; + _nSetRect(p0: number, p1: number, p2: number, p3: number, p4: number): boolean; + _nSetRects(p0: number, p1: Array): boolean; + _nSetRegion(p0: number, p1: number): boolean; + _nSetPath(p0: number, p1: number, p2: number): boolean; + _nIntersectsIRect(p0: number, p1: number, p2: number, p3: number, p4: number): boolean; + _nIntersectsRegion(p0: number, p1: number): boolean; + _nContainsIPoint(p0: number, p1: number, p2: number): boolean; + _nContainsIRect(p0: number, p1: number, p2: number, p3: number, p4: number): boolean; + _nContainsRegion(p0: number, p1: number): boolean; + _nQuickContains(p0: number, p1: number, p2: number, p3: number, p4: number): boolean; + _nQuickRejectIRect(p0: number, p1: number, p2: number, p3: number, p4: number): boolean; + _nQuickRejectRegion(p0: number, p1: number): boolean; + _nTranslate(p0: number, p1: number, p2: number): void; + _nOpIRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): boolean; + _nOpRegion(p0: number, p1: number, p2: number): boolean; + _nOpIRectRegion(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): boolean; + _nOpRegionIRect(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): boolean; + _nOpRegionRegion(p0: number, p1: number, p2: number, p3: number): boolean; + } + interface Region extends io.github.humbleui.skija.impl.Managed { + set(p0: io.github.humbleui.skija.Region): boolean; + isEmpty(): boolean; + isRect(): boolean; + isComplex(): boolean; + getBounds(): io.github.humbleui.types.IRect; + computeRegionComplexity(): number; + getBoundaryPath(): io.github.humbleui.skija.Path; + setEmpty(): boolean; + setRect(p0: io.github.humbleui.types.IRect): boolean; + setRects(p0: Array): boolean; + setRegion(p0: io.github.humbleui.skija.Region): boolean; + setPath(p0: io.github.humbleui.skija.Path, p1: io.github.humbleui.skija.Region): boolean; + intersects(p0: io.github.humbleui.types.IRect): boolean; + intersects(p0: io.github.humbleui.skija.Region): boolean; + contains(p0: number, p1: number): boolean; + contains(p0: io.github.humbleui.types.IRect): boolean; + contains(p0: io.github.humbleui.skija.Region): boolean; + quickContains(p0: io.github.humbleui.types.IRect): boolean; + quickReject(p0: io.github.humbleui.types.IRect): boolean; + quickReject(p0: io.github.humbleui.skija.Region): boolean; + translate(p0: number, p1: number): void; + op(p0: io.github.humbleui.types.IRect, p1: io.github.humbleui.skija.RegionOp): boolean; + op(p0: io.github.humbleui.skija.Region, p1: io.github.humbleui.skija.RegionOp): boolean; + op(p0: io.github.humbleui.types.IRect, p1: io.github.humbleui.skija.Region, p2: io.github.humbleui.skija.RegionOp): boolean; + op(p0: io.github.humbleui.skija.Region, p1: io.github.humbleui.types.IRect, p2: io.github.humbleui.skija.RegionOp): boolean; + op(p0: io.github.humbleui.skija.Region, p1: io.github.humbleui.skija.Region, p2: io.github.humbleui.skija.RegionOp): boolean; + } + const RegionOp: { + DIFFERENCE: io.github.humbleui.skija.RegionOp; + INTERSECT: io.github.humbleui.skija.RegionOp; + UNION: io.github.humbleui.skija.RegionOp; + XOR: io.github.humbleui.skija.RegionOp; + REVERSE_DIFFERENCE: io.github.humbleui.skija.RegionOp; + REPLACE: io.github.humbleui.skija.RegionOp; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.RegionOp; + } + interface RegionOp extends kotlin.Enum { + } + const Region$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.Region$_FinalizerHolder; + } + interface Region$_FinalizerHolder { + } + const Font: { + _FinalizerHolder: typeof io.github.humbleui.skija.Font$_FinalizerHolder; + new(p0: number): io.github.humbleui.skija.Font; + new(p0: number, p1: boolean): io.github.humbleui.skija.Font; + new(): io.github.humbleui.skija.Font; + new(p0: io.github.humbleui.skija.Typeface | null | undefined): io.github.humbleui.skija.Font; + new(p0: io.github.humbleui.skija.Typeface | null | undefined, p1: number): io.github.humbleui.skija.Font; + new(p0: io.github.humbleui.skija.Typeface | null | undefined, p1: number, p2: number, p3: number): io.github.humbleui.skija.Font; + makeClone(p0: number): io.github.humbleui.skija.Font; + _nGetFinalizer(): number; + _nMakeDefault(): number; + _nMakeTypeface(p0: number): number; + _nMakeTypefaceSize(p0: number, p1: number): number; + _nMakeTypefaceSizeScaleSkew(p0: number, p1: number, p2: number, p3: number): number; + _nMakeClone(p0: number): number; + _nEquals(p0: number, p1: number): boolean; + _nIsAutoHintingForced(p0: number): boolean; + _nAreBitmapsEmbedded(p0: number): boolean; + _nIsSubpixel(p0: number): boolean; + _nAreMetricsLinear(p0: number): boolean; + _nIsEmboldened(p0: number): boolean; + _nIsBaselineSnapped(p0: number): boolean; + _nSetAutoHintingForced(p0: number, p1: boolean): void; + _nSetBitmapsEmbedded(p0: number, p1: boolean): void; + _nSetSubpixel(p0: number, p1: boolean): void; + _nSetMetricsLinear(p0: number, p1: boolean): void; + _nSetEmboldened(p0: number, p1: boolean): void; + _nSetBaselineSnapped(p0: number, p1: boolean): void; + _nGetEdging(p0: number): number; + _nSetEdging(p0: number, p1: number): void; + _nGetHinting(p0: number): number; + _nSetHinting(p0: number, p1: number): void; + _nGetTypeface(p0: number): number; + _nGetSize(p0: number): number; + _nGetScaleX(p0: number): number; + _nGetSkewX(p0: number): number; + _nSetTypeface(p0: number, p1: number): void; + _nSetSize(p0: number, p1: number): void; + _nSetScaleX(p0: number, p1: number): void; + _nSetSkewX(p0: number, p1: number): void; + _nGetStringGlyphs(p0: number, p1: string): Array; + _nGetUTF32Glyph(p0: number, p1: number): number; + _nGetUTF32Glyphs(p0: number, p1: Array): Array; + _nGetStringGlyphsCount(p0: number, p1: string): number; + _nMeasureText(p0: number, p1: string, p2: number): io.github.humbleui.types.Rect; + _nMeasureTextWidth(p0: number, p1: string, p2: number): number; + _nGetWidths(p0: number, p1: Array): kotlin.FloatArray; + _nGetBounds(p0: number, p1: Array, p2: number): Array; + _nGetPositions(p0: number, p1: Array, p2: number, p3: number): Array; + _nGetXPositions(p0: number, p1: Array, p2: number): kotlin.FloatArray; + _nGetPath(p0: number, p1: number): number; + _nGetPaths(p0: number, p1: Array): Array; + _nGetMetrics(p0: number): io.github.humbleui.skija.FontMetrics; + _nGetSpacing(p0: number): number; + } + interface Font extends io.github.humbleui.skija.impl.Managed { + _metrics: io.github.humbleui.skija.FontMetrics; + _spacing: number; + _resetMetrics(): void; + isAutoHintingForced(): boolean; + areBitmapsEmbedded(): boolean; + isSubpixel(): boolean; + areMetricsLinear(): boolean; + isEmboldened(): boolean; + isBaselineSnapped(): boolean; + setAutoHintingForced(p0: boolean): io.github.humbleui.skija.Font; + setBitmapsEmbedded(p0: boolean): io.github.humbleui.skija.Font; + setSubpixel(p0: boolean): io.github.humbleui.skija.Font; + setMetricsLinear(p0: boolean): io.github.humbleui.skija.Font; + setEmboldened(p0: boolean): io.github.humbleui.skija.Font; + setBaselineSnapped(p0: boolean): io.github.humbleui.skija.Font; + getEdging(): io.github.humbleui.skija.FontEdging; + setEdging(p0: io.github.humbleui.skija.FontEdging): io.github.humbleui.skija.Font; + getHinting(): io.github.humbleui.skija.FontHinting; + setHinting(p0: io.github.humbleui.skija.FontHinting): io.github.humbleui.skija.Font; + makeWithSize(p0: number): io.github.humbleui.skija.Font; + getTypeface(): io.github.humbleui.skija.Typeface | null | undefined; + getSize(): number; + getScaleX(): number; + getSkewX(): number; + setTypeface(p0: io.github.humbleui.skija.Typeface | null | undefined): io.github.humbleui.skija.Font; + setSize(p0: number): io.github.humbleui.skija.Font; + setScaleX(p0: number): io.github.humbleui.skija.Font; + setSkewX(p0: number): io.github.humbleui.skija.Font; + getStringGlyphs(p0: string): Array; + getUTF32Glyphs(p0: Array): Array; + getUTF32Glyph(p0: number): number; + getStringGlyphsCount(p0: string): number; + measureText(p0: string): io.github.humbleui.types.Rect; + measureText(p0: string, p1: io.github.humbleui.skija.Paint): io.github.humbleui.types.Rect; + measureTextWidth(p0: string): number; + measureTextWidth(p0: string, p1: io.github.humbleui.skija.Paint): number; + getWidths(p0: Array): kotlin.FloatArray; + getBounds(p0: Array): Array; + getBounds(p0: Array, p1: io.github.humbleui.skija.Paint): Array; + getPositions(p0: Array): Array; + getPositions(p0: Array, p1: io.github.humbleui.types.Point): Array; + getXPositions(p0: Array): kotlin.FloatArray; + getXPositions(p0: Array, p1: number): kotlin.FloatArray; + getPath(p0: number): io.github.humbleui.skija.Path | null | undefined; + getPaths(p0: Array): Array; + getMetrics(): io.github.humbleui.skija.FontMetrics; + getSpacing(): number; + } + const FontMetrics: { + new(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number | null | undefined, p12: number | null | undefined, p13: number | null | undefined, p14: number | null | undefined): io.github.humbleui.skija.FontMetrics; + } + interface FontMetrics { + _top: number; + _ascent: number; + _descent: number; + _bottom: number; + _leading: number; + _avgCharWidth: number; + _maxCharWidth: number; + _xMin: number; + _xMax: number; + _xHeight: number; + _capHeight: number; + _underlineThickness: number | null | undefined; + _underlinePosition: number | null | undefined; + _strikeoutThickness: number | null | undefined; + _strikeoutPosition: number | null | undefined; + getHeight(): number; + getTop(): number; + getAscent(): number; + getDescent(): number; + getBottom(): number; + getLeading(): number; + getAvgCharWidth(): number; + getMaxCharWidth(): number; + getXMin(): number; + getXMax(): number; + getXHeight(): number; + getCapHeight(): number; + getUnderlineThickness(): number | null | undefined; + getUnderlinePosition(): number | null | undefined; + getStrikeoutThickness(): number | null | undefined; + getStrikeoutPosition(): number | null | undefined; + } + const FontEdging: { + ALIAS: io.github.humbleui.skija.FontEdging; + ANTI_ALIAS: io.github.humbleui.skija.FontEdging; + SUBPIXEL_ANTI_ALIAS: io.github.humbleui.skija.FontEdging; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.FontEdging; + } + interface FontEdging extends kotlin.Enum { + } + const FontHinting: { + NONE: io.github.humbleui.skija.FontHinting; + SLIGHT: io.github.humbleui.skija.FontHinting; + NORMAL: io.github.humbleui.skija.FontHinting; + FULL: io.github.humbleui.skija.FontHinting; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.FontHinting; + } + interface FontHinting extends kotlin.Enum { + } + const Typeface: { + new(p0: number): io.github.humbleui.skija.Typeface; + _nGetFontStyle(p0: number): number; + _nIsFixedPitch(p0: number): boolean; + _nGetVariations(p0: number): Array; + _nGetVariationAxes(p0: number): Array; + _nGetUniqueId(p0: number): number; + _nEquals(p0: number, p1: number): boolean; + _nMakeFromName(p0: string, p1: number): number; + _nMakeFromFile(p0: string, p1: number): number; + _nMakeFromData(p0: number, p1: number): number; + _nMakeClone(p0: number, p1: io.github.humbleui.skija.FontArguments): number; + _nGetUTF32Glyphs(p0: number, p1: Array): Array; + _nGetUTF32Glyph(p0: number, p1: number): number; + _nGetGlyphsCount(p0: number): number; + _nGetTablesCount(p0: number): number; + _nGetTableTags(p0: number): Array; + _nGetTableSize(p0: number, p1: number): number; + _nGetTableData(p0: number, p1: number): number; + _nGetUnitsPerEm(p0: number): number; + _nGetKerningPairAdjustments(p0: number, p1: Array): Array; + _nGetFamilyNames(p0: number): Array; + _nGetFamilyName(p0: number): string; + _nGetBounds(p0: number): io.github.humbleui.types.Rect; + _nOpenStream(p0: number, p1: Array): number; + } + interface Typeface extends io.github.humbleui.skija.impl.RefCnt { + getFontStyle(): io.github.humbleui.skija.FontStyle; + isBold(): boolean; + isItalic(): boolean; + isFixedPitch(): boolean; + getVariations(): Array; + getVariationAxes(): Array; + getUniqueId(): number; + makeClone(p0: io.github.humbleui.skija.FontVariation): io.github.humbleui.skija.Typeface; + makeClone(p0: Array): io.github.humbleui.skija.Typeface; + makeClone(p0: io.github.humbleui.skija.FontArguments): io.github.humbleui.skija.Typeface; + getStringGlyphs(p0: string): Array; + getUTF32Glyphs(p0: Array): Array; + getUTF32Glyph(p0: number): number; + getGlyphsCount(): number; + getTablesCount(): number; + getTableTags(): Array; + getTableSize(p0: string): number; + getTableData(p0: string): io.github.humbleui.skija.Data | null | undefined; + getUnitsPerEm(): number; + getKerningPairAdjustments(p0: Array): Array; + getFamilyNames(): Array; + getFamilyName(): string; + getBounds(): io.github.humbleui.types.Rect; + openStream(): io.github.humbleui.skija.StreamAsset; + openStream(p0: Array): io.github.humbleui.skija.StreamAsset; + } + const FontStyle: { + NORMAL: io.github.humbleui.skija.FontStyle; + BOLD: io.github.humbleui.skija.FontStyle; + ITALIC: io.github.humbleui.skija.FontStyle; + BOLD_ITALIC: io.github.humbleui.skija.FontStyle; + new(p0: number, p1: number, p2: io.github.humbleui.skija.FontSlant): io.github.humbleui.skija.FontStyle; + new(p0: number): io.github.humbleui.skija.FontStyle; + } + interface FontStyle { + _value: number; + getWeight(): number; + withWeight(p0: number): io.github.humbleui.skija.FontStyle; + getWidth(): number; + withWidth(p0: number): io.github.humbleui.skija.FontStyle; + getSlant(): io.github.humbleui.skija.FontSlant; + withSlant(p0: io.github.humbleui.skija.FontSlant): io.github.humbleui.skija.FontStyle; + } + const FontSlant: { + UPRIGHT: io.github.humbleui.skija.FontSlant; + ITALIC: io.github.humbleui.skija.FontSlant; + OBLIQUE: io.github.humbleui.skija.FontSlant; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.FontSlant; + } + interface FontSlant extends kotlin.Enum { + } + const FontVariation: { + EMPTY: Array; + _splitPattern: java.util.regex.Pattern; + _variationPattern: java.util.regex.Pattern; + new(p0: string, p1: number): io.github.humbleui.skija.FontVariation; + new(p0: number, p1: number): io.github.humbleui.skija.FontVariation; + parseOne(p0: string): io.github.humbleui.skija.FontVariation; + parse(p0: string): Array; + } + interface FontVariation { + _tag: number; + _value: number; + getTag(): string; + getValue(): number; + } + const FontArguments: { + DEFAULT: io.github.humbleui.skija.FontArguments; + new(p0: number, p1: Array, p2: number, p3: Array): io.github.humbleui.skija.FontArguments; + } + interface FontArguments { + _collectionIndex: number; + _variations: Array; + _paletteIndex: number; + _paletteOverrides: Array; + getCollectionIndex(): number; + getVariations(): Array; + getPaletteIndex(): number; + getPaletteOverrides(): Array; + withCollectionIndex(p0: number): io.github.humbleui.skija.FontArguments; + withVariations(p0: Array): io.github.humbleui.skija.FontArguments; + withPaletteIndex(p0: number): io.github.humbleui.skija.FontArguments; + withPaletteOverrides(p0: Array): io.github.humbleui.skija.FontArguments; + } + const StreamAsset: { + new(p0: number): io.github.humbleui.skija.StreamAsset; + _nGetFinalizer(): number; + _nIsAtEnd(p0: number): boolean; + _nRead(p0: number, p1: Array, p2: number): number; + _nPeek(p0: number, p1: Array, p2: number): number; + _nSkip(p0: number, p1: number): number; + _nRewind(p0: number): boolean; + _nDuplicate(p0: number): number; + _nFork(p0: number): number; + _nHasPosition(p0: number): boolean; + _nGetPosition(p0: number): number; + _nSeek(p0: number, p1: number): boolean; + _nMove(p0: number, p1: number): boolean; + _nHasLength(p0: number): boolean; + _nGetLength(p0: number): number; + _nGetMemoryBase(p0: number): number; + } + interface StreamAsset extends io.github.humbleui.skija.impl.Managed { + isAtEnd(): boolean; + read(p0: Array, p1: number): number; + peek(p0: Array, p1: number): number; + skip(p0: number): number; + rewind(): boolean; + duplicate(): io.github.humbleui.skija.StreamAsset | null | undefined; + fork(): io.github.humbleui.skija.StreamAsset | null | undefined; + hasPosition(): boolean; + getPosition(): number; + seek(p0: number): boolean; + move(p0: number): boolean; + hasLength(): boolean; + getLength(): number; + getMemoryBase(): number; + } + const Font$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.Font$_FinalizerHolder; + } + interface Font$_FinalizerHolder { + } + const TextBlob: { + _FinalizerHolder: typeof io.github.humbleui.skija.TextBlob$_FinalizerHolder; + new(p0: number): io.github.humbleui.skija.TextBlob; + makeFromPosH(p0: Array, p1: kotlin.FloatArray, p2: number, p3: io.github.humbleui.skija.Font): io.github.humbleui.skija.TextBlob; + makeFromPos(p0: Array, p1: Array, p2: io.github.humbleui.skija.Font): io.github.humbleui.skija.TextBlob; + makeFromRSXform(p0: Array, p1: Array, p2: io.github.humbleui.skija.Font): io.github.humbleui.skija.TextBlob; + makeFromData(p0: io.github.humbleui.skija.Data): io.github.humbleui.skija.TextBlob | null | undefined; + _nGetFinalizer(): number; + _nBounds(p0: number): io.github.humbleui.types.Rect; + _nGetUniqueId(p0: number): number; + _nGetIntercepts(p0: number, p1: number, p2: number, p3: number): kotlin.FloatArray; + _nMakeFromPosH(p0: Array, p1: kotlin.FloatArray, p2: number, p3: number): number; + _nMakeFromPos(p0: Array, p1: kotlin.FloatArray, p2: number): number; + _nMakeFromRSXform(p0: Array, p1: kotlin.FloatArray, p2: number): number; + _nSerializeToData(p0: number): number; + _nMakeFromData(p0: number): number; + _nGetGlyphs(p0: number): Array; + _nGetPositions(p0: number): kotlin.FloatArray; + _nGetClusters(p0: number): Array; + _nGetTightBounds(p0: number): io.github.humbleui.types.Rect; + _nGetBlockBounds(p0: number): io.github.humbleui.types.Rect; + _nGetFirstBaseline(p0: number): number; + _nGetLastBaseline(p0: number): number; + } + interface TextBlob extends io.github.humbleui.skija.impl.Managed { + getBounds(): io.github.humbleui.types.Rect; + getUniqueId(): number; + getIntercepts(p0: number, p1: number): kotlin.FloatArray; + getIntercepts(p0: number, p1: number, p2: io.github.humbleui.skija.Paint | null | undefined): kotlin.FloatArray; + serializeToData(): io.github.humbleui.skija.Data; + getGlyphs(): Array; + getPositions(): kotlin.FloatArray; + getClusters(): Array; + getTightBounds(): io.github.humbleui.types.Rect; + getBlockBounds(): io.github.humbleui.types.Rect; + getFirstBaseline(): number; + getLastBaseline(): number; + } + const TextBlob$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.TextBlob$_FinalizerHolder; + } + interface TextBlob$_FinalizerHolder { + } + const TextLine: { + _FinalizerHolder: typeof io.github.humbleui.skija.TextLine$_FinalizerHolder; + new(p0: number): io.github.humbleui.skija.TextLine; + make(p0: string, p1: io.github.humbleui.skija.Font): io.github.humbleui.skija.TextLine; + make(p0: string, p1: io.github.humbleui.skija.Font, p2: io.github.humbleui.skija.shaper.ShapingOptions): io.github.humbleui.skija.TextLine; + _nGetFinalizer(): number; + _nGetAscent(p0: number): number; + _nGetCapHeight(p0: number): number; + _nGetXHeight(p0: number): number; + _nGetDescent(p0: number): number; + _nGetLeading(p0: number): number; + _nGetWidth(p0: number): number; + _nGetHeight(p0: number): number; + _nGetTextBlob(p0: number): number; + _nGetGlyphs(p0: number): Array; + _nGetPositions(p0: number): kotlin.FloatArray; + _nGetRunPositions(p0: number): kotlin.FloatArray; + _nGetBreakPositions(p0: number): kotlin.FloatArray; + _nGetBreakOffsets(p0: number): Array; + _nGetOffsetAtCoord(p0: number, p1: number): number; + _nGetLeftOffsetAtCoord(p0: number, p1: number): number; + _nGetCoordAtOffset(p0: number, p1: number): number; + } + interface TextLine extends io.github.humbleui.skija.impl.Managed { + getAscent(): number; + getCapHeight(): number; + getXHeight(): number; + getDescent(): number; + getLeading(): number; + getWidth(): number; + getHeight(): number; + getTextBlob(): io.github.humbleui.skija.TextBlob | null | undefined; + getGlyphs(): Array; + getPositions(): kotlin.FloatArray; + getOffsetAtCoord(p0: number): number; + getLeftOffsetAtCoord(p0: number): number; + getCoordAtOffset(p0: number): number; + getIntercepts(p0: number, p1: number): kotlin.FloatArray; + getIntercepts(p0: number, p1: number, p2: io.github.humbleui.skija.Paint | null | undefined): kotlin.FloatArray; + } + const FontMgr: { + _DefaultHolder: typeof io.github.humbleui.skija.FontMgr$_DefaultHolder; + new(p0: number): io.github.humbleui.skija.FontMgr; + new(p0: number, p1: boolean): io.github.humbleui.skija.FontMgr; + useSystemRenderingParams(p0: boolean): void; + getDefault(): io.github.humbleui.skija.FontMgr; + _nGetFamiliesCount(p0: number): number; + _nGetFamilyName(p0: number, p1: number): string; + _nMakeStyleSet(p0: number, p1: number): number; + _nMatchFamily(p0: number, p1: string): number; + _nMatchFamilyStyle(p0: number, p1: string, p2: number): number; + _nMatchFamilyStyleCharacter(p0: number, p1: string, p2: number, p3: Array, p4: number): number; + _nMakeFromFile(p0: number, p1: string, p2: number): number; + _nMakeFromData(p0: number, p1: number, p2: number): number; + _nUseSystemRenderingParams(p0: number): void; + _nDefault(): number; + } + interface FontMgr extends io.github.humbleui.skija.impl.RefCnt { + getFamiliesCount(): number; + getFamilyName(p0: number): string; + makeStyleSet(p0: number): io.github.humbleui.skija.FontStyleSet; + matchFamily(p0: string | null | undefined): io.github.humbleui.skija.FontStyleSet; + matchFamilyStyle(p0: string | null | undefined, p1: io.github.humbleui.skija.FontStyle): io.github.humbleui.skija.Typeface | null | undefined; + matchFamiliesStyle(p0: Array, p1: io.github.humbleui.skija.FontStyle): io.github.humbleui.skija.Typeface | null | undefined; + matchFamilyStyleCharacter(p0: string | null | undefined, p1: io.github.humbleui.skija.FontStyle, p2: Array, p3: number): io.github.humbleui.skija.Typeface; + matchFamiliesStyleCharacter(p0: Array, p1: io.github.humbleui.skija.FontStyle, p2: Array, p3: number): io.github.humbleui.skija.Typeface | null | undefined; + makeFromFile(p0: string): io.github.humbleui.skija.Typeface | null | undefined; + makeFromFile(p0: string, p1: number): io.github.humbleui.skija.Typeface | null | undefined; + makeFromData(p0: io.github.humbleui.skija.Data): io.github.humbleui.skija.Typeface | null | undefined; + makeFromData(p0: io.github.humbleui.skija.Data, p1: number): io.github.humbleui.skija.Typeface | null | undefined; + } + const FontStyleSet: { + new(p0: number): io.github.humbleui.skija.FontStyleSet; + makeEmpty(): io.github.humbleui.skija.FontStyleSet; + _nMakeEmpty(): number; + _nCount(p0: number): number; + _nGetStyle(p0: number, p1: number): number; + _nGetStyleName(p0: number, p1: number): string; + _nGetTypeface(p0: number, p1: number): number; + _nMatchStyle(p0: number, p1: number): number; + } + interface FontStyleSet extends io.github.humbleui.skija.impl.RefCnt { + count(): number; + getStyle(p0: number): io.github.humbleui.skija.FontStyle; + getStyleName(p0: number): string; + getTypeface(p0: number): io.github.humbleui.skija.Typeface; + matchStyle(p0: io.github.humbleui.skija.FontStyle): io.github.humbleui.skija.Typeface; + } + const FontMgr$_DefaultHolder: { + INSTANCE: io.github.humbleui.skija.FontMgr; + new(): io.github.humbleui.skija.FontMgr$_DefaultHolder; + } + interface FontMgr$_DefaultHolder { + } + const TextLine$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.TextLine$_FinalizerHolder; + } + interface TextLine$_FinalizerHolder { + } + const Drawable: { + new(): io.github.humbleui.skija.Drawable; + _nMake(): number; + _nDraw(p0: number, p1: number, p2: kotlin.FloatArray): void; + _nMakePictureSnapshot(p0: number): number; + _nGetGenerationId(p0: number): number; + _nNotifyDrawingChanged(p0: number): void; + } + interface Drawable extends io.github.humbleui.skija.impl.RefCnt, io.github.humbleui.skija.Flattenable { + _bounds: io.github.humbleui.types.Rect; + draw(p0: io.github.humbleui.skija.Canvas): io.github.humbleui.skija.Drawable; + draw(p0: io.github.humbleui.skija.Canvas, p1: number, p2: number): io.github.humbleui.skija.Drawable; + draw(p0: io.github.humbleui.skija.Canvas, p1: io.github.humbleui.skija.Matrix33 | null | undefined): io.github.humbleui.skija.Drawable; + makePictureSnapshot(): io.github.humbleui.skija.Picture; + getGenerationId(): number; + getBounds(): io.github.humbleui.types.Rect; + notifyDrawingChanged(): io.github.humbleui.skija.Drawable; + onDraw(p0: io.github.humbleui.skija.Canvas): void; + onGetBounds(): io.github.humbleui.types.Rect; + _onDraw(p0: number): void; + _nInit(p0: number): void; + } + const ClipMode: { + DIFFERENCE: io.github.humbleui.skija.ClipMode; + INTERSECT: io.github.humbleui.skija.ClipMode; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.ClipMode; + } + interface ClipMode extends kotlin.Enum { + } + const SaveLayerRec: { + new(): io.github.humbleui.skija.SaveLayerRec; + new(p0: io.github.humbleui.types.Rect | null | undefined, p1: io.github.humbleui.skija.Paint | null | undefined): io.github.humbleui.skija.SaveLayerRec; + new(p0: io.github.humbleui.types.Rect | null | undefined, p1: io.github.humbleui.skija.Paint | null | undefined, p2: io.github.humbleui.skija.SaveLayerRecFlag): io.github.humbleui.skija.SaveLayerRec; + new(p0: io.github.humbleui.types.Rect | null | undefined, p1: io.github.humbleui.skija.Paint | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined): io.github.humbleui.skija.SaveLayerRec; + new(p0: io.github.humbleui.types.Rect | null | undefined, p1: io.github.humbleui.skija.Paint | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.skija.SaveLayerRecFlag): io.github.humbleui.skija.SaveLayerRec; + new(p0: io.github.humbleui.types.Rect | null | undefined, p1: io.github.humbleui.skija.Paint | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.skija.ColorSpace | null | undefined, p4: io.github.humbleui.skija.SaveLayerRecFlag): io.github.humbleui.skija.SaveLayerRec; + new(p0: io.github.humbleui.types.Rect | null | undefined, p1: io.github.humbleui.skija.Paint | null | undefined, p2: io.github.humbleui.skija.ImageFilter | null | undefined, p3: io.github.humbleui.skija.FilterTileMode, p4: io.github.humbleui.skija.ColorSpace | null | undefined, p5: io.github.humbleui.skija.SaveLayerRecFlag): io.github.humbleui.skija.SaveLayerRec; + } + interface SaveLayerRec { + _bounds: io.github.humbleui.types.Rect | null | undefined; + _paint: io.github.humbleui.skija.Paint | null | undefined; + _backdrop: io.github.humbleui.skija.ImageFilter | null | undefined; + _tileMode: io.github.humbleui.skija.FilterTileMode; + _colorSpace: io.github.humbleui.skija.ColorSpace | null | undefined; + _flags: number; + getBounds(): io.github.humbleui.types.Rect | null | undefined; + getPaint(): io.github.humbleui.skija.Paint | null | undefined; + getBackdrop(): io.github.humbleui.skija.ImageFilter | null | undefined; + getTileMode(): io.github.humbleui.skija.FilterTileMode; + getColorSpace(): io.github.humbleui.skija.ColorSpace | null | undefined; + getFlags(): number; + } + const SaveLayerRecFlag: { + PRESERVE_LCD_TEXT: io.github.humbleui.skija.SaveLayerRecFlag; + INIT_WITH_PREVIOUS: io.github.humbleui.skija.SaveLayerRecFlag; + F16_COLOR_TYPE: io.github.humbleui.skija.SaveLayerRecFlag; + _values: Array; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.github.humbleui.skija.SaveLayerRecFlag; + } + interface SaveLayerRecFlag extends kotlin.Enum { + _flag: number; + } + const Canvas$_FinalizerHolder: { + PTR: number; + new(): io.github.humbleui.skija.Canvas$_FinalizerHolder; + } + interface Canvas$_FinalizerHolder { + } + } + namespace types { + const Point: { + ZERO: io.github.humbleui.types.Point; + new(p0: number, p1: number): io.github.humbleui.types.Point; + flattenArray(p0: Array): kotlin.FloatArray; + fromArray(p0: kotlin.FloatArray): Array; + } + interface Point { + _x: number; + _y: number; + offset(p0: number, p1: number): io.github.humbleui.types.Point; + offset(p0: io.github.humbleui.types.Point): io.github.humbleui.types.Point; + scale(p0: number): io.github.humbleui.types.Point; + scale(p0: number, p1: number): io.github.humbleui.types.Point; + inverse(): io.github.humbleui.types.Point; + isEmpty(): boolean; + toIPoint(): io.github.humbleui.types.IPoint; + getX(): number; + getY(): number; + withX(p0: number): io.github.humbleui.types.Point; + withY(p0: number): io.github.humbleui.types.Point; + } + const IPoint: { + ZERO: io.github.humbleui.types.IPoint; + new(p0: number, p1: number): io.github.humbleui.types.IPoint; + _makeFromLong(p0: number): io.github.humbleui.types.IPoint; + } + interface IPoint { + _x: number; + _y: number; + offset(p0: number, p1: number): io.github.humbleui.types.IPoint; + offset(p0: io.github.humbleui.types.IPoint): io.github.humbleui.types.IPoint; + scale(p0: number): io.github.humbleui.types.IPoint; + scale(p0: number, p1: number): io.github.humbleui.types.IPoint; + inverse(): io.github.humbleui.types.IPoint; + isEmpty(): boolean; + toPoint(): io.github.humbleui.types.Point; + getX(): number; + getY(): number; + withX(p0: number): io.github.humbleui.types.IPoint; + withY(p0: number): io.github.humbleui.types.IPoint; + } + const IRect: { + new(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.IRect; + makeLTRB(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.IRect; + makeXYWH(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.IRect; + makeWH(p0: number, p1: number): io.github.humbleui.types.IRect; + } + interface IRect { + _left: number; + _top: number; + _right: number; + _bottom: number; + getWidth(): number; + getHeight(): number; + withWidth(p0: number): io.github.humbleui.types.IRect; + withHeight(p0: number): io.github.humbleui.types.IRect; + intersect(p0: io.github.humbleui.types.IRect): io.github.humbleui.types.IRect | null | undefined; + scale(p0: number): io.github.humbleui.types.IRect; + scale(p0: number, p1: number): io.github.humbleui.types.IRect; + offset(p0: number, p1: number): io.github.humbleui.types.IRect; + offset(p0: io.github.humbleui.types.IPoint): io.github.humbleui.types.IRect; + toRect(): io.github.humbleui.types.Rect; + isEmpty(): boolean; + contains(p0: number, p1: number): boolean; + contains(p0: io.github.humbleui.types.IPoint): boolean; + getLeft(): number; + getTop(): number; + getRight(): number; + getBottom(): number; + withLeft(p0: number): io.github.humbleui.types.IRect; + withTop(p0: number): io.github.humbleui.types.IRect; + withRight(p0: number): io.github.humbleui.types.IRect; + withBottom(p0: number): io.github.humbleui.types.IRect; + } + const Rect: { + new(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.Rect; + makeLTRB(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.Rect; + makeWH(p0: number, p1: number): io.github.humbleui.types.Rect; + makeWH(p0: io.github.humbleui.types.Point): io.github.humbleui.types.Rect; + makeXYWH(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.Rect; + } + interface Rect { + _left: number; + _top: number; + _right: number; + _bottom: number; + getWidth(): number; + getHeight(): number; + withWidth(p0: number): io.github.humbleui.types.Rect; + withHeight(p0: number): io.github.humbleui.types.Rect; + intersect(p0: io.github.humbleui.types.Rect): io.github.humbleui.types.Rect | null | undefined; + scale(p0: number): io.github.humbleui.types.Rect; + scale(p0: number, p1: number): io.github.humbleui.types.Rect; + offset(p0: number, p1: number): io.github.humbleui.types.Rect; + offset(p0: io.github.humbleui.types.Point): io.github.humbleui.types.Rect; + toIRect(): io.github.humbleui.types.IRect; + withRadii(p0: number): io.github.humbleui.types.RRect; + withRadii(p0: number, p1: number): io.github.humbleui.types.RRect; + withRadii(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.RRect; + withRadii(p0: kotlin.FloatArray): io.github.humbleui.types.RRect; + inflate(p0: number): io.github.humbleui.types.Rect; + isEmpty(): boolean; + getLeft(): number; + getTop(): number; + getRight(): number; + getBottom(): number; + withLeft(p0: number): io.github.humbleui.types.Rect; + withTop(p0: number): io.github.humbleui.types.Rect; + withRight(p0: number): io.github.humbleui.types.Rect; + withBottom(p0: number): io.github.humbleui.types.Rect; + } + const RRect: { + new(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): io.github.humbleui.types.RRect; + makeLTRB(p0: number, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.types.RRect; + makeLTRB(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): io.github.humbleui.types.RRect; + makeLTRB(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): io.github.humbleui.types.RRect; + makeNinePatchLTRB(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): io.github.humbleui.types.RRect; + makeComplexLTRB(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): io.github.humbleui.types.RRect; + makeOvalLTRB(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.RRect; + makePillLTRB(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.RRect; + makeXYWH(p0: number, p1: number, p2: number, p3: number, p4: number): io.github.humbleui.types.RRect; + makeXYWH(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): io.github.humbleui.types.RRect; + makeXYWH(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): io.github.humbleui.types.RRect; + makeNinePatchXYWH(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): io.github.humbleui.types.RRect; + makeComplexXYWH(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): io.github.humbleui.types.RRect; + makeOvalXYWH(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.RRect; + makePillXYWH(p0: number, p1: number, p2: number, p3: number): io.github.humbleui.types.RRect; + } + interface RRect extends io.github.humbleui.types.Rect { + _radii: kotlin.FloatArray; + } + } + } + } } namespace it { namespace unimi { From 68d28b3071d7bec557c07a723e6500b5ddc87976 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Tue, 18 Aug 2026 17:32:06 +0100 Subject: [PATCH 21/61] ponytail + testing agents.md --- AGENTS.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..51db2a3e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,42 @@ +# Repository Guidelines + +## Coding Style + +You are a lazy senior developer. Lazy means efficient, not careless. The best code is the code never written. + +Before writing any code, stop at the first rung that holds: + +Does this need to be built at all? (YAGNI) +Does it already exist in this codebase? Reuse the helper, util, or pattern that's already here, don't re-write it. +Does the standard library already do this? Use it. +Does a native platform feature cover it? Use it. +Does an already-installed dependency solve it? Use it. +Can this be one line? Make it one line. +Only then: write the minimum code that works. +The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb. + +Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken. + +Rules: + +No abstractions that weren't explicitly requested. +No new dependency if it can be avoided. +No boilerplate nobody asked for. +Deletion over addition. Boring over clever. Fewest files possible. +Shortest working diff wins, but only once you understand the problem. The smallest change in the wrong place isn't lazy, it's a second bug. +Question complex requests: "Do you actually need X, or does Y cover it?" +Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm. +Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a ponytail: comment naming the ceiling and upgrade path. +Not lazy about: understanding the problem (read it fully and trace the real flow before picking a rung, a small diff you don't understand is just laziness dressed up as efficiency), input validation at trust boundaries, error handling that prevents data loss, security, accessibility, the calibration real hardware needs (the platform is never the spec ideal, a clock drifts, a sensor reads off), anything explicitly requested. Lazy code without its check is unfinished: non-trivial logic leaves ONE runnable check behind, the smallest thing that fails if the logic breaks (an assert-based demo/self-check or one small test file; no frameworks, no fixtures). Trivial one-liners need no test. + +## Build, Test, and Development Process + +- `./gradlew build` — compile all supported Minecraft versions and produces `versions//build/libs/V5-Loader-DEV-.jar`. +- `./gradlew generateTypings` — regenerate `typing-generator/src/main/resources/typings.d.ts` after exported API changes. + +## Testing Guidelines + +Do not implement any testing coverage. +Before finishing, run `./gradlew build` only, do not use any other gradlew commands for confirming build status. +Changes affecting API should run `./gradlew generateTypings`. NEVER manually edit the `typings.d.ts` file EVER. +For native changes, rebuild with CMake for local only; Automated workflows will handle building all natives on push. From f9c723ff6263eafcce6b24ef772f141bf7a87bc7 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:17:15 +0100 Subject: [PATCH 22/61] codex: optimise rendering --- .../ctjs/api/render/GuiRendererBackend.kt | 30 ++++++++++++------- .../chattriggers/ctjs/api/render/Render3D.kt | 4 --- .../kotlin/com/v5/loader/internal/V5Loader.kt | 4 +-- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt index 34808b18..db2fa91b 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt @@ -41,6 +41,9 @@ open class GuiRendererBackend { private val scissorDepths = ArrayDeque() private var canvas: Canvas? = null private var checkerImage: SkijaImage? = null + private val checkerShaders = HashMap() + private val gradientShaders = HashMap() + private val hueColors = IntArray(7) { 0xff000000.toInt() or (Color.HSBtoRGB(it / 6f, 1f, 1f) and 0xffffff) } private var alpha = 1f private var saveDepth = 0 @@ -59,6 +62,7 @@ open class GuiRendererBackend { private data class CachedImage(val image: SkijaImage, var refs: Int = 1) private data class CachedGif(val frames: List, val delays: IntArray, val width: Int, val height: Int, var refs: Int = 1) private data class FontKey(val font: Font, val size: Float) + private data class GradientKey(val x: Float, val y: Float, val width: Float, val height: Float, val color1: Int, val color2: Int, val direction: Gradient, val alpha: Float) private enum class Gradient { LEFT_TO_RIGHT, TOP_TO_BOTTOM, TL_TO_BR, BL_TO_TR } fun registerV5Render(callback: Runnable) = callback.also(callbacks::add) @@ -181,7 +185,7 @@ open class GuiRendererBackend { @JvmOverloads fun drawGradientRect(x: Float, y: Float, width: Float, height: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) = - gradientShader(x, y, width, height, color1, color2, direction).use { shader -> + gradientShader(x, y, width, height, color1, color2, direction).let { shader -> Paint().setAntiAlias(true).setShader(shader).use { if (radius > 0f) canvas?.drawRRect(RRect.makeXYWH(x, y, width, height, radius), it) else canvas?.drawRect(Rect.makeXYWH(x, y, width, height), it) @@ -191,7 +195,7 @@ open class GuiRendererBackend { @JvmOverloads fun drawHollowGradientRect(x: Float, y: Float, width: Float, height: Float, thickness: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) = - gradientShader(x, y, width, height, color1, color2, direction).use { shader -> + gradientShader(x, y, width, height, color1, color2, direction).let { shader -> Paint().setAntiAlias(true).setShader(shader).setMode(PaintMode.STROKE).setStrokeWidth(thickness).use { if (radius > 0f) canvas?.drawRRect(RRect.makeXYWH(x, y, width, height, radius), it) else canvas?.drawRect(Rect.makeXYWH(x, y, width, height), it) @@ -205,12 +209,7 @@ open class GuiRendererBackend { val step = size.coerceAtLeast(0.1f) active.save() active.clipRRect(RRect.makeXYWH(x, y, width, height, radius), true) - checkerImage().makeShader( - FilterTileMode.REPEAT, - FilterTileMode.REPEAT, - SamplingMode.DEFAULT, - Matrix33.makeScale(step), - ).use { shader -> + checkerShader(step).let { shader -> Paint().setShader(shader).setAlphaf(alpha).use { active.drawRect(Rect.makeXYWH(x, y, width, height), it) } @@ -219,7 +218,7 @@ open class GuiRendererBackend { } fun drawHueBar(x: Float, y: Float, width: Float, height: Float, radius: Float) { - val colors = IntArray(7) { applyAlpha(0xff000000.toInt() or (Color.HSBtoRGB(it / 6f, 1f, 1f) and 0xffffff)) } + val colors = if (alpha == 1f) hueColors else IntArray(7) { applyAlpha(hueColors[it]) } Shader.makeLinearGradient(x, y, x + width, y, colors).use { shader -> Paint().setAntiAlias(true).setShader(shader).use { paint -> canvas?.drawRRect(RRect.makeXYWH(x, y, width, height, radius), paint) @@ -319,6 +318,8 @@ open class GuiRendererBackend { fun destroy() { clearImageCache() checkerImage?.close(); checkerImage = null + checkerShaders.values.forEach(Shader::close); checkerShaders.clear() + gradientShaders.values.forEach(Shader::close); gradientShaders.clear() fonts.values.forEach(io.github.humbleui.skija.Font::close); fonts.clear() typefaces.values.forEach(Typeface::close); typefaces.clear() } @@ -349,6 +350,10 @@ open class GuiRendererBackend { surface.makeImageSnapshot().also { checkerImage = it } } + private fun checkerShader(size: Float) = checkerShaders.getOrPut(size) { + checkerImage().makeShader(FilterTileMode.REPEAT, FilterTileMode.REPEAT, SamplingMode.DEFAULT, Matrix33.makeScale(size)) + } + private fun processDownloads() { repeat(5) { val (url, bytes) = downloadedUrls.poll() ?: return @@ -423,13 +428,16 @@ open class GuiRendererBackend { .setAntiAlias(true).setMode(mode).setColor(applyAlpha(color)) private fun gradientShader(x: Float, y: Float, width: Float, height: Float, color1: Int, color2: Int, direction: Any): Shader { - val (endX, endY) = when (resolveGradient(direction)) { + val resolved = resolveGradient(direction) + val key = GradientKey(x, y, width, height, color1, color2, resolved, alpha) + gradientShaders[key]?.let { return it } + val (endX, endY) = when (resolved) { Gradient.TOP_TO_BOTTOM -> x to y + height Gradient.TL_TO_BR -> x + width to y + height Gradient.BL_TO_TR -> x + width to y - height Gradient.LEFT_TO_RIGHT -> x + width to y } - return Shader.makeLinearGradient(x, y, endX, endY, intArrayOf(applyAlpha(color1), applyAlpha(color2))) + return Shader.makeLinearGradient(x, y, endX, endY, intArrayOf(applyAlpha(color1), applyAlpha(color2))).also { gradientShaders[key] = it } } private fun resolveGradient(direction: Any) = when { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt index 71bce492..a3e4ab65 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt @@ -14,10 +14,6 @@ object Render3D { private val client = Minecraft.getInstance() data class Color(val r: Int, val g: Int, val b: Int, val a: Int) { - val rf = r / 255f - val gf = g / 255f - val bf = b / 255f - val af = a / 255f val packed = ARGB.color(a, r, g, b) } diff --git a/src/main/kotlin/com/v5/loader/internal/V5Loader.kt b/src/main/kotlin/com/v5/loader/internal/V5Loader.kt index e04f9a15..b392a406 100644 --- a/src/main/kotlin/com/v5/loader/internal/V5Loader.kt +++ b/src/main/kotlin/com/v5/loader/internal/V5Loader.kt @@ -21,7 +21,7 @@ import kotlin.io.path.writeText internal object V5Loader { private const val MOD_ID = "ctjs" - private const val DEVELOPER_JAR_NAME = "V5-Loader-DEV.jar" + private const val DEVELOPER_JAR_PREFIX = "V5-Loader-DEV-" private val secretLock = Any() private var initialized = false private var sessionToken = "" @@ -66,7 +66,7 @@ internal object V5Loader { private fun checkSelfUpdate(token: String, minecraftVersion: String, gameDir: File) { val activeJar = resolveActiveJar() - if (activeJar.name == DEVELOPER_JAR_NAME) { + if (activeJar.name.startsWith(DEVELOPER_JAR_PREFIX) && activeJar.extension.equals("jar", ignoreCase = true)) { println("[V5] Developer jar detected; skipping integrity check.") return } From 4b016dbb9854b019a82e8519d69c32a75baee0b7 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:17:51 +0100 Subject: [PATCH 23/61] bump deps --- README.md | 4 ++-- build.gradle.kts | 5 ----- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- typing-generator/build.gradle.kts | 4 +--- 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 1a8354c9..b78977a8 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ For production release commits, CI builds all platforms in parallel and commits ### Quick dev commands -Each command compiles required native C++ code, then builds the final Kotlin mod. The output can be found at `build/libs/V5-Loader-DEV.jar`. +Each command compiles required native C++ code, then builds the final Kotlin mod. The output can be found at `versions//build/libs/V5-Loader-DEV-.jar`. - **Linux:** @@ -76,4 +76,4 @@ cmake -S NativeSrc -B NativeSrc/build -DCMAKE_BUILD_TYPE=Release; cmake --build ### Install built mod -After building, copy `build/libs/V5-Loader-DEV.jar` into `.minecraft/mods/`. +After building, copy the relevant `versions//build/libs/V5-Loader-DEV-.jar` into `.minecraft/mods/`. diff --git a/build.gradle.kts b/build.gradle.kts index 2fb5e081..646e33c6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,11 +7,6 @@ plugins { alias(libs.plugins.serialization) alias(libs.plugins.ksp) alias(libs.plugins.loom) - id("io.github.izhangzhihao.unmeta") version "1.0.3" -} - -unmeta { - enable.set(true) } version = property("mod_version").toString() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aecb578c..2dadca0a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,7 +18,7 @@ hypixel-modrinth-api = "1.0.2+build.1+mc26.1" # Plugin Versions kotlin = "2.3.10" -loom = "1.17-SNAPSHOT" +loom = "1.18.0-alpha.16" ksp = "2.3.9" [libraries] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7e7d24f6..1e922f40 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/typing-generator/build.gradle.kts b/typing-generator/build.gradle.kts index 34ec3c30..3e46849c 100644 --- a/typing-generator/build.gradle.kts +++ b/typing-generator/build.gradle.kts @@ -3,9 +3,7 @@ plugins { } kotlin { - kotlin { - jvmToolchain(21) - } + jvmToolchain(21) } buildscript { From 2ae726942c1684c3aaa43e6d5253f6aace92bee0 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:35:37 +0100 Subject: [PATCH 24/61] add bulk 3d render apis --- .../chattriggers/ctjs/api/render/Render3D.kt | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt index a3e4ab65..de0a133d 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Render3D.kt @@ -28,6 +28,22 @@ object Render3D { Gizmos.cuboid(box, GizmoStyle.fill(color.packed)).depth(depth) } + @JvmStatic + @JvmOverloads + fun drawFilledBoxes(positions: Array, color: Color, depth: Boolean = false) { + val style = GizmoStyle.fill(color.packed) + positions.forEach { pos -> + Gizmos.cuboid(AABB(pos.x, pos.y, pos.z, pos.x + 1, pos.y + 1, pos.z + 1), style).depth(depth) + } + } + + @JvmStatic + @JvmOverloads + fun drawFilledAABBs(boxes: Array, color: Color, depth: Boolean = false) { + val style = GizmoStyle.fill(color.packed) + boxes.forEach { box -> Gizmos.cuboid(box, style).depth(depth) } + } + @JvmStatic @JvmOverloads fun drawWireFrameBox(pos: Vec3, color: Color, thickness: Float = 5f, depth: Boolean = false) = @@ -39,12 +55,35 @@ object Render3D { Gizmos.cuboid(box, GizmoStyle.stroke(color.packed, thickness)).depth(depth) } + @JvmStatic + @JvmOverloads + fun drawWireFrameBoxes(positions: Array, color: Color, thickness: Float = 5f, depth: Boolean = false) { + val style = GizmoStyle.stroke(color.packed, thickness) + positions.forEach { pos -> + Gizmos.cuboid(AABB(pos.x, pos.y, pos.z, pos.x + 1, pos.y + 1, pos.z + 1), style).depth(depth) + } + } + + @JvmStatic + @JvmOverloads + fun drawWireFrameAABBs(boxes: Array, color: Color, thickness: Float = 5f, depth: Boolean = false) { + val style = GizmoStyle.stroke(color.packed, thickness) + boxes.forEach { box -> Gizmos.cuboid(box, style).depth(depth) } + } + @JvmStatic @JvmOverloads fun drawBox(box: AABB, color: Color, thickness: Float = 2f, depth: Boolean = false) { Gizmos.cuboid(box, GizmoStyle.strokeAndFill(color.packed, thickness, color.packed)).depth(depth) } + @JvmStatic + @JvmOverloads + fun drawBoxes(boxes: Array, color: Color, thickness: Float = 2f, depth: Boolean = false) { + val style = GizmoStyle.strokeAndFill(color.packed, thickness, color.packed) + boxes.forEach { box -> Gizmos.cuboid(box, style).depth(depth) } + } + @JvmStatic @JvmOverloads fun drawStyledBox(pos: Vec3, color1: Color, color2: Color, wireThickness: Float = 5f, depth: Boolean = false) { @@ -52,6 +91,15 @@ object Render3D { Gizmos.cuboid(box, GizmoStyle.strokeAndFill(color2.packed, wireThickness, color1.packed)).depth(depth) } + @JvmStatic + @JvmOverloads + fun drawStyledBoxes(positions: Array, color1: Color, color2: Color, wireThickness: Float = 5f, depth: Boolean = false) { + val style = GizmoStyle.strokeAndFill(color2.packed, wireThickness, color1.packed) + positions.forEach { pos -> + Gizmos.cuboid(AABB(pos.x, pos.y, pos.z, pos.x + 1, pos.y + 1, pos.z + 1), style).depth(depth) + } + } + @JvmStatic @JvmOverloads fun drawSizedBox(pos: Vec3, width: Double, height: Double, length: Double, color: Color, filled: Boolean = true, thickness: Float = 1f, depth: Boolean = false) { @@ -59,6 +107,16 @@ object Render3D { Gizmos.cuboid(box, if (filled) GizmoStyle.fill(color.packed) else GizmoStyle.stroke(color.packed, thickness)).depth(depth) } + @JvmStatic + @JvmOverloads + fun drawSizedBoxes(positions: Array, width: Double, height: Double, length: Double, color: Color, filled: Boolean = true, thickness: Float = 1f, depth: Boolean = false) { + val style = if (filled) GizmoStyle.fill(color.packed) else GizmoStyle.stroke(color.packed, thickness) + positions.forEach { pos -> + val box = AABB(pos.x - width / 2, pos.y, pos.z - length / 2, pos.x + width / 2, pos.y + height, pos.z + length / 2) + Gizmos.cuboid(box, style).depth(depth) + } + } + @JvmStatic @JvmOverloads fun drawHitbox(entity: Entity, color: Color, thickness: Float = 2f, depth: Boolean = false) { @@ -71,12 +129,43 @@ object Render3D { drawBox(box, color, thickness, depth) } + @JvmStatic + @JvmOverloads + fun drawHitboxes(entities: Array, color: Color, thickness: Float = 2f, depth: Boolean = false) { + val partialTicks = client.deltaTracker.getGameTimeDeltaPartialTick(true) + val style = GizmoStyle.strokeAndFill(color.packed, thickness, color.packed) + entities.forEach { entity -> + val box = entity.boundingBox.move( + entity.xOld + (entity.x - entity.xOld) * partialTicks - entity.x, + entity.yOld + (entity.y - entity.yOld) * partialTicks - entity.y, + entity.zOld + (entity.z - entity.zOld) * partialTicks - entity.z, + ) + Gizmos.cuboid(box, style).depth(depth) + } + } + @JvmStatic @JvmOverloads fun drawLine(start: Vec3, end: Vec3, color: Color, thickness: Float = 3f, depth: Boolean = false) { Gizmos.line(start, end, color.packed, thickness).depth(depth) } + @JvmStatic + @JvmOverloads + fun drawLines(points: Array, color: Color, thickness: Float = 3f, depth: Boolean = false) { + for (i in 0 until points.lastIndex) { + Gizmos.line(points[i], points[i + 1], color.packed, thickness).depth(depth) + } + } + + @JvmStatic + @JvmOverloads + fun drawLines(points: Array, colors: Array, thickness: Float = 3f, depth: Boolean = false) { + for (i in 0 until minOf(points.lastIndex, colors.lastIndex + 1)) { + Gizmos.line(points[i], points[i + 1], colors[i].packed, thickness).depth(depth) + } + } + @JvmStatic @JvmOverloads fun drawTracer(targetPos: Vec3, color: Color, thickness: Float = 2f, depth: Boolean = false) { @@ -85,6 +174,14 @@ object Render3D { drawLine(start, targetPos, color, thickness, depth) } + @JvmStatic + @JvmOverloads + fun drawTracers(targetPositions: Array, color: Color, thickness: Float = 2f, depth: Boolean = false) { + val camera = MinecraftCompat.mainCamera(client.gameRenderer) + val start = camera.position().add(Vec3.directionFromRotation(camera.xRot(), camera.yRot()).scale(0.1)) + targetPositions.forEach { targetPos -> Gizmos.line(start, targetPos, color.packed, thickness).depth(depth) } + } + @JvmStatic @JvmOverloads fun drawText(text: String, pos: Vec3, scale: Float = 1f, backgroundBox: Boolean = false, increase: Boolean = false, seeThrough: Boolean = false, translate: Boolean = true) { @@ -96,6 +193,20 @@ object Render3D { } } + @JvmStatic + @JvmOverloads + fun drawTexts(texts: Array, positions: Array, scale: Float = 1f, backgroundBox: Boolean = false, increase: Boolean = false, seeThrough: Boolean = false, translate: Boolean = true) { + val camera = MinecraftCompat.mainCamera(client.gameRenderer) + for (i in 0 until minOf(texts.size, positions.size)) { + val pos = positions[i] + val distanceScale = if (increase) (pos.distanceTo(camera.position()).toFloat() / 120f).coerceAtLeast(0.01f) else 1f + val style = TextGizmo.Style.whiteAndCentered().withScale(TextGizmo.Style.DEFAULT_SCALE * scale * distanceScale) + Gizmos.billboardText(texts[i], if (translate) pos else camera.position(), style).apply { + if (seeThrough) setAlwaysOnTop() + } + } + } + private fun net.minecraft.gizmos.GizmoProperties.depth(depth: Boolean) = apply { if (!depth) setAlwaysOnTop() } From c83cc361e7e27eabdf581abfe02ff1a223008fb6 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:38:21 +0100 Subject: [PATCH 25/61] typings upadte --- .../src/main/resources/typings.d.ts | 8886 ++++++++++------- 1 file changed, 5093 insertions(+), 3793 deletions(-) diff --git a/typing-generator/src/main/resources/typings.d.ts b/typing-generator/src/main/resources/typings.d.ts index 7fa81a6e..7a609a93 100644 --- a/typing-generator/src/main/resources/typings.d.ts +++ b/typing-generator/src/main/resources/typings.d.ts @@ -3608,11 +3608,14 @@ declare global { } const Reader: { nullReader(): java.io.Reader; + of(p0: kotlin.CharSequence): java.io.Reader; } interface Reader extends java.lang.Readable, java.io.Closeable { read(): number; read(p0: Array): number; read(p0: Array, p1: number, p2: number): number; + readAllLines(): Array; + readAllAsString(): string; skip(p0: number): number; ready(): boolean; markSupported(): boolean; @@ -3757,6 +3760,7 @@ declare global { reduce(p0: T, p1: unknown): T; reduce(p0: unknown): java.util.Optional; reduce(p0: U, p1: unknown, p2: unknown): U; + gather(p0: java.util.stream.Gatherer): java.util.stream.Stream; collect(p0: unknown, p1: unknown, p2: unknown): R; collect(p0: java.util.stream.Collector): R; toList(): Array; @@ -3941,6 +3945,40 @@ declare global { add(p0: number): java.util.stream.IntStream$Builder; build(): java.util.stream.IntStream; } + const Gatherer: { + defaultInitializer(): unknown; + defaultCombiner(): unknown; + defaultFinisher(): unknown; + ofSequential(p0: java.util.stream.Gatherer$Integrator): java.util.stream.Gatherer; + ofSequential(p0: java.util.stream.Gatherer$Integrator, p1: unknown): java.util.stream.Gatherer; + ofSequential(p0: unknown, p1: java.util.stream.Gatherer$Integrator): java.util.stream.Gatherer; + ofSequential(p0: unknown, p1: java.util.stream.Gatherer$Integrator, p2: unknown): java.util.stream.Gatherer; + of(p0: java.util.stream.Gatherer$Integrator): java.util.stream.Gatherer; + of(p0: java.util.stream.Gatherer$Integrator, p1: unknown): java.util.stream.Gatherer; + of(p0: unknown, p1: java.util.stream.Gatherer$Integrator, p2: unknown, p3: unknown): java.util.stream.Gatherer; + } + interface Gatherer { + initializer(): unknown; + integrator(): java.util.stream.Gatherer$Integrator; + combiner(): unknown; + finisher(): unknown; + andThen(p0: java.util.stream.Gatherer): java.util.stream.Gatherer; + } + const Gatherer$Integrator: { + of(p0: java.util.stream.Gatherer$Integrator): java.util.stream.Gatherer$Integrator; + ofGreedy(p0: unknown): unknown; + } + interface Gatherer$Integrator { + integrate(p0: A, p1: T, p2: java.util.stream.Gatherer$Downstream): boolean; + (p0: A, p1: T, p2: java.util.stream.Gatherer$Downstream): boolean; + } + interface Gatherer$Downstream { + push(p0: T): boolean; + isRejecting(): boolean; + (p0: T): boolean; + } + interface Gatherer$Integrator$Greedy extends java.util.stream.Gatherer$Integrator { + } const Collector: { Characteristics: typeof java.util.stream.Collector$Characteristics; of(p0: unknown, p1: unknown, p2: unknown, p3: java.util.stream.Collector$Characteristics): java.util.stream.Collector; @@ -4270,6 +4308,7 @@ declare global { doubles(p0: number, p1: number): java.util.stream.DoubleStream; doubles(p0: number): java.util.stream.DoubleStream; doubles(p0: number, p1: number, p2: number): java.util.stream.DoubleStream; + equiDoubles(p0: number, p1: number, p2: boolean, p3: boolean): java.util.stream.DoubleStream; ints(): java.util.stream.IntStream; ints(p0: number, p1: number): java.util.stream.IntStream; ints(p0: number): java.util.stream.IntStream; @@ -4835,10 +4874,42 @@ declare global { nextElement(): E; asIterator(): kotlin.collections.MutableIterator; } + interface SortedMap extends java.util.SequencedMap { + comparator(): java.util.Comparator; + subMap(p0: K, p1: K): java.util.SortedMap; + headMap(p0: K): java.util.SortedMap; + tailMap(p0: K): java.util.SortedMap; + firstKey(): K; + lastKey(): K; + } + interface SequencedMap extends Map { + reversed(): java.util.SequencedMap; + firstEntry(): kotlin.collections.MutableMap$MutableEntry; + lastEntry(): kotlin.collections.MutableMap$MutableEntry; + pollFirstEntry(): kotlin.collections.MutableMap$MutableEntry; + pollLastEntry(): kotlin.collections.MutableMap$MutableEntry; + putFirst(p0: K, p1: V): V; + putLast(p0: K, p1: V): V; + sequencedKeySet(): java.util.SequencedSet; + sequencedValues(): java.util.SequencedCollection; + sequencedEntrySet(): java.util.SequencedSet>; + } + interface SequencedSet extends java.util.SequencedCollection, Set { + } + interface SequencedCollection extends Array { + reversed(): java.util.SequencedCollection; + addFirst(p0: E): void; + addLast(p0: E): void; + getFirst(): E; + getLast(): E; + removeFirst(): E; + removeLast(): E; + } const Currency: { getInstance(p0: string): java.util.Currency; getInstance(p0: java.util.Locale): java.util.Currency; getAvailableCurrencies(): Set; + availableCurrencies(): java.util.stream.Stream; } interface Currency extends java.io.Serializable { getCurrencyCode(): string; @@ -4891,37 +4962,6 @@ declare global { interface Random extends java.util.random.RandomGenerator, java.io.Serializable { setSeed(p0: number): void; } - interface SortedMap extends java.util.SequencedMap { - comparator(): java.util.Comparator; - subMap(p0: K, p1: K): java.util.SortedMap; - headMap(p0: K): java.util.SortedMap; - tailMap(p0: K): java.util.SortedMap; - firstKey(): K; - lastKey(): K; - } - interface SequencedMap extends Map { - reversed(): java.util.SequencedMap; - firstEntry(): kotlin.collections.MutableMap$MutableEntry; - lastEntry(): kotlin.collections.MutableMap$MutableEntry; - pollFirstEntry(): kotlin.collections.MutableMap$MutableEntry; - pollLastEntry(): kotlin.collections.MutableMap$MutableEntry; - putFirst(p0: K, p1: V): V; - putLast(p0: K, p1: V): V; - sequencedKeySet(): java.util.SequencedSet; - sequencedValues(): java.util.SequencedCollection; - sequencedEntrySet(): java.util.SequencedSet>; - } - interface SequencedSet extends java.util.SequencedCollection, Set { - } - interface SequencedCollection extends Array { - reversed(): java.util.SequencedCollection; - addFirst(p0: E): void; - addLast(p0: E): void; - getFirst(): E; - getLast(): E; - removeFirst(): E; - removeLast(): E; - } const BitSet: { new(): java.util.BitSet; new(p0: number): java.util.BitSet; @@ -5108,6 +5148,8 @@ declare global { getTimeZone(p0: java.time.ZoneId): java.util.TimeZone; getAvailableIDs(p0: number): Array; getAvailableIDs(): Array; + availableIDs(p0: number): java.util.stream.Stream; + availableIDs(): java.util.stream.Stream; getDefault(): java.util.TimeZone; setDefault(p0: java.util.TimeZone): void; } @@ -5148,8 +5190,6 @@ declare global { setWeekDefinition(p0: number, p1: number): java.util.Calendar$Builder; build(): java.util.Calendar; } - interface EventListener { - } const Properties: { new(): java.util.Properties; new(p0: number): java.util.Properties; @@ -5194,6 +5234,8 @@ declare global { put(p0: K, p1: V): V; remove(p0: any): V; } + interface EventListener { + } const EnumMap: { new(p0: java.lang.Class): java.util.EnumMap; new(p0: java.util.EnumMap): java.util.EnumMap; @@ -5909,26 +5951,28 @@ declare global { prefixAllocator(p0: java.lang.foreign.MemorySegment): java.lang.foreign.SegmentAllocator; } interface SegmentAllocator { - allocateUtf8String(p0: string): java.lang.foreign.MemorySegment; - allocate(p0: java.lang.foreign.ValueLayout$OfByte, p1: number): java.lang.foreign.MemorySegment; - allocate(p0: java.lang.foreign.ValueLayout$OfChar, p1: number): java.lang.foreign.MemorySegment; - allocate(p0: java.lang.foreign.ValueLayout$OfShort, p1: number): java.lang.foreign.MemorySegment; - allocate(p0: java.lang.foreign.ValueLayout$OfInt, p1: number): java.lang.foreign.MemorySegment; - allocate(p0: java.lang.foreign.ValueLayout$OfFloat, p1: number): java.lang.foreign.MemorySegment; - allocate(p0: java.lang.foreign.ValueLayout$OfLong, p1: number): java.lang.foreign.MemorySegment; - allocate(p0: java.lang.foreign.ValueLayout$OfDouble, p1: number): java.lang.foreign.MemorySegment; - allocate(p0: java.lang.foreign.AddressLayout, p1: java.lang.foreign.MemorySegment): java.lang.foreign.MemorySegment; + allocateFrom(p0: string): java.lang.foreign.MemorySegment; + allocateFrom(p0: string, p1: java.nio.charset.Charset): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfByte, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfChar, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfShort, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfInt, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfFloat, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfLong, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfDouble, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.AddressLayout, p1: java.lang.foreign.MemorySegment): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout, p1: java.lang.foreign.MemorySegment, p2: java.lang.foreign.ValueLayout, p3: number, p4: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfByte, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfShort, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfChar, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfInt, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfFloat, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfLong, p1: number): java.lang.foreign.MemorySegment; + allocateFrom(p0: java.lang.foreign.ValueLayout$OfDouble, p1: number): java.lang.foreign.MemorySegment; allocate(p0: java.lang.foreign.MemoryLayout): java.lang.foreign.MemorySegment; + allocate(p0: java.lang.foreign.MemoryLayout, p1: number): java.lang.foreign.MemorySegment; allocate(p0: number): java.lang.foreign.MemorySegment; allocate(p0: number, p1: number): java.lang.foreign.MemorySegment; - allocateArray(p0: java.lang.foreign.ValueLayout$OfByte, p1: number): java.lang.foreign.MemorySegment; - allocateArray(p0: java.lang.foreign.ValueLayout$OfShort, p1: number): java.lang.foreign.MemorySegment; - allocateArray(p0: java.lang.foreign.ValueLayout$OfChar, p1: number): java.lang.foreign.MemorySegment; - allocateArray(p0: java.lang.foreign.ValueLayout$OfInt, p1: number): java.lang.foreign.MemorySegment; - allocateArray(p0: java.lang.foreign.ValueLayout$OfFloat, p1: number): java.lang.foreign.MemorySegment; - allocateArray(p0: java.lang.foreign.ValueLayout$OfLong, p1: number): java.lang.foreign.MemorySegment; - allocateArray(p0: java.lang.foreign.ValueLayout$OfDouble, p1: number): java.lang.foreign.MemorySegment; - allocateArray(p0: java.lang.foreign.MemoryLayout, p1: number): java.lang.foreign.MemorySegment; (p0: number, p1: number): java.lang.foreign.MemorySegment; } const MemorySegment: { @@ -5956,6 +6000,7 @@ declare global { scope(): java.lang.foreign.MemorySegment$Scope; isAccessibleBy(p0: java.lang.Thread): boolean; byteSize(): number; + maxByteAlignment(): number; asSlice(p0: number, p1: number): java.lang.foreign.MemorySegment; asSlice(p0: number, p1: number, p2: number): java.lang.foreign.MemorySegment; asSlice(p0: number, p1: java.lang.foreign.MemoryLayout): java.lang.foreign.MemorySegment; @@ -5968,7 +6013,6 @@ declare global { isNative(): boolean; isMapped(): boolean; asOverlappingSlice(p0: java.lang.foreign.MemorySegment): java.util.Optional; - segmentOffset(p0: java.lang.foreign.MemorySegment): number; fill(p0: number): java.lang.foreign.MemorySegment; copyFrom(p0: java.lang.foreign.MemorySegment): java.lang.foreign.MemorySegment; mismatch(p0: java.lang.foreign.MemorySegment): number; @@ -5984,8 +6028,10 @@ declare global { toArray(p0: java.lang.foreign.ValueLayout$OfFloat): kotlin.FloatArray; toArray(p0: java.lang.foreign.ValueLayout$OfLong): Array; toArray(p0: java.lang.foreign.ValueLayout$OfDouble): kotlin.DoubleArray; - getUtf8String(p0: number): string; - setUtf8String(p0: number, p1: string): void; + getString(p0: number): string; + getString(p0: number, p1: java.nio.charset.Charset): string; + setString(p0: number, p1: string): void; + setString(p0: number, p1: string, p2: java.nio.charset.Charset): void; get(p0: java.lang.foreign.ValueLayout$OfByte, p1: number): number; get(p0: java.lang.foreign.ValueLayout$OfBoolean, p1: number): boolean; get(p0: java.lang.foreign.ValueLayout$OfChar, p1: number): number; @@ -6026,7 +6072,6 @@ declare global { const MemoryLayout: { paddingLayout(p0: number): java.lang.foreign.PaddingLayout; sequenceLayout(p0: number, p1: java.lang.foreign.MemoryLayout): java.lang.foreign.SequenceLayout; - sequenceLayout(p0: java.lang.foreign.MemoryLayout): java.lang.foreign.SequenceLayout; structLayout(p0: java.lang.foreign.MemoryLayout): java.lang.foreign.StructLayout; unionLayout(p0: java.lang.foreign.MemoryLayout): java.lang.foreign.UnionLayout; } @@ -6037,9 +6082,12 @@ declare global { withoutName(): java.lang.foreign.MemoryLayout; byteAlignment(): number; withByteAlignment(p0: number): java.lang.foreign.MemoryLayout; + scale(p0: number, p1: number): number; + scaleHandle(): java.lang.invoke.MethodHandle; byteOffset(p0: java.lang.foreign.MemoryLayout$PathElement): number; byteOffsetHandle(p0: java.lang.foreign.MemoryLayout$PathElement): java.lang.invoke.MethodHandle; varHandle(p0: java.lang.foreign.MemoryLayout$PathElement): java.lang.invoke.VarHandle; + arrayElementVarHandle(p0: java.lang.foreign.MemoryLayout$PathElement): java.lang.invoke.VarHandle; sliceHandle(p0: java.lang.foreign.MemoryLayout$PathElement): java.lang.invoke.MethodHandle; select(p0: java.lang.foreign.MemoryLayout$PathElement): java.lang.foreign.MemoryLayout; } @@ -6095,8 +6143,8 @@ declare global { interface ValueLayout extends java.lang.foreign.MemoryLayout { order(): java.nio.ByteOrder; withOrder(p0: java.nio.ByteOrder): java.lang.foreign.ValueLayout; - arrayElementVarHandle(p0: number): java.lang.invoke.VarHandle; carrier(): java.lang.Class; + varHandle(): java.lang.invoke.VarHandle; } interface AddressLayout extends java.lang.foreign.ValueLayout { withTargetLayout(p0: java.lang.foreign.MemoryLayout): java.lang.foreign.AddressLayout; @@ -6174,14 +6222,11 @@ declare global { interrupt(): void; isInterrupted(): boolean; isAlive(): boolean; - suspend(): void; - resume(): void; setPriority(p0: number): void; getPriority(): number; setName(p0: string): void; getName(): string; getThreadGroup(): java.lang.ThreadGroup; - countStackFrames(): number; join(p0: number): void; join(p0: number, p1: number): void; join(): void; @@ -6218,10 +6263,7 @@ declare global { enumerate(p0: Array): number; enumerate(p0: Array, p1: boolean): number; activeGroupCount(): number; - stop(): void; interrupt(): void; - suspend(): void; - resume(): void; destroy(): void; list(): void; } @@ -6257,6 +6299,7 @@ declare global { forName(p0: string): java.lang.Class; forName(p0: string, p1: boolean, p2: java.lang.ClassLoader): java.lang.Class; forName(p0: java.lang.Module, p1: string): java.lang.Class; + forPrimitiveName(p0: string): java.lang.Class; } interface Class extends java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement, java.lang.invoke.TypeDescriptor$OfField>, java.lang.constant.Constable { toGenericString(): string; @@ -6285,7 +6328,6 @@ declare global { getEnclosingClass(): java.lang.Class; getSimpleName(): string; getCanonicalName(): string; - isUnnamedClass(): boolean; isAnonymousClass(): boolean; isLocalClass(): boolean; isMemberClass(): boolean; @@ -6555,6 +6597,8 @@ declare global { normalize(): java.nio.file.Path; resolve(p0: java.nio.file.Path): java.nio.file.Path; resolve(p0: string): java.nio.file.Path; + resolve(p0: java.nio.file.Path, p1: java.nio.file.Path): java.nio.file.Path; + resolve(p0: string, p1: string): java.nio.file.Path; resolveSibling(p0: java.nio.file.Path): java.nio.file.Path; resolveSibling(p0: string): java.nio.file.Path; relativize(p0: java.nio.file.Path): java.nio.file.Path; @@ -7547,6 +7591,7 @@ declare global { minusSeconds(p0: number): java.time.Instant; minusMillis(p0: number): java.time.Instant; minusNanos(p0: number): java.time.Instant; + until(p0: java.time.Instant): java.time.Duration; atOffset(p0: java.time.ZoneOffset): java.time.OffsetDateTime; atZone(p0: java.time.ZoneId): java.time.ZonedDateTime; toEpochMilli(): number; @@ -8165,6 +8210,7 @@ declare global { getByName(p0: string): java.net.InetAddress; getAllByName(p0: string): Array; getLoopbackAddress(): java.net.InetAddress; + ofLiteral(p0: string): java.net.InetAddress; getLocalHost(): java.net.InetAddress; } interface InetAddress extends java.io.Serializable { @@ -8231,6 +8277,22 @@ declare global { namespace spec { interface AlgorithmParameterSpec { } + const PKCS8EncodedKeySpec: { + new(p0: Array): java.security.spec.PKCS8EncodedKeySpec; + new(p0: Array, p1: string): java.security.spec.PKCS8EncodedKeySpec; + } + interface PKCS8EncodedKeySpec extends java.security.spec.EncodedKeySpec, java.security.DEREncodable { + } + const EncodedKeySpec: { + new(p0: Array): java.security.spec.EncodedKeySpec; + } + interface EncodedKeySpec extends java.security.spec.KeySpec { + getAlgorithm(): string; + getEncoded(): Array; + getFormat(): string; + } + interface KeySpec { + } } namespace cert { interface Certificate extends java.io.Serializable { @@ -8313,7 +8375,10 @@ declare global { const PublicKey: { serialVersionUID: number; } - interface PublicKey extends java.security.Key { + interface PublicKey extends java.security.AsymmetricKey { + } + interface AsymmetricKey extends java.security.Key, java.security.DEREncodable { + getParams(): java.security.spec.AlgorithmParameterSpec; } const Key: { serialVersionUID: number; @@ -8323,17 +8388,7 @@ declare global { getFormat(): string; getEncoded(): Array; } - const KeyPair: { - new(p0: java.security.PublicKey, p1: java.security.PrivateKey): java.security.KeyPair; - } - interface KeyPair extends java.io.Serializable { - getPublic(): java.security.PublicKey; - getPrivate(): java.security.PrivateKey; - } - const PrivateKey: { - serialVersionUID: number; - } - interface PrivateKey extends java.security.Key, javax.security.auth.Destroyable { + interface DEREncodable { } const Provider: { Service: typeof java.security.Provider$Service; @@ -8409,6 +8464,151 @@ declare global { } interface SecureRandomSpi extends java.io.Serializable { } + interface AlgorithmConstraints { + permits(p0: Set, p1: string, p2: java.security.AlgorithmParameters): boolean; + permits(p0: Set, p1: java.security.Key): boolean; + permits(p0: Set, p1: string, p2: java.security.Key, p3: java.security.AlgorithmParameters): boolean; + } + const KeyStore: { + Builder: typeof java.security.KeyStore$Builder; + TrustedCertificateEntry: typeof java.security.KeyStore$TrustedCertificateEntry; + SecretKeyEntry: typeof java.security.KeyStore$SecretKeyEntry; + PrivateKeyEntry: typeof java.security.KeyStore$PrivateKeyEntry; + CallbackHandlerProtection: typeof java.security.KeyStore$CallbackHandlerProtection; + PasswordProtection: typeof java.security.KeyStore$PasswordProtection; + getInstance(p0: string): java.security.KeyStore; + getInstance(p0: string, p1: string): java.security.KeyStore; + getInstance(p0: string, p1: java.security.Provider): java.security.KeyStore; + getInstance(p0: java.io.File, p1: Array): java.security.KeyStore; + getInstance(p0: java.io.File, p1: java.security.KeyStore$LoadStoreParameter): java.security.KeyStore; + getDefaultType(): string; + } + interface KeyStore { + getProvider(): java.security.Provider; + getType(): string; + getAttributes(p0: string): Set; + getKey(p0: string, p1: Array): java.security.Key; + getCertificateChain(p0: string): Array; + getCertificate(p0: string): java.security.cert.Certificate; + getCreationDate(p0: string): java.util.Date; + setKeyEntry(p0: string, p1: java.security.Key, p2: Array, p3: Array): void; + setKeyEntry(p0: string, p1: Array, p2: Array): void; + setCertificateEntry(p0: string, p1: java.security.cert.Certificate): void; + deleteEntry(p0: string): void; + aliases(): java.util.Enumeration; + containsAlias(p0: string): boolean; + size(): number; + isKeyEntry(p0: string): boolean; + isCertificateEntry(p0: string): boolean; + getCertificateAlias(p0: java.security.cert.Certificate): string; + store(p0: java.io.OutputStream, p1: Array): void; + store(p0: java.security.KeyStore$LoadStoreParameter): void; + load(p0: java.io.InputStream, p1: Array): void; + load(p0: java.security.KeyStore$LoadStoreParameter): void; + getEntry(p0: string, p1: java.security.KeyStore$ProtectionParameter): java.security.KeyStore$Entry; + setEntry(p0: string, p1: java.security.KeyStore$Entry, p2: java.security.KeyStore$ProtectionParameter): void; + entryInstanceOf(p0: string, p1: java.lang.Class): boolean; + } + interface KeyStore$LoadStoreParameter { + getProtectionParameter(): java.security.KeyStore$ProtectionParameter; + } + interface KeyStore$ProtectionParameter { + } + interface KeyStore$Entry { + getAttributes(): Set; + } + interface KeyStore$Entry$Attribute { + getName(): string; + getValue(): string; + } + const KeyStoreSpi: { + new(): java.security.KeyStoreSpi; + } + interface KeyStoreSpi { + engineGetKey(p0: string, p1: Array): java.security.Key; + engineGetCertificateChain(p0: string): Array; + engineGetCertificate(p0: string): java.security.cert.Certificate; + engineGetCreationDate(p0: string): java.util.Date; + engineSetKeyEntry(p0: string, p1: java.security.Key, p2: Array, p3: Array): void; + engineSetKeyEntry(p0: string, p1: Array, p2: Array): void; + engineSetCertificateEntry(p0: string, p1: java.security.cert.Certificate): void; + engineDeleteEntry(p0: string): void; + engineAliases(): java.util.Enumeration; + engineContainsAlias(p0: string): boolean; + engineSize(): number; + engineIsKeyEntry(p0: string): boolean; + engineIsCertificateEntry(p0: string): boolean; + engineGetCertificateAlias(p0: java.security.cert.Certificate): string; + engineStore(p0: java.io.OutputStream, p1: Array): void; + engineStore(p0: java.security.KeyStore$LoadStoreParameter): void; + engineLoad(p0: java.io.InputStream, p1: Array): void; + engineLoad(p0: java.security.KeyStore$LoadStoreParameter): void; + engineGetAttributes(p0: string): Set; + engineGetEntry(p0: string, p1: java.security.KeyStore$ProtectionParameter): java.security.KeyStore$Entry; + engineSetEntry(p0: string, p1: java.security.KeyStore$Entry, p2: java.security.KeyStore$ProtectionParameter): void; + engineEntryInstanceOf(p0: string, p1: java.lang.Class): boolean; + engineProbe(p0: java.io.InputStream): boolean; + } + const KeyStore$Builder: { + newInstance(p0: java.security.KeyStore, p1: java.security.KeyStore$ProtectionParameter): java.security.KeyStore$Builder; + newInstance(p0: string, p1: java.security.Provider, p2: java.io.File, p3: java.security.KeyStore$ProtectionParameter): java.security.KeyStore$Builder; + newInstance(p0: java.io.File, p1: java.security.KeyStore$ProtectionParameter): java.security.KeyStore$Builder; + newInstance(p0: string, p1: java.security.Provider, p2: java.security.KeyStore$ProtectionParameter): java.security.KeyStore$Builder; + } + interface KeyStore$Builder { + getKeyStore(): java.security.KeyStore; + getProtectionParameter(p0: string): java.security.KeyStore$ProtectionParameter; + } + const KeyStore$TrustedCertificateEntry: { + new(p0: java.security.cert.Certificate): java.security.KeyStore$TrustedCertificateEntry; + new(p0: java.security.cert.Certificate, p1: Set): java.security.KeyStore$TrustedCertificateEntry; + } + interface KeyStore$TrustedCertificateEntry extends java.security.KeyStore$Entry { + getTrustedCertificate(): java.security.cert.Certificate; + } + const KeyStore$SecretKeyEntry: { + new(p0: javax.crypto.SecretKey): java.security.KeyStore$SecretKeyEntry; + new(p0: javax.crypto.SecretKey, p1: Set): java.security.KeyStore$SecretKeyEntry; + } + interface KeyStore$SecretKeyEntry extends java.security.KeyStore$Entry { + getSecretKey(): javax.crypto.SecretKey; + } + const KeyStore$PrivateKeyEntry: { + new(p0: java.security.PrivateKey, p1: Array): java.security.KeyStore$PrivateKeyEntry; + new(p0: java.security.PrivateKey, p1: Array, p2: Set): java.security.KeyStore$PrivateKeyEntry; + } + interface KeyStore$PrivateKeyEntry extends java.security.KeyStore$Entry { + getPrivateKey(): java.security.PrivateKey; + getCertificateChain(): Array; + getCertificate(): java.security.cert.Certificate; + } + const PrivateKey: { + serialVersionUID: number; + } + interface PrivateKey extends java.security.AsymmetricKey, javax.security.auth.Destroyable { + } + const KeyStore$CallbackHandlerProtection: { + new(p0: javax.security.auth.callback.CallbackHandler): java.security.KeyStore$CallbackHandlerProtection; + } + interface KeyStore$CallbackHandlerProtection extends java.security.KeyStore$ProtectionParameter { + getCallbackHandler(): javax.security.auth.callback.CallbackHandler; + } + const KeyStore$PasswordProtection: { + new(p0: Array): java.security.KeyStore$PasswordProtection; + new(p0: Array, p1: string, p2: java.security.spec.AlgorithmParameterSpec): java.security.KeyStore$PasswordProtection; + } + interface KeyStore$PasswordProtection extends java.security.KeyStore$ProtectionParameter, javax.security.auth.Destroyable { + getProtectionAlgorithm(): string; + getProtectionParameters(): java.security.spec.AlgorithmParameterSpec; + getPassword(): Array; + } + const KeyPair: { + new(p0: java.security.PublicKey, p1: java.security.PrivateKey): java.security.KeyPair; + } + interface KeyPair extends java.io.Serializable, java.security.DEREncodable { + getPublic(): java.security.PublicKey; + getPrivate(): java.security.PrivateKey; + } } namespace text { const NumberFormat: { @@ -8439,6 +8639,8 @@ declare global { parse(p0: string): number; isParseIntegerOnly(): boolean; setParseIntegerOnly(p0: boolean): void; + isStrict(): boolean; + setStrict(p0: boolean): void; isGroupingUsed(): boolean; setGroupingUsed(p0: boolean): void; getMaximumIntegerDigits(): number; @@ -8882,7 +9084,6 @@ declare global { sqrt(): java.math.BigInteger; sqrtAndRemainder(): Array; gcd(p0: java.math.BigInteger): java.math.BigInteger; - bitLength(): number; abs(): java.math.BigInteger; negate(): java.math.BigInteger; mod(p0: java.math.BigInteger): java.math.BigInteger; @@ -8900,6 +9101,7 @@ declare global { clearBit(p0: number): java.math.BigInteger; flipBit(p0: number): java.math.BigInteger; getLowestSetBit(): number; + bitLength(): number; bitCount(): number; isProbablePrime(p0: number): boolean; min(p0: java.math.BigInteger): java.math.BigInteger; @@ -11016,20 +11218,18 @@ declare global { interface AbstractContainerScreen extends net.minecraft.client.gui.screens.Screen, net.minecraft.client.gui.screens.inventory.MenuAccess { extractContents(graphics: net.minecraft.client.gui.GuiGraphicsExtractor, mouseX: number, mouseY: number, a: number): void; extractCarriedItem(graphics: net.minecraft.client.gui.GuiGraphicsExtractor, mouseX: number, mouseY: number): void; - extractSnapbackItem(graphics: net.minecraft.client.gui.GuiGraphicsExtractor): void; - clearDraggingState(): void; } interface MenuAccess { getMenu(): T; } } - namespace options { - const OptionsSubScreen: { - new(lastScreen: net.minecraft.client.gui.screens.Screen, options: net.minecraft.client.Options, title: net.minecraft.network.chat.Component): net.minecraft.client.gui.screens.options.OptionsSubScreen; - } - interface OptionsSubScreen extends net.minecraft.client.gui.screens.Screen { - layout: net.minecraft.client.gui.layouts.HeaderAndFooterLayout; - resetOption(option: net.minecraft.client.OptionInstance): void; + namespace dialog { + interface DialogConnectionAccess { + disconnect(message: net.minecraft.network.chat.Component): void; + runCommand(command: string, activeScreen: net.minecraft.client.gui.screens.Screen | null | undefined): void; + openDialog(dialog: net.minecraft.core.Holder, activeScreen: net.minecraft.client.gui.screens.Screen | null | undefined): void; + sendCustomAction(id: net.minecraft.resources.Identifier, payload: java.util.Optional): void; + serverLinks(): net.minecraft.server.ServerLinks; } } namespace worldselection { @@ -11159,9 +11359,16 @@ declare global { } namespace social { const PlayerSocialManager: { - new(minecraft: net.minecraft.client.Minecraft, service: com.mojang.authlib.minecraft.UserApiService): net.minecraft.client.gui.screens.social.PlayerSocialManager; + PlayerData: typeof net.minecraft.client.gui.screens.social.PlayerSocialManager$PlayerData; + new(minecraft: net.minecraft.client.Minecraft, service: com.mojang.authlib.minecraft.UserApiService, friendsService: com.mojang.authlib.yggdrasil.FriendsService, remoteFriendListUpdateHandler: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler): net.minecraft.client.gui.screens.social.PlayerSocialManager; } interface PlayerSocialManager { + addFriendListUpdateListener(listener: java.lang.Runnable): void; + removeFriendListUpdateListener(listener: java.lang.Runnable): void; + getFriends(): Array; + getIncomingRequests(): Array; + getOutgoingRequests(): Array; + getFriendListState(): net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; hidePlayer(id: java.util.UUID): void; showPlayer(id: java.util.UUID): void; shouldHideMessageFrom(id: java.util.UUID): boolean; @@ -11172,16 +11379,63 @@ declare global { getHiddenPlayers(): Set; getDiscoveredUUID(name: string): java.util.UUID; addPlayer(info: net.minecraft.client.multiplayer.PlayerInfo): void; + sendFriendRequest(name: string): java.util.concurrent.CompletableFuture; removePlayer(id: java.util.UUID): void; + removeFriend(id: java.util.UUID): java.util.concurrent.CompletableFuture; + acceptIncomingFriendRequest(id: java.util.UUID): java.util.concurrent.CompletableFuture; + declineIncomingFriendRequest(id: java.util.UUID): java.util.concurrent.CompletableFuture; + revokeOutgoingFriendRequest(id: java.util.UUID): java.util.concurrent.CompletableFuture; + updateFriendSettings(friendsListEnabled: boolean, allowInvites: boolean): java.util.concurrent.CompletableFuture; + isFriendListEnabled(): boolean; + setFriendListEnabled(friendListEnabled: boolean): void; + isAllowFriendRequests(): boolean; + setAllowFriendRequests(allowFriendRequests: boolean): void; + getPresenceHandler(): net.minecraft.client.gui.screens.social.PresenceHandler; + isFriend(uuid: java.util.UUID): boolean; + } + const RemoteFriendListUpdateHandler$State: { + LOADING: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + UPGRADE_NEEDED: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + CONNECTION_ISSUE: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + USER_MAY_LACK_ACTIVE_PROFILE: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + UNAUTHORIZED: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + TEMPORARY_UNAVAILABLE: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + GENERIC_ERROR: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + SUCCESS: net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + } + interface RemoteFriendListUpdateHandler$State extends kotlin.Enum { + } + const PresenceHandler: { + new(minecraft: net.minecraft.client.Minecraft, friendsService: com.mojang.authlib.yggdrasil.FriendsService): net.minecraft.client.gui.screens.social.PresenceHandler; + } + interface PresenceHandler { + tick(): void; + tryUpdatePresence(): void; + getLatestPresence(): com.mojang.authlib.yggdrasil.response.PresenceResponse; + } + const RemoteFriendListUpdateHandler: { + State: typeof net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + new(friendsService: com.mojang.authlib.yggdrasil.FriendsService, minecraft: net.minecraft.client.Minecraft): net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler; + } + interface RemoteFriendListUpdateHandler { + getLatestFriendData(): com.mojang.authlib.yggdrasil.response.FriendData; + getState(): net.minecraft.client.gui.screens.social.RemoteFriendListUpdateHandler$State; + addUpdateListener(listener: java.lang.Runnable): void; + removeUpdateListener(listener: java.lang.Runnable): void; + forceUpdate(): java.util.concurrent.CompletableFuture; + start(): void; + stop(): void; + close(): void; } - } - namespace dialog { - interface DialogConnectionAccess { - disconnect(message: net.minecraft.network.chat.Component): void; - runCommand(command: string, activeScreen: net.minecraft.client.gui.screens.Screen | null | undefined): void; - openDialog(dialog: net.minecraft.core.Holder, activeScreen: net.minecraft.client.gui.screens.Screen | null | undefined): void; - sendCustomAction(id: net.minecraft.resources.Identifier, payload: java.util.Optional): void; - serverLinks(): net.minecraft.server.ServerLinks; + const PlayerSocialManager$PlayerData: { + new(id: java.util.UUID, name: string): net.minecraft.client.gui.screens.social.PlayerSocialManager$PlayerData; + } + interface PlayerSocialManager$PlayerData extends java.lang.Record { + id(): java.util.UUID; + name(): string; } } const Screen: { @@ -11246,7 +11500,7 @@ declare global { new(): net.minecraft.client.gui.screens.Overlay; } interface Overlay extends net.minecraft.client.gui.components.Renderable { - isPauseScreen(): boolean; + isPausing(): boolean; tick(): void; } const Screen$NarratableSearchResult: { @@ -11319,49 +11573,6 @@ declare global { profilerPieChartKeyPress(key: number): void; } } - namespace debug { - const DebugScreenEntryList: { - new(workingDirectory: java.io.File, dataFixer: com.mojang.datafixers.DataFixer): net.minecraft.client.gui.components.debug.DebugScreenEntryList; - } - interface DebugScreenEntryList { - isOverlayVisible(): boolean; - load(): void; - loadProfile(profile: net.minecraft.client.gui.components.debug.DebugScreenProfile): void; - getStatus(location: net.minecraft.resources.Identifier): net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; - isCurrentlyEnabled(location: net.minecraft.resources.Identifier): boolean; - setStatus(location: net.minecraft.resources.Identifier, status: net.minecraft.client.gui.components.debug.DebugScreenEntryStatus): void; - toggleStatus(location: net.minecraft.resources.Identifier): boolean; - getCurrentlyEnabled(): Array; - toggleDebugOverlay(): void; - setOverlayVisible(visible: boolean): void; - rebuildCurrentList(): void; - getCurrentlyEnabledVersion(): number; - isUsingProfile(profile: net.minecraft.client.gui.components.debug.DebugScreenProfile): boolean; - save(): void; - } - const DebugScreenProfile: { - DEFAULT: net.minecraft.client.gui.components.debug.DebugScreenProfile; - PERFORMANCE: net.minecraft.client.gui.components.debug.DebugScreenProfile; - CODEC: net.minecraft.util.StringRepresentable$EnumCodec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.client.gui.components.debug.DebugScreenProfile; - } - interface DebugScreenProfile extends kotlin.Enum, net.minecraft.util.StringRepresentable { - translationKey(): string; - } - const DebugScreenEntryStatus: { - ALWAYS_ON: net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; - IN_OVERLAY: net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; - NEVER: net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; - CODEC: com.mojang.serialization.Codec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; - } - interface DebugScreenEntryStatus extends kotlin.Enum, net.minecraft.util.StringRepresentable { - } - } namespace toasts { const ToastManager: { new(minecraft: net.minecraft.client.Minecraft, options: net.minecraft.client.Options): net.minecraft.client.gui.components.toasts.ToastManager; @@ -11408,6 +11619,49 @@ declare global { playSound(manager: net.minecraft.client.sounds.SoundManager): void; } } + namespace debug { + const DebugScreenEntryList: { + new(workingDirectory: java.io.File, dataFixer: com.mojang.datafixers.DataFixer): net.minecraft.client.gui.components.debug.DebugScreenEntryList; + } + interface DebugScreenEntryList { + isOverlayVisible(): boolean; + load(): void; + loadProfile(profile: net.minecraft.client.gui.components.debug.DebugScreenProfile): void; + getStatus(location: net.minecraft.resources.Identifier): net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; + isCurrentlyEnabled(location: net.minecraft.resources.Identifier): boolean; + setStatus(location: net.minecraft.resources.Identifier, status: net.minecraft.client.gui.components.debug.DebugScreenEntryStatus): void; + toggleStatus(location: net.minecraft.resources.Identifier): boolean; + getCurrentlyEnabled(): Array; + toggleDebugOverlay(): void; + setOverlayVisible(visible: boolean): void; + rebuildCurrentList(): void; + getCurrentlyEnabledVersion(): number; + isUsingProfile(profile: net.minecraft.client.gui.components.debug.DebugScreenProfile): boolean; + save(): void; + } + const DebugScreenProfile: { + DEFAULT: net.minecraft.client.gui.components.debug.DebugScreenProfile; + PERFORMANCE: net.minecraft.client.gui.components.debug.DebugScreenProfile; + CODEC: net.minecraft.util.StringRepresentable$EnumCodec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.gui.components.debug.DebugScreenProfile; + } + interface DebugScreenProfile extends kotlin.Enum, net.minecraft.util.StringRepresentable { + translationKey(): string; + } + const DebugScreenEntryStatus: { + ALWAYS_ON: net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; + IN_OVERLAY: net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; + NEVER: net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; + CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.gui.components.debug.DebugScreenEntryStatus; + } + interface DebugScreenEntryStatus extends kotlin.Enum, net.minecraft.util.StringRepresentable { + } + } interface TabOrderedElement { getTabOrderGroup(): number; } @@ -11453,11 +11707,10 @@ declare global { component(): java.util.Optional; toCharSequence(minecraft: net.minecraft.client.Minecraft): Array; } - const AbstractWidget$WithInactiveMessage: { - new(x: number, y: number, width: number, height: number, message: net.minecraft.network.chat.Component): net.minecraft.client.gui.components.AbstractWidget$WithInactiveMessage; - defaultInactiveMessage(activeMessage: net.minecraft.network.chat.Component): net.minecraft.network.chat.Component; + const ChatComponent$State: { + new(messages: Array, history: Array, delayedMessageDeletions: Array): net.minecraft.client.gui.components.ChatComponent$State; } - interface AbstractWidget$WithInactiveMessage extends net.minecraft.client.gui.components.AbstractWidget { + interface ChatComponent$State { } const CycleButton$ValueListSupplier: { create(values: Array): net.minecraft.client.gui.components.CycleButton$ValueListSupplier; @@ -11475,94 +11728,15 @@ declare global { } interface AbstractSliderButton extends net.minecraft.client.gui.components.AbstractWidget$WithInactiveMessage { } + const AbstractWidget$WithInactiveMessage: { + new(x: number, y: number, width: number, height: number, message: net.minecraft.network.chat.Component): net.minecraft.client.gui.components.AbstractWidget$WithInactiveMessage; + defaultInactiveMessage(activeMessage: net.minecraft.network.chat.Component): net.minecraft.network.chat.Component; + } + interface AbstractWidget$WithInactiveMessage extends net.minecraft.client.gui.components.AbstractWidget { + } interface ResettableOptionWidget { resetValue(): void; } - const OptionsList: { - OptionInstanceWidget: typeof net.minecraft.client.gui.components.OptionsList$OptionInstanceWidget; - new(minecraft: net.minecraft.client.Minecraft, width: number, screen: net.minecraft.client.gui.screens.options.OptionsSubScreen): net.minecraft.client.gui.components.OptionsList; - } - interface OptionsList extends net.minecraft.client.gui.components.ContainerObjectSelectionList { - addBig(option: net.minecraft.client.OptionInstance): void; - addSmall(options: net.minecraft.client.OptionInstance): void; - addSmall(widgets: Array): void; - addSmall(firstOption: net.minecraft.client.gui.components.AbstractWidget, secondOption: net.minecraft.client.gui.components.AbstractWidget | null | undefined): void; - addSmall(firstOption: net.minecraft.client.gui.components.AbstractWidget, firstOptionInstance: net.minecraft.client.OptionInstance, secondOption: net.minecraft.client.gui.components.AbstractWidget | null | undefined): void; - addHeader(text: net.minecraft.network.chat.Component): void; - findOption(option: net.minecraft.client.OptionInstance): net.minecraft.client.gui.components.AbstractWidget | null | undefined; - applyUnsavedChanges(): void; - resetOption(option: net.minecraft.client.OptionInstance): void; - } - const ContainerObjectSelectionList: { - Entry: typeof net.minecraft.client.gui.components.ContainerObjectSelectionList$Entry; - new(minecraft: net.minecraft.client.Minecraft, width: number, height: number, y: number, itemHeight: number): net.minecraft.client.gui.components.ContainerObjectSelectionList; - } - interface ContainerObjectSelectionList extends net.minecraft.client.gui.components.AbstractSelectionList { - } - const AbstractSelectionList: { - new(minecraft: net.minecraft.client.Minecraft, width: number, height: number, y: number, defaultEntryHeight: number): net.minecraft.client.gui.components.AbstractSelectionList; - } - interface AbstractSelectionList extends net.minecraft.client.gui.components.AbstractContainerWidget { - getSelected(): E; - setSelected(selected: E): void; - replaceEntries(newChildren: Array): void; - getNextY(): number; - updateSize(width: number, layout: net.minecraft.client.gui.layouts.HeaderAndFooterLayout): void; - updateSizeAndPosition(width: number, height: number, y: number): void; - updateSizeAndPosition(width: number, height: number, x: number, y: number): void; - getRowLeft(): number; - getRowRight(): number; - getRowTop(row: number): number; - getRowBottom(row: number): number; - getRowWidth(): number; - } - const AbstractContainerWidget: { - new(x: number, y: number, width: number, height: number, message: net.minecraft.network.chat.Component, scrollbarSettings: net.minecraft.client.gui.components.AbstractScrollArea$ScrollbarSettings): net.minecraft.client.gui.components.AbstractContainerWidget; - } - interface AbstractContainerWidget extends net.minecraft.client.gui.components.AbstractScrollArea, net.minecraft.client.gui.components.events.ContainerEventHandler { - } - const AbstractScrollArea: { - ScrollbarSettings: typeof net.minecraft.client.gui.components.AbstractScrollArea$ScrollbarSettings; - SCROLLBAR_WIDTH: number; - new(x: number, y: number, width: number, height: number, message: net.minecraft.network.chat.Component, scrollbarSettings: net.minecraft.client.gui.components.AbstractScrollArea$ScrollbarSettings): net.minecraft.client.gui.components.AbstractScrollArea; - defaultSettings(scrollRate: number): net.minecraft.client.gui.components.AbstractScrollArea$ScrollbarSettings; - } - interface AbstractScrollArea extends net.minecraft.client.gui.components.AbstractWidget { - scrollAmount(): number; - setScrollAmount(scrollAmount: number): void; - updateScrolling(event: net.minecraft.client.input.MouseButtonEvent): boolean; - refreshScrollAmount(): void; - maxScrollAmount(): number; - scrollbarWidth(): number; - scrollBarY(): number; - } - const AbstractScrollArea$ScrollbarSettings: { - new(scrollerSprite: net.minecraft.resources.Identifier, disabledScrollerSprite: net.minecraft.resources.Identifier | null | undefined, backgroundSprite: net.minecraft.resources.Identifier, scrollbarWidth: number, scrollbarMinHeight: number, scrollRate: number, resizingScrollbar: boolean): net.minecraft.client.gui.components.AbstractScrollArea$ScrollbarSettings; - } - interface AbstractScrollArea$ScrollbarSettings extends java.lang.Record { - scrollerSprite(): net.minecraft.resources.Identifier; - disabledScrollerSprite(): net.minecraft.resources.Identifier | null | undefined; - backgroundSprite(): net.minecraft.resources.Identifier; - scrollbarWidth(): number; - scrollbarMinHeight(): number; - scrollRate(): number; - resizingScrollbar(): boolean; - } - const ContainerObjectSelectionList$Entry: { - new(): net.minecraft.client.gui.components.ContainerObjectSelectionList$Entry; - } - interface ContainerObjectSelectionList$Entry extends net.minecraft.client.gui.components.events.ContainerEventHandler { - focusPathAtIndex(navigationEvent: net.minecraft.client.gui.navigation.FocusNavigationEvent, currentIndex: number): net.minecraft.client.gui.ComponentPath | null | undefined; - narratables(): Array; - } - const OptionsList$OptionInstanceWidget: { - new(widget: net.minecraft.client.gui.components.AbstractWidget): net.minecraft.client.gui.components.OptionsList$OptionInstanceWidget; - new(widget: net.minecraft.client.gui.components.AbstractWidget, optionInstance: net.minecraft.client.OptionInstance | null | undefined): net.minecraft.client.gui.components.OptionsList$OptionInstanceWidget; - } - interface OptionsList$OptionInstanceWidget extends java.lang.Record { - widget(): net.minecraft.client.gui.components.AbstractWidget; - optionInstance(): net.minecraft.client.OptionInstance | null | undefined; - } const ChatComponent: { DisplayMode: typeof net.minecraft.client.gui.components.ChatComponent$DisplayMode; Draft: typeof net.minecraft.client.gui.components.ChatComponent$Draft; @@ -11638,6 +11812,7 @@ declare global { DEFAULT_TEXT_COLOR: number; DEFAULT_HINT_STYLE: net.minecraft.network.chat.Style; SEARCH_HINT_STYLE: net.minecraft.network.chat.Style; + new(font: net.minecraft.client.gui.Font, narration: net.minecraft.network.chat.Component): net.minecraft.client.gui.components.EditBox; new(font: net.minecraft.client.gui.Font, width: number, height: number, narration: net.minecraft.network.chat.Component): net.minecraft.client.gui.components.EditBox; new(font: net.minecraft.client.gui.Font, x: number, y: number, width: number, height: number, narration: net.minecraft.network.chat.Component): net.minecraft.client.gui.components.EditBox; new(font: net.minecraft.client.gui.Font, x: number, y: number, width: number, height: number, oldBox: net.minecraft.client.gui.components.EditBox | null | undefined, narration: net.minecraft.network.chat.Component): net.minecraft.client.gui.components.EditBox; @@ -11682,11 +11857,6 @@ declare global { format(text: string, offset: number): net.minecraft.util.FormattedCharSequence | null | undefined; (text: string, offset: number): net.minecraft.util.FormattedCharSequence | null | undefined; } - const ChatComponent$State: { - new(messages: Array, history: Array, delayedMessageDeletions: Array): net.minecraft.client.gui.components.ChatComponent$State; - } - interface ChatComponent$State { - } interface ChatComponent$ChatGraphicsAccess { updatePose(updater: unknown): void; fill(x0: number, y0: number, x1: number, y1: number, color: number): void; @@ -11696,7 +11866,7 @@ declare global { } const PlayerTabOverlay: { MAX_ROWS_PER_COL: number; - new(minecraft: net.minecraft.client.Minecraft, gui: net.minecraft.client.gui.Gui): net.minecraft.client.gui.components.PlayerTabOverlay; + new(minecraft: net.minecraft.client.Minecraft, hud: net.minecraft.client.gui.Hud): net.minecraft.client.gui.components.PlayerTabOverlay; } interface PlayerTabOverlay { getNameForDisplay(info: net.minecraft.client.multiplayer.PlayerInfo): net.minecraft.network.chat.Component; @@ -11739,7 +11909,6 @@ declare global { getProfilerPieChart(): net.minecraft.client.gui.components.debugchart.ProfilerPieChart; logRemoteSample(sample: Array, type: net.minecraft.util.debugchart.RemoteDebugSampleType): void; reset(): void; - render3dCrosshair(cameraState: net.minecraft.client.renderer.state.level.CameraRenderState, guiScale: number): void; } const SplashRenderer: { CHRISTMAS: net.minecraft.client.gui.components.SplashRenderer; @@ -11954,7 +12123,7 @@ declare global { } const GlyphRenderTypes: { new(normal: net.minecraft.client.renderer.rendertype.RenderType, seeThrough: net.minecraft.client.renderer.rendertype.RenderType, polygonOffset: net.minecraft.client.renderer.rendertype.RenderType, guiPipeline: com.mojang.blaze3d.pipeline.RenderPipeline): net.minecraft.client.gui.font.GlyphRenderTypes; - createForIntensityTexture(name: net.minecraft.resources.Identifier): net.minecraft.client.gui.font.GlyphRenderTypes; + createForGrayscaleTexture(name: net.minecraft.resources.Identifier): net.minecraft.client.gui.font.GlyphRenderTypes; createForColorTexture(name: net.minecraft.resources.Identifier): net.minecraft.client.gui.font.GlyphRenderTypes; } interface GlyphRenderTypes extends java.lang.Record { @@ -12027,31 +12196,6 @@ declare global { setPosition(x: number, y: number): void; visitWidgets(widgetVisitor: unknown): void; } - const HeaderAndFooterLayout: { - MAGIC_PADDING: number; - DEFAULT_HEADER_AND_FOOTER_HEIGHT: number; - new(screen: net.minecraft.client.gui.screens.Screen): net.minecraft.client.gui.layouts.HeaderAndFooterLayout; - new(screen: net.minecraft.client.gui.screens.Screen, headerAndFooterHeight: number): net.minecraft.client.gui.layouts.HeaderAndFooterLayout; - new(screen: net.minecraft.client.gui.screens.Screen, headerHeight: number, footerHeight: number): net.minecraft.client.gui.layouts.HeaderAndFooterLayout; - } - interface HeaderAndFooterLayout extends net.minecraft.client.gui.layouts.Layout { - getFooterHeight(): number; - setFooterHeight(footerHeight: number): void; - setHeaderHeight(headerHeight: number): void; - getHeaderHeight(): number; - getContentHeight(): number; - addToHeader(child: T): T; - addToHeader(child: T, layoutSettingsAdjustments: unknown): T; - addTitleHeader(component: net.minecraft.network.chat.Component, font: net.minecraft.client.gui.Font): void; - addToFooter(child: T): T; - addToFooter(child: T, layoutSettingsAdjustments: unknown): T; - addToContents(child: T): T; - addToContents(child: T, layoutSettingsAdjustments: unknown): T; - } - interface Layout extends net.minecraft.client.gui.layouts.LayoutElement { - visitChildren(layoutElementVisitor: unknown): void; - arrangeElements(): void; - } } namespace narration { const NarratableEntry: { @@ -12154,6 +12298,7 @@ declare global { interface ComponentPath { component(): net.minecraft.client.gui.components.events.GuiEventListener; applyFocus(focused: boolean): void; + leafComponent(): net.minecraft.client.gui.components.events.GuiEventListener; } const ComponentPath$Leaf: { new(component: net.minecraft.client.gui.components.events.GuiEventListener): net.minecraft.client.gui.ComponentPath$Leaf; @@ -12225,11 +12370,10 @@ declare global { itemDecorations(font: net.minecraft.client.gui.Font, itemStack: net.minecraft.world.item.ItemStack, x: number, y: number): void; itemDecorations(font: net.minecraft.client.gui.Font, itemStack: net.minecraft.world.item.ItemStack, x: number, y: number, countText: string | null | undefined): void; map(mapRenderState: net.minecraft.client.renderer.state.MapRenderState): void; - entity(renderState: net.minecraft.client.renderer.entity.state.EntityRenderState, scale: number, translation: org.joml.Vector3f, rotation: org.joml.Quaternionf, overrideCameraAngle: org.joml.Quaternionf | null | undefined, x0: number, y0: number, x1: number, y1: number): void; - skin(playerModel: net.minecraft.client.model.player.PlayerModel, texture: net.minecraft.resources.Identifier, scale: number, rotationX: number, rotationY: number, pivotY: number, x0: number, y0: number, x1: number, y1: number): void; + entity(renderState: net.minecraft.client.renderer.entity.state.EntityRenderState, scale: number, translation: org.joml.Vector3fc, rotation: org.joml.Quaternionfc, overrideCameraAngle: org.joml.Quaternionfc | null | undefined, x0: number, y0: number, x1: number, y1: number): void; + skin(playerModel: net.minecraft.client.model.Model$Simple, texture: net.minecraft.resources.Identifier, scale: number, rotationX: number, rotationY: number, pivotY: number, x0: number, y0: number, x1: number, y1: number): void; book(bookModel: net.minecraft.client.model.object.book.BookModel, texture: net.minecraft.resources.Identifier, scale: number, open: number, flip: number, x0: number, y0: number, x1: number, y1: number): void; bannerPattern(flag: net.minecraft.client.model.object.banner.BannerFlagModel, baseColor: net.minecraft.world.item.DyeColor, resultBannerPatterns: net.minecraft.world.level.block.entity.BannerPatternLayers, x0: number, y0: number, x1: number, y1: number): void; - sign(signModel: net.minecraft.client.model.Model$Simple, scale: number, woodType: net.minecraft.world.level.block.state.properties.WoodType, x0: number, y0: number, x1: number, y1: number): void; profilerChart(chartData: Array, x0: number, y0: number, x1: number, y1: number): void; setTooltipForNextFrame(component: net.minecraft.network.chat.Component, x: number, y: number): void; setTooltipForNextFrame(formattedCharSequences: Array, x: number, y: number): void; @@ -12254,8 +12398,8 @@ declare global { textRenderer(hoveredTextEffects: net.minecraft.client.gui.GuiGraphicsExtractor$HoveredTextEffects, additionalHoverStyleConsumer: unknown): net.minecraft.client.gui.ActiveTextCollector; } interface GuiGraphicsExtractor$ScissorStack { - push(rectangle: net.minecraft.client.gui.navigation.ScreenRectangle): net.minecraft.client.gui.navigation.ScreenRectangle; - pop(): net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined; + push(rectangle: net.minecraft.client.gui.navigation.ScreenRectangle): void; + pop(): void; peek(): net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined; containsPoint(x: number, y: number): boolean; } @@ -12269,6 +12413,16 @@ declare global { } interface Font$DisplayMode extends kotlin.Enum { } + interface Font$PreparedText { + visit(visitor: net.minecraft.client.gui.Font$GlyphVisitor): void; + bounds(): net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined; + } + interface Font$GlyphVisitor { + acceptGlyph(glyph: net.minecraft.client.gui.font.TextRenderable$Styled): void; + acceptEffect(effect: net.minecraft.client.gui.font.TextRenderable): void; + acceptRenderable(renderable: net.minecraft.client.gui.font.TextRenderable): void; + acceptEmptyArea(empty: net.minecraft.client.gui.font.EmptyArea): void; + } const Font: { DisplayMode: typeof net.minecraft.client.gui.Font$DisplayMode; SHADOW_DEPTH: number; @@ -12277,10 +12431,7 @@ declare global { interface Font { lineHeight: number; bidirectionalShaping(text: string): string; - drawInBatch(str: string, x: number, y: number, color: number, dropShadow: boolean, pose: org.joml.Matrix4fc, bufferSource: net.minecraft.client.renderer.MultiBufferSource, displayMode: net.minecraft.client.gui.Font$DisplayMode, backgroundColor: number, packedLightCoords: number): void; - drawInBatch(str: net.minecraft.network.chat.Component, x: number, y: number, color: number, dropShadow: boolean, pose: org.joml.Matrix4fc, bufferSource: net.minecraft.client.renderer.MultiBufferSource, displayMode: net.minecraft.client.gui.Font$DisplayMode, backgroundColor: number, packedLightCoords: number): void; - drawInBatch(str: net.minecraft.util.FormattedCharSequence, x: number, y: number, color: number, dropShadow: boolean, pose: org.joml.Matrix4fc, bufferSource: net.minecraft.client.renderer.MultiBufferSource, displayMode: net.minecraft.client.gui.Font$DisplayMode, backgroundColor: number, packedLightCoords: number): void; - drawInBatch8xOutline(str: net.minecraft.util.FormattedCharSequence, x: number, y: number, color: number, outlineColor: number, pose: org.joml.Matrix4fc, bufferSource: net.minecraft.client.renderer.MultiBufferSource, packedLightCoords: number): void; + prepare8xTextOutline(str: net.minecraft.util.FormattedCharSequence, x: number, y: number, outlineColor: number): net.minecraft.client.gui.Font$PreparedText; prepareText(text: string, x: number, y: number, originalColor: number, drawShadow: boolean, backgroundColor: number): net.minecraft.client.gui.Font$PreparedText; prepareText(text: net.minecraft.util.FormattedCharSequence, x: number, y: number, originalColor: number, drawShadow: boolean, includeEmpty: boolean, backgroundColor: number): net.minecraft.client.gui.Font$PreparedText; width(str: string): number; @@ -12295,18 +12446,6 @@ declare global { isBidirectional(): boolean; getSplitter(): net.minecraft.client.StringSplitter; } - interface Font$PreparedText { - visit(visitor: net.minecraft.client.gui.Font$GlyphVisitor): void; - bounds(): net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined; - } - const Font$GlyphVisitor: { - forMultiBufferSource(bufferSource: net.minecraft.client.renderer.MultiBufferSource, pose: org.joml.Matrix4fc, displayMode: net.minecraft.client.gui.Font$DisplayMode, lightCoords: number): net.minecraft.client.gui.Font$GlyphVisitor; - } - interface Font$GlyphVisitor { - acceptGlyph(glyph: net.minecraft.client.gui.font.TextRenderable$Styled): void; - acceptEffect(effect: net.minecraft.client.gui.font.TextRenderable): void; - acceptEmptyArea(empty: net.minecraft.client.gui.font.EmptyArea): void; - } interface Font$Provider { glyphs(font: net.minecraft.network.chat.FontDescription): net.minecraft.client.gui.GlyphSource; effect(): net.minecraft.client.gui.font.glyphs.EffectGlyph; @@ -12315,6 +12454,66 @@ declare global { getGlyph(codepoint: number): net.minecraft.client.gui.font.glyphs.BakedGlyph; getRandomGlyph(random: net.minecraft.util.RandomSource, width: number): net.minecraft.client.gui.font.glyphs.BakedGlyph; } + const Gui: { + SAVING_LEVEL: net.minecraft.network.chat.Component; + new(minecraft: net.minecraft.client.Minecraft, hud: net.minecraft.client.gui.Hud, guiRenderState: net.minecraft.client.renderer.state.gui.GuiRenderState): net.minecraft.client.gui.Gui; + } + interface Gui { + hud: net.minecraft.client.gui.Hud; + screen(): net.minecraft.client.gui.screens.Screen | null | undefined; + overlay(): net.minecraft.client.gui.screens.Overlay | null | undefined; + splashManager(): net.minecraft.client.resources.SplashManager; + toastManager(): net.minecraft.client.gui.components.toasts.ToastManager; + chatListener(): net.minecraft.client.multiplayer.chat.ChatListener; + registerReloadListeners(resourceManager: net.minecraft.server.packs.resources.ReloadableResourceManager): void; + tick(): void; + update(): void; + extractRenderState(deltaTracker: net.minecraft.client.DeltaTracker, shouldRenderLevel: boolean, resourcesLoaded: boolean): void; + setScreen(screen: net.minecraft.client.gui.screens.Screen | null | undefined): void; + setOverlay(overlay: net.minecraft.client.gui.screens.Overlay | null | undefined): void; + isPausing(): boolean; + addSocialInteractionsToast(): void; + setPauseScreen(suppressPauseMenuIfWeReallyArePausing: boolean, canGameReallyBePaused: boolean): void; + handleKeybinds(): void; + openChatScreen(chatMethod: net.minecraft.client.gui.components.ChatComponent$ChatMethod): void; + openChatAndAddText(chatMethod: net.minecraft.client.gui.components.ChatComponent$ChatMethod, text: string): void; + buildInitialScreens(cookie: net.minecraft.client.GameLoadCookie | null | undefined): java.lang.Runnable; + canInterruptScreen(): boolean; + setClientLevelTeardownInProgress(clientLevelTeardownInProgress: boolean): void; + } + const Hud: { + NAUSEA_LOCATION: net.minecraft.resources.Identifier; + new(minecraft: net.minecraft.client.Minecraft): net.minecraft.client.gui.Hud; + getMobEffectSprite(effect: net.minecraft.core.Holder): net.minecraft.resources.Identifier; + } + interface Hud { + vignetteBrightness: number; + isHidden(): boolean; + registerReloadListeners(resourceManager: net.minecraft.server.packs.resources.ReloadableResourceManager): void; + toggle(): void; + resetTitleTimes(): void; + extractRenderState(graphics: net.minecraft.client.gui.GuiGraphicsExtractor, deltaTracker: net.minecraft.client.DeltaTracker): void; + extractDebugOverlay(graphics: net.minecraft.client.gui.GuiGraphicsExtractor): void; + extractDeferredSubtitles(): void; + tick(pause: boolean): void; + setNowPlaying(string: net.minecraft.network.chat.Component): void; + setOverlayMessage(string: net.minecraft.network.chat.Component, animate: boolean): void; + setTimes(fadeInTime: number, stayTime: number, fadeOutTime: number): void; + setSubtitle(subtitle: net.minecraft.network.chat.Component): void; + setTitle(title: net.minecraft.network.chat.Component): void; + clearTitles(): void; + getChat(): net.minecraft.client.gui.components.ChatComponent; + getWaypointStyles(): net.minecraft.client.resources.WaypointStyleManager; + getGuiTicks(): number; + getFont(): net.minecraft.client.gui.Font; + getSpectatorGui(): net.minecraft.client.gui.components.spectator.SpectatorGui; + getTabList(): net.minecraft.client.gui.components.PlayerTabOverlay; + onDisconnected(): void; + getBossOverlay(): net.minecraft.client.gui.components.BossHealthOverlay; + getDebugOverlay(): net.minecraft.client.gui.components.DebugScreenOverlay; + clearCache(): void; + extractSavingIndicator(graphics: net.minecraft.client.gui.GuiGraphicsExtractor, deltaTracker: net.minecraft.client.DeltaTracker): void; + } const ActiveTextCollector: { Parameters: typeof net.minecraft.client.gui.ActiveTextCollector$Parameters; ClickableStyleFinder: typeof net.minecraft.client.gui.ActiveTextCollector$ClickableStyleFinder; @@ -12370,35 +12569,6 @@ declare global { includeInsertions(flag: boolean): net.minecraft.client.gui.ActiveTextCollector$ClickableStyleFinder; result(): net.minecraft.network.chat.Style | null | undefined; } - const Gui: { - NAUSEA_LOCATION: net.minecraft.resources.Identifier; - new(minecraft: net.minecraft.client.Minecraft): net.minecraft.client.gui.Gui; - getMobEffectSprite(effect: net.minecraft.core.Holder): net.minecraft.resources.Identifier; - } - interface Gui { - vignetteBrightness: number; - resetTitleTimes(): void; - extractRenderState(graphics: net.minecraft.client.gui.GuiGraphicsExtractor, deltaTracker: net.minecraft.client.DeltaTracker): void; - extractDebugOverlay(graphics: net.minecraft.client.gui.GuiGraphicsExtractor): void; - extractDeferredSubtitles(): void; - tick(pause: boolean): void; - setNowPlaying(string: net.minecraft.network.chat.Component): void; - setOverlayMessage(string: net.minecraft.network.chat.Component, animate: boolean): void; - setTimes(fadeInTime: number, stayTime: number, fadeOutTime: number): void; - setSubtitle(subtitle: net.minecraft.network.chat.Component): void; - setTitle(title: net.minecraft.network.chat.Component): void; - clearTitles(): void; - getChat(): net.minecraft.client.gui.components.ChatComponent; - getGuiTicks(): number; - getFont(): net.minecraft.client.gui.Font; - getSpectatorGui(): net.minecraft.client.gui.components.spectator.SpectatorGui; - getTabList(): net.minecraft.client.gui.components.PlayerTabOverlay; - onDisconnected(): void; - getBossOverlay(): net.minecraft.client.gui.components.BossHealthOverlay; - getDebugOverlay(): net.minecraft.client.gui.components.DebugScreenOverlay; - clearCache(): void; - extractSavingIndicator(graphics: net.minecraft.client.gui.GuiGraphicsExtractor, deltaTracker: net.minecraft.client.DeltaTracker): void; - } const GuiGraphicsExtractor$HoveredTextEffects: { NONE: net.minecraft.client.gui.GuiGraphicsExtractor$HoveredTextEffects; TOOLTIP_ONLY: net.minecraft.client.gui.GuiGraphicsExtractor$HoveredTextEffects; @@ -12424,7 +12594,7 @@ declare global { namespace gui { namespace pip { const PictureInPictureRenderState: { - IDENTITY_POSE: org.joml.Matrix3x2f; + IDENTITY_POSE: org.joml.Matrix3x2fc; getBounds(x0: number, y0: number, x1: number, y1: number, scissorArea: net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined): net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined; } interface PictureInPictureRenderState extends net.minecraft.client.renderer.state.gui.ScreenArea { @@ -12433,7 +12603,7 @@ declare global { y0(): number; y1(): number; scale(): number; - pose(): org.joml.Matrix3x2f; + pose(): org.joml.Matrix3x2fc; scissorArea(): net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined; } } @@ -12443,7 +12613,8 @@ declare global { } interface GuiRenderState extends net.fabricmc.fabric.api.client.rendering.v1.FabricRenderState { panoramaRenderState: net.minecraft.client.renderer.state.gui.PanoramaRenderState | null | undefined; - clearColorOverride: number; + clearColorOverride: org.joml.Vector4f; + isHudHidden: boolean; nextStratum(): void; blurBeforeThisStratum(): void; up(): void; @@ -12485,14 +12656,7 @@ declare global { new(font: net.minecraft.client.gui.Font, text: net.minecraft.util.FormattedCharSequence, pose: org.joml.Matrix3x2fc, x: number, y: number, color: number, backgroundColor: number, dropShadow: boolean, includeEmpty: boolean, scissor: net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined): net.minecraft.client.renderer.state.gui.GuiTextRenderState; } interface GuiTextRenderState extends net.minecraft.client.renderer.state.gui.ScreenArea { - font: net.minecraft.client.gui.Font; - text: net.minecraft.util.FormattedCharSequence; pose: org.joml.Matrix3x2fc; - x: number; - y: number; - color: number; - backgroundColor: number; - dropShadow: boolean; scissor: net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined; ensurePrepared(): net.minecraft.client.gui.Font$PreparedText; } @@ -12504,10 +12668,10 @@ declare global { } const BlitRenderState: { new(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline, textureSetup: net.minecraft.client.gui.render.TextureSetup, pose: org.joml.Matrix3x2f, x0: number, y0: number, x1: number, y1: number, u0: number, u1: number, v0: number, v1: number, color: number, scissorArea: net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined): net.minecraft.client.renderer.state.gui.BlitRenderState; - new(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline, textureSetup: net.minecraft.client.gui.render.TextureSetup, pose: org.joml.Matrix3x2f, x0: number, y0: number, x1: number, y1: number, u0: number, u1: number, v0: number, v1: number, color: number, scissorArea: net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined, bounds: net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined): net.minecraft.client.renderer.state.gui.BlitRenderState; + new(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline, textureSetup: net.minecraft.client.gui.render.TextureSetup, pose: org.joml.Matrix3x2fc, x0: number, y0: number, x1: number, y1: number, u0: number, u1: number, v0: number, v1: number, color: number, scissorArea: net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined, bounds: net.minecraft.client.gui.navigation.ScreenRectangle | null | undefined): net.minecraft.client.renderer.state.gui.BlitRenderState; } interface BlitRenderState extends java.lang.Record, net.minecraft.client.renderer.state.gui.GuiElementRenderState { - pose(): org.joml.Matrix3x2f; + pose(): org.joml.Matrix3x2fc; x0(): number; y0(): number; x1(): number; @@ -12540,6 +12704,8 @@ declare global { yRot: number; initialized: boolean; isPanoramicMode: boolean; + isFrustumCaptured: boolean; + smartCull: boolean; orientation: org.joml.Quaternionf; cullFrustum: net.minecraft.client.renderer.culling.Frustum; fogType: net.minecraft.world.level.material.FogType; @@ -12566,22 +12732,31 @@ declare global { backwardsInterpolatedWalkDistance: number; bob: number; } - const QuadParticleRenderState$PreparedBuffers: { - new(indexCount: number, dynamicTransforms: com.mojang.blaze3d.buffers.GpuBufferSlice, layers: Map): net.minecraft.client.renderer.state.level.QuadParticleRenderState$PreparedBuffers; + const QuadParticleRenderState: { + new(): net.minecraft.client.renderer.state.level.QuadParticleRenderState; } - interface QuadParticleRenderState$PreparedBuffers extends java.lang.Record { - indexCount(): number; - dynamicTransforms(): com.mojang.blaze3d.buffers.GpuBufferSlice; - layers(): Map; + interface QuadParticleRenderState extends net.minecraft.client.renderer.state.level.ParticleGroupRenderState { + add(layer: net.minecraft.client.particle.SingleQuadParticle$Layer, x: number, y: number, z: number, xRot: number, yRot: number, zRot: number, wRot: number, scale: number, u0: number, u1: number, v0: number, v1: number, color: number, lightCoords: number): void; + isEmpty(): boolean; + buildLayer(layer: net.minecraft.client.particle.SingleQuadParticle$Layer, bufferBuilder: com.mojang.blaze3d.vertex.VertexConsumer): void; + layers(): Set; + } + interface ParticleGroupRenderState { + submit(submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, camera: net.minecraft.client.renderer.state.level.CameraRenderState): void; + clear(): void; + } + interface QuadParticleRenderState$ParticleConsumer { + consume(x: number, y: number, z: number, xRot: number, yRot: number, zRot: number, wRot: number, scale: number, u0: number, u1: number, v0: number, v1: number, color: number, lightCoords: number): void; + (x: number, y: number, z: number, xRot: number, yRot: number, zRot: number, wRot: number, scale: number, u0: number, u1: number, v0: number, v1: number, color: number, lightCoords: number): void; } const LevelRenderState: { new(): net.minecraft.client.renderer.state.level.LevelRenderState; } interface LevelRenderState extends net.fabricmc.fabric.api.client.rendering.v1.FabricRenderState { cameraRenderState: net.minecraft.client.renderer.state.level.CameraRenderState; + sectionUpdateRenderStates: Array; entityRenderStates: Array; blockEntityRenderStates: Array; - haveGlowingEntities: boolean; blockOutlineRenderState: net.minecraft.client.renderer.state.level.BlockOutlineRenderState | null | undefined; blockBreakingRenderStates: Array; weatherRenderState: net.minecraft.client.renderer.state.level.WeatherRenderState; @@ -12592,7 +12767,12 @@ declare global { lastEntityRenderStateCount: number; cloudColor: number; cloudHeight: number; - chunkSectionsToRender: net.minecraft.client.renderer.chunk.ChunkSectionsToRender | null | undefined; + render3dCrosshair: boolean; + playerCompiledSectionCallback: java.lang.Runnable | null | undefined; + chunkLoadingRenderState: net.minecraft.client.renderer.state.level.ChunkLoadingRenderState; + shouldResetChunkLayerSampler: boolean; + shouldShowEntityOutlines: boolean; + shouldResetSkyRenderer: boolean; reset(): void; } const BlockOutlineRenderState: { @@ -12612,8 +12792,8 @@ declare global { new(): net.minecraft.client.renderer.state.level.WeatherRenderState; } interface WeatherRenderState extends net.fabricmc.fabric.api.client.rendering.v1.FabricRenderState { - rainColumns: Array; - snowColumns: Array; + rainColumns: Array; + snowColumns: Array; intensity: number; radius: number; reset(): void; @@ -12665,11 +12845,18 @@ declare global { particles: Array; reset(): void; add(state: net.minecraft.client.renderer.state.level.ParticleGroupRenderState): void; - submit(submitNodeStorage: net.minecraft.client.renderer.SubmitNodeStorage, camera: net.minecraft.client.renderer.state.level.CameraRenderState): void; - } - interface ParticleGroupRenderState { submit(submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, camera: net.minecraft.client.renderer.state.level.CameraRenderState): void; - clear(): void; + } + const ChunkLoadingRenderState: { + new(): net.minecraft.client.renderer.state.level.ChunkLoadingRenderState; + } + interface ChunkLoadingRenderState { + addedEmptySections: it.unimi.dsi.fastutil.longs.LongOpenHashSet; + removedEmptySections: it.unimi.dsi.fastutil.longs.LongOpenHashSet; + addedLoadedChunks: it.unimi.dsi.fastutil.longs.LongOpenHashSet; + removedLoadedChunks: it.unimi.dsi.fastutil.longs.LongOpenHashSet; + loadedExpectedChunks: it.unimi.dsi.fastutil.longs.LongOpenHashSet; + reset(): void; } } const MapRenderState: { @@ -12701,6 +12888,7 @@ declare global { optionsRenderState: net.minecraft.client.renderer.state.OptionsRenderState; windowRenderState: net.minecraft.client.renderer.state.WindowRenderState; framerateLimit: number; + useShaderTransparency(): boolean; } const LightmapRenderState: { new(): net.minecraft.client.renderer.state.LightmapRenderState; @@ -12731,7 +12919,6 @@ declare global { maxAnisotropyValue: number; textureFiltering: net.minecraft.client.TextureFilteringMethod; bobView: boolean; - hideGui: boolean; screenEffectScale: number; glintSpeed: number; glintStrength: number; @@ -12741,6 +12928,9 @@ declare global { cloudStatus: net.minecraft.client.CloudStatus; cameraType: net.minecraft.client.CameraType; renderDistance: number; + chunkSectionFadeInTime: number; + prioritizeChunkUpdates: net.minecraft.client.PrioritizeChunkUpdates; + fov: number; getBackgroundOpacity(defaultOpacity: number): number; } const WindowRenderState: { @@ -12752,7 +12942,6 @@ declare global { guiScale: number; appropriateLineWidth: number; isMinimized: boolean; - isResized: boolean; } } namespace item { @@ -12810,6 +12999,12 @@ declare global { } interface ItemStackRenderState$FoilType extends kotlin.Enum { } + const ItemModel: { + BakingContext: typeof net.minecraft.client.renderer.item.ItemModel$BakingContext; + } + interface ItemModel { + update(output: net.minecraft.client.renderer.item.ItemStackRenderState, item: net.minecraft.world.item.ItemStack, resolver: net.minecraft.client.renderer.item.ItemModelResolver, displayContext: net.minecraft.world.item.ItemDisplayContext, level: net.minecraft.client.multiplayer.ClientLevel | null | undefined, owner: net.minecraft.world.entity.ItemOwner | null | undefined, seed: number): void; + } const ItemModelResolver: { new(modelManager: net.minecraft.client.resources.model.ModelManager): net.minecraft.client.renderer.item.ItemModelResolver; } @@ -12821,12 +13016,6 @@ declare global { shouldPlaySwapAnimation(stack: net.minecraft.world.item.ItemStack): boolean; swapAnimationScale(stack: net.minecraft.world.item.ItemStack): number; } - const ItemModel: { - BakingContext: typeof net.minecraft.client.renderer.item.ItemModel$BakingContext; - } - interface ItemModel { - update(output: net.minecraft.client.renderer.item.ItemStackRenderState, item: net.minecraft.world.item.ItemStack, resolver: net.minecraft.client.renderer.item.ItemModelResolver, displayContext: net.minecraft.world.item.ItemDisplayContext, level: net.minecraft.client.multiplayer.ClientLevel | null | undefined, owner: net.minecraft.world.entity.ItemOwner | null | undefined, seed: number): void; - } const ItemModel$BakingContext: { new(blockModelBaker: net.minecraft.client.resources.model.ModelBaker, entityModelSet: net.minecraft.client.model.geom.EntityModelSet, sprites: net.minecraft.client.resources.model.sprite.SpriteGetter, playerSkinRenderCache: net.minecraft.client.renderer.PlayerSkinRenderCache, missingItemModel: net.minecraft.client.renderer.item.MissingItemModel, contextSwapper: net.minecraft.util.RegistryContextSwapper | null | undefined): net.minecraft.client.renderer.item.ItemModel$BakingContext; } @@ -12884,20 +13073,96 @@ declare global { label(): string; vertexFormat(): com.mojang.blaze3d.vertex.VertexFormat; } + const SectionRenderDispatcher$RenderSection: { + SectionTask: typeof net.minecraft.client.renderer.chunk.SectionRenderDispatcher.SectionRenderDispatcher$RenderSection$SectionTask; + new(index: number, sectionNode: number): net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection; + } + interface SectionRenderDispatcher$RenderSection extends net.minecraft.client.RotatingSectionStorage$Value { + index: number; + sectionMesh: java.util.concurrent.atomic.AtomicReference; + wasPreviouslyEmpty(): boolean; + getVisibility(now: number): number; + setFadeDuration(fadeDuration: number): void; + setWasPreviouslyEmpty(wasPreviouslyEmpty: boolean): void; + getBoundingBox(): net.minecraft.world.phys.AABB; + getSectionMesh(): net.minecraft.client.renderer.chunk.SectionMesh; + reset(): void; + getRenderOrigin(): net.minecraft.core.BlockPos; + getNeighborSectionNode(direction: net.minecraft.core.Direction): number; + resortTransparency(): void; + hasTranslucentGeometry(): boolean; + transparencyResortingScheduled(): boolean; + compileAsync(region: net.minecraft.client.renderer.chunk.RenderSectionRegion): void; + compileSync(region: net.minecraft.client.renderer.chunk.RenderSectionRegion): void; + } + const SectionMesh: { + SectionDraw: typeof net.minecraft.client.renderer.chunk.SectionMesh$SectionDraw; + } + interface SectionMesh extends java.lang.AutoCloseable { + isDifferentPointOfView(pointOfView: net.minecraft.client.renderer.chunk.TranslucencyPointOfView): boolean; + hasRenderableLayers(): boolean; + hasTranslucentGeometry(): boolean; + isEmpty(layer: net.minecraft.client.renderer.chunk.ChunkSectionLayer): boolean; + getRenderableBlockEntities(): Array; + facesCanSeeEachother(direction1: net.minecraft.core.Direction, direction2: net.minecraft.core.Direction): boolean; + getSectionDraw(layer: net.minecraft.client.renderer.chunk.ChunkSectionLayer): net.minecraft.client.renderer.chunk.SectionMesh$SectionDraw | null | undefined; + } + const TranslucencyPointOfView: { + new(): net.minecraft.client.renderer.chunk.TranslucencyPointOfView; + of(cameraPos: net.minecraft.world.phys.Vec3, sectionNode: number): net.minecraft.client.renderer.chunk.TranslucencyPointOfView; + } + interface TranslucencyPointOfView { + set(cameraPos: net.minecraft.world.phys.Vec3, sectionPos: number): net.minecraft.client.renderer.chunk.TranslucencyPointOfView; + isAxisAligned(): boolean; + } + const SectionMesh$SectionDraw: { + new(indexCount: number, indexType: com.mojang.blaze3d.IndexType, hasCustomIndexBuffer: boolean): net.minecraft.client.renderer.chunk.SectionMesh$SectionDraw; + } + interface SectionMesh$SectionDraw extends java.lang.Record { + indexCount(): number; + indexType(): com.mojang.blaze3d.IndexType; + hasCustomIndexBuffer(): boolean; + } + const RenderSectionRegion: { + RADIUS: number; + SIZE: number; + new(level: net.minecraft.client.multiplayer.ClientLevel, minSectionX: number, minSectionY: number, minSectionZ: number, sections: Array): net.minecraft.client.renderer.chunk.RenderSectionRegion; + index(minSectionX: number, minSectionY: number, minSectionZ: number, sectionX: number, sectionY: number, sectionZ: number): number; + } + interface RenderSectionRegion extends net.minecraft.client.renderer.block.BlockAndTintGetter { + } + const SectionRenderDispatcher$RenderSection$SectionTask: { + SectionTaskResult: typeof net.minecraft.client.renderer.chunk.SectionRenderDispatcher.RenderSection.SectionRenderDispatcher$RenderSection$SectionTask$SectionTaskResult; + new(isRecompile: boolean): unknown; + } + interface SectionRenderDispatcher$RenderSection$SectionTask { + isRecompile(): boolean; + doTask(buffers: net.minecraft.client.renderer.SectionBufferBuilderPack): unknown; + cancel(): void; + getRenderOrigin(): net.minecraft.core.BlockPos; + } + const SectionRenderDispatcher$RenderSection$SectionTask$SectionTaskResult: { + SUCCESSFUL: net.minecraft.client.renderer.chunk.SectionRenderDispatcher.RenderSection.SectionRenderDispatcher$RenderSection$SectionTask$SectionTaskResult; + CANCELLED: net.minecraft.client.renderer.chunk.SectionRenderDispatcher.RenderSection.SectionRenderDispatcher$RenderSection$SectionTask$SectionTaskResult; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): unknown; + } + interface SectionRenderDispatcher$RenderSection$SectionTask$SectionTaskResult extends kotlin.Enum { + } const SectionRenderDispatcher: { RenderSection: typeof net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection; RenderSectionBufferSlice: typeof net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSectionBufferSlice; - new(level: net.minecraft.client.multiplayer.ClientLevel, renderer: net.minecraft.client.renderer.LevelRenderer, executor: net.minecraft.TracingExecutor, renderBuffers: net.minecraft.client.renderer.RenderBuffers, sectionCompiler: net.minecraft.client.renderer.chunk.SectionCompiler): net.minecraft.client.renderer.chunk.SectionRenderDispatcher; + NEARBY_SECTION_DISTANCE_IN_BLOCKS: number; + new(executor: net.minecraft.TracingExecutor, renderBuffers: net.minecraft.client.renderer.RenderBuffers, sectionCompiler: net.minecraft.client.renderer.chunk.SectionCompiler, onSectionMeshUpdate: unknown): net.minecraft.client.renderer.chunk.SectionRenderDispatcher; } interface SectionRenderDispatcher { - setLevel(level: net.minecraft.client.multiplayer.ClientLevel, sectionCompiler: net.minecraft.client.renderer.chunk.SectionCompiler): void; + setCompiler(sectionCompiler: net.minecraft.client.renderer.chunk.SectionCompiler): void; setCameraPosition(cameraPosition: net.minecraft.world.phys.Vec3): void; getRenderSectionSlice(sectionMesh: net.minecraft.client.renderer.chunk.SectionMesh, layer: net.minecraft.client.renderer.chunk.ChunkSectionLayer): net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSectionBufferSlice | null | undefined; lock(): void; unlock(): void; - uploadGlobalGeomBuffersToGPU(): void; - rebuildSectionSync(section: net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection, cache: net.minecraft.client.renderer.chunk.RenderRegionCache): void; - schedule(task: unknown): void; + uploadTerrainBuffersToGpu(): void; clearCompileQueue(): void; isQueueEmpty(): boolean; dispose(): void; @@ -12907,24 +13172,17 @@ declare global { } const SectionCompiler: { Results: typeof net.minecraft.client.renderer.chunk.SectionCompiler$Results; - new(ambientOcclusion: boolean, cutoutLeaves: boolean, blockModelSet: net.minecraft.client.renderer.block.BlockStateModelSet, fluidModelSet: net.minecraft.client.renderer.block.FluidStateModelSet, blockColors: net.minecraft.client.color.block.BlockColors, blockEntityRenderer: net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher): net.minecraft.client.renderer.chunk.SectionCompiler; + new(ambientOcclusion: boolean, cutoutLeaves: boolean, blockModelSet: net.minecraft.client.renderer.block.BlockStateModelSet, fluidModelSet: net.minecraft.client.renderer.block.FluidStateModelSet, blockColors: net.minecraft.client.color.block.BlockColors): net.minecraft.client.renderer.chunk.SectionCompiler; } interface SectionCompiler { compile(sectionPos: net.minecraft.core.SectionPos, region: net.minecraft.client.renderer.chunk.RenderSectionRegion, vertexSorting: com.mojang.blaze3d.vertex.VertexSorting, builders: net.minecraft.client.renderer.SectionBufferBuilderPack): net.minecraft.client.renderer.chunk.SectionCompiler$Results; } - const RenderSectionRegion: { - RADIUS: number; - SIZE: number; - index(minSectionX: number, minSectionY: number, minSectionZ: number, sectionX: number, sectionY: number, sectionZ: number): number; - } - interface RenderSectionRegion extends net.minecraft.client.renderer.block.BlockAndTintGetter { - } const SectionCompiler$Results: { new(): net.minecraft.client.renderer.chunk.SectionCompiler$Results; } interface SectionCompiler$Results { blockEntities: Array; - renderedLayers: Map; + renderedLayers: Map; visibilitySet: net.minecraft.client.renderer.chunk.VisibilitySet; transparencyState: com.mojang.blaze3d.vertex.MeshData$SortState | null | undefined; release(): void; @@ -12938,34 +13196,6 @@ declare global { setAll(visible: boolean): void; visibilityBetween(direction1: net.minecraft.core.Direction, direction2: net.minecraft.core.Direction): boolean; } - const SectionMesh: { - SectionDraw: typeof net.minecraft.client.renderer.chunk.SectionMesh$SectionDraw; - } - interface SectionMesh extends java.lang.AutoCloseable { - isDifferentPointOfView(pointOfView: net.minecraft.client.renderer.chunk.TranslucencyPointOfView): boolean; - hasRenderableLayers(): boolean; - hasTranslucentGeometry(): boolean; - isEmpty(layer: net.minecraft.client.renderer.chunk.ChunkSectionLayer): boolean; - getRenderableBlockEntities(): Array; - facesCanSeeEachother(direction1: net.minecraft.core.Direction, direction2: net.minecraft.core.Direction): boolean; - getSectionDraw(layer: net.minecraft.client.renderer.chunk.ChunkSectionLayer): net.minecraft.client.renderer.chunk.SectionMesh$SectionDraw | null | undefined; - } - const TranslucencyPointOfView: { - new(): net.minecraft.client.renderer.chunk.TranslucencyPointOfView; - of(cameraPos: net.minecraft.world.phys.Vec3, sectionNode: number): net.minecraft.client.renderer.chunk.TranslucencyPointOfView; - } - interface TranslucencyPointOfView { - set(cameraPos: net.minecraft.world.phys.Vec3, sectionPos: number): net.minecraft.client.renderer.chunk.TranslucencyPointOfView; - isAxisAligned(): boolean; - } - const SectionMesh$SectionDraw: { - new(indexCount: number, indexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType, hasCustomIndexBuffer: boolean): net.minecraft.client.renderer.chunk.SectionMesh$SectionDraw; - } - interface SectionMesh$SectionDraw extends java.lang.Record { - indexCount(): number; - indexType(): com.mojang.blaze3d.vertex.VertexFormat$IndexType; - hasCustomIndexBuffer(): boolean; - } const SectionRenderDispatcher$RenderSectionBufferSlice: { new(vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, vertexBufferOffset: number, indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer | null | undefined, indexBufferOffset: number): net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSectionBufferSlice; } @@ -12975,62 +13205,6 @@ declare global { indexBuffer(): com.mojang.blaze3d.buffers.GpuBuffer | null | undefined; indexBufferOffset(): number; } - const SectionRenderDispatcher$RenderSection: { - CompileTask: typeof net.minecraft.client.renderer.chunk.SectionRenderDispatcher.SectionRenderDispatcher$RenderSection$CompileTask; - SIZE: number; - new(index: number, sectionNode: number): net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection; - } - interface SectionRenderDispatcher$RenderSection { - index: number; - sectionMesh: java.util.concurrent.atomic.AtomicReference; - wasPreviouslyEmpty(): boolean; - getVisibility(now: number): number; - setFadeDuration(fadeDuration: number): void; - setWasPreviouslyEmpty(wasPreviouslyEmpty: boolean): void; - hasAllNeighbors(): boolean; - getBoundingBox(): net.minecraft.world.phys.AABB; - setSectionNode(sectionNode: number): void; - getSectionMesh(): net.minecraft.client.renderer.chunk.SectionMesh; - reset(): void; - getRenderOrigin(): net.minecraft.core.BlockPos; - getSectionNode(): number; - setDirty(fromPlayer: boolean): void; - setNotDirty(): void; - isDirty(): boolean; - isDirtyFromPlayer(): boolean; - getNeighborSectionNode(direction: net.minecraft.core.Direction): number; - resortTransparency(dispatcher: net.minecraft.client.renderer.chunk.SectionRenderDispatcher): void; - hasTranslucentGeometry(): boolean; - transparencyResortingScheduled(): boolean; - createCompileTask(cache: net.minecraft.client.renderer.chunk.RenderRegionCache): unknown; - rebuildSectionAsync(cache: net.minecraft.client.renderer.chunk.RenderRegionCache): void; - compileSync(cache: net.minecraft.client.renderer.chunk.RenderRegionCache): void; - } - const RenderRegionCache: { - new(): net.minecraft.client.renderer.chunk.RenderRegionCache; - } - interface RenderRegionCache { - createRegion(level: net.minecraft.client.multiplayer.ClientLevel, sectionNode: number): net.minecraft.client.renderer.chunk.RenderSectionRegion; - } - const SectionRenderDispatcher$RenderSection$CompileTask: { - SectionTaskResult: typeof net.minecraft.client.renderer.chunk.SectionRenderDispatcher.RenderSection.SectionRenderDispatcher$RenderSection$CompileTask$SectionTaskResult; - new(isRecompile: boolean): unknown; - } - interface SectionRenderDispatcher$RenderSection$CompileTask { - isRecompile(): boolean; - doTask(buffers: net.minecraft.client.renderer.SectionBufferBuilderPack): unknown; - cancel(): void; - getRenderOrigin(): net.minecraft.core.BlockPos; - } - const SectionRenderDispatcher$RenderSection$CompileTask$SectionTaskResult: { - SUCCESSFUL: net.minecraft.client.renderer.chunk.SectionRenderDispatcher.RenderSection.SectionRenderDispatcher$RenderSection$CompileTask$SectionTaskResult; - CANCELLED: net.minecraft.client.renderer.chunk.SectionRenderDispatcher.RenderSection.SectionRenderDispatcher$RenderSection$CompileTask$SectionTaskResult; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): unknown; - } - interface SectionRenderDispatcher$RenderSection$CompileTask$SectionTaskResult extends kotlin.Enum { - } const ChunkSectionsToRender: { new(textureView: com.mojang.blaze3d.textures.GpuTextureView, drawGroupsPerLayer: java.util.EnumMap, maxIndicesRequired: number, chunkSectionInfos: Array): net.minecraft.client.renderer.chunk.ChunkSectionsToRender; } @@ -13065,10 +13239,9 @@ declare global { outline(): java.util.Optional; hasBlending(): boolean; outputTarget(): net.minecraft.client.renderer.rendertype.OutputTarget; - draw(mesh: com.mojang.blaze3d.vertex.MeshData): void; - bufferSize(): number; + prepare(): net.minecraft.client.renderer.rendertype.PreparedRenderType; format(): com.mojang.blaze3d.vertex.VertexFormat; - mode(): com.mojang.blaze3d.vertex.VertexFormat$Mode; + primitiveTopology(): com.mojang.blaze3d.PrimitiveTopology; isOutline(): boolean; pipeline(): com.mojang.blaze3d.pipeline.RenderPipeline; affectsCrumbling(): boolean; @@ -13085,21 +13258,40 @@ declare global { interface OutputTarget { getRenderTarget(): com.mojang.blaze3d.pipeline.RenderTarget; } + const PreparedRenderType: { + Texture: typeof net.minecraft.client.renderer.rendertype.PreparedRenderType$Texture; + new(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline, outputTarget: net.minecraft.client.renderer.rendertype.OutputTarget, dynamicTransforms: com.mojang.blaze3d.buffers.GpuBufferSlice, scissorState: com.mojang.blaze3d.systems.ScissorState, textures: Array): net.minecraft.client.renderer.rendertype.PreparedRenderType; + } + interface PreparedRenderType extends java.lang.Record { + drawFromBuffer(info: net.minecraft.client.renderer.StagedVertexBuffer$ExecuteInfo): void; + drawFromBuffer(vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexType: com.mojang.blaze3d.IndexType, baseVertex: number, firstIndex: number, indexCount: number): void; + pipeline(): com.mojang.blaze3d.pipeline.RenderPipeline; + outputTarget(): net.minecraft.client.renderer.rendertype.OutputTarget; + dynamicTransforms(): com.mojang.blaze3d.buffers.GpuBufferSlice; + scissorState(): com.mojang.blaze3d.systems.ScissorState; + textures(): Array; + } + const PreparedRenderType$Texture: { + new(name: string, textureView: com.mojang.blaze3d.textures.GpuTextureView, sampler: com.mojang.blaze3d.textures.GpuSampler): net.minecraft.client.renderer.rendertype.PreparedRenderType$Texture; + } + interface PreparedRenderType$Texture extends java.lang.Record { + name(): string; + textureView(): com.mojang.blaze3d.textures.GpuTextureView; + sampler(): com.mojang.blaze3d.textures.GpuSampler; + } const RenderSetup: { OutlineProperty: typeof net.minecraft.client.renderer.rendertype.RenderSetup$OutlineProperty; RenderSetupBuilder: typeof net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; - TextureAndSampler: typeof net.minecraft.client.renderer.rendertype.RenderSetup$TextureAndSampler; builder(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; } interface RenderSetup { - getTextures(): Map; + prepareTextures(textureManager: net.minecraft.client.renderer.texture.TextureManager, samplerCache: com.mojang.blaze3d.systems.SamplerCache, overlayTexture: com.mojang.blaze3d.textures.GpuTextureView, lightmapTexture: com.mojang.blaze3d.textures.GpuTextureView): Array; } interface RenderSetup$RenderSetupBuilder { useLightmap(): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; useOverlay(): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; affectsCrumbling(): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; sortOnUpload(): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; - bufferSize(bufferSize: number): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; withTexture(name: string, texture: net.minecraft.resources.Identifier): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; withTexture(name: string, texture: net.minecraft.resources.Identifier, sampler: unknown): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; setLayeringTransform(layeringTransform: net.minecraft.client.renderer.rendertype.LayeringTransform): net.minecraft.client.renderer.rendertype.RenderSetup$RenderSetupBuilder; @@ -13127,7 +13319,7 @@ declare global { new(name: string, matrix: unknown): net.minecraft.client.renderer.rendertype.TextureTransform; } interface TextureTransform { - getMatrix(): org.joml.Matrix4f; + createMatrix(): org.joml.Matrix4f; } const TextureTransform$OffsetTextureTransform: { new(uOffset: number, vOffset: number): net.minecraft.client.renderer.rendertype.TextureTransform$OffsetTextureTransform; @@ -13144,60 +13336,8 @@ declare global { } interface RenderSetup$OutlineProperty extends kotlin.Enum { } - const RenderSetup$TextureAndSampler: { - new(textureView: com.mojang.blaze3d.textures.GpuTextureView, sampler: com.mojang.blaze3d.textures.GpuSampler): net.minecraft.client.renderer.rendertype.RenderSetup$TextureAndSampler; - } - interface RenderSetup$TextureAndSampler extends java.lang.Record { - textureView(): com.mojang.blaze3d.textures.GpuTextureView; - sampler(): com.mojang.blaze3d.textures.GpuSampler; - } } namespace texture { - interface TextureAtlasSprite extends java.lang.AutoCloseable { - atlasLocation(): net.minecraft.resources.Identifier; - contents(): net.minecraft.client.renderer.texture.SpriteContents; - getX(): number; - getY(): number; - getU0(): number; - getU1(): number; - createAnimationState(uboSlice: com.mojang.blaze3d.buffers.GpuBufferSlice, spriteUboSize: number): net.minecraft.client.renderer.texture.SpriteContents$AnimationState | null | undefined; - transparency(): com.mojang.blaze3d.platform.Transparency; - getU(offset: number): number; - getV0(): number; - getV1(): number; - getV(offset: number): number; - uploadFirstFrame(destination: com.mojang.blaze3d.textures.GpuTexture, level: number): void; - wrap(buffer: com.mojang.blaze3d.vertex.VertexConsumer): com.mojang.blaze3d.vertex.VertexConsumer; - uploadSpriteUbo(uboBuffer: java.nio.ByteBuffer, startOffset: number, maxMipLevel: number, atlasWidth: number, atlasHeight: number, spriteUboSize: number): void; - } - const SpriteContents: { - AnimationState: typeof net.minecraft.client.renderer.texture.SpriteContents$AnimationState; - UBO_SIZE: number; - new(name: net.minecraft.resources.Identifier, frameSize: net.minecraft.client.resources.metadata.animation.FrameSize, image: com.mojang.blaze3d.platform.NativeImage): net.minecraft.client.renderer.texture.SpriteContents; - new(name: net.minecraft.resources.Identifier, frameSize: net.minecraft.client.resources.metadata.animation.FrameSize, image: com.mojang.blaze3d.platform.NativeImage, animationInfo: java.util.Optional, additionalMetadata: Array>, textureInfo: java.util.Optional): net.minecraft.client.renderer.texture.SpriteContents; - } - interface SpriteContents extends java.lang.AutoCloseable, net.minecraft.client.renderer.texture.Stitcher$Entry { - transparency(): com.mojang.blaze3d.platform.Transparency; - increaseMipLevel(mipLevel: number): void; - isAnimated(): boolean; - getUniqueFrames(): it.unimi.dsi.fastutil.ints.IntList; - createAnimationState(uboSlice: com.mojang.blaze3d.buffers.GpuBufferSlice, spriteUboSize: number): net.minecraft.client.renderer.texture.SpriteContents$AnimationState | null | undefined; - getAdditionalMetadata(type: net.minecraft.server.packs.metadata.MetadataSectionType): java.util.Optional; - isTransparent(frame: number, x: number, y: number): boolean; - computeTransparency(u0: number, v0: number, u1: number, v1: number): com.mojang.blaze3d.platform.Transparency; - uploadFirstFrame(destination: com.mojang.blaze3d.textures.GpuTexture, level: number): void; - } - interface Stitcher$Entry { - width(): number; - height(): number; - name(): net.minecraft.resources.Identifier; - } - interface SpriteContents$AnimationState extends java.lang.AutoCloseable { - tick(): void; - getDrawUbo(level: number): com.mojang.blaze3d.buffers.GpuBufferSlice; - needsToDraw(): boolean; - drawToAtlas(renderPass: com.mojang.blaze3d.systems.RenderPass, ubo: com.mojang.blaze3d.buffers.GpuBufferSlice): void; - } const TextureManager: { INTENTIONAL_MISSING_TEXTURE: net.minecraft.resources.Identifier; new(resourceManager: net.minecraft.server.packs.resources.ResourceManager): net.minecraft.client.renderer.texture.TextureManager; @@ -13251,12 +13391,70 @@ declare global { } interface MipmapStrategy extends kotlin.Enum, net.minecraft.util.StringRepresentable { } + interface TextureAtlasSprite extends java.lang.AutoCloseable { + atlasLocation(): net.minecraft.resources.Identifier; + contents(): net.minecraft.client.renderer.texture.SpriteContents; + getX(): number; + getY(): number; + getU0(): number; + getU1(): number; + createAnimationState(uboSlice: com.mojang.blaze3d.buffers.GpuBufferSlice, spriteUboSize: number): net.minecraft.client.renderer.texture.SpriteContents$AnimationState | null | undefined; + transparency(): com.mojang.blaze3d.platform.Transparency; + getU(offset: number): number; + getV0(): number; + getV1(): number; + getV(offset: number): number; + uploadFirstFrame(destination: com.mojang.blaze3d.textures.GpuTexture, level: number): void; + wrap(buffer: com.mojang.blaze3d.vertex.VertexConsumer): com.mojang.blaze3d.vertex.VertexConsumer; + isAnimated(): boolean; + uploadSpriteUbo(uboBuffer: java.nio.ByteBuffer, startOffset: number, maxMipLevel: number, atlasWidth: number, atlasHeight: number, spriteUboSize: number): void; + } + const SpriteContents: { + AnimationState: typeof net.minecraft.client.renderer.texture.SpriteContents$AnimationState; + UBO_SIZE: number; + new(name: net.minecraft.resources.Identifier, frameSize: net.minecraft.client.resources.metadata.animation.FrameSize, image: com.mojang.blaze3d.platform.NativeImage): net.minecraft.client.renderer.texture.SpriteContents; + new(name: net.minecraft.resources.Identifier, frameSize: net.minecraft.client.resources.metadata.animation.FrameSize, image: com.mojang.blaze3d.platform.NativeImage, animationInfo: java.util.Optional, additionalMetadata: Array>, textureInfo: java.util.Optional): net.minecraft.client.renderer.texture.SpriteContents; + } + interface SpriteContents extends java.lang.AutoCloseable, net.minecraft.client.renderer.texture.Stitcher$Entry { + transparency(): com.mojang.blaze3d.platform.Transparency; + increaseMipLevel(mipLevel: number): void; + isAnimated(): boolean; + getUniqueFrames(): it.unimi.dsi.fastutil.ints.IntList; + createAnimationState(uboSlice: com.mojang.blaze3d.buffers.GpuBufferSlice, spriteUboSize: number): net.minecraft.client.renderer.texture.SpriteContents$AnimationState | null | undefined; + getAdditionalMetadata(type: net.minecraft.server.packs.metadata.MetadataSectionType): java.util.Optional; + isTransparent(frame: number, x: number, y: number): boolean; + computeTransparency(u0: number, v0: number, u1: number, v1: number): com.mojang.blaze3d.platform.Transparency; + uploadFirstFrame(destination: com.mojang.blaze3d.textures.GpuTexture, level: number): void; + } + interface Stitcher$Entry { + width(): number; + height(): number; + name(): net.minecraft.resources.Identifier; + } + interface SpriteContents$AnimationState extends java.lang.AutoCloseable { + tick(): void; + getDrawUbo(level: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + needsToDraw(): boolean; + drawToAtlas(renderPass: com.mojang.blaze3d.systems.RenderPass, ubo: com.mojang.blaze3d.buffers.GpuBufferSlice): void; + } const SkinTextureDownloader: { new(proxy: java.net.Proxy, textureManager: net.minecraft.client.renderer.texture.TextureManager, mainThreadExecutor: java.util.concurrent.Executor): net.minecraft.client.renderer.texture.SkinTextureDownloader; } interface SkinTextureDownloader { downloadAndRegisterSkin(textureId: net.minecraft.resources.Identifier, localCopy: java.nio.file.Path, url: string, processLegacySkin: boolean): java.util.concurrent.CompletableFuture; } + const SpriteLoader$Preparations: { + new(width: number, height: number, mipLevel: number, missing: net.minecraft.client.renderer.texture.TextureAtlasSprite, regions: Map, readyForUpload: java.util.concurrent.CompletableFuture): net.minecraft.client.renderer.texture.SpriteLoader$Preparations; + } + interface SpriteLoader$Preparations extends java.lang.Record, net.fabricmc.fabric.api.client.renderer.v1.sprite.FabricPreparations { + getSprite(id: net.minecraft.resources.Identifier): net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined; + width(): number; + height(): number; + mipLevel(): number; + missing(): net.minecraft.client.renderer.texture.TextureAtlasSprite; + regions(): Map; + readyForUpload(): java.util.concurrent.CompletableFuture; + } const TextureAtlas: { LOCATION_BLOCKS: net.minecraft.resources.Identifier; LOCATION_ITEMS: net.minecraft.resources.Identifier; @@ -13278,18 +13476,6 @@ declare global { interface Dumpable { dumpContents(selfId: net.minecraft.resources.Identifier, dir: java.nio.file.Path): void; } - const SpriteLoader$Preparations: { - new(width: number, height: number, mipLevel: number, missing: net.minecraft.client.renderer.texture.TextureAtlasSprite, regions: Map, readyForUpload: java.util.concurrent.CompletableFuture): net.minecraft.client.renderer.texture.SpriteLoader$Preparations; - } - interface SpriteLoader$Preparations extends java.lang.Record, net.fabricmc.fabric.api.client.renderer.v1.sprite.FabricPreparations { - getSprite(id: net.minecraft.resources.Identifier): net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined; - width(): number; - height(): number; - mipLevel(): number; - missing(): net.minecraft.client.renderer.texture.TextureAtlasSprite; - regions(): Map; - readyForUpload(): java.util.concurrent.CompletableFuture; - } const OverlayTexture: { NO_WHITE_U: number; RED_OVERLAY_V: number; @@ -13331,6 +13517,78 @@ declare global { type(): com.mojang.serialization.MapCodec>; } } + namespace feature { + namespace phase { + const SimpleFeatureRenderPhase: { + new(): net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + } + interface SimpleFeatureRenderPhase extends net.minecraft.client.renderer.feature.phase.FeatureRenderPhase { + clear(): void; + } + interface FeatureRenderPhase { + submit(submit: Submit): void; + sortInto(output: net.minecraft.client.renderer.feature.phase.FeatureRenderPhase$Output): void; + isEmpty(): boolean; + } + interface FeatureRenderPhase$Output { + accept(submit: net.minecraft.client.renderer.feature.submit.SubmitNode, strictlyOrdered: boolean): void; + acceptFeatureGroup(featureType: net.minecraft.client.renderer.feature.FeatureRendererType, submits: Array, strictlyOrdered: boolean): void; + (submit: net.minecraft.client.renderer.feature.submit.SubmitNode, strictlyOrdered: boolean): void; + } + const TranslucentFeatureRenderPhase: { + new(): net.minecraft.client.renderer.feature.phase.TranslucentFeatureRenderPhase; + } + interface TranslucentFeatureRenderPhase extends net.minecraft.client.renderer.feature.phase.FeatureRenderPhase { + } + } + namespace submit { + interface SubmitNode { + featureType(): net.minecraft.client.renderer.feature.FeatureRendererType; + } + const TranslucentSubmit: { + computeDistanceToCameraSq(pose: org.joml.Matrix4fc): number; + computeDistanceToCameraSq(pose: org.joml.Matrix4fc, originX: number, originY: number, originZ: number): number; + } + interface TranslucentSubmit extends net.minecraft.client.renderer.feature.submit.SubmitNode { + distanceToCameraSq(): number; + } + } + const FeatureRendererType: { + new(id: number, name: string): net.minecraft.client.renderer.feature.FeatureRendererType; + create(name: string): net.minecraft.client.renderer.feature.FeatureRendererType; + } + interface FeatureRendererType extends java.lang.Record { + id(): number; + name(): string; + } + const ModelFeatureRenderer$CrumblingOverlay: { + new(progress: number, cameraPose: com.mojang.blaze3d.vertex.PoseStack$Pose): net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay; + } + interface ModelFeatureRenderer$CrumblingOverlay extends java.lang.Record { + progress(): number; + cameraPose(): com.mojang.blaze3d.vertex.PoseStack$Pose; + } + const FeatureRenderDispatcher: { + PreparedFrame: typeof net.minecraft.client.renderer.feature.FeatureRenderDispatcher$PreparedFrame; + new(renderBuffers: net.minecraft.client.renderer.RenderBuffers, modelManager: net.minecraft.client.resources.model.ModelManager, atlasManager: net.minecraft.client.resources.model.sprite.AtlasManager, font: net.minecraft.client.gui.Font, gameRenderState: net.minecraft.client.renderer.state.GameRenderState): net.minecraft.client.renderer.feature.FeatureRenderDispatcher; + } + interface FeatureRenderDispatcher extends java.lang.AutoCloseable { + prepareFrame(submitNodeStorage: net.minecraft.client.renderer.SubmitNodeStorage): net.minecraft.client.renderer.feature.FeatureRenderDispatcher$PreparedFrame; + renderAllFeatures(submitNodeStorage: net.minecraft.client.renderer.SubmitNodeStorage): void; + } + const FeatureRenderDispatcher$PreparedFrame: { + new(): net.minecraft.client.renderer.feature.FeatureRenderDispatcher$PreparedFrame; + } + interface FeatureRenderDispatcher$PreparedFrame extends java.lang.AutoCloseable { + executeSolid(): void; + executeTranslucent(): void; + executeOutline(): void; + executeTranslucentAfterTerrain(): void; + executeAlwaysOnTop(): void; + hasAnyAlwaysOnTop(): boolean; + hasAnyOutline(): boolean; + } + } namespace culling { const Frustum: { OFFSET_STEP: number; @@ -13421,48 +13679,6 @@ declare global { endSkyLight: number; slack: boolean; } - const HumanoidRenderState: { - new(): net.minecraft.client.renderer.entity.state.HumanoidRenderState; - } - interface HumanoidRenderState extends net.minecraft.client.renderer.entity.state.ArmedEntityRenderState { - swimAmount: number; - speedValue: number; - maxCrossbowChargeDuration: number; - ticksUsingItem: number; - useItemHand: net.minecraft.world.InteractionHand; - isCrouching: boolean; - isFallFlying: boolean; - isVisuallySwimming: boolean; - isPassenger: boolean; - isUsingItem: boolean; - elytraRotX: number; - elytraRotY: number; - elytraRotZ: number; - headEquipment: net.minecraft.world.item.ItemStack; - chestEquipment: net.minecraft.world.item.ItemStack; - legsEquipment: net.minecraft.world.item.ItemStack; - feetEquipment: net.minecraft.world.item.ItemStack; - } - const ArmedEntityRenderState: { - new(): net.minecraft.client.renderer.entity.state.ArmedEntityRenderState; - extractArmedEntityRenderState(entity: net.minecraft.world.entity.LivingEntity, state: net.minecraft.client.renderer.entity.state.ArmedEntityRenderState, itemModelResolver: net.minecraft.client.renderer.item.ItemModelResolver, partialTicks: number): void; - } - interface ArmedEntityRenderState extends net.minecraft.client.renderer.entity.state.LivingEntityRenderState { - mainArm: net.minecraft.world.entity.HumanoidArm; - attackArm: net.minecraft.world.entity.HumanoidArm; - rightArmPose: net.minecraft.client.model.HumanoidModel$ArmPose; - rightHandItemState: net.minecraft.client.renderer.item.ItemStackRenderState; - rightHandItemStack: net.minecraft.world.item.ItemStack; - leftArmPose: net.minecraft.client.model.HumanoidModel$ArmPose; - leftHandItemState: net.minecraft.client.renderer.item.ItemStackRenderState; - leftHandItemStack: net.minecraft.world.item.ItemStack; - swingAnimationType: net.minecraft.world.item.SwingAnimationType; - attackTime: number; - getMainHandItemState(): net.minecraft.client.renderer.item.ItemStackRenderState; - getMainHandItemStack(): net.minecraft.world.item.ItemStack; - getUseItemStackForArm(arm: net.minecraft.world.entity.HumanoidArm): net.minecraft.world.item.ItemStack; - ticksUsingItem(arm: net.minecraft.world.entity.HumanoidArm): number; - } const LivingEntityRenderState: { new(): net.minecraft.client.renderer.entity.state.LivingEntityRenderState; } @@ -13519,6 +13735,48 @@ declare global { heldOnHead: net.minecraft.client.renderer.item.ItemStackRenderState; fallFlyingScale(): number; } + const HumanoidRenderState: { + new(): net.minecraft.client.renderer.entity.state.HumanoidRenderState; + } + interface HumanoidRenderState extends net.minecraft.client.renderer.entity.state.ArmedEntityRenderState { + swimAmount: number; + speedValue: number; + maxCrossbowChargeDuration: number; + ticksUsingItem: number; + useItemHand: net.minecraft.world.InteractionHand; + isCrouching: boolean; + isFallFlying: boolean; + isVisuallySwimming: boolean; + isPassenger: boolean; + isUsingItem: boolean; + elytraRotX: number; + elytraRotY: number; + elytraRotZ: number; + headEquipment: net.minecraft.world.item.ItemStack; + chestEquipment: net.minecraft.world.item.ItemStack; + legsEquipment: net.minecraft.world.item.ItemStack; + feetEquipment: net.minecraft.world.item.ItemStack; + } + const ArmedEntityRenderState: { + new(): net.minecraft.client.renderer.entity.state.ArmedEntityRenderState; + extractArmedEntityRenderState(entity: net.minecraft.world.entity.LivingEntity, state: net.minecraft.client.renderer.entity.state.ArmedEntityRenderState, itemModelResolver: net.minecraft.client.renderer.item.ItemModelResolver, partialTicks: number): void; + } + interface ArmedEntityRenderState extends net.minecraft.client.renderer.entity.state.LivingEntityRenderState { + mainArm: net.minecraft.world.entity.HumanoidArm; + attackArm: net.minecraft.world.entity.HumanoidArm; + rightArmPose: net.minecraft.client.model.HumanoidModel$ArmPose; + rightHandItemState: net.minecraft.client.renderer.item.ItemStackRenderState; + rightHandItemStack: net.minecraft.world.item.ItemStack; + leftArmPose: net.minecraft.client.model.HumanoidModel$ArmPose; + leftHandItemState: net.minecraft.client.renderer.item.ItemStackRenderState; + leftHandItemStack: net.minecraft.world.item.ItemStack; + swingAnimationType: net.minecraft.world.item.SwingAnimationType; + attackTime: number; + getMainHandItemState(): net.minecraft.client.renderer.item.ItemStackRenderState; + getMainHandItemStack(): net.minecraft.world.item.ItemStack; + getUseItemStackForArm(arm: net.minecraft.world.entity.HumanoidArm): net.minecraft.world.item.ItemStack; + ticksUsingItem(arm: net.minecraft.world.entity.HumanoidArm): number; + } } namespace layers { const EquipmentLayerRenderer: { @@ -13541,7 +13799,7 @@ declare global { new(context: net.minecraft.client.renderer.entity.EntityRendererProvider$Context, slimSteve: boolean): net.minecraft.client.renderer.entity.player.AvatarRenderer; isPlayerUpsideDown(player: net.minecraft.world.entity.player.Player): boolean; } - interface AvatarRenderer extends net.minecraft.client.renderer.entity.LivingEntityRenderer { + interface AvatarRenderer extends net.minecraft.client.renderer.entity.LivingEntityRenderer { renderRightHand(poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, lightCoords: number, skinTexture: net.minecraft.resources.Identifier, hasSleeve: boolean): void; renderLeftHand(poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, lightCoords: number, skinTexture: net.minecraft.resources.Identifier, hasSleeve: boolean): void; } @@ -13608,99 +13866,32 @@ declare global { interface RenderLayerParent { getModel(): M; } - const ArmorModelSet: { - new(head: T, chest: T, legs: T, feet: T): net.minecraft.client.renderer.entity.ArmorModelSet; - bake(locations: net.minecraft.client.renderer.entity.ArmorModelSet, modelSet: net.minecraft.client.model.geom.EntityModelSet, factory: unknown): net.minecraft.client.renderer.entity.ArmorModelSet; - } - interface ArmorModelSet extends java.lang.Record { - get(slot: net.minecraft.world.entity.EquipmentSlot): T; - map(mapper: unknown): net.minecraft.client.renderer.entity.ArmorModelSet; - putFrom(values: net.minecraft.client.renderer.entity.ArmorModelSet, output: com.google.common.collect.ImmutableMap$Builder): void; - head(): T; - chest(): T; - legs(): T; - feet(): T; - } - } - namespace feature { - const ModelFeatureRenderer$CrumblingOverlay: { - new(progress: number, cameraPose: com.mojang.blaze3d.vertex.PoseStack$Pose): net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay; - } - interface ModelFeatureRenderer$CrumblingOverlay extends java.lang.Record { - progress(): number; - cameraPose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - } - const ParticleFeatureRenderer$ParticleBufferCache: { - new(): net.minecraft.client.renderer.feature.ParticleFeatureRenderer$ParticleBufferCache; - } - interface ParticleFeatureRenderer$ParticleBufferCache extends java.lang.AutoCloseable { - write(byteBuffer: java.nio.ByteBuffer): void; - get(): com.mojang.blaze3d.buffers.GpuBuffer; - } - const NameTagFeatureRenderer$Storage: { - new(): net.minecraft.client.renderer.feature.NameTagFeatureRenderer$Storage; - } - interface NameTagFeatureRenderer$Storage { - add(poseStack: com.mojang.blaze3d.vertex.PoseStack, nameTagAttachment: net.minecraft.world.phys.Vec3 | null | undefined, offset: number, name: net.minecraft.network.chat.Component, seeThrough: boolean, lightCoords: number, distanceToCameraSq: number, camera: net.minecraft.client.renderer.state.level.CameraRenderState): void; - clear(): void; - } - const ModelPartFeatureRenderer$Storage: { - new(): net.minecraft.client.renderer.feature.ModelPartFeatureRenderer$Storage; - } - interface ModelPartFeatureRenderer$Storage { - add(renderType: net.minecraft.client.renderer.rendertype.RenderType, submit: net.minecraft.client.renderer.SubmitNodeStorage$ModelPartSubmit): void; - clear(): void; - endFrame(): void; - } - const ModelFeatureRenderer$Storage: { - new(): net.minecraft.client.renderer.feature.ModelFeatureRenderer$Storage; - } - interface ModelFeatureRenderer$Storage { - add(renderType: net.minecraft.client.renderer.rendertype.RenderType, modelSubmit: net.minecraft.client.renderer.SubmitNodeStorage$ModelSubmit): void; - clear(): void; - endFrame(): void; - } - const CustomFeatureRenderer$Storage: { - new(): net.minecraft.client.renderer.feature.CustomFeatureRenderer$Storage; - } - interface CustomFeatureRenderer$Storage { - add(poseStack: com.mojang.blaze3d.vertex.PoseStack, renderType: net.minecraft.client.renderer.rendertype.RenderType, customGeometryRenderer: net.minecraft.client.renderer.SubmitNodeCollector$CustomGeometryRenderer): void; - clear(): void; - endFrame(): void; - } - const FeatureRenderDispatcher: { - new(submitNodeStorage: net.minecraft.client.renderer.SubmitNodeStorage, modelManager: net.minecraft.client.resources.model.ModelManager, bufferSource: net.minecraft.client.renderer.MultiBufferSource$BufferSource, atlasManager: net.minecraft.client.resources.model.sprite.AtlasManager, outlineBufferSource: net.minecraft.client.renderer.OutlineBufferSource, crumblingBufferSource: net.minecraft.client.renderer.MultiBufferSource$BufferSource, font: net.minecraft.client.gui.Font, gameRenderState: net.minecraft.client.renderer.state.GameRenderState): net.minecraft.client.renderer.feature.FeatureRenderDispatcher; - } - interface FeatureRenderDispatcher extends java.lang.AutoCloseable { - renderSolidFeatures(): void; - renderTranslucentFeatures(): void; - renderTranslucentParticles(): void; - clearSubmitNodes(): void; - renderAllFeatures(): void; - endFrame(): void; - getSubmitNodeStorage(): net.minecraft.client.renderer.SubmitNodeStorage; - } } namespace block { - namespace dispatch { - const BlockStateModel: { - SimpleCachedUnbakedRoot: typeof net.minecraft.client.renderer.block.dispatch.BlockStateModel$SimpleCachedUnbakedRoot; + namespace model { + const BlockDisplayContext: { + create(): net.minecraft.client.renderer.block.model.BlockDisplayContext; } - interface BlockStateModel extends net.fabricmc.fabric.api.client.renderer.v1.model.FabricBlockStateModel { - collectParts(random: net.minecraft.util.RandomSource, output: Array): void; - particleMaterial(): net.minecraft.client.resources.model.sprite.Material$Baked; - materialFlags(): number; - hasMaterialFlag(flag: number): boolean; + interface BlockDisplayContext { } - const BlockStateModel$SimpleCachedUnbakedRoot: { - new(contents: net.minecraft.client.renderer.block.dispatch.BlockStateModel$Unbaked): net.minecraft.client.renderer.block.dispatch.BlockStateModel$SimpleCachedUnbakedRoot; + const BlockModel: { + BakingContext: typeof net.minecraft.client.renderer.block.model.BlockModel$BakingContext; } - interface BlockStateModel$SimpleCachedUnbakedRoot extends net.minecraft.client.renderer.block.dispatch.BlockStateModel$UnbakedRoot { + interface BlockModel { + update(output: net.minecraft.client.renderer.block.BlockModelRenderState, blockState: net.minecraft.world.level.block.state.BlockState, displayContext: net.minecraft.client.renderer.block.model.BlockDisplayContext, seed: number): void; } - interface BlockStateModel$UnbakedRoot extends net.minecraft.client.resources.model.ResolvableModel { - bake(blockState: net.minecraft.world.level.block.state.BlockState, modelBakery: net.minecraft.client.resources.model.ModelBaker): net.minecraft.client.renderer.block.dispatch.BlockStateModel; - visualEqualityGroup(blockState: net.minecraft.world.level.block.state.BlockState): any; + const BlockModel$BakingContext: { + new(entityModelSet: net.minecraft.client.model.geom.EntityModelSet, sprites: net.minecraft.client.resources.model.sprite.SpriteGetter, playerSkinRenderCache: net.minecraft.client.renderer.PlayerSkinRenderCache, modelGetter: unknown, missingBlockModel: net.minecraft.client.renderer.block.model.BlockModel): net.minecraft.client.renderer.block.model.BlockModel$BakingContext; + } + interface BlockModel$BakingContext extends java.lang.Record, net.minecraft.client.renderer.special.SpecialModelRenderer$BakingContext { + modelGetter(): unknown; + missingBlockModel(): net.minecraft.client.renderer.block.model.BlockModel; + } + interface BlockModel$Unbaked { + bake(context: net.minecraft.client.renderer.block.model.BlockModel$BakingContext, transformation: org.joml.Matrix4fc): net.minecraft.client.renderer.block.model.BlockModel; } + } + namespace dispatch { const ModelState: { NO_TRANSFORM: org.joml.Matrix4fc; } @@ -13718,6 +13909,24 @@ declare global { interface BlockStateModelPart$Unbaked extends net.minecraft.client.resources.model.ResolvableModel { bake(modelBakery: net.minecraft.client.resources.model.ModelBaker): net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; } + const BlockStateModel: { + SimpleCachedUnbakedRoot: typeof net.minecraft.client.renderer.block.dispatch.BlockStateModel$SimpleCachedUnbakedRoot; + } + interface BlockStateModel extends net.fabricmc.fabric.api.client.renderer.v1.model.FabricBlockStateModel { + collectParts(random: net.minecraft.util.RandomSource, output: Array): void; + particleMaterial(): net.minecraft.client.resources.model.sprite.Material$Baked; + materialFlags(): number; + hasMaterialFlag(flag: number): boolean; + } + const BlockStateModel$SimpleCachedUnbakedRoot: { + new(contents: net.minecraft.client.renderer.block.dispatch.BlockStateModel$Unbaked): net.minecraft.client.renderer.block.dispatch.BlockStateModel$SimpleCachedUnbakedRoot; + } + interface BlockStateModel$SimpleCachedUnbakedRoot extends net.minecraft.client.renderer.block.dispatch.BlockStateModel$UnbakedRoot { + } + interface BlockStateModel$UnbakedRoot extends net.minecraft.client.resources.model.ResolvableModel { + bake(blockState: net.minecraft.world.level.block.state.BlockState, modelBakery: net.minecraft.client.resources.model.ModelBaker): net.minecraft.client.renderer.block.dispatch.BlockStateModel; + visualEqualityGroup(blockState: net.minecraft.world.level.block.state.BlockState): any; + } const BlockStateModel$Unbaked: { ELEMENT_CODEC: com.mojang.serialization.Codec>; HARDCODED_WEIGHTED_CODEC: com.mojang.serialization.Codec; @@ -13728,29 +13937,6 @@ declare global { asRoot(): net.minecraft.client.renderer.block.dispatch.BlockStateModel$UnbakedRoot; } } - namespace model { - const BlockDisplayContext: { - create(): net.minecraft.client.renderer.block.model.BlockDisplayContext; - } - interface BlockDisplayContext { - } - const BlockModel: { - BakingContext: typeof net.minecraft.client.renderer.block.model.BlockModel$BakingContext; - } - interface BlockModel { - update(output: net.minecraft.client.renderer.block.BlockModelRenderState, blockState: net.minecraft.world.level.block.state.BlockState, displayContext: net.minecraft.client.renderer.block.model.BlockDisplayContext, seed: number): void; - } - const BlockModel$BakingContext: { - new(entityModelSet: net.minecraft.client.model.geom.EntityModelSet, sprites: net.minecraft.client.resources.model.sprite.SpriteGetter, playerSkinRenderCache: net.minecraft.client.renderer.PlayerSkinRenderCache, modelGetter: unknown, missingBlockModel: net.minecraft.client.renderer.block.model.BlockModel): net.minecraft.client.renderer.block.model.BlockModel$BakingContext; - } - interface BlockModel$BakingContext extends java.lang.Record, net.minecraft.client.renderer.special.SpecialModelRenderer$BakingContext { - modelGetter(): unknown; - missingBlockModel(): net.minecraft.client.renderer.block.model.BlockModel; - } - interface BlockModel$Unbaked { - bake(context: net.minecraft.client.renderer.block.model.BlockModel$BakingContext, transformation: org.joml.Matrix4fc): net.minecraft.client.renderer.block.model.BlockModel; - } - } const MovingBlockRenderState: { new(): net.minecraft.client.renderer.block.MovingBlockRenderState; } @@ -13769,6 +13955,29 @@ declare global { cardinalLighting(): net.minecraft.world.level.CardinalLighting; getBlockTint(pos: net.minecraft.core.BlockPos, color: net.minecraft.world.level.ColorResolver): number; } + const BlockModelResolver: { + new(modelManager: net.minecraft.client.resources.model.ModelManager): net.minecraft.client.renderer.block.BlockModelResolver; + } + interface BlockModelResolver { + update(renderState: net.minecraft.client.renderer.block.BlockModelRenderState, blockState: net.minecraft.world.level.block.state.BlockState, displayContext: net.minecraft.client.renderer.block.model.BlockDisplayContext): void; + updateForItemFrame(renderState: net.minecraft.client.renderer.block.BlockModelRenderState, isGlowing: boolean, map: boolean): void; + } + const BlockModelRenderState: { + EMPTY_TINTS: Array; + new(): net.minecraft.client.renderer.block.BlockModelRenderState; + } + interface BlockModelRenderState extends net.fabricmc.fabric.api.client.renderer.v1.render.FabricBlockModelRenderState, net.fabricmc.fabric.api.client.rendering.v1.FabricRenderState { + blockLightCoords: number; + tintLayers(): it.unimi.dsi.fastutil.ints.IntList; + clear(): void; + setupSpecialModel(renderer: net.minecraft.client.renderer.special.SpecialModelRenderer, transformation: org.joml.Matrix4fc): void; + setupModel(transformation: org.joml.Matrix4fc, hasTranslucency: boolean): Array; + submit(poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, externalLightCoords: number, overlayCoords: number, outlineColor: number): void; + submitOnlyOutline(poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, lightCoords: number, overlayCoords: number, outlineColor: number): void; + submitWithZOffset(poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, lightCoords: number, overlayCoords: number, outlineColor: number): void; + isEmpty(): boolean; + scratchRandomSource(seed: number): net.minecraft.util.RandomSource; + } const BlockStateModelSet: { new(modelByState: Map, missingModel: net.minecraft.client.renderer.block.dispatch.BlockStateModel): net.minecraft.client.renderer.block.BlockStateModelSet; } @@ -13777,6 +13986,12 @@ declare global { get(state: net.minecraft.world.level.block.state.BlockState): net.minecraft.client.renderer.block.dispatch.BlockStateModel; getParticleMaterial(blockState: net.minecraft.world.level.block.state.BlockState): net.minecraft.client.resources.model.sprite.Material$Baked; } + const BlockModelSet: { + new(fallback: net.minecraft.client.renderer.block.BlockStateModelSet, blockModelByState: Map, blockColors: net.minecraft.client.color.block.BlockColors): net.minecraft.client.renderer.block.BlockModelSet; + } + interface BlockModelSet { + get(blockState: net.minecraft.world.level.block.state.BlockState): net.minecraft.client.renderer.block.model.BlockModel; + } const FluidStateModelSet: { new(modelByFluid: Map, missingModel: net.minecraft.client.renderer.block.FluidModel): net.minecraft.client.renderer.block.FluidStateModelSet; bake(materials: net.minecraft.client.resources.model.sprite.MaterialBaker): Map; @@ -13805,33 +14020,44 @@ declare global { overlayMaterial(): net.minecraft.client.resources.model.sprite.Material | null | undefined; tintSource(): net.minecraft.client.color.block.BlockTintSource | null | undefined; } - const BlockModelResolver: { - new(modelManager: net.minecraft.client.resources.model.ModelManager): net.minecraft.client.renderer.block.BlockModelResolver; - } - interface BlockModelResolver { - update(renderState: net.minecraft.client.renderer.block.BlockModelRenderState, blockState: net.minecraft.world.level.block.state.BlockState, displayContext: net.minecraft.client.renderer.block.model.BlockDisplayContext): void; - updateForItemFrame(renderState: net.minecraft.client.renderer.block.BlockModelRenderState, isGlowing: boolean, map: boolean): void; - } - const BlockModelRenderState: { - EMPTY_TINTS: Array; - new(): net.minecraft.client.renderer.block.BlockModelRenderState; - } - interface BlockModelRenderState extends net.fabricmc.fabric.api.client.renderer.v1.render.FabricBlockModelRenderState, net.fabricmc.fabric.api.client.rendering.v1.FabricRenderState { - tintLayers(): it.unimi.dsi.fastutil.ints.IntList; - clear(): void; - setupSpecialModel(renderer: net.minecraft.client.renderer.special.SpecialModelRenderer, transformation: org.joml.Matrix4fc): void; - setupModel(transformation: org.joml.Matrix4fc, hasTranslucency: boolean): Array; - submit(poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, lightCoords: number, overlayCoords: number, outlineColor: number): void; - submitOnlyOutline(poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, lightCoords: number, overlayCoords: number, outlineColor: number): void; - submitWithZOffset(poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, lightCoords: number, overlayCoords: number, outlineColor: number): void; - isEmpty(): boolean; - scratchRandomSource(seed: number): net.minecraft.util.RandomSource; - } - const BlockModelSet: { - new(fallback: net.minecraft.client.renderer.block.BlockStateModelSet, blockModelByState: Map, blockColors: net.minecraft.client.color.block.BlockColors): net.minecraft.client.renderer.block.BlockModelSet; - } - interface BlockModelSet { - get(blockState: net.minecraft.world.level.block.state.BlockState): net.minecraft.client.renderer.block.model.BlockModel; + } + namespace gizmos { + const DrawableGizmoPrimitives$Group: { + new(opaque: boolean, lines: Array, quads: Array, triangleFans: Array, texts: Array, points: Array): net.minecraft.client.renderer.gizmos.DrawableGizmoPrimitives$Group; + } + interface DrawableGizmoPrimitives$Group extends java.lang.Record { + opaque(): boolean; + lines(): Array; + quads(): Array; + triangleFans(): Array; + texts(): Array; + points(): Array; + } + } + namespace extract { + const LevelExtractor: { + new(minecraft: net.minecraft.client.Minecraft, levelRenderState: net.minecraft.client.renderer.state.level.LevelRenderState, levelRenderer: net.minecraft.client.renderer.LevelRenderer): net.minecraft.client.renderer.extract.LevelExtractor; + } + interface LevelExtractor extends net.minecraft.server.packs.resources.ResourceManagerReloadListener { + debugRenderer: net.minecraft.client.renderer.debug.DebugRenderer; + gameTestBlockHighlightRenderer: net.minecraft.client.renderer.debug.GameTestBlockHighlightRenderer; + lastViewDistance(): number; + extract(deltaTracker: net.minecraft.client.DeltaTracker, camera: net.minecraft.client.Camera, deltaPartialTick: number): void; + isEntityVisible(entity: net.minecraft.world.entity.Entity, frustum: net.minecraft.client.renderer.culling.Frustum, camX: number, camY: number, camZ: number): boolean; + setLevel(level: net.minecraft.client.multiplayer.ClientLevel | null | undefined): void; + allChanged(): void; + resetSampler(): void; + blockChanged(pos: net.minecraft.core.BlockPos, updateFlags: number): void; + setBlockDirty(pos: net.minecraft.core.BlockPos, oldState: net.minecraft.world.level.block.state.BlockState, newState: net.minecraft.world.level.block.state.BlockState): void; + setBlocksDirty(x0: number, y0: number, z0: number, x1: number, y1: number, z1: number): void; + setSectionDirtyWithNeighbors(sectionX: number, sectionY: number, sectionZ: number): void; + setSectionRangeDirty(minSectionX: number, minSectionY: number, minSectionZ: number, maxSectionX: number, maxSectionY: number, maxSectionZ: number): void; + setSectionDirty(sectionX: number, sectionY: number, sectionZ: number): void; + collectPerFrameMainThreadGizmos(): net.minecraft.gizmos.Gizmos$TemporaryCollection; + countRenderedSections(): number; + sectionStatistics(): string | null | undefined; + entityStatistics(): string | null | undefined; + totalSections(): number; } } namespace debug { @@ -13863,7 +14089,7 @@ declare global { getRenderer(blockEntity: E): net.minecraft.client.renderer.blockentity.BlockEntityRenderer | null | undefined; getRenderer(state: S): net.minecraft.client.renderer.blockentity.BlockEntityRenderer | null | undefined; prepare(cameraPos: net.minecraft.world.phys.Vec3): void; - tryExtractRenderState(blockEntity: E, partialTicks: number, breakProgress: net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined): S; + tryExtractRenderState(blockEntity: E, partialTicks: number, breakProgress: net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined, isGloballyRendered: boolean): S; submit(state: S, poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, camera: net.minecraft.client.renderer.state.level.CameraRenderState): void; } interface BlockEntityRenderer { @@ -13896,12 +14122,23 @@ declare global { define(key: string): net.minecraft.client.renderer.ShaderDefines$Builder; build(): net.minecraft.client.renderer.ShaderDefines; } + const StagedVertexBuffer$ExecuteInfo: { + new(vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexType: com.mojang.blaze3d.IndexType, baseVertex: number, firstIndex: number, indexCount: number): net.minecraft.client.renderer.StagedVertexBuffer$ExecuteInfo; + } + interface StagedVertexBuffer$ExecuteInfo extends java.lang.Record { + vertexBuffer(): com.mojang.blaze3d.buffers.GpuBuffer; + indexBuffer(): com.mojang.blaze3d.buffers.GpuBuffer; + indexType(): com.mojang.blaze3d.IndexType; + baseVertex(): number; + firstIndex(): number; + indexCount(): number; + } interface SubmitNodeCollector extends net.minecraft.client.renderer.OrderedSubmitNodeCollector { order(order: number): net.minecraft.client.renderer.OrderedSubmitNodeCollector; } - interface OrderedSubmitNodeCollector extends net.fabricmc.fabric.api.client.renderer.v1.render.FabricOrderedSubmitNodeCollector { + interface OrderedSubmitNodeCollector extends net.fabricmc.fabric.api.client.renderer.v1.render.FabricOrderedSubmitNodeCollector, net.fabricmc.fabric.api.client.rendering.v1.FabricOrderedSubmitNodeCollector { submitShadow(poseStack: com.mojang.blaze3d.vertex.PoseStack, radius: number, pieces: Array): void; - submitNameTag(poseStack: com.mojang.blaze3d.vertex.PoseStack, nameTagAttachment: net.minecraft.world.phys.Vec3 | null | undefined, offset: number, name: net.minecraft.network.chat.Component, seeThrough: boolean, lightCoords: number, distanceToCameraSq: number, camera: net.minecraft.client.renderer.state.level.CameraRenderState): void; + submitNameTag(poseStack: com.mojang.blaze3d.vertex.PoseStack, nameTagAttachment: net.minecraft.world.phys.Vec3 | null | undefined, offset: number, name: net.minecraft.network.chat.Component, seeThrough: boolean, lightCoords: number, camera: net.minecraft.client.renderer.state.level.CameraRenderState): void; submitText(poseStack: com.mojang.blaze3d.vertex.PoseStack, x: number, y: number, string: net.minecraft.util.FormattedCharSequence, dropShadow: boolean, displayMode: net.minecraft.client.gui.Font$DisplayMode, lightCoords: number, color: number, backgroundColor: number, outlineColor: number): void; submitFlame(poseStack: com.mojang.blaze3d.vertex.PoseStack, renderState: net.minecraft.client.renderer.entity.state.EntityRenderState, rotation: org.joml.Quaternionf): void; submitLeash(poseStack: com.mojang.blaze3d.vertex.PoseStack, leashState: net.minecraft.client.renderer.entity.state.EntityRenderState$LeashState): void; @@ -13911,36 +14148,40 @@ declare global { submitModel(model: net.minecraft.client.model.Model, state: S, poseStack: com.mojang.blaze3d.vertex.PoseStack, lightCoords: number, overlayCoords: number, tintedColor: number, sprite: net.minecraft.client.resources.model.sprite.SpriteId, sprites: net.minecraft.client.resources.model.sprite.SpriteGetter, outlineColor: number, crumblingOverlay: net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined): void; submitModelPart(modelPart: net.minecraft.client.model.geom.ModelPart, poseStack: com.mojang.blaze3d.vertex.PoseStack, renderType: net.minecraft.client.renderer.rendertype.RenderType, lightCoords: number, overlayCoords: number, sprite: net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined): void; submitModelPart(modelPart: net.minecraft.client.model.geom.ModelPart, poseStack: com.mojang.blaze3d.vertex.PoseStack, renderType: net.minecraft.client.renderer.rendertype.RenderType, lightCoords: number, overlayCoords: number, sprite: net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined, tintedColor: number, crumblingOverlay: net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined): void; - submitModelPart(modelPart: net.minecraft.client.model.geom.ModelPart, poseStack: com.mojang.blaze3d.vertex.PoseStack, renderType: net.minecraft.client.renderer.rendertype.RenderType, lightCoords: number, overlayCoords: number, sprite: net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined, sheeted: boolean, hasFoil: boolean): void; - submitModelPart(modelPart: net.minecraft.client.model.geom.ModelPart, poseStack: com.mojang.blaze3d.vertex.PoseStack, renderType: net.minecraft.client.renderer.rendertype.RenderType, lightCoords: number, overlayCoords: number, sprite: net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined, sheeted: boolean, hasFoil: boolean, tintedColor: number, crumblingOverlay: net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined, outlineColor: number): void; - submitMovingBlock(poseStack: com.mojang.blaze3d.vertex.PoseStack, movingBlockRenderState: net.minecraft.client.renderer.block.MovingBlockRenderState): void; + submitModelPart(modelPart: net.minecraft.client.model.geom.ModelPart, poseStack: com.mojang.blaze3d.vertex.PoseStack, renderType: net.minecraft.client.renderer.rendertype.RenderType, lightCoords: number, overlayCoords: number, sprite: net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined, tintedColor: number, crumblingOverlay: net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined, outlineColor: number): void; + submitMovingBlock(poseStack: com.mojang.blaze3d.vertex.PoseStack, movingBlockRenderState: net.minecraft.client.renderer.block.MovingBlockRenderState, outlineColor: number): void; submitBlockModel(poseStack: com.mojang.blaze3d.vertex.PoseStack, renderType: net.minecraft.client.renderer.rendertype.RenderType, parts: Array, tintLayers: Array, lightCoords: number, overlayCoords: number, outlineColor: number): void; - submitBreakingBlockModel(poseStack: com.mojang.blaze3d.vertex.PoseStack, model: net.minecraft.client.renderer.block.dispatch.BlockStateModel, seed: number, progress: number): void; + submitBreakingBlockModel(poseStack: com.mojang.blaze3d.vertex.PoseStack, parts: Array, progress: number): void; + submitShapeOutline(poseStack: com.mojang.blaze3d.vertex.PoseStack, shape: net.minecraft.world.phys.shapes.VoxelShape, renderType: net.minecraft.client.renderer.rendertype.RenderType, color: number, width: number, afterTerrain: boolean): void; submitItem(poseStack: com.mojang.blaze3d.vertex.PoseStack, displayContext: net.minecraft.world.item.ItemDisplayContext, lightCoords: number, overlayCoords: number, outlineColor: number, tintLayers: Array, quads: Array, foilType: net.minecraft.client.renderer.item.ItemStackRenderState$FoilType): void; submitCustomGeometry(poseStack: com.mojang.blaze3d.vertex.PoseStack, renderType: net.minecraft.client.renderer.rendertype.RenderType, customGeometryRenderer: net.minecraft.client.renderer.SubmitNodeCollector$CustomGeometryRenderer): void; - submitParticleGroup(particleGroupRenderer: net.minecraft.client.renderer.SubmitNodeCollector$ParticleGroupRenderer): void; - } - const MultiBufferSource: { - BufferSource: typeof net.minecraft.client.renderer.MultiBufferSource$BufferSource; - immediate(buffer: com.mojang.blaze3d.vertex.ByteBufferBuilder): net.minecraft.client.renderer.MultiBufferSource$BufferSource; - immediateWithBuffers(fixedBuffers: java.util.SequencedMap, sharedBuffer: com.mojang.blaze3d.vertex.ByteBufferBuilder): net.minecraft.client.renderer.MultiBufferSource$BufferSource; + submitQuadParticleGroup(particles: net.minecraft.client.renderer.state.level.QuadParticleRenderState): void; + submitGizmoPrimitives(group: net.minecraft.client.renderer.gizmos.DrawableGizmoPrimitives$Group, camera: net.minecraft.client.renderer.state.level.CameraRenderState, onTop: boolean): void; } - interface MultiBufferSource { - getBuffer(renderType: net.minecraft.client.renderer.rendertype.RenderType): com.mojang.blaze3d.vertex.VertexConsumer; - } - interface MultiBufferSource$BufferSource extends net.minecraft.client.renderer.MultiBufferSource { - endLastBatch(): void; - endBatch(): void; - endBatch(type: net.minecraft.client.renderer.rendertype.RenderType): void; + const SubmitNodeCollection: { + new(): net.minecraft.client.renderer.SubmitNodeCollection; + } + interface SubmitNodeCollection extends net.minecraft.client.renderer.OrderedSubmitNodeCollector { + solid: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + shadows: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + nameTags: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + seeThroughNameTags: net.minecraft.client.renderer.feature.phase.TranslucentFeatureRenderPhase; + texts: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + shapeOutlines: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + translucentBlocksAndItems: net.minecraft.client.renderer.feature.phase.TranslucentFeatureRenderPhase; + translucentModels: net.minecraft.client.renderer.feature.phase.TranslucentFeatureRenderPhase; + translucentCustomGeometry: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + gizmos: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + breakingOverlay: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + waterMask: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + afterTerrain: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + alwaysOnTop: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + outline: net.minecraft.client.renderer.feature.phase.SimpleFeatureRenderPhase; + allPhases(): Array>; } interface SubmitNodeCollector$CustomGeometryRenderer { render(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, buffer: com.mojang.blaze3d.vertex.VertexConsumer): void; } - interface SubmitNodeCollector$ParticleGroupRenderer { - isEmpty(): boolean; - prepare(buffer: net.minecraft.client.renderer.feature.ParticleFeatureRenderer$ParticleBufferCache, translucent: boolean): net.minecraft.client.renderer.state.level.QuadParticleRenderState$PreparedBuffers | null | undefined; - render(buffers: net.minecraft.client.renderer.state.level.QuadParticleRenderState$PreparedBuffers, bufferCache: net.minecraft.client.renderer.feature.ParticleFeatureRenderer$ParticleBufferCache, renderPass: com.mojang.blaze3d.systems.RenderPass, textureManager: net.minecraft.client.renderer.texture.TextureManager): void; - } const PlayerSkinRenderCache: { RenderInfo: typeof net.minecraft.client.renderer.PlayerSkinRenderCache$RenderInfo; DEFAULT_PLAYER_SKIN_RENDER_TYPE: net.minecraft.client.renderer.rendertype.RenderType; @@ -13973,94 +14214,40 @@ declare global { getIntensity(partialTicks: number): number; flashStartedThisTick(): boolean; } - const RenderBuffers: { - new(maxSectionBuilders: number): net.minecraft.client.renderer.RenderBuffers; - } - interface RenderBuffers { - fixedBufferPack(): net.minecraft.client.renderer.SectionBufferBuilderPack; - sectionBufferPool(): net.minecraft.client.renderer.SectionBufferBuilderPool; - bufferSource(): net.minecraft.client.renderer.MultiBufferSource$BufferSource; - crumblingBufferSource(): net.minecraft.client.renderer.MultiBufferSource$BufferSource; - outlineBufferSource(): net.minecraft.client.renderer.OutlineBufferSource; - } - const SectionBufferBuilderPack: { - TOTAL_BUFFERS_SIZE: number; - new(): net.minecraft.client.renderer.SectionBufferBuilderPack; - } - interface SectionBufferBuilderPack extends java.lang.AutoCloseable { - buffer(layer: net.minecraft.client.renderer.chunk.ChunkSectionLayer): com.mojang.blaze3d.vertex.ByteBufferBuilder; - clearAll(): void; - discardAll(): void; - } - const SectionBufferBuilderPool: { - allocate(maxWorkers: number): net.minecraft.client.renderer.SectionBufferBuilderPool; - } - interface SectionBufferBuilderPool { - acquire(): net.minecraft.client.renderer.SectionBufferBuilderPack | null | undefined; - release(buffer: net.minecraft.client.renderer.SectionBufferBuilderPack): void; - isEmpty(): boolean; - getFreeBufferCount(): number; - } - const OutlineBufferSource: { - new(): net.minecraft.client.renderer.OutlineBufferSource; - } - interface OutlineBufferSource extends net.minecraft.client.renderer.MultiBufferSource { - setColor(color: number): void; - endOutlineBatch(): void; - } const LevelRenderer: { - SECTION_SIZE: number; - HALF_SECTION_SIZE: number; - NEARBY_SECTION_DISTANCE_IN_BLOCKS: number; - new(minecraft: net.minecraft.client.Minecraft, entityRenderDispatcher: net.minecraft.client.renderer.entity.EntityRenderDispatcher, blockEntityRenderDispatcher: net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher, renderBuffers: net.minecraft.client.renderer.RenderBuffers, gameRenderState: net.minecraft.client.renderer.state.GameRenderState, featureRenderDispatcher: net.minecraft.client.renderer.feature.FeatureRenderDispatcher): net.minecraft.client.renderer.LevelRenderer; - offsetFrustum(frustum: net.minecraft.client.renderer.culling.Frustum): net.minecraft.client.renderer.culling.Frustum; - getLightCoords(level: net.minecraft.world.level.BlockAndLightGetter, pos: net.minecraft.core.BlockPos): number; - getLightCoords(brightnessGetter: net.minecraft.client.renderer.LevelRenderer$BrightnessGetter, level: net.minecraft.world.level.BlockAndLightGetter, state: net.minecraft.world.level.block.state.BlockState, pos: net.minecraft.core.BlockPos): number; - } - interface LevelRenderer extends net.minecraft.server.packs.resources.ResourceManagerReloadListener, java.lang.AutoCloseable { - debugRenderer: net.minecraft.client.renderer.debug.DebugRenderer; - gameTestBlockHighlightRenderer: net.minecraft.client.renderer.debug.GameTestBlockHighlightRenderer; + new(entityRenderDispatcher: net.minecraft.client.renderer.entity.EntityRenderDispatcher, blockEntityRenderDispatcher: net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher, modelManager: net.minecraft.client.resources.model.ModelManager, textureManager: net.minecraft.client.renderer.texture.TextureManager, atlasManager: net.minecraft.client.resources.model.sprite.AtlasManager, shaderManager: net.minecraft.client.renderer.ShaderManager, gameRenderer: net.minecraft.client.renderer.GameRenderer, width: number, height: number): net.minecraft.client.renderer.LevelRenderer; + } + interface LevelRenderer extends java.lang.AutoCloseable { + entityRenderDispatcher(): net.minecraft.client.renderer.entity.EntityRenderDispatcher; + blockEntityRenderDispatcher(): net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; + skyRenderer(): net.minecraft.client.renderer.SkyRenderer | null | undefined; + cloudRenderer(): net.minecraft.client.renderer.CloudRenderer; + worldBorderRenderer(): net.minecraft.client.renderer.WorldBorderRenderer; + weatherEffectRenderer(): net.minecraft.client.renderer.WeatherEffectRenderer; + sectionOcclusionGraph(): net.minecraft.client.renderer.SectionOcclusionGraph; + visibleSections(): it.unimi.dsi.fastutil.objects.ObjectArrayList; + nearbyVisibleSections(): it.unimi.dsi.fastutil.objects.ObjectArrayList; + viewArea(): net.minecraft.client.renderer.ViewArea | null | undefined; entityOutlineTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; - initOutline(): void; - doEntityOutline(): void; - setLevel(level: net.minecraft.client.multiplayer.ClientLevel | null | undefined): void; - allChanged(): void; - resize(width: number, height: number): void; - getSectionStatistics(): string | null | undefined; - getSectionRenderDispatcher(): net.minecraft.client.renderer.chunk.SectionRenderDispatcher | null | undefined; - getTotalSections(): number; - getLastViewDistance(): number; - countRenderedSections(): number; - resetSampler(): void; - getEntityStatistics(): string | null | undefined; - addRecentlyCompiledSection(section: net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection): void; - update(camera: net.minecraft.client.Camera): void; - renderLevel(resourceAllocator: com.mojang.blaze3d.resource.GraphicsResourceAllocator, deltaTracker: net.minecraft.client.DeltaTracker, renderOutline: boolean, cameraState: net.minecraft.client.renderer.state.level.CameraRenderState, modelViewMatrix: org.joml.Matrix4fc, terrainFog: com.mojang.blaze3d.buffers.GpuBufferSlice, fogColor: org.joml.Vector4f, shouldRenderSky: boolean, chunkSectionsToRender: net.minecraft.client.renderer.chunk.ChunkSectionsToRender): void; - extractLevel(deltaTracker: net.minecraft.client.DeltaTracker, camera: net.minecraft.client.Camera, deltaPartialTick: number): void; + sectionRenderDispatcher(): net.minecraft.client.renderer.chunk.SectionRenderDispatcher | null | undefined; + render(resourceAllocator: com.mojang.blaze3d.resource.GraphicsResourceAllocator, deltaTracker: net.minecraft.client.DeltaTracker, renderOutline: boolean, cameraState: net.minecraft.client.renderer.state.level.CameraRenderState, modelViewMatrix: org.joml.Matrix4fc, terrainFog: com.mojang.blaze3d.buffers.GpuBufferSlice, fogColor: org.joml.Vector4f, shouldRenderSky: boolean): void; prepareChunkRenders(modelViewMatrix: org.joml.Matrix4fc): net.minecraft.client.renderer.chunk.ChunkSectionsToRender; + resize(width: number, height: number): void; endFrame(): void; - tick(camera: net.minecraft.client.Camera): void; - blockChanged(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos, old: net.minecraft.world.level.block.state.BlockState, current: net.minecraft.world.level.block.state.BlockState, updateFlags: number): void; - setBlockDirty(pos: net.minecraft.core.BlockPos, oldState: net.minecraft.world.level.block.state.BlockState, newState: net.minecraft.world.level.block.state.BlockState): void; - setBlocksDirty(x0: number, y0: number, z0: number, x1: number, y1: number, z1: number): void; - setSectionDirtyWithNeighbors(sectionX: number, sectionY: number, sectionZ: number): void; - setSectionRangeDirty(minSectionX: number, minSectionY: number, minSectionZ: number, maxSectionX: number, maxSectionY: number, maxSectionZ: number): void; - setSectionDirty(sectionX: number, sectionY: number, sectionZ: number): void; - onSectionBecomingNonEmpty(sectionNode: number): void; - destroyBlockProgress(id: number, pos: net.minecraft.core.BlockPos, progress: number): void; + doEntityOutline(): void; + invalidateCompiledGeometry(level: net.minecraft.client.multiplayer.ClientLevel, options: net.minecraft.client.Options, camera: net.minecraft.client.Camera, blockColors: net.minecraft.client.color.block.BlockColors): void; + clearVisibleSections(): void; + resetLevelRenderData(): void; hasRenderedAllSections(): boolean; - onChunkReadyToRender(pos: net.minecraft.world.level.ChunkPos): void; - needsUpdate(): void; isSectionCompiledAndVisible(blockPos: net.minecraft.core.BlockPos): boolean; - getTranslucentTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; - getItemEntityTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; - getParticlesTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; - getWeatherTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; - getCloudsTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; - getVisibleSections(): it.unimi.dsi.fastutil.objects.ObjectArrayList; - getSectionOcclusionGraph(): net.minecraft.client.renderer.SectionOcclusionGraph; - getCloudRenderer(): net.minecraft.client.renderer.CloudRenderer; - collectPerFrameGizmos(): net.minecraft.gizmos.Gizmos$TemporaryCollection; + translucentTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; + itemEntityTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; + particlesTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; + weatherTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; + cloudsTarget(): com.mojang.blaze3d.pipeline.RenderTarget | null | undefined; + expectedChunks(): it.unimi.dsi.fastutil.longs.LongCollection; + collectPerFrameRenderThreadGizmos(): net.minecraft.gizmos.Gizmos$TemporaryCollection; + addMainThreadGizmos(mainThreadGizmos: Array): void; } const MapRenderer: { WIDTH: number; @@ -14076,56 +14263,21 @@ declare global { } interface ItemInHandRenderer { renderItem(mob: net.minecraft.world.entity.LivingEntity, itemStack: net.minecraft.world.item.ItemStack, type: net.minecraft.world.item.ItemDisplayContext, poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, lightCoords: number): void; - renderHandsWithItems(frameInterp: number, poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, player: net.minecraft.client.player.LocalPlayer, lightCoords: number): void; + submitHandsWithItems(frameInterp: number, poseStack: com.mojang.blaze3d.vertex.PoseStack, submitNodeCollector: net.minecraft.client.renderer.SubmitNodeCollector, player: net.minecraft.client.player.LocalPlayer, lightCoords: number): void; tick(): void; itemUsed(hand: net.minecraft.world.InteractionHand): void; } - const SectionOcclusionGraph: { - Node: typeof net.minecraft.client.renderer.SectionOcclusionGraph$Node; - new(): net.minecraft.client.renderer.SectionOcclusionGraph; - } - interface SectionOcclusionGraph { - waitAndReset(viewArea: net.minecraft.client.renderer.ViewArea | null | undefined): void; - invalidate(): void; - addSectionsInFrustum(frustum: net.minecraft.client.renderer.culling.Frustum, visibleSections: Array, nearbyVisibleSection: Array): void; - consumeFrustumUpdate(): boolean; - onChunkReadyToRender(pos: net.minecraft.world.level.ChunkPos): void; - schedulePropagationFrom(section: net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection): void; - update(smartCull: boolean, camera: net.minecraft.client.Camera, frustum: net.minecraft.client.renderer.culling.Frustum, visibleSections: Array, loadedEmptySections: it.unimi.dsi.fastutil.longs.LongOpenHashSet): void; - getNode(section: net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection): net.minecraft.client.renderer.SectionOcclusionGraph$Node | null | undefined; - getOctree(): net.minecraft.client.renderer.Octree; - } - const ViewArea: { - new(sectionRenderDispatcher: net.minecraft.client.renderer.chunk.SectionRenderDispatcher, level: net.minecraft.world.level.Level, renderDistance: number, levelRenderer: net.minecraft.client.renderer.LevelRenderer): net.minecraft.client.renderer.ViewArea; - } - interface ViewArea { - sections: Array; - releaseAllBuffers(): void; - getViewDistance(): number; - getLevelHeightAccessor(): net.minecraft.world.level.LevelHeightAccessor; - repositionCamera(cameraSectionPos: net.minecraft.core.SectionPos): void; - getCameraSectionPos(): net.minecraft.core.SectionPos; - setDirty(sectionX: number, sectionY: number, sectionZ: number, playerChanged: boolean): void; + const SkyRenderer: { + new(textureManager: net.minecraft.client.renderer.texture.TextureManager, atlasManager: net.minecraft.client.resources.model.sprite.AtlasManager, renderTarget: com.mojang.blaze3d.pipeline.RenderTarget): net.minecraft.client.renderer.SkyRenderer; } - interface SectionOcclusionGraph$Node { - step: number; - hasSourceDirection(directionOrdinal: number): boolean; - } - const Octree: { - new(cameraSection: net.minecraft.core.SectionPos, renderDistance: number, sectionsPerChunk: number, minBlockY: number): net.minecraft.client.renderer.Octree; - } - interface Octree { - add(section: net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection): boolean; - visitNodes(visitor: net.minecraft.client.renderer.Octree$OctreeVisitor, frustum: net.minecraft.client.renderer.culling.Frustum, closeDistance: number): void; - } - interface Octree$OctreeVisitor { - visit(node: net.minecraft.client.renderer.Octree$Node, fullyVisible: boolean, depth: number, isClose: boolean): void; - (node: net.minecraft.client.renderer.Octree$Node, fullyVisible: boolean, depth: number, isClose: boolean): void; - } - interface Octree$Node { - visitNodes(visitor: net.minecraft.client.renderer.Octree$OctreeVisitor, skipFrustumCheck: boolean, frustum: net.minecraft.client.renderer.culling.Frustum, depth: number, closeDistance: number, isClose: boolean): void; - getSection(): net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection | null | undefined; - getAABB(): net.minecraft.world.phys.AABB; + interface SkyRenderer extends java.lang.AutoCloseable { + renderSkyDisc(skyColor: number): void; + extractRenderState(level: net.minecraft.client.multiplayer.ClientLevel, partialTicks: number, camera: net.minecraft.client.Camera, state: net.minecraft.client.renderer.state.level.SkyRenderState): void; + renderDarkDisc(): void; + renderSunMoonAndStars(poseStack: com.mojang.blaze3d.vertex.PoseStack, sunAngle: number, moonAngle: number, starAngle: number, moonPhase: net.minecraft.world.level.MoonPhase, rainBrightness: number, starBrightness: number): void; + renderSunriseAndSunset(poseStack: com.mojang.blaze3d.vertex.PoseStack, sunAngle: number, sunriseAndSunsetColor: number): void; + renderEndSky(): void; + renderEndFlash(poseStack: com.mojang.blaze3d.vertex.PoseStack, intensity: number, xAngle: number, yAngle: number): void; } const CloudRenderer: { TextureData: typeof net.minecraft.client.renderer.CloudRenderer$TextureData; @@ -14144,242 +14296,132 @@ declare global { width(): number; height(): number; } - const SubmitNodeStorage: { - BreakingBlockModelSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$BreakingBlockModelSubmit; - CustomGeometrySubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$CustomGeometrySubmit; - ItemSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$ItemSubmit; - BlockModelSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$BlockModelSubmit; - MovingBlockSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$MovingBlockSubmit; - TranslucentModelSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$TranslucentModelSubmit; - ModelPartSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$ModelPartSubmit; - ModelSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$ModelSubmit; - LeashSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$LeashSubmit; - TextSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$TextSubmit; - NameTagSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$NameTagSubmit; - FlameSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$FlameSubmit; - ShadowSubmit: typeof net.minecraft.client.renderer.SubmitNodeStorage$ShadowSubmit; - new(): net.minecraft.client.renderer.SubmitNodeStorage; - } - interface SubmitNodeStorage extends net.minecraft.client.renderer.SubmitNodeCollector { - clear(): void; - endFrame(): void; - getSubmitsPerOrder(): it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap; - } - const SubmitNodeCollection: { - new(submitNodeStorage: net.minecraft.client.renderer.SubmitNodeStorage): net.minecraft.client.renderer.SubmitNodeCollection; - } - interface SubmitNodeCollection extends net.minecraft.client.renderer.OrderedSubmitNodeCollector, net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection { - wasUsed(): boolean; - getShadowSubmits(): Array; - getFlameSubmits(): Array; - getNameTagSubmits(): net.minecraft.client.renderer.feature.NameTagFeatureRenderer$Storage; - getTextSubmits(): Array; - getLeashSubmits(): Array; - getMovingBlockSubmits(): Array; - getBlockModelSubmits(): Array; - getBreakingBlockModelSubmits(): Array; - getModelPartSubmits(): net.minecraft.client.renderer.feature.ModelPartFeatureRenderer$Storage; - getItemSubmits(): Array; - getParticleGroupRenderers(): Array; - getModelSubmits(): net.minecraft.client.renderer.feature.ModelFeatureRenderer$Storage; - getCustomGeometrySubmits(): net.minecraft.client.renderer.feature.CustomFeatureRenderer$Storage; - clear(): void; - endFrame(): void; - } - const SubmitNodeStorage$ModelPartSubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, modelPart: net.minecraft.client.model.geom.ModelPart, lightCoords: number, overlayCoords: number, sprite: net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined, sheeted: boolean, hasFoil: boolean, tintedColor: number, crumblingOverlay: net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined, outlineColor: number): net.minecraft.client.renderer.SubmitNodeStorage$ModelPartSubmit; - } - interface SubmitNodeStorage$ModelPartSubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - modelPart(): net.minecraft.client.model.geom.ModelPart; - lightCoords(): number; - overlayCoords(): number; - sprite(): net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined; - sheeted(): boolean; - hasFoil(): boolean; - tintedColor(): number; - crumblingOverlay(): net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined; - outlineColor(): number; - } - const SubmitNodeStorage$ModelSubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, model: net.minecraft.client.model.Model, state: S, lightCoords: number, overlayCoords: number, tintedColor: number, sprite: net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined, outlineColor: number, crumblingOverlay: net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined): net.minecraft.client.renderer.SubmitNodeStorage$ModelSubmit; - } - interface SubmitNodeStorage$ModelSubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - model(): net.minecraft.client.model.Model; - state(): S; - lightCoords(): number; - overlayCoords(): number; - tintedColor(): number; - sprite(): net.minecraft.client.renderer.texture.TextureAtlasSprite | null | undefined; - outlineColor(): number; - crumblingOverlay(): net.minecraft.client.renderer.feature.ModelFeatureRenderer$CrumblingOverlay | null | undefined; - } - const SubmitNodeStorage$BreakingBlockModelSubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, model: net.minecraft.client.renderer.block.dispatch.BlockStateModel, seed: number, progress: number): net.minecraft.client.renderer.SubmitNodeStorage$BreakingBlockModelSubmit; - } - interface SubmitNodeStorage$BreakingBlockModelSubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - model(): net.minecraft.client.renderer.block.dispatch.BlockStateModel; - seed(): number; - progress(): number; - } - const SubmitNodeStorage$CustomGeometrySubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, customGeometryRenderer: net.minecraft.client.renderer.SubmitNodeCollector$CustomGeometryRenderer): net.minecraft.client.renderer.SubmitNodeStorage$CustomGeometrySubmit; + const WorldBorderRenderer: { + FORCEFIELD_LOCATION: net.minecraft.resources.Identifier; + new(): net.minecraft.client.renderer.WorldBorderRenderer; } - interface SubmitNodeStorage$CustomGeometrySubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - customGeometryRenderer(): net.minecraft.client.renderer.SubmitNodeCollector$CustomGeometryRenderer; + interface WorldBorderRenderer extends java.lang.AutoCloseable { + extract(border: net.minecraft.world.level.border.WorldBorder, deltaPartialTick: number, cameraPos: net.minecraft.world.phys.Vec3, renderDistance: number, state: net.minecraft.client.renderer.state.level.WorldBorderRenderState): void; + render(state: net.minecraft.client.renderer.state.level.WorldBorderRenderState, cameraPos: net.minecraft.world.phys.Vec3, renderDistance: number, depthFar: number): void; + invalidate(): void; } - const SubmitNodeStorage$ItemSubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, displayContext: net.minecraft.world.item.ItemDisplayContext, lightCoords: number, overlayCoords: number, outlineColor: number, tintLayers: Array, quads: Array, foilType: net.minecraft.client.renderer.item.ItemStackRenderState$FoilType): net.minecraft.client.renderer.SubmitNodeStorage$ItemSubmit; + const WeatherEffectRenderer: { + ColumnInstance: typeof net.minecraft.client.renderer.WeatherEffectRenderer$ColumnInstance; + new(): net.minecraft.client.renderer.WeatherEffectRenderer; } - interface SubmitNodeStorage$ItemSubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - displayContext(): net.minecraft.world.item.ItemDisplayContext; - lightCoords(): number; - overlayCoords(): number; - outlineColor(): number; - tintLayers(): Array; - quads(): Array; - foilType(): net.minecraft.client.renderer.item.ItemStackRenderState$FoilType; + interface WeatherEffectRenderer extends java.lang.AutoCloseable { + extractRenderState(level: net.minecraft.client.multiplayer.ClientLevel, partialTicks: number, cameraPos: net.minecraft.world.phys.Vec3, renderState: net.minecraft.client.renderer.state.level.WeatherRenderState): void; + render(cameraPos: net.minecraft.world.phys.Vec3, renderState: net.minecraft.client.renderer.state.level.WeatherRenderState): void; } - const SubmitNodeStorage$BlockModelSubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, renderType: net.minecraft.client.renderer.rendertype.RenderType, modelParts: Array, tintLayers: Array, lightCoords: number, overlayCoords: number, outlineColor: number): net.minecraft.client.renderer.SubmitNodeStorage$BlockModelSubmit; + const WeatherEffectRenderer$ColumnInstance: { + new(x: number, z: number, bottomY: number, topY: number, uOffset: number, vOffset: number, lightCoords: number): net.minecraft.client.renderer.WeatherEffectRenderer$ColumnInstance; } - interface SubmitNodeStorage$BlockModelSubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - renderType(): net.minecraft.client.renderer.rendertype.RenderType; - modelParts(): Array; - tintLayers(): Array; + interface WeatherEffectRenderer$ColumnInstance extends java.lang.Record { + x(): number; + z(): number; + bottomY(): number; + topY(): number; + uOffset(): number; + vOffset(): number; lightCoords(): number; - overlayCoords(): number; - outlineColor(): number; - } - const SubmitNodeStorage$MovingBlockSubmit: { - new(pose: org.joml.Matrix4fc, movingBlockRenderState: net.minecraft.client.renderer.block.MovingBlockRenderState): net.minecraft.client.renderer.SubmitNodeStorage$MovingBlockSubmit; } - interface SubmitNodeStorage$MovingBlockSubmit extends java.lang.Record { - pose(): org.joml.Matrix4fc; - movingBlockRenderState(): net.minecraft.client.renderer.block.MovingBlockRenderState; - } - const SubmitNodeStorage$TranslucentModelSubmit: { - new(modelSubmit: net.minecraft.client.renderer.SubmitNodeStorage$ModelSubmit, renderType: net.minecraft.client.renderer.rendertype.RenderType, position: org.joml.Vector3f): net.minecraft.client.renderer.SubmitNodeStorage$TranslucentModelSubmit; - } - interface SubmitNodeStorage$TranslucentModelSubmit extends java.lang.Record { - modelSubmit(): net.minecraft.client.renderer.SubmitNodeStorage$ModelSubmit; - renderType(): net.minecraft.client.renderer.rendertype.RenderType; - position(): org.joml.Vector3f; - } - const SubmitNodeStorage$LeashSubmit: { - new(pose: org.joml.Matrix4f, leashState: net.minecraft.client.renderer.entity.state.EntityRenderState$LeashState): net.minecraft.client.renderer.SubmitNodeStorage$LeashSubmit; - } - interface SubmitNodeStorage$LeashSubmit extends java.lang.Record { - pose(): org.joml.Matrix4f; - leashState(): net.minecraft.client.renderer.entity.state.EntityRenderState$LeashState; + const SectionOcclusionGraph: { + Node: typeof net.minecraft.client.renderer.SectionOcclusionGraph$Node; + new(): net.minecraft.client.renderer.SectionOcclusionGraph; } - const SubmitNodeStorage$TextSubmit: { - new(pose: org.joml.Matrix4fc, x: number, y: number, string: net.minecraft.util.FormattedCharSequence, dropShadow: boolean, displayMode: net.minecraft.client.gui.Font$DisplayMode, lightCoords: number, color: number, backgroundColor: number, outlineColor: number): net.minecraft.client.renderer.SubmitNodeStorage$TextSubmit; + interface SectionOcclusionGraph { + waitAndReset(viewArea: net.minecraft.client.renderer.ViewArea | null | undefined): void; + expectedChunks(): it.unimi.dsi.fastutil.longs.LongCollection; + invalidate(): void; + invalidateIfNeeded(camera: net.minecraft.client.renderer.state.level.CameraRenderState, fov: number): void; + addSectionsInFrustum(frustum: net.minecraft.client.renderer.culling.Frustum, visibleSections: Array, nearbyVisibleSection: Array): void; + consumeFrustumUpdate(): boolean; + schedulePropagationFrom(section: net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection): void; + update(camera: net.minecraft.client.renderer.state.level.CameraRenderState, fov: number, chunkLoadingRenderState: net.minecraft.client.renderer.state.level.ChunkLoadingRenderState): void; + getNode(section: net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection): net.minecraft.client.renderer.SectionOcclusionGraph$Node | null | undefined; + updateEmptySections(added: it.unimi.dsi.fastutil.longs.LongOpenHashSet, removed: it.unimi.dsi.fastutil.longs.LongOpenHashSet): void; + updateLoadedChunks(added: it.unimi.dsi.fastutil.longs.LongOpenHashSet, removed: it.unimi.dsi.fastutil.longs.LongOpenHashSet): void; + getOctree(): net.minecraft.client.renderer.Octree; } - interface SubmitNodeStorage$TextSubmit extends java.lang.Record { - pose(): org.joml.Matrix4fc; - x(): number; - y(): number; - string(): net.minecraft.util.FormattedCharSequence; - dropShadow(): boolean; - displayMode(): net.minecraft.client.gui.Font$DisplayMode; - lightCoords(): number; - color(): number; - backgroundColor(): number; - outlineColor(): number; + const ViewArea: { + new(sectionRenderDispatcher: net.minecraft.client.renderer.chunk.SectionRenderDispatcher, minY: number, maxY: number, minSectionY: number, maxSectionY: number, renderDistance: number, sectionOcclusionGraph: net.minecraft.client.renderer.SectionOcclusionGraph): net.minecraft.client.renderer.ViewArea; } - const SubmitNodeStorage$NameTagSubmit: { - new(pose: org.joml.Matrix4fc, x: number, y: number, text: net.minecraft.network.chat.Component, lightCoords: number, color: number, backgroundColor: number, distanceToCameraSq: number): net.minecraft.client.renderer.SubmitNodeStorage$NameTagSubmit; + interface ViewArea { + minY(): number; + maxY(): number; + releaseAllBuffers(): void; + size(): number; + minSectionY(): number; + maxSectionY(): number; + sectionCount(): number; + getViewDistance(): number; + repositionCamera(cameraSectionPos: net.minecraft.core.SectionPos): boolean; + getCameraSectionPos(): net.minecraft.core.SectionPos; + getRenderSectionAt(pos: net.minecraft.core.BlockPos): net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection | null | undefined; } - interface SubmitNodeStorage$NameTagSubmit extends java.lang.Record { - pose(): org.joml.Matrix4fc; - x(): number; - y(): number; - text(): net.minecraft.network.chat.Component; - lightCoords(): number; - color(): number; - backgroundColor(): number; - distanceToCameraSq(): number; + const SectionBufferBuilderPack: { + TOTAL_BUFFERS_SIZE: number; + new(): net.minecraft.client.renderer.SectionBufferBuilderPack; } - const SubmitNodeStorage$FlameSubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, entityRenderState: net.minecraft.client.renderer.entity.state.EntityRenderState, rotation: org.joml.Quaternionf): net.minecraft.client.renderer.SubmitNodeStorage$FlameSubmit; + interface SectionBufferBuilderPack extends java.lang.AutoCloseable { + buffer(layer: net.minecraft.client.renderer.chunk.ChunkSectionLayer): com.mojang.blaze3d.vertex.ByteBufferBuilder; + clearAll(): void; + discardAll(): void; } - interface SubmitNodeStorage$FlameSubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - entityRenderState(): net.minecraft.client.renderer.entity.state.EntityRenderState; - rotation(): org.joml.Quaternionf; + const RenderBuffers: { + new(maxSectionBuilders: number): net.minecraft.client.renderer.RenderBuffers; } - const SubmitNodeStorage$ShadowSubmit: { - new(pose: org.joml.Matrix4fc, radius: number, pieces: Array): net.minecraft.client.renderer.SubmitNodeStorage$ShadowSubmit; + interface RenderBuffers extends java.lang.AutoCloseable { + fixedBufferPack(): net.minecraft.client.renderer.SectionBufferBuilderPack; + sectionBufferPool(): net.minecraft.client.renderer.SectionBufferBuilderPool; + stagedVertexBuffer(): net.minecraft.client.renderer.StagedVertexBuffer; + endFrame(): void; } - interface SubmitNodeStorage$ShadowSubmit extends java.lang.Record { - pose(): org.joml.Matrix4fc; - radius(): number; - pieces(): Array; + const SectionBufferBuilderPool: { + allocate(maxWorkers: number): net.minecraft.client.renderer.SectionBufferBuilderPool; } - const LevelRenderer$BrightnessGetter: { - DEFAULT: net.minecraft.client.renderer.LevelRenderer$BrightnessGetter; + interface SectionBufferBuilderPool extends java.lang.AutoCloseable { + acquire(): net.minecraft.client.renderer.SectionBufferBuilderPack | null | undefined; + release(buffer: net.minecraft.client.renderer.SectionBufferBuilderPack): void; + isEmpty(): boolean; + getFreeBufferCount(): number; } - interface LevelRenderer$BrightnessGetter { - packedBrightness(level: net.minecraft.world.level.BlockAndLightGetter, pos: net.minecraft.core.BlockPos): number; - (level: net.minecraft.world.level.BlockAndLightGetter, pos: net.minecraft.core.BlockPos): number; + const StagedVertexBuffer: { + Draw: typeof net.minecraft.client.renderer.StagedVertexBuffer$Draw; + ExecuteInfo: typeof net.minecraft.client.renderer.StagedVertexBuffer$ExecuteInfo; + new(label: unknown, initialCapacity: number): net.minecraft.client.renderer.StagedVertexBuffer; + } + interface StagedVertexBuffer extends java.lang.AutoCloseable { + appendDraw(format: com.mojang.blaze3d.vertex.VertexFormat, primitiveTopology: com.mojang.blaze3d.PrimitiveTopology): net.minecraft.client.renderer.StagedVertexBuffer$Draw; + appendDraw(format: com.mojang.blaze3d.vertex.VertexFormat, primitiveTopology: com.mojang.blaze3d.PrimitiveTopology, quadSorting: com.mojang.blaze3d.vertex.VertexSorting | null | undefined): net.minecraft.client.renderer.StagedVertexBuffer$Draw; + getVertexBuilder(draw: net.minecraft.client.renderer.StagedVertexBuffer$Draw): com.mojang.blaze3d.vertex.VertexConsumer; + upload(): void; + getExecuteInfo(draw: net.minecraft.client.renderer.StagedVertexBuffer$Draw): net.minecraft.client.renderer.StagedVertexBuffer$ExecuteInfo | null | undefined; + endDraw(): void; + endFrame(): void; } - const GameRenderer: { - MAX_BLUR_RADIUS: number; - PROJECTION_3D_HUD_Z_FAR: number; - new(minecraft: net.minecraft.client.Minecraft, itemInHandRenderer: net.minecraft.client.renderer.ItemInHandRenderer, renderBuffers: net.minecraft.client.renderer.RenderBuffers, modelManager: net.minecraft.client.resources.model.ModelManager): net.minecraft.client.renderer.GameRenderer; - getNightVisionScale(camera: net.minecraft.world.entity.LivingEntity, a: number): number; + interface StagedVertexBuffer$Draw { + isEmpty(): boolean; } - interface GameRenderer extends java.lang.AutoCloseable, net.minecraft.world.waypoints.TrackedWaypoint$Projector { - itemInHandRenderer: net.minecraft.client.renderer.ItemInHandRenderer; - lightmap(): com.mojang.blaze3d.textures.GpuTextureView; - overlayTexture(): net.minecraft.client.renderer.texture.OverlayTexture; - getSubmitNodeStorage(): net.minecraft.client.renderer.SubmitNodeStorage; - getFeatureRenderDispatcher(): net.minecraft.client.renderer.feature.FeatureRenderDispatcher; - getGameRenderState(): net.minecraft.client.renderer.state.GameRenderState; - setRenderBlockOutline(renderBlockOutline: boolean): void; - clearPostEffect(): void; - togglePostEffect(): void; - checkEntityPostEffect(cameraEntity: net.minecraft.world.entity.Entity | null | undefined): void; - processBlurEffect(): void; - preloadUiShader(resourceProvider: net.minecraft.server.packs.resources.ResourceProvider): void; - tick(): void; - currentPostEffect(): net.minecraft.resources.Identifier | null | undefined; - resize(width: number, height: number): void; - update(deltaTracker: net.minecraft.client.DeltaTracker, advanceGameTime: boolean): void; - extract(deltaTracker: net.minecraft.client.DeltaTracker, advanceGameTime: boolean): void; - render(deltaTracker: net.minecraft.client.DeltaTracker, advanceGameTime: boolean): void; - renderLevel(deltaTracker: net.minecraft.client.DeltaTracker): void; - resetData(): void; - displayItemActivation(itemStack: net.minecraft.world.item.ItemStack): void; - getMinecraft(): net.minecraft.client.Minecraft; - getBossOverlayWorldDarkening(a: number): number; - getMainCamera(): net.minecraft.client.Camera; - levelLightmap(): com.mojang.blaze3d.textures.GpuTextureView; - getGlobalSettingsUniform(): net.minecraft.client.renderer.GlobalSettingsUniform; - getLighting(): com.mojang.blaze3d.platform.Lighting; - setLevel(level: net.minecraft.client.multiplayer.ClientLevel | null | undefined): void; - getPanorama(): net.minecraft.client.renderer.Panorama; - registerPanoramaTextures(textureManager: net.minecraft.client.renderer.texture.TextureManager): void; + interface SectionOcclusionGraph$Node { + step: number; + hasSourceDirection(directionOrdinal: number): boolean; } - const Panorama: { - PANORAMA_OVERLAY: net.minecraft.resources.Identifier; - new(): net.minecraft.client.renderer.Panorama; + const Octree: { + new(cameraSection: net.minecraft.core.SectionPos, renderDistance: number, sectionsPerChunk: number, minBlockY: number): net.minecraft.client.renderer.Octree; } - interface Panorama { - extractRenderState(graphics: net.minecraft.client.gui.GuiGraphicsExtractor, width: number, height: number, shouldSpin: boolean): void; + interface Octree { + add(section: net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection): boolean; + visitNodes(visitor: net.minecraft.client.renderer.Octree$OctreeVisitor, frustum: net.minecraft.client.renderer.culling.Frustum, closeDistance: number): void; } - const GlobalSettingsUniform: { - UBO_SIZE: number; - new(): net.minecraft.client.renderer.GlobalSettingsUniform; + interface Octree$OctreeVisitor { + visit(node: net.minecraft.client.renderer.Octree$Node, fullyVisible: boolean, depth: number, isClose: boolean): void; + (node: net.minecraft.client.renderer.Octree$Node, fullyVisible: boolean, depth: number, isClose: boolean): void; } - interface GlobalSettingsUniform extends java.lang.AutoCloseable { - update(width: number, height: number, glintAlpha: number, gameTime: number, deltaTracker: net.minecraft.client.DeltaTracker, menuBlurRadius: number, cameraPos: net.minecraft.world.phys.Vec3, useRgss: boolean): void; + interface Octree$Node { + visitNodes(visitor: net.minecraft.client.renderer.Octree$OctreeVisitor, skipFrustumCheck: boolean, frustum: net.minecraft.client.renderer.culling.Frustum, depth: number, closeDistance: number, isClose: boolean): void; + getSection(): net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection | null | undefined; + getAABB(): net.minecraft.world.phys.AABB; } const ShaderManager: { Configs: typeof net.minecraft.client.renderer.ShaderManager$Configs; @@ -14504,6 +14546,59 @@ declare global { } interface ShaderManager$CompilationException extends java.lang.Exception { } + const GameRenderer: { + MAX_BLUR_RADIUS: number; + PROJECTION_3D_HUD_Z_FAR: number; + new(minecraft: net.minecraft.client.Minecraft, itemInHandRenderer: net.minecraft.client.renderer.ItemInHandRenderer, modelManager: net.minecraft.client.resources.model.ModelManager): net.minecraft.client.renderer.GameRenderer; + nightVisionScale(camera: net.minecraft.world.entity.LivingEntity, a: number): number; + } + interface GameRenderer extends java.lang.AutoCloseable, net.minecraft.world.waypoints.TrackedWaypoint$Projector { + itemInHandRenderer: net.minecraft.client.renderer.ItemInHandRenderer; + gameRenderState(): net.minecraft.client.renderer.state.GameRenderState; + renderBuffers(): net.minecraft.client.renderer.RenderBuffers; + mainRenderTarget(): com.mojang.blaze3d.pipeline.RenderTarget; + bossOverlayWorldDarkening(a: number): number; + lightmap(): com.mojang.blaze3d.textures.GpuTextureView; + overlayTexture(): net.minecraft.client.renderer.texture.OverlayTexture; + panorama(): net.minecraft.client.renderer.Panorama; + featureRenderDispatcher(): net.minecraft.client.renderer.feature.FeatureRenderDispatcher; + mainCamera(): net.minecraft.client.Camera; + lighting(): com.mojang.blaze3d.platform.Lighting; + setRenderBlockOutline(renderBlockOutline: boolean): void; + clearPostEffect(): void; + togglePostEffect(): void; + checkEntityPostEffect(cameraEntity: net.minecraft.world.entity.Entity | null | undefined): void; + processBlurEffect(): void; + preloadUiShader(resourceProvider: net.minecraft.server.packs.resources.ResourceProvider): void; + tick(): void; + currentPostEffect(): net.minecraft.resources.Identifier | null | undefined; + resize(width: number, height: number): void; + update(deltaTracker: net.minecraft.client.DeltaTracker): void; + extract(deltaTracker: net.minecraft.client.DeltaTracker, advanceGameTime: boolean): void; + render(deltaTracker: net.minecraft.client.DeltaTracker, advanceGameTime: boolean): void; + renderLevel(deltaTracker: net.minecraft.client.DeltaTracker): void; + resetData(): void; + displayItemActivation(itemStack: net.minecraft.world.item.ItemStack): void; + levelLightmap(): com.mojang.blaze3d.textures.GpuTextureView; + setLevel(level: net.minecraft.client.multiplayer.ClientLevel | null | undefined): void; + registerPanoramaTextures(textureManager: net.minecraft.client.renderer.texture.TextureManager): void; + } + const Panorama: { + PANORAMA_OVERLAY: net.minecraft.resources.Identifier; + new(): net.minecraft.client.renderer.Panorama; + } + interface Panorama { + startSpin(): void; + holdSpin(): void; + extractRenderState(graphics: net.minecraft.client.gui.GuiGraphicsExtractor, width: number, height: number): void; + } + const SubmitNodeStorage: { + new(): net.minecraft.client.renderer.SubmitNodeStorage; + } + interface SubmitNodeStorage extends net.minecraft.client.renderer.SubmitNodeCollector { + getSubmitsPerOrder(): it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap; + drainPhases(consumer: unknown): void; + } const GpuWarnlistManager: { new(): net.minecraft.client.renderer.GpuWarnlistManager; } @@ -14522,15 +14617,6 @@ declare global { } namespace resources { namespace metadata { - namespace animation { - const FrameSize: { - new(width: number, height: number): net.minecraft.client.resources.metadata.animation.FrameSize; - } - interface FrameSize extends java.lang.Record { - width(): number; - height(): number; - } - } namespace texture { const TextureMetadataSection: { DEFAULT_BLUR: boolean; @@ -14547,6 +14633,15 @@ declare global { alphaCutoffBias(): number; } } + namespace animation { + const FrameSize: { + new(width: number, height: number): net.minecraft.client.resources.metadata.animation.FrameSize; + } + interface FrameSize extends java.lang.Record { + width(): number; + height(): number; + } + } } namespace model { namespace geometry { @@ -14630,8 +14725,6 @@ declare global { } interface SpriteId extends java.lang.Record { renderType(renderType: unknown): net.minecraft.client.renderer.rendertype.RenderType; - buffer(sprites: net.minecraft.client.resources.model.sprite.SpriteGetter, bufferSource: net.minecraft.client.renderer.MultiBufferSource, renderType: unknown): com.mojang.blaze3d.vertex.VertexConsumer; - buffer(sprites: net.minecraft.client.resources.model.sprite.SpriteGetter, bufferSource: net.minecraft.client.renderer.MultiBufferSource, renderType: unknown, sheeted: boolean, hasFoil: boolean): com.mojang.blaze3d.vertex.VertexConsumer; atlasLocation(): net.minecraft.resources.Identifier; texture(): net.minecraft.resources.Identifier; } @@ -14684,10 +14777,15 @@ declare global { } interface TextureSlots$SlotContents { } + const MaterialBaker: { + new(missingSprite: net.minecraft.client.renderer.texture.TextureAtlasSprite): net.minecraft.client.resources.model.sprite.MaterialBaker; + } interface MaterialBaker extends net.fabricmc.fabric.api.client.renderer.v1.sprite.FabricMaterialBaker { + replacementForMissingMaterial(material: net.minecraft.client.resources.model.sprite.Material): net.minecraft.client.resources.model.sprite.Material$Baked; get(material: net.minecraft.client.resources.model.sprite.Material, name: net.minecraft.client.resources.model.ModelDebugName): net.minecraft.client.resources.model.sprite.Material$Baked; - reportMissingReference(reference: string, name: net.minecraft.client.resources.model.ModelDebugName): net.minecraft.client.resources.model.sprite.Material$Baked; resolveSlot(slots: net.minecraft.client.resources.model.sprite.TextureSlots, id: string, name: net.minecraft.client.resources.model.ModelDebugName): net.minecraft.client.resources.model.sprite.Material$Baked; + reportMissingReference(reference: string, responsibleModel: net.minecraft.client.resources.model.ModelDebugName): net.minecraft.client.resources.model.sprite.Material$Baked; + logMissingTextures(): void; } const AtlasManager: { AtlasConfig: typeof net.minecraft.client.resources.model.sprite.AtlasManager$AtlasConfig; @@ -14743,11 +14841,17 @@ declare global { fixedFromBottom(): net.minecraft.client.resources.model.cuboid.ItemTransform; } } - interface ResolvableModel { - resolveDependencies(resolver: net.minecraft.client.resources.model.ResolvableModel$Resolver): void; + const ModelManager: { + new(blockColors: net.minecraft.client.color.block.BlockColors, atlasManager: net.minecraft.client.resources.model.sprite.AtlasManager, playerSkinRenderCache: net.minecraft.client.renderer.PlayerSkinRenderCache): net.minecraft.client.resources.model.ModelManager; } - interface ResolvableModel$Resolver { - markDependency(id: net.minecraft.resources.Identifier): void; + interface ModelManager extends net.minecraft.server.packs.resources.PreparableReloadListener, net.fabricmc.fabric.api.client.model.loading.v1.FabricModelManager { + getItemModel(id: net.minecraft.resources.Identifier): net.minecraft.client.renderer.item.ItemModel; + getItemProperties(id: net.minecraft.resources.Identifier): net.minecraft.client.renderer.item.ClientItem$Properties; + getBlockStateModelSet(): net.minecraft.client.renderer.block.BlockStateModelSet; + getBlockModelSet(): net.minecraft.client.renderer.block.BlockModelSet; + getFluidStateModelSet(): net.minecraft.client.renderer.block.FluidStateModelSet; + requiresRender(oldState: net.minecraft.world.level.block.state.BlockState, newState: net.minecraft.world.level.block.state.BlockState): boolean; + entityModels(): unknown; } interface ModelBaker { getModel(location: net.minecraft.resources.Identifier): net.minecraft.client.resources.model.ResolvedModel; @@ -14805,6 +14909,12 @@ declare global { interface UnbakedModel$GuiLight extends kotlin.Enum { lightLikeBlock(): boolean; } + interface ResolvableModel { + resolveDependencies(resolver: net.minecraft.client.resources.model.ResolvableModel$Resolver): void; + } + interface ResolvableModel$Resolver { + markDependency(id: net.minecraft.resources.Identifier): void; + } interface ModelBaker$Interner { vector(vector: org.joml.Vector3fc): org.joml.Vector3fc; materialInfo(material: net.minecraft.client.resources.model.geometry.BakedQuad$MaterialInfo): net.minecraft.client.resources.model.geometry.BakedQuad$MaterialInfo; @@ -14813,18 +14923,6 @@ declare global { compute(modelBakery: net.minecraft.client.resources.model.ModelBaker): T; (modelBakery: net.minecraft.client.resources.model.ModelBaker): T; } - const ModelManager: { - new(blockColors: net.minecraft.client.color.block.BlockColors, atlasManager: net.minecraft.client.resources.model.sprite.AtlasManager, playerSkinRenderCache: net.minecraft.client.renderer.PlayerSkinRenderCache): net.minecraft.client.resources.model.ModelManager; - } - interface ModelManager extends net.minecraft.server.packs.resources.PreparableReloadListener, net.fabricmc.fabric.api.client.model.loading.v1.FabricModelManager { - getItemModel(id: net.minecraft.resources.Identifier): net.minecraft.client.renderer.item.ItemModel; - getItemProperties(id: net.minecraft.resources.Identifier): net.minecraft.client.renderer.item.ClientItem$Properties; - getBlockStateModelSet(): net.minecraft.client.renderer.block.BlockStateModelSet; - getBlockModelSet(): net.minecraft.client.renderer.block.BlockModelSet; - getFluidStateModelSet(): net.minecraft.client.renderer.block.FluidStateModelSet; - requiresRender(oldState: net.minecraft.world.level.block.state.BlockState, newState: net.minecraft.world.level.block.state.BlockState): boolean; - entityModels(): unknown; - } const EquipmentAssetManager: { MISSING: net.minecraft.client.resources.model.EquipmentClientInfo; new(): net.minecraft.client.resources.model.EquipmentAssetManager; @@ -15064,6 +15162,13 @@ declare global { namespace model { namespace geom { namespace builders { + const LayerDefinition: { + create(mesh: net.minecraft.client.model.geom.builders.MeshDefinition, xTexSize: number, yTexSize: number): net.minecraft.client.model.geom.builders.LayerDefinition; + } + interface LayerDefinition { + apply(transformer: net.minecraft.client.model.geom.builders.MeshTransformer): net.minecraft.client.model.geom.builders.LayerDefinition; + bakeRoot(): net.minecraft.client.model.geom.ModelPart; + } const MeshTransformer: { IDENTITY: net.minecraft.client.model.geom.builders.MeshTransformer; scaling(factor: number): net.minecraft.client.model.geom.builders.MeshTransformer; @@ -15120,13 +15225,6 @@ declare global { extend(factor: number): net.minecraft.client.model.geom.builders.CubeDeformation; extend(factorX: number, factorY: number, factorZ: number): net.minecraft.client.model.geom.builders.CubeDeformation; } - const LayerDefinition: { - create(mesh: net.minecraft.client.model.geom.builders.MeshDefinition, xTexSize: number, yTexSize: number): net.minecraft.client.model.geom.builders.LayerDefinition; - } - interface LayerDefinition { - apply(transformer: net.minecraft.client.model.geom.builders.MeshTransformer): net.minecraft.client.model.geom.builders.LayerDefinition; - bakeRoot(): net.minecraft.client.model.geom.ModelPart; - } } const ModelPart: { Cube: typeof net.minecraft.client.model.geom.ModelPart$Cube; @@ -15248,22 +15346,6 @@ declare global { layer(): string; } } - namespace player { - const PlayerModel: { - new(root: net.minecraft.client.model.geom.ModelPart, slim: boolean): net.minecraft.client.model.player.PlayerModel; - createMesh(scale: net.minecraft.client.model.geom.builders.CubeDeformation, slim: boolean): net.minecraft.client.model.geom.builders.MeshDefinition; - createArmorMeshSet(innerDeformation: net.minecraft.client.model.geom.builders.CubeDeformation, outerDeformation: net.minecraft.client.model.geom.builders.CubeDeformation): net.minecraft.client.renderer.entity.ArmorModelSet; - } - interface PlayerModel extends net.minecraft.client.model.HumanoidModel { - leftSleeve: net.minecraft.client.model.geom.ModelPart; - rightSleeve: net.minecraft.client.model.geom.ModelPart; - leftPants: net.minecraft.client.model.geom.ModelPart; - rightPants: net.minecraft.client.model.geom.ModelPart; - jacket: net.minecraft.client.model.geom.ModelPart; - translateToHand(state: net.minecraft.client.renderer.entity.state.AvatarRenderState, arm: net.minecraft.world.entity.HumanoidArm, poseStack: com.mojang.blaze3d.vertex.PoseStack): void; - getRandomBodyPart(random: net.minecraft.util.RandomSource): net.minecraft.client.model.geom.ModelPart; - } - } namespace object { namespace book { const BookModel: { @@ -15302,7 +15384,6 @@ declare global { renderType(texture: net.minecraft.resources.Identifier): net.minecraft.client.renderer.rendertype.RenderType; allParts(): Array; renderToBuffer(poseStack: com.mojang.blaze3d.vertex.PoseStack, buffer: com.mojang.blaze3d.vertex.VertexConsumer, lightCoords: number, overlayCoords: number, color: number): void; - renderToBuffer(poseStack: com.mojang.blaze3d.vertex.PoseStack, buffer: com.mojang.blaze3d.vertex.VertexConsumer, lightCoords: number, overlayCoords: number): void; setupAnim(state: S): void; resetPose(): void; } @@ -15311,42 +15392,6 @@ declare global { } interface Model$Simple extends net.minecraft.client.model.Model { } - const HumanoidModel: { - ArmPose: typeof net.minecraft.client.model.HumanoidModel$ArmPose; - BABY_TRANSFORMER: net.minecraft.client.model.geom.builders.MeshTransformer; - OVERLAY_SCALE: number; - HAT_OVERLAY_SCALE: number; - LEGGINGS_OVERLAY_SCALE: number; - TOOT_HORN_XROT_BASE: number; - TOOT_HORN_YROT_BASE: number; - new(root: net.minecraft.client.model.geom.ModelPart): net.minecraft.client.model.HumanoidModel; - new(root: net.minecraft.client.model.geom.ModelPart, renderType: unknown): net.minecraft.client.model.HumanoidModel; - createMesh(g: net.minecraft.client.model.geom.builders.CubeDeformation, yOffset: number): net.minecraft.client.model.geom.builders.MeshDefinition; - createArmorMeshSet(innerDeformation: net.minecraft.client.model.geom.builders.CubeDeformation, outerDeformation: net.minecraft.client.model.geom.builders.CubeDeformation): net.minecraft.client.renderer.entity.ArmorModelSet; - createBabyArmorMeshSet(innerDeformation: net.minecraft.client.model.geom.builders.CubeDeformation, outerDeformation: net.minecraft.client.model.geom.builders.CubeDeformation, armOffset: net.minecraft.client.model.geom.PartPose): net.minecraft.client.renderer.entity.ArmorModelSet; - } - interface HumanoidModel extends net.minecraft.client.model.EntityModel, net.minecraft.client.model.ArmedModel, net.minecraft.client.model.HeadedModel { - head: net.minecraft.client.model.geom.ModelPart; - hat: net.minecraft.client.model.geom.ModelPart; - body: net.minecraft.client.model.geom.ModelPart; - rightArm: net.minecraft.client.model.geom.ModelPart; - leftArm: net.minecraft.client.model.geom.ModelPart; - rightLeg: net.minecraft.client.model.geom.ModelPart; - leftLeg: net.minecraft.client.model.geom.ModelPart; - getArm(arm: net.minecraft.world.entity.HumanoidArm): net.minecraft.client.model.geom.ModelPart; - } - const EntityModel: { - MODEL_Y_OFFSET: number; - } - interface EntityModel extends net.minecraft.client.model.Model { - } - interface ArmedModel { - translateToHand(state: T, arm: net.minecraft.world.entity.HumanoidArm, poseStack: com.mojang.blaze3d.vertex.PoseStack): void; - } - interface HeadedModel { - getHead(): net.minecraft.client.model.geom.ModelPart; - translateToHead(poseStack: com.mojang.blaze3d.vertex.PoseStack): void; - } const HumanoidModel$ArmPose: { EMPTY: net.minecraft.client.model.HumanoidModel$ArmPose; ITEM: net.minecraft.client.model.HumanoidModel$ArmPose; @@ -15369,6 +15414,88 @@ declare global { animateUseItem(state: S, poseStack: com.mojang.blaze3d.vertex.PoseStack, ticksUsingItem: number, arm: net.minecraft.world.entity.HumanoidArm, actualItem: net.minecraft.world.item.ItemStack): void; } } + namespace particle { + const SingleQuadParticle$Layer: { + OPAQUE_TERRAIN: net.minecraft.client.particle.SingleQuadParticle$Layer; + TRANSLUCENT_TERRAIN: net.minecraft.client.particle.SingleQuadParticle$Layer; + OPAQUE_ITEMS: net.minecraft.client.particle.SingleQuadParticle$Layer; + TRANSLUCENT_ITEMS: net.minecraft.client.particle.SingleQuadParticle$Layer; + OPAQUE: net.minecraft.client.particle.SingleQuadParticle$Layer; + TRANSLUCENT: net.minecraft.client.particle.SingleQuadParticle$Layer; + new(translucent: boolean, textureAtlasLocation: net.minecraft.resources.Identifier, pipeline: com.mojang.blaze3d.pipeline.RenderPipeline): net.minecraft.client.particle.SingleQuadParticle$Layer; + bySprite(sprite: net.minecraft.client.renderer.texture.TextureAtlasSprite): net.minecraft.client.particle.SingleQuadParticle$Layer; + } + interface SingleQuadParticle$Layer extends java.lang.Record { + translucent(): boolean; + textureAtlasLocation(): net.minecraft.resources.Identifier; + pipeline(): com.mojang.blaze3d.pipeline.RenderPipeline; + } + const ParticleEngine: { + new(level: net.minecraft.client.multiplayer.ClientLevel, resourceManager: net.minecraft.client.particle.ParticleResources): net.minecraft.client.particle.ParticleEngine; + } + interface ParticleEngine { + createTrackingEmitter(entity: net.minecraft.world.entity.Entity, particle: net.minecraft.core.particles.ParticleOptions): void; + createTrackingEmitter(entity: net.minecraft.world.entity.Entity, particle: net.minecraft.core.particles.ParticleOptions, lifeTime: number): void; + createParticle(options: net.minecraft.core.particles.ParticleOptions, x: number, y: number, z: number, xa: number, ya: number, za: number): net.minecraft.client.particle.Particle | null | undefined; + add(p: net.minecraft.client.particle.Particle): void; + tick(): void; + extract(particlesRenderState: net.minecraft.client.renderer.state.level.ParticlesRenderState, frustum: net.minecraft.client.renderer.culling.Frustum, camera: net.minecraft.client.Camera, partialTickTime: number): void; + setLevel(level: net.minecraft.client.multiplayer.ClientLevel | null | undefined): void; + countParticles(): string; + clearParticles(): void; + getRandom(): net.minecraft.util.RandomSource; + } + const Particle: { + LifetimeAlpha: typeof net.minecraft.client.particle.Particle$LifetimeAlpha; + new(level: net.minecraft.client.multiplayer.ClientLevel, x: number, y: number, z: number, xa: number, ya: number, za: number): net.minecraft.client.particle.Particle; + } + interface Particle { + setPower(power: number): net.minecraft.client.particle.Particle; + setParticleSpeed(xd: number, yd: number, zd: number): void; + scale(scale: number): net.minecraft.client.particle.Particle; + setLifetime(lifetime: number): void; + getLifetime(): number; + tick(): void; + getGroup(): net.minecraft.client.particle.ParticleRenderType; + remove(): void; + setPos(x: number, y: number, z: number): void; + move(xa: number, ya: number, za: number): void; + isAlive(): boolean; + getBoundingBox(): net.minecraft.world.phys.AABB; + setBoundingBox(bb: net.minecraft.world.phys.AABB): void; + getParticleLimit(): java.util.Optional; + } + const ParticleRenderType: { + SINGLE_QUADS: net.minecraft.client.particle.ParticleRenderType; + ITEM_PICKUP: net.minecraft.client.particle.ParticleRenderType; + ELDER_GUARDIANS: net.minecraft.client.particle.ParticleRenderType; + NO_RENDER: net.minecraft.client.particle.ParticleRenderType; + new(name: string, shorthand: string): net.minecraft.client.particle.ParticleRenderType; + } + interface ParticleRenderType extends java.lang.Record { + name(): string; + shorthand(): string; + } + const Particle$LifetimeAlpha: { + ALWAYS_OPAQUE: net.minecraft.client.particle.Particle$LifetimeAlpha; + new(startAlpha: number, endAlpha: number, startAtNormalizedAge: number, endAtNormalizedAge: number): net.minecraft.client.particle.Particle$LifetimeAlpha; + } + interface Particle$LifetimeAlpha extends java.lang.Record { + isOpaque(): boolean; + currentAlphaForAge(age: number, lifetime: number, partialTickTime: number): number; + startAlpha(): number; + endAlpha(): number; + startAtNormalizedAge(): number; + endAtNormalizedAge(): number; + } + const ParticleResources: { + new(): net.minecraft.client.particle.ParticleResources; + } + interface ParticleResources extends net.minecraft.server.packs.resources.PreparableReloadListener { + onReload(onReload: java.lang.Runnable): void; + getProviders(): it.unimi.dsi.fastutil.ints.Int2ObjectMap; + } + } namespace main { const SilentInitException: { new(message: string): net.minecraft.client.main.SilentInitException; @@ -15376,6 +15503,20 @@ declare global { } interface SilentInitException extends java.lang.RuntimeException { } + const GameConfig$QuickPlayData: { + new(logPath: string | null | undefined, variant: net.minecraft.client.main.GameConfig$QuickPlayVariant): net.minecraft.client.main.GameConfig$QuickPlayData; + } + interface GameConfig$QuickPlayData extends java.lang.Record { + isEnabled(): boolean; + logPath(): string | null | undefined; + variant(): net.minecraft.client.main.GameConfig$QuickPlayVariant; + } + const GameConfig$QuickPlayVariant: { + DISABLED: net.minecraft.client.main.GameConfig$QuickPlayVariant; + } + interface GameConfig$QuickPlayVariant { + isEnabled(): boolean; + } const GameConfig$UserData: { new(user: net.minecraft.client.User, proxy: java.net.Proxy): net.minecraft.client.main.GameConfig$UserData; } @@ -15412,7 +15553,7 @@ declare global { getExternalAssetSource(): java.nio.file.Path; } const GameConfig$GameData: { - new(demo: boolean, launchVersion: string, versionType: string, disableMultiplayer: boolean, disableChat: boolean, captureTracyImages: boolean, renderDebugLabels: boolean, offlineDeveloperMode: boolean): net.minecraft.client.main.GameConfig$GameData; + new(demo: boolean, launchVersion: string, versionType: string, disableMultiplayer: boolean, disableChat: boolean, captureTracyImages: boolean, vulkanValidation: boolean, renderDebugLabels: boolean, forcedGraphicsApi: net.minecraft.client.PreferredGraphicsApi | null | undefined, offlineDeveloperMode: boolean): net.minecraft.client.main.GameConfig$GameData; } interface GameConfig$GameData { demo: boolean; @@ -15422,22 +15563,10 @@ declare global { disableChat: boolean; captureTracyImages: boolean; renderDebugLabels: boolean; + vulkanValidation: boolean; + forcedGraphicsApi: net.minecraft.client.PreferredGraphicsApi | null | undefined; offlineDeveloperMode: boolean; } - const GameConfig$QuickPlayData: { - new(logPath: string | null | undefined, variant: net.minecraft.client.main.GameConfig$QuickPlayVariant): net.minecraft.client.main.GameConfig$QuickPlayData; - } - interface GameConfig$QuickPlayData extends java.lang.Record { - isEnabled(): boolean; - logPath(): string | null | undefined; - variant(): net.minecraft.client.main.GameConfig$QuickPlayVariant; - } - const GameConfig$QuickPlayVariant: { - DISABLED: net.minecraft.client.main.GameConfig$QuickPlayVariant; - } - interface GameConfig$QuickPlayVariant { - isEnabled(): boolean; - } const GameConfig$QuickPlayDisabled: { new(): net.minecraft.client.main.GameConfig$QuickPlayDisabled; } @@ -15763,10 +15892,11 @@ declare global { const ClientLevel: { ClientLevelData: typeof net.minecraft.client.multiplayer.ClientLevel$ClientLevelData; DEFAULT_QUIT_MESSAGE: net.minecraft.network.chat.Component; - new(connection: net.minecraft.client.multiplayer.ClientPacketListener, levelData: net.minecraft.client.multiplayer.ClientLevel$ClientLevelData, dimension: net.minecraft.resources.ResourceKey, dimensionType: net.minecraft.core.Holder, serverChunkRadius: number, serverSimulationDistance: number, levelRenderer: net.minecraft.client.renderer.LevelRenderer, isDebug: boolean, biomeZoomSeed: number, seaLevel: number): net.minecraft.client.multiplayer.ClientLevel; + new(connection: net.minecraft.client.multiplayer.ClientPacketListener, levelData: net.minecraft.client.multiplayer.ClientLevel$ClientLevelData, dimension: net.minecraft.resources.ResourceKey, dimensionType: net.minecraft.core.Holder, serverChunkRadius: number, serverSimulationDistance: number, levelExtractor: net.minecraft.client.renderer.extract.LevelExtractor, isDebug: boolean, biomeZoomSeed: number, seaLevel: number): net.minecraft.client.multiplayer.ClientLevel; } interface ClientLevel extends net.minecraft.world.level.Level, net.minecraft.client.renderer.block.BlockAndTintGetter, net.minecraft.client.multiplayer.CacheSlot$Cleaner { endFlashState(): net.minecraft.client.renderer.EndFlashState | null | undefined; + destructionProgress(): it.unimi.dsi.fastutil.longs.Long2ObjectMap>; handleBlockChangedAck(sequence: number): void; getGloballyRenderedBlockEntities(): Set; setServerVerifiedBlockState(pos: net.minecraft.core.BlockPos, blockState: net.minecraft.world.level.block.state.BlockState, updateFlag: number): void; @@ -15774,6 +15904,8 @@ declare global { queueLightUpdate(update: java.lang.Runnable): void; pollLightUpdates(): void; tick(haveTime: unknown): void; + tickWeatherEffects(): void; + getPrecipitationAt(pos: net.minecraft.core.BlockPos): net.minecraft.world.level.biome.Biome$Precipitation; setTimeFromServer(gameTime: number): void; entitiesForRendering(): kotlin.collections.MutableIterable; tickEntities(): void; @@ -15782,7 +15914,6 @@ declare global { update(): void; unload(levelChunk: net.minecraft.world.level.chunk.LevelChunk): void; onChunkLoaded(pos: net.minecraft.world.level.ChunkPos): void; - onSectionBecomingNonEmpty(sectionNode: number): void; clearTintCaches(): void; getEntityCount(): number; addEntity(entity: net.minecraft.world.entity.Entity): void; @@ -15820,10 +15951,15 @@ declare global { replaceWithPacketData(chunkX: number, chunkZ: number, readBuffer: net.minecraft.network.FriendlyByteBuf, heightmaps: Map>, blockEntities: unknown): net.minecraft.world.level.chunk.LevelChunk | null | undefined; updateViewCenter(x: number, z: number): void; updateViewRadius(viewRange: number): void; - getLoadedEmptySections(): it.unimi.dsi.fastutil.longs.LongOpenHashSet; + addedEmptySections(): it.unimi.dsi.fastutil.longs.LongOpenHashSet; + removedEmptySections(): it.unimi.dsi.fastutil.longs.LongOpenHashSet; + addedLoadedChunks(): it.unimi.dsi.fastutil.longs.LongOpenHashSet; + removedLoadedChunks(): it.unimi.dsi.fastutil.longs.LongOpenHashSet; + flipUpdateTrackingSets(): void; } interface ClientChunkCache$Storage { onSectionEmptinessChanged(sectionX: number, sectionY: number, sectionZ: number, empty: boolean): void; + getChunk(index: number): net.minecraft.world.level.chunk.LevelChunk | null | undefined; } const ClientLevel$ClientLevelData: { new(difficulty: net.minecraft.world.Difficulty, hardcore: boolean, isFlat: boolean): net.minecraft.client.multiplayer.ClientLevel$ClientLevelData; @@ -15846,6 +15982,7 @@ declare global { enabledFeatures(): net.minecraft.world.flag.FeatureFlagSet; potionBrewing(): net.minecraft.world.item.alchemy.PotionBrewing; fuelValues(): net.minecraft.world.level.block.entity.FuelValues; + onlineMode(): boolean; scoreboard(): net.minecraft.world.scores.Scoreboard; clockManager(): net.minecraft.client.ClientClockManager; searchTrees(): net.minecraft.client.multiplayer.SessionSearchTrees; @@ -15870,6 +16007,7 @@ declare global { sendCommand(command: string): void; sendUnattendedCommand(command: string, screenAfterCommand: net.minecraft.client.gui.screens.Screen | null | undefined): void; broadcastClientInformation(information: net.minecraft.server.level.ClientInformation): void; + getPlayerCompiledSectionCallback(): java.lang.Runnable | null | undefined; prepareKeyPair(): void; getServerData(): net.minecraft.client.multiplayer.ServerData | null | undefined; isFeatureEnabled(requiredFlags: net.minecraft.world.flag.FeatureFlagSet): boolean; @@ -15887,25 +16025,6 @@ declare global { clearDialog(): void; send(packet: net.minecraft.network.protocol.Packet): void; } - const PlayerInfo: { - new(profile: com.mojang.authlib.GameProfile, enforcesSecureChat: boolean): net.minecraft.client.multiplayer.PlayerInfo; - } - interface PlayerInfo { - showHat(): boolean; - getProfile(): com.mojang.authlib.GameProfile; - getChatSession(): net.minecraft.network.chat.RemoteChatSession | null | undefined; - getMessageValidator(): net.minecraft.network.chat.SignedMessageValidator; - hasVerifiableChat(): boolean; - getGameMode(): net.minecraft.world.level.GameType; - getLatency(): number; - getSkin(): net.minecraft.world.entity.player.PlayerSkin; - getTeam(): net.minecraft.world.scores.PlayerTeam | null | undefined; - setTabListDisplayName(tabListDisplayName: net.minecraft.network.chat.Component | null | undefined): void; - getTabListDisplayName(): net.minecraft.network.chat.Component | null | undefined; - setShowHat(showHat: boolean): void; - setTabListOrder(tabListOrder: number): void; - getTabListOrder(): number; - } const ServerData: { ServerPackStatus: typeof net.minecraft.client.multiplayer.ServerData$ServerPackStatus; State: typeof net.minecraft.client.multiplayer.ServerData$State; @@ -15974,53 +16093,6 @@ declare global { interface ServerData$ServerPackStatus extends kotlin.Enum { getName(): net.minecraft.network.chat.Component; } - const MultiPlayerGameMode: { - new(minecraft: net.minecraft.client.Minecraft, connection: net.minecraft.client.multiplayer.ClientPacketListener): net.minecraft.client.multiplayer.MultiPlayerGameMode; - } - interface MultiPlayerGameMode { - isDestroying(): boolean; - adjustPlayer(player: net.minecraft.world.entity.player.Player): void; - setLocalMode(mode: net.minecraft.world.level.GameType, previousMode: net.minecraft.world.level.GameType | null | undefined): void; - setLocalMode(mode: net.minecraft.world.level.GameType): void; - canHurtPlayer(): boolean; - destroyBlock(pos: net.minecraft.core.BlockPos): boolean; - startDestroyBlock(pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction): boolean; - stopDestroyBlock(): void; - continueDestroyBlock(pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction): boolean; - tick(): void; - useItemOn(player: net.minecraft.client.player.LocalPlayer, hand: net.minecraft.world.InteractionHand, blockHit: net.minecraft.world.phys.BlockHitResult): net.minecraft.world.InteractionResult; - useItem(player: net.minecraft.world.entity.player.Player, hand: net.minecraft.world.InteractionHand): net.minecraft.world.InteractionResult; - createPlayer(level: net.minecraft.client.multiplayer.ClientLevel, stats: net.minecraft.stats.StatsCounter, recipeBook: net.minecraft.client.ClientRecipeBook): net.minecraft.client.player.LocalPlayer; - createPlayer(level: net.minecraft.client.multiplayer.ClientLevel, stats: net.minecraft.stats.StatsCounter, recipeBook: net.minecraft.client.ClientRecipeBook, lastSentInput: net.minecraft.world.entity.player.Input, wasSprinting: boolean): net.minecraft.client.player.LocalPlayer; - attack(player: net.minecraft.world.entity.player.Player, entity: net.minecraft.world.entity.Entity): void; - spectate(entity: net.minecraft.world.entity.Entity): void; - interact(player: net.minecraft.world.entity.player.Player, entity: net.minecraft.world.entity.Entity, hitResult: net.minecraft.world.phys.EntityHitResult, hand: net.minecraft.world.InteractionHand): net.minecraft.world.InteractionResult; - handleContainerInput(containerId: number, slotNum: number, buttonNum: number, containerInput: net.minecraft.world.inventory.ContainerInput, player: net.minecraft.world.entity.player.Player): void; - handlePlaceRecipe(containerId: number, recipe: net.minecraft.world.item.crafting.display.RecipeDisplayId, useMaxItems: boolean): void; - handleInventoryButtonClick(containerId: number, buttonId: number): void; - handleCreativeModeItemAdd(clicked: net.minecraft.world.item.ItemStack, slot: number): void; - handleCreativeModeItemDrop(clicked: net.minecraft.world.item.ItemStack): void; - releaseUsingItem(player: net.minecraft.world.entity.player.Player): void; - piercingAttack(weapon: net.minecraft.world.item.component.PiercingWeapon): void; - hasExperience(): boolean; - hasMissTime(): boolean; - isServerControlledInventory(): boolean; - isSpectator(): boolean; - getPreviousPlayerMode(): net.minecraft.world.level.GameType | null | undefined; - getPlayerMode(): net.minecraft.world.level.GameType; - getDestroyStage(): number; - handlePickItemFromBlock(pos: net.minecraft.core.BlockPos, includeData: boolean): void; - handlePickItemFromEntity(entity: net.minecraft.world.entity.Entity, includeData: boolean): void; - handleSlotStateChanged(slotId: number, containerId: number, newState: boolean): void; - } - const ProfileKeyPairManager: { - EMPTY_KEY_MANAGER: net.minecraft.client.multiplayer.ProfileKeyPairManager; - create(userApiService: com.mojang.authlib.minecraft.UserApiService, user: net.minecraft.client.User, gameDirectory: java.nio.file.Path): net.minecraft.client.multiplayer.ProfileKeyPairManager; - } - interface ProfileKeyPairManager { - prepareKeyPair(): java.util.concurrent.CompletableFuture>; - shouldRefreshKeyPair(): boolean; - } const CommonListenerCookie: { new(levelLoadTracker: net.minecraft.client.multiplayer.LevelLoadTracker, localGameProfile: com.mojang.authlib.GameProfile, telemetryManager: net.minecraft.client.telemetry.WorldSessionTelemetryManager, receivedRegistries: net.minecraft.core.RegistryAccess$Frozen, enabledFeatures: net.minecraft.world.flag.FeatureFlagSet, serverBrand: string | null | undefined, serverData: net.minecraft.client.multiplayer.ServerData | null | undefined, postDisconnectScreen: net.minecraft.client.gui.screens.Screen | null | undefined, serverCookies: Map>, chatState: net.minecraft.client.gui.components.ChatComponent$State | null | undefined, customReportDetails: Map, serverLinks: net.minecraft.server.ServerLinks, seenPlayers: Map, seenInsecureChatWarning: boolean): net.minecraft.client.multiplayer.CommonListenerCookie; } @@ -16047,13 +16119,33 @@ declare global { } interface LevelLoadTracker extends net.minecraft.server.level.progress.LevelLoadListener { setServerChunkStatusView(serverChunkStatusView: net.minecraft.server.level.progress.ChunkLoadStatusView): void; - startClientLoad(player: net.minecraft.client.player.LocalPlayer, level: net.minecraft.client.multiplayer.ClientLevel, levelRenderer: net.minecraft.client.renderer.LevelRenderer): void; + startClientLoad(player: net.minecraft.client.player.LocalPlayer, level: net.minecraft.client.multiplayer.ClientLevel): void; tickClientLoad(): void; isLevelReady(): boolean; loadingPacketsReceived(): void; statusView(): net.minecraft.server.level.progress.ChunkLoadStatusView | null | undefined; serverProgress(): number; hasProgress(): boolean; + getPlayerCompiledSectionCallback(): java.lang.Runnable | null | undefined; + } + const PlayerInfo: { + new(profile: com.mojang.authlib.GameProfile, enforcesSecureChat: boolean): net.minecraft.client.multiplayer.PlayerInfo; + } + interface PlayerInfo { + showHat(): boolean; + getProfile(): com.mojang.authlib.GameProfile; + getChatSession(): net.minecraft.network.chat.RemoteChatSession | null | undefined; + getMessageValidator(): net.minecraft.network.chat.SignedMessageValidator; + hasVerifiableChat(): boolean; + getGameMode(): net.minecraft.world.level.GameType; + getLatency(): number; + getSkin(): net.minecraft.world.entity.player.PlayerSkin; + getTeam(): net.minecraft.world.scores.PlayerTeam | null | undefined; + setTabListDisplayName(tabListDisplayName: net.minecraft.network.chat.Component | null | undefined): void; + getTabListDisplayName(): net.minecraft.network.chat.Component | null | undefined; + setShowHat(showHat: boolean): void; + setTabListOrder(tabListOrder: number): void; + getTabListOrder(): number; } const SessionSearchTrees: { new(): net.minecraft.client.multiplayer.SessionSearchTrees; @@ -16088,216 +16180,211 @@ declare global { onUpdateAdvancementProgress(advancement: net.minecraft.advancements.AdvancementNode, progress: net.minecraft.advancements.AdvancementProgress): void; onSelectedTabChanged(selectedTab: net.minecraft.advancements.AdvancementHolder | null | undefined): void; } - } - namespace color { - namespace block { - interface BlockTintSource { - color(state: net.minecraft.world.level.block.state.BlockState): number; - colorInWorld(state: net.minecraft.world.level.block.state.BlockState, level: net.minecraft.client.renderer.block.BlockAndTintGetter, pos: net.minecraft.core.BlockPos): number; - colorAsTerrainParticle(state: net.minecraft.world.level.block.state.BlockState, level: net.minecraft.client.renderer.block.BlockAndTintGetter, pos: net.minecraft.core.BlockPos): number; - relevantProperties(): Set>; - } - const BlockColors: { - LILY_PAD_IN_WORLD: number; - LILY_PAD_DEFAULT: number; - new(): net.minecraft.client.color.block.BlockColors; - createDefault(): net.minecraft.client.color.block.BlockColors; - } - interface BlockColors { - getTintSources(state: net.minecraft.world.level.block.state.BlockState): Array; - getTintSource(state: net.minecraft.world.level.block.state.BlockState, layer: number): net.minecraft.client.color.block.BlockTintSource | null | undefined; - register(layers: Array, blocks: net.minecraft.world.level.block.Block): void; - getColoringProperties(block: net.minecraft.world.level.block.Block): Set>; - } + const MultiPlayerGameMode: { + new(minecraft: net.minecraft.client.Minecraft, connection: net.minecraft.client.multiplayer.ClientPacketListener): net.minecraft.client.multiplayer.MultiPlayerGameMode; } - } - namespace sounds { - const SoundManager: { - EMPTY_SOUND_LOCATION: net.minecraft.resources.Identifier; - EMPTY_SOUND: net.minecraft.client.resources.sounds.Sound; - INTENTIONALLY_EMPTY_SOUND_LOCATION: net.minecraft.resources.Identifier; - INTENTIONALLY_EMPTY_SOUND_EVENT: net.minecraft.client.sounds.WeighedSoundEvents; - INTENTIONALLY_EMPTY_SOUND: net.minecraft.client.resources.sounds.Sound; - new(options: net.minecraft.client.Options): net.minecraft.client.sounds.SoundManager; + interface MultiPlayerGameMode { + isDestroying(): boolean; + adjustPlayer(player: net.minecraft.world.entity.player.Player): void; + setLocalMode(mode: net.minecraft.world.level.GameType, previousMode: net.minecraft.world.level.GameType | null | undefined): void; + setLocalMode(mode: net.minecraft.world.level.GameType): void; + canHurtPlayer(): boolean; + destroyBlock(pos: net.minecraft.core.BlockPos): boolean; + startDestroyBlock(pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction): boolean; + stopDestroyBlock(): void; + continueDestroyBlock(pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction): boolean; + tick(): void; + useItemOn(player: net.minecraft.client.player.LocalPlayer, hand: net.minecraft.world.InteractionHand, blockHit: net.minecraft.world.phys.BlockHitResult): net.minecraft.world.InteractionResult; + useItem(player: net.minecraft.world.entity.player.Player, hand: net.minecraft.world.InteractionHand): net.minecraft.world.InteractionResult; + createPlayer(level: net.minecraft.client.multiplayer.ClientLevel, stats: net.minecraft.stats.StatsCounter, recipeBook: net.minecraft.client.ClientRecipeBook): net.minecraft.client.player.LocalPlayer; + createPlayer(level: net.minecraft.client.multiplayer.ClientLevel, stats: net.minecraft.stats.StatsCounter, recipeBook: net.minecraft.client.ClientRecipeBook, lastSentInput: net.minecraft.world.entity.player.Input, wasSprinting: boolean): net.minecraft.client.player.LocalPlayer; + attack(player: net.minecraft.world.entity.player.Player, entity: net.minecraft.world.entity.Entity): void; + spectate(entity: net.minecraft.world.entity.Entity): void; + spectatorNoAction(): void; + interact(player: net.minecraft.world.entity.player.Player, entity: net.minecraft.world.entity.Entity, hitResult: net.minecraft.world.phys.EntityHitResult, hand: net.minecraft.world.InteractionHand): net.minecraft.world.InteractionResult; + handleContainerInput(containerId: number, slotNum: number, buttonNum: number, containerInput: net.minecraft.world.inventory.ContainerInput, player: net.minecraft.world.entity.player.Player): void; + handlePlaceRecipe(containerId: number, recipe: net.minecraft.world.item.crafting.display.RecipeDisplayId, useMaxItems: boolean): void; + handleInventoryButtonClick(containerId: number, buttonId: number): void; + handleCreativeModeItemAdd(clicked: net.minecraft.world.item.ItemStack, slot: number): void; + handleCreativeModeItemDrop(clicked: net.minecraft.world.item.ItemStack): void; + releaseUsingItem(player: net.minecraft.world.entity.player.Player): void; + piercingAttack(weapon: net.minecraft.world.item.component.PiercingWeapon): void; + hasExperience(): boolean; + hasMissTime(): boolean; + isServerControlledInventory(): boolean; + isSpectator(): boolean; + getPreviousPlayerMode(): net.minecraft.world.level.GameType | null | undefined; + getPlayerMode(): net.minecraft.world.level.GameType; + getDestroyStage(): number; + handlePickItemFromBlock(pos: net.minecraft.core.BlockPos, includeData: boolean): void; + handlePickItemFromEntity(entity: net.minecraft.world.entity.Entity, includeData: boolean): void; + handleSlotStateChanged(slotId: number, containerId: number, newState: boolean): void; } - interface SoundManager extends net.minecraft.server.packs.resources.SimplePreparableReloadListener { - getAvailableSoundDevices(): Array; - getListenerTransform(): com.mojang.blaze3d.audio.ListenerTransform; - getSoundEvent(location: net.minecraft.resources.Identifier): net.minecraft.client.sounds.WeighedSoundEvents | null | undefined; - getAvailableSounds(): Array; - queueTickingSound(instance: net.minecraft.client.resources.sounds.TickableSoundInstance): void; - play(instance: net.minecraft.client.resources.sounds.SoundInstance): net.minecraft.client.sounds.SoundEngine$PlayResult; - playDelayed(instance: net.minecraft.client.resources.sounds.SoundInstance, delay: number): void; - updateSource(camera: net.minecraft.client.Camera): void; - pauseAllExcept(ignoredSources: net.minecraft.sounds.SoundSource): void; - stop(): void; - stop(soundInstance: net.minecraft.client.resources.sounds.SoundInstance): void; - stop(sound: net.minecraft.resources.Identifier | null | undefined, source: net.minecraft.sounds.SoundSource | null | undefined): void; - destroy(): void; - emergencyShutdown(): void; - tick(paused: boolean): void; - resume(): void; - refreshCategoryVolume(category: net.minecraft.sounds.SoundSource): void; - updateCategoryVolume(source: net.minecraft.sounds.SoundSource, gain: number): void; - isActive(instance: net.minecraft.client.resources.sounds.SoundInstance): boolean; - addListener(listener: net.minecraft.client.sounds.SoundEventListener): void; - removeListener(listener: net.minecraft.client.sounds.SoundEventListener): void; - getChannelDebugString(): string; - getSoundCacheDebugStats(output: net.minecraft.client.sounds.SoundBufferLibrary$DebugOutput): void; - reload(): void; + const ProfileKeyPairManager: { + EMPTY_KEY_MANAGER: net.minecraft.client.multiplayer.ProfileKeyPairManager; + create(userApiService: com.mojang.authlib.minecraft.UserApiService, user: net.minecraft.client.User, gameDirectory: java.nio.file.Path): net.minecraft.client.multiplayer.ProfileKeyPairManager; } - const WeighedSoundEvents: { - new(location: net.minecraft.resources.Identifier, subtitle: string | null | undefined): net.minecraft.client.sounds.WeighedSoundEvents; + interface ProfileKeyPairManager { + prepareKeyPair(): java.util.concurrent.CompletableFuture>; + shouldRefreshKeyPair(): boolean; } - interface WeighedSoundEvents extends net.minecraft.client.sounds.Weighted { - addSound(sound: net.minecraft.client.sounds.Weighted): void; - getSubtitle(): net.minecraft.network.chat.Component | null | undefined; + } + namespace telemetry { + const WorldSessionTelemetryManager: { + new(eventSender: net.minecraft.client.telemetry.TelemetryEventSender, newWorld: boolean, worldLoadDuration: java.time.Duration | null | undefined, minigameName: string | null | undefined, sessionId: java.util.UUID): net.minecraft.client.telemetry.WorldSessionTelemetryManager; } - interface Weighted { - getWeight(): number; - getSound(random: net.minecraft.util.RandomSource): T; - preloadIfRequired(soundEngine: net.minecraft.client.sounds.SoundEngine): void; + interface WorldSessionTelemetryManager { + tick(): void; + onPlayerInfoReceived(type: net.minecraft.world.level.GameType, hardcore: boolean): void; + onServerBrandReceived(serverBrand: string): void; + setTime(gameTime: number): void; + worldSessionStart(): void; + onDisconnect(): void; + onAdvancementDone(level: net.minecraft.world.level.Level, holder: net.minecraft.advancements.AdvancementHolder): void; } - const SoundEngine: { - PlayResult: typeof net.minecraft.client.sounds.SoundEngine$PlayResult; - MISSING_SOUND: string; - OPEN_AL_SOFT_PREFIX: string; - OPEN_AL_SOFT_PREFIX_LENGTH: number; - new(soundManager: net.minecraft.client.sounds.SoundManager, options: net.minecraft.client.Options, resourceProvider: net.minecraft.server.packs.resources.ResourceProvider): net.minecraft.client.sounds.SoundEngine; + const TelemetryEventSender: { + DISABLED: net.minecraft.client.telemetry.TelemetryEventSender; } - interface SoundEngine { - reload(): void; - refreshCategoryVolume(source: net.minecraft.sounds.SoundSource): void; - destroy(): void; - emergencyShutdown(): void; - stop(soundInstance: net.minecraft.client.resources.sounds.SoundInstance): void; - stop(sound: net.minecraft.resources.Identifier | null | undefined, source: net.minecraft.sounds.SoundSource | null | undefined): void; - updateCategoryVolume(source: net.minecraft.sounds.SoundSource, gain: number): void; - stopAll(): void; - addEventListener(listener: net.minecraft.client.sounds.SoundEventListener): void; - removeEventListener(listener: net.minecraft.client.sounds.SoundEventListener): void; - tick(paused: boolean): void; - isActive(instance: net.minecraft.client.resources.sounds.SoundInstance): boolean; - play(instance: net.minecraft.client.resources.sounds.SoundInstance): net.minecraft.client.sounds.SoundEngine$PlayResult; - queueTickingSound(tickableSoundInstance: net.minecraft.client.resources.sounds.TickableSoundInstance): void; - requestPreload(sound: net.minecraft.client.resources.sounds.Sound): void; - pauseAllExcept(ignoredSources: net.minecraft.sounds.SoundSource): void; - resume(): void; - playDelayed(instance: net.minecraft.client.resources.sounds.SoundInstance, delay: number): void; - updateSource(camera: net.minecraft.client.Camera): void; - getChannelDebugString(): string; - getSoundCacheDebugStats(output: net.minecraft.client.sounds.SoundBufferLibrary$DebugOutput): void; - getAvailableSoundDevices(): Array; - getListenerTransform(): com.mojang.blaze3d.audio.ListenerTransform; + interface TelemetryEventSender { + decorate(decorator: unknown): net.minecraft.client.telemetry.TelemetryEventSender; + send(type: net.minecraft.client.telemetry.TelemetryEventType, buildFunction: unknown): void; + (type: net.minecraft.client.telemetry.TelemetryEventType, buildFunction: unknown): void; } - const SoundBufferLibrary: { - new(resourceProvider: net.minecraft.server.packs.resources.ResourceProvider): net.minecraft.client.sounds.SoundBufferLibrary; + const TelemetryEventType: { + Builder: typeof net.minecraft.client.telemetry.TelemetryEventType$Builder; + CODEC: com.mojang.serialization.Codec; + GRAPHICS_CAPABILITIES: net.minecraft.client.telemetry.TelemetryEventType; + WORLD_LOADED: net.minecraft.client.telemetry.TelemetryEventType; + PERFORMANCE_METRICS: net.minecraft.client.telemetry.TelemetryEventType; + WORLD_LOAD_TIMES: net.minecraft.client.telemetry.TelemetryEventType; + WORLD_UNLOADED: net.minecraft.client.telemetry.TelemetryEventType; + ADVANCEMENT_MADE: net.minecraft.client.telemetry.TelemetryEventType; + GAME_LOAD_TIMES: net.minecraft.client.telemetry.TelemetryEventType; + builder(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryEventType$Builder; + values(): Array; + selfTest(): boolean; } - interface SoundBufferLibrary { - getCompleteBuffer(location: net.minecraft.resources.Identifier): java.util.concurrent.CompletableFuture; - getStream(location: net.minecraft.resources.Identifier, looping: boolean): java.util.concurrent.CompletableFuture; - clear(): void; - preload(sounds: Array): java.util.concurrent.CompletableFuture; - enumerate(debugOutput: net.minecraft.client.sounds.SoundBufferLibrary$DebugOutput): void; + interface TelemetryEventType { + id(): string; + properties(): Array>; + isOptIn(): boolean; + codec(): com.mojang.serialization.MapCodec; + contains(property: net.minecraft.client.telemetry.TelemetryProperty): boolean; + title(): net.minecraft.network.chat.MutableComponent; + description(): net.minecraft.network.chat.MutableComponent; } - const SoundBufferLibrary$DebugOutput: { - Counter: typeof net.minecraft.client.sounds.SoundBufferLibrary.SoundBufferLibrary$DebugOutput$Counter; + const TelemetryPropertyMap: { + Builder: typeof net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; + builder(): net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; + createCodec(properties: Array>): com.mojang.serialization.MapCodec; } - interface SoundBufferLibrary$DebugOutput { - accountBuffer(id: net.minecraft.resources.Identifier, size: number, format: javax.sound.sampled.AudioFormat): void; + interface TelemetryPropertyMap { + get(property: net.minecraft.client.telemetry.TelemetryProperty): T; + propertySet(): Set>; } - const SoundBufferLibrary$DebugOutput$Counter: { - new(): unknown; + const TelemetryProperty: { + GameMode: typeof net.minecraft.client.telemetry.TelemetryProperty$GameMode; + ServerType: typeof net.minecraft.client.telemetry.TelemetryProperty$ServerType; + USER_ID: net.minecraft.client.telemetry.TelemetryProperty; + CLIENT_ID: net.minecraft.client.telemetry.TelemetryProperty; + MINECRAFT_SESSION_ID: net.minecraft.client.telemetry.TelemetryProperty; + GAME_VERSION: net.minecraft.client.telemetry.TelemetryProperty; + OPERATING_SYSTEM: net.minecraft.client.telemetry.TelemetryProperty; + PLATFORM: net.minecraft.client.telemetry.TelemetryProperty; + CLIENT_MODDED: net.minecraft.client.telemetry.TelemetryProperty; + LAUNCHER_NAME: net.minecraft.client.telemetry.TelemetryProperty; + BACKEND_NAME: net.minecraft.client.telemetry.TelemetryProperty; + BACKEND_FAILURE_MESSAGE: net.minecraft.client.telemetry.TelemetryProperty; + BACKEND_FAILURE_REASON: net.minecraft.client.telemetry.TelemetryProperty; + BACKEND_FAILURE_MISSING_CAPABILITIES: net.minecraft.client.telemetry.TelemetryProperty; + WORLD_SESSION_ID: net.minecraft.client.telemetry.TelemetryProperty; + SERVER_SESSION_ID: net.minecraft.client.telemetry.TelemetryProperty; + SERVER_MODDED: net.minecraft.client.telemetry.TelemetryProperty; + SERVER_TYPE: net.minecraft.client.telemetry.TelemetryProperty; + OPT_IN: net.minecraft.client.telemetry.TelemetryProperty; + EVENT_TIMESTAMP_UTC: net.minecraft.client.telemetry.TelemetryProperty; + GAME_MODE: net.minecraft.client.telemetry.TelemetryProperty; + REALMS_MAP_CONTENT: net.minecraft.client.telemetry.TelemetryProperty; + SECONDS_SINCE_LOAD: net.minecraft.client.telemetry.TelemetryProperty; + TICKS_SINCE_LOAD: net.minecraft.client.telemetry.TelemetryProperty; + FRAME_RATE_SAMPLES: net.minecraft.client.telemetry.TelemetryProperty; + RENDER_TIME_SAMPLES: net.minecraft.client.telemetry.TelemetryProperty; + USED_MEMORY_SAMPLES: net.minecraft.client.telemetry.TelemetryProperty; + NUMBER_OF_SAMPLES: net.minecraft.client.telemetry.TelemetryProperty; + RENDER_DISTANCE: net.minecraft.client.telemetry.TelemetryProperty; + DEDICATED_MEMORY_KB: net.minecraft.client.telemetry.TelemetryProperty; + WORLD_LOAD_TIME_MS: net.minecraft.client.telemetry.TelemetryProperty; + NEW_WORLD: net.minecraft.client.telemetry.TelemetryProperty; + LOAD_TIME_TOTAL_TIME_MS: net.minecraft.client.telemetry.TelemetryProperty; + LOAD_TIME_PRE_WINDOW_MS: net.minecraft.client.telemetry.TelemetryProperty; + LOAD_TIME_BOOTSTRAP_MS: net.minecraft.client.telemetry.TelemetryProperty; + LOAD_TIME_LOADING_OVERLAY_MS: net.minecraft.client.telemetry.TelemetryProperty; + ADVANCEMENT_ID: net.minecraft.client.telemetry.TelemetryProperty; + ADVANCEMENT_GAME_TIME: net.minecraft.client.telemetry.TelemetryProperty; + new(id: string, exportKey: string, codec: com.mojang.serialization.Codec, exporter: net.minecraft.client.telemetry.TelemetryProperty$Exporter): net.minecraft.client.telemetry.TelemetryProperty; + create(id: string, exportKey: string, codec: com.mojang.serialization.Codec, exporter: net.minecraft.client.telemetry.TelemetryProperty$Exporter): net.minecraft.client.telemetry.TelemetryProperty; + bool(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; + string(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; + integer(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; + makeLong(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; + uuid(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; + gameLoadMeasurement(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; + longSamples(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; } - interface SoundBufferLibrary$DebugOutput$Counter extends net.minecraft.client.sounds.SoundBufferLibrary$DebugOutput { - totalCount(): number; - totalSize(): number; + interface TelemetryProperty extends java.lang.Record { + title(): net.minecraft.network.chat.MutableComponent; + id(): string; + exportKey(): string; + codec(): com.mojang.serialization.Codec; + exporter(): net.minecraft.client.telemetry.TelemetryProperty$Exporter; } - interface SoundEventListener { - onPlaySound(sound: net.minecraft.client.resources.sounds.SoundInstance, soundEvent: net.minecraft.client.sounds.WeighedSoundEvents, range: number): void; + interface TelemetryProperty$Exporter { + apply(output: com.mojang.authlib.minecraft.TelemetryPropertyContainer, key: string, value: T): void; } - const SoundEngine$PlayResult: { - STARTED: net.minecraft.client.sounds.SoundEngine$PlayResult; - STARTED_SILENTLY: net.minecraft.client.sounds.SoundEngine$PlayResult; - NOT_STARTED: net.minecraft.client.sounds.SoundEngine$PlayResult; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.client.sounds.SoundEngine$PlayResult; + const TelemetryProperty$GameMode: { + SURVIVAL: net.minecraft.client.telemetry.TelemetryProperty$GameMode; + CREATIVE: net.minecraft.client.telemetry.TelemetryProperty$GameMode; + ADVENTURE: net.minecraft.client.telemetry.TelemetryProperty$GameMode; + SPECTATOR: net.minecraft.client.telemetry.TelemetryProperty$GameMode; + HARDCORE: net.minecraft.client.telemetry.TelemetryProperty$GameMode; + CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.telemetry.TelemetryProperty$GameMode; } - interface SoundEngine$PlayResult extends kotlin.Enum { + interface TelemetryProperty$GameMode extends kotlin.Enum, net.minecraft.util.StringRepresentable { + id(): number; } - const MusicManager: { - MusicFrequency: typeof net.minecraft.client.sounds.MusicManager$MusicFrequency; - new(minecraft: net.minecraft.client.Minecraft): net.minecraft.client.sounds.MusicManager; + const TelemetryProperty$ServerType: { + REALM: net.minecraft.client.telemetry.TelemetryProperty$ServerType; + LOCAL: net.minecraft.client.telemetry.TelemetryProperty$ServerType; + OTHER: net.minecraft.client.telemetry.TelemetryProperty$ServerType; + CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.telemetry.TelemetryProperty$ServerType; } - interface MusicManager { - tick(): void; - startPlaying(music: net.minecraft.sounds.Music): void; - showNowPlayingToastIfNeeded(): void; - stopPlaying(music: net.minecraft.sounds.Music): void; - stopPlaying(): void; - isPlayingMusic(music: net.minecraft.sounds.Music): boolean; - getCurrentMusicTranslationKey(): string | null | undefined; - setMinutesBetweenSongs(musicFrequency: net.minecraft.client.sounds.MusicManager$MusicFrequency): void; + interface TelemetryProperty$ServerType extends kotlin.Enum, net.minecraft.util.StringRepresentable { } - const MusicManager$MusicFrequency: { - DEFAULT: net.minecraft.client.sounds.MusicManager$MusicFrequency; - FREQUENT: net.minecraft.client.sounds.MusicManager$MusicFrequency; - CONSTANT: net.minecraft.client.sounds.MusicManager$MusicFrequency; - CODEC: com.mojang.serialization.Codec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.client.sounds.MusicManager$MusicFrequency; - } - interface MusicManager$MusicFrequency extends kotlin.Enum, net.minecraft.util.StringRepresentable { - caption(): net.minecraft.network.chat.Component; - } - } - namespace tutorial { - const TutorialSteps: { - MOVEMENT: net.minecraft.client.tutorial.TutorialSteps; - FIND_TREE: net.minecraft.client.tutorial.TutorialSteps; - PUNCH_TREE: net.minecraft.client.tutorial.TutorialSteps; - OPEN_INVENTORY: net.minecraft.client.tutorial.TutorialSteps; - CRAFT_PLANKS: net.minecraft.client.tutorial.TutorialSteps; - NONE: net.minecraft.client.tutorial.TutorialSteps; - entries: kotlin.enums.EnumEntries; - getByName(name: string): net.minecraft.client.tutorial.TutorialSteps; - values(): Array; - valueOf(value: string): net.minecraft.client.tutorial.TutorialSteps; - } - interface TutorialSteps extends kotlin.Enum { - create(tutorial: net.minecraft.client.tutorial.Tutorial): net.minecraft.client.tutorial.TutorialStepInstance; - getName(): string; + interface TelemetryPropertyMap$Builder { + put(property: net.minecraft.client.telemetry.TelemetryProperty, value: T): net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; + putIfNotNull(property: net.minecraft.client.telemetry.TelemetryProperty, value: T): net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; + putAll(properties: net.minecraft.client.telemetry.TelemetryPropertyMap): net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; + build(): net.minecraft.client.telemetry.TelemetryPropertyMap; } - const Tutorial: { - new(minecraft: net.minecraft.client.Minecraft, options: net.minecraft.client.Options): net.minecraft.client.tutorial.Tutorial; - key(name: string): net.minecraft.network.chat.Component; + interface TelemetryEventType$Builder { + defineAll(properties: Array>): net.minecraft.client.telemetry.TelemetryEventType$Builder; + define(property: net.minecraft.client.telemetry.TelemetryProperty): net.minecraft.client.telemetry.TelemetryEventType$Builder; + optIn(): net.minecraft.client.telemetry.TelemetryEventType$Builder; + register(): net.minecraft.client.telemetry.TelemetryEventType; } - interface Tutorial { - onInput(input: net.minecraft.client.player.ClientInput): void; - onMouse(xd: number, yd: number): void; - onLookAt(level: net.minecraft.client.multiplayer.ClientLevel | null | undefined, hit: net.minecraft.world.phys.HitResult | null | undefined): void; - onDestroyBlock(level: net.minecraft.client.multiplayer.ClientLevel, pos: net.minecraft.core.BlockPos, state: net.minecraft.world.level.block.state.BlockState, percent: number): void; - onOpenInventory(): void; - onGetItem(itemStack: net.minecraft.world.item.ItemStack): void; - stop(): void; - start(): void; - tick(): void; - setStep(step: net.minecraft.client.tutorial.TutorialSteps): void; - getMinecraft(): net.minecraft.client.Minecraft; - isSurvival(): boolean; - onInventoryAction(itemCarried: net.minecraft.world.item.ItemStack, itemInSlot: net.minecraft.world.item.ItemStack, clickAction: net.minecraft.world.inventory.ClickAction): void; + const ClientTelemetryManager: { + new(minecraft: net.minecraft.client.Minecraft, userApiService: com.mojang.authlib.minecraft.UserApiService, user: net.minecraft.client.User): net.minecraft.client.telemetry.ClientTelemetryManager; } - interface TutorialStepInstance { - clear(): void; - tick(): void; - onInput(input: net.minecraft.client.player.ClientInput): void; - onMouse(xd: number, yd: number): void; - onLookAt(level: net.minecraft.client.multiplayer.ClientLevel, hit: net.minecraft.world.phys.HitResult): void; - onDestroyBlock(level: net.minecraft.client.multiplayer.ClientLevel, pos: net.minecraft.core.BlockPos, state: net.minecraft.world.level.block.state.BlockState, percent: number): void; - onOpenInventory(): void; - onGetItem(itemStack: net.minecraft.world.item.ItemStack): void; + interface ClientTelemetryManager extends java.lang.AutoCloseable { + createWorldSessionManager(newWorld: boolean, worldLoadDuration: java.time.Duration | null | undefined, minigameName: string | null | undefined, sessionId: java.util.UUID): net.minecraft.client.telemetry.WorldSessionTelemetryManager; + getOutsideSessionSender(): net.minecraft.client.telemetry.TelemetryEventSender; + getLogDirectory(): java.nio.file.Path; } } namespace player { @@ -16312,22 +16399,6 @@ declare global { isEmpty(): boolean; } } - const ClientInput: { - new(): net.minecraft.client.player.ClientInput; - } - interface ClientInput { - keyPresses: net.minecraft.world.entity.player.Input; - tick(): void; - getMoveVector(): net.minecraft.world.phys.Vec2; - hasForwardImpulse(): boolean; - makeJump(): void; - } - const AbstractClientPlayer: { - new(level: net.minecraft.client.multiplayer.ClientLevel, gameProfile: com.mojang.authlib.GameProfile): net.minecraft.client.player.AbstractClientPlayer; - } - interface AbstractClientPlayer extends net.minecraft.world.entity.player.Player, net.minecraft.client.entity.ClientAvatarEntity { - getFieldOfViewModifier(firstPerson: boolean, effectScale: number): number; - } const LocalPlayer: { LOGGER: org.slf4j.Logger; new(minecraft: net.minecraft.client.Minecraft, level: net.minecraft.client.multiplayer.ClientLevel, connection: net.minecraft.client.multiplayer.ClientPacketListener, stats: net.minecraft.stats.StatsCounter, recipeBook: net.minecraft.client.ClientRecipeBook, lastSentInput: net.minecraft.world.entity.player.Input, wasSprinting: boolean, chatAbilities: net.minecraft.client.multiplayer.chat.ChatAbilities): net.minecraft.client.player.LocalPlayer; @@ -16372,6 +16443,22 @@ declare global { getLastSentInput(): net.minecraft.world.entity.player.Input; raycastHitResult(a: number, cameraEntity: net.minecraft.world.entity.Entity): net.minecraft.world.phys.HitResult; } + const AbstractClientPlayer: { + new(level: net.minecraft.client.multiplayer.ClientLevel, gameProfile: com.mojang.authlib.GameProfile): net.minecraft.client.player.AbstractClientPlayer; + } + interface AbstractClientPlayer extends net.minecraft.world.entity.player.Player, net.minecraft.client.entity.ClientAvatarEntity { + getFieldOfViewModifier(firstPerson: boolean, effectScale: number): number; + } + const ClientInput: { + new(): net.minecraft.client.player.ClientInput; + } + interface ClientInput { + keyPresses: net.minecraft.world.entity.player.Input; + tick(): void; + getMoveVector(): net.minecraft.world.phys.Vec2; + hasForwardImpulse(): boolean; + makeJump(): void; + } } namespace entity { interface ClientAvatarEntity { @@ -16397,240 +16484,254 @@ declare global { getInterpolatedWalkDistance(partialTicks: number): number; } } - namespace particle { - const ParticleEngine: { - new(level: net.minecraft.client.multiplayer.ClientLevel, resourceManager: net.minecraft.client.particle.ParticleResources): net.minecraft.client.particle.ParticleEngine; + namespace searchtree { + const SearchTree: { + empty(): net.minecraft.client.searchtree.SearchTree; + plainText(elements: Array, idGetter: unknown): net.minecraft.client.searchtree.SearchTree; } - interface ParticleEngine { - createTrackingEmitter(entity: net.minecraft.world.entity.Entity, particle: net.minecraft.core.particles.ParticleOptions): void; - createTrackingEmitter(entity: net.minecraft.world.entity.Entity, particle: net.minecraft.core.particles.ParticleOptions, lifeTime: number): void; - createParticle(options: net.minecraft.core.particles.ParticleOptions, x: number, y: number, z: number, xa: number, ya: number, za: number): net.minecraft.client.particle.Particle | null | undefined; - add(p: net.minecraft.client.particle.Particle): void; - tick(): void; - extract(particlesRenderState: net.minecraft.client.renderer.state.level.ParticlesRenderState, frustum: net.minecraft.client.renderer.culling.Frustum, camera: net.minecraft.client.Camera, partialTickTime: number): void; - setLevel(level: net.minecraft.client.multiplayer.ClientLevel | null | undefined): void; - countParticles(): string; - clearParticles(): void; + interface SearchTree { + search(text: string): Array; + (text: string): Array; } - const Particle: { - LifetimeAlpha: typeof net.minecraft.client.particle.Particle$LifetimeAlpha; - new(level: net.minecraft.client.multiplayer.ClientLevel, x: number, y: number, z: number, xa: number, ya: number, za: number): net.minecraft.client.particle.Particle; + } + namespace waypoints { + const ClientWaypointManager: { + new(): net.minecraft.client.waypoints.ClientWaypointManager; } - interface Particle { - setPower(power: number): net.minecraft.client.particle.Particle; - setParticleSpeed(xd: number, yd: number, zd: number): void; - scale(scale: number): net.minecraft.client.particle.Particle; - setLifetime(lifetime: number): void; - getLifetime(): number; - tick(): void; - getGroup(): net.minecraft.client.particle.ParticleRenderType; - remove(): void; - setPos(x: number, y: number, z: number): void; - move(xa: number, ya: number, za: number): void; - isAlive(): boolean; - getBoundingBox(): net.minecraft.world.phys.AABB; - setBoundingBox(bb: net.minecraft.world.phys.AABB): void; - getParticleLimit(): java.util.Optional; + interface ClientWaypointManager extends net.minecraft.world.waypoints.TrackedWaypointManager { + hasWaypoints(): boolean; + forEachWaypoint(fromEntity: net.minecraft.world.entity.Entity, consumer: unknown): void; } - const ParticleRenderType: { - SINGLE_QUADS: net.minecraft.client.particle.ParticleRenderType; - ITEM_PICKUP: net.minecraft.client.particle.ParticleRenderType; - ELDER_GUARDIANS: net.minecraft.client.particle.ParticleRenderType; - NO_RENDER: net.minecraft.client.particle.ParticleRenderType; - new(name: string): net.minecraft.client.particle.ParticleRenderType; + } + namespace sounds { + const SoundManager: { + EMPTY_SOUND_LOCATION: net.minecraft.resources.Identifier; + EMPTY_SOUND: net.minecraft.client.resources.sounds.Sound; + INTENTIONALLY_EMPTY_SOUND_LOCATION: net.minecraft.resources.Identifier; + INTENTIONALLY_EMPTY_SOUND_EVENT: net.minecraft.client.sounds.WeighedSoundEvents; + INTENTIONALLY_EMPTY_SOUND: net.minecraft.client.resources.sounds.Sound; + new(options: net.minecraft.client.Options): net.minecraft.client.sounds.SoundManager; } - interface ParticleRenderType extends java.lang.Record { - name(): string; + interface SoundManager extends net.minecraft.server.packs.resources.SimplePreparableReloadListener { + getAvailableSoundDevices(): Array; + getListenerTransform(): com.mojang.blaze3d.audio.ListenerTransform; + getSoundEvent(location: net.minecraft.resources.Identifier): net.minecraft.client.sounds.WeighedSoundEvents | null | undefined; + getAvailableSounds(): Array; + queueTickingSound(instance: net.minecraft.client.resources.sounds.TickableSoundInstance): void; + play(instance: net.minecraft.client.resources.sounds.SoundInstance): net.minecraft.client.sounds.SoundEngine$PlayResult; + playDelayed(instance: net.minecraft.client.resources.sounds.SoundInstance, delay: number): void; + updateSource(camera: net.minecraft.client.Camera): void; + pauseAllExcept(ignoredSources: net.minecraft.sounds.SoundSource): void; + stop(): void; + stop(soundInstance: net.minecraft.client.resources.sounds.SoundInstance): void; + stop(sound: net.minecraft.resources.Identifier | null | undefined, source: net.minecraft.sounds.SoundSource | null | undefined): void; + destroy(): void; + emergencyShutdown(): void; + tick(paused: boolean): void; + resume(): void; + refreshCategoryVolume(category: net.minecraft.sounds.SoundSource): void; + updateCategoryVolume(source: net.minecraft.sounds.SoundSource, gain: number): void; + isActive(instance: net.minecraft.client.resources.sounds.SoundInstance): boolean; + addListener(listener: net.minecraft.client.sounds.SoundEventListener): void; + removeListener(listener: net.minecraft.client.sounds.SoundEventListener): void; + getChannelDebugString(): string; + getSoundCacheDebugStats(output: net.minecraft.client.sounds.SoundBufferLibrary$DebugOutput): void; + reload(): void; } - const Particle$LifetimeAlpha: { - ALWAYS_OPAQUE: net.minecraft.client.particle.Particle$LifetimeAlpha; - new(startAlpha: number, endAlpha: number, startAtNormalizedAge: number, endAtNormalizedAge: number): net.minecraft.client.particle.Particle$LifetimeAlpha; + const WeighedSoundEvents: { + new(location: net.minecraft.resources.Identifier, subtitle: string | null | undefined): net.minecraft.client.sounds.WeighedSoundEvents; } - interface Particle$LifetimeAlpha extends java.lang.Record { - isOpaque(): boolean; - currentAlphaForAge(age: number, lifetime: number, partialTickTime: number): number; - startAlpha(): number; - endAlpha(): number; - startAtNormalizedAge(): number; - endAtNormalizedAge(): number; + interface WeighedSoundEvents extends net.minecraft.client.sounds.Weighted { + addSound(sound: net.minecraft.client.sounds.Weighted): void; + getSubtitle(): net.minecraft.network.chat.Component | null | undefined; } - const ParticleResources: { - new(): net.minecraft.client.particle.ParticleResources; + interface Weighted { + getWeight(): number; + getSound(random: net.minecraft.util.RandomSource): T; + preloadIfRequired(soundEngine: net.minecraft.client.sounds.SoundEngine): void; } - interface ParticleResources extends net.minecraft.server.packs.resources.PreparableReloadListener { - onReload(onReload: java.lang.Runnable): void; - getProviders(): it.unimi.dsi.fastutil.ints.Int2ObjectMap; + const SoundEngine: { + PlayResult: typeof net.minecraft.client.sounds.SoundEngine$PlayResult; + MISSING_SOUND: string; + OPEN_AL_SOFT_PREFIX: string; + OPEN_AL_SOFT_PREFIX_LENGTH: number; + new(soundManager: net.minecraft.client.sounds.SoundManager, options: net.minecraft.client.Options, resourceProvider: net.minecraft.server.packs.resources.ResourceProvider): net.minecraft.client.sounds.SoundEngine; } - } - namespace quickplay { - const QuickPlayLog: { - Type: typeof net.minecraft.client.quickplay.QuickPlayLog$Type; - of(path: string | null | undefined): net.minecraft.client.quickplay.QuickPlayLog; + interface SoundEngine { + reload(): void; + refreshCategoryVolume(source: net.minecraft.sounds.SoundSource): void; + destroy(): void; + emergencyShutdown(): void; + stop(soundInstance: net.minecraft.client.resources.sounds.SoundInstance): void; + stop(sound: net.minecraft.resources.Identifier | null | undefined, source: net.minecraft.sounds.SoundSource | null | undefined): void; + updateCategoryVolume(source: net.minecraft.sounds.SoundSource, gain: number): void; + stopAll(): void; + addEventListener(listener: net.minecraft.client.sounds.SoundEventListener): void; + removeEventListener(listener: net.minecraft.client.sounds.SoundEventListener): void; + tick(paused: boolean): void; + isActive(instance: net.minecraft.client.resources.sounds.SoundInstance): boolean; + play(instance: net.minecraft.client.resources.sounds.SoundInstance): net.minecraft.client.sounds.SoundEngine$PlayResult; + queueTickingSound(tickableSoundInstance: net.minecraft.client.resources.sounds.TickableSoundInstance): void; + requestPreload(sound: net.minecraft.client.resources.sounds.Sound): void; + pauseAllExcept(ignoredSources: net.minecraft.sounds.SoundSource): void; + resume(): void; + playDelayed(instance: net.minecraft.client.resources.sounds.SoundInstance, delay: number): void; + updateSource(camera: net.minecraft.client.Camera): void; + getChannelDebugString(): string; + getSoundCacheDebugStats(output: net.minecraft.client.sounds.SoundBufferLibrary$DebugOutput): void; + getAvailableSoundDevices(): Array; + getListenerTransform(): com.mojang.blaze3d.audio.ListenerTransform; } - interface QuickPlayLog { - setWorldData(type: net.minecraft.client.quickplay.QuickPlayLog$Type, id: string, name: string): void; - log(minecraft: net.minecraft.client.Minecraft): void; + const SoundBufferLibrary: { + new(resourceProvider: net.minecraft.server.packs.resources.ResourceProvider): net.minecraft.client.sounds.SoundBufferLibrary; } - const QuickPlayLog$Type: { - SINGLEPLAYER: net.minecraft.client.quickplay.QuickPlayLog$Type; - MULTIPLAYER: net.minecraft.client.quickplay.QuickPlayLog$Type; - REALMS: net.minecraft.client.quickplay.QuickPlayLog$Type; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.client.quickplay.QuickPlayLog$Type; + interface SoundBufferLibrary { + getCompleteBuffer(location: net.minecraft.resources.Identifier): java.util.concurrent.CompletableFuture; + getStream(location: net.minecraft.resources.Identifier, looping: boolean): java.util.concurrent.CompletableFuture; + clear(): void; + preload(sounds: Array): java.util.concurrent.CompletableFuture; + enumerate(debugOutput: net.minecraft.client.sounds.SoundBufferLibrary$DebugOutput): void; } - interface QuickPlayLog$Type extends kotlin.Enum, net.minecraft.util.StringRepresentable { + const SoundBufferLibrary$DebugOutput: { + Counter: typeof net.minecraft.client.sounds.SoundBufferLibrary.SoundBufferLibrary$DebugOutput$Counter; } - } - namespace telemetry { - const ClientTelemetryManager: { - new(minecraft: net.minecraft.client.Minecraft, userApiService: com.mojang.authlib.minecraft.UserApiService, user: net.minecraft.client.User): net.minecraft.client.telemetry.ClientTelemetryManager; + interface SoundBufferLibrary$DebugOutput { + accountBuffer(id: net.minecraft.resources.Identifier, size: number, format: javax.sound.sampled.AudioFormat): void; } - interface ClientTelemetryManager extends java.lang.AutoCloseable { - createWorldSessionManager(newWorld: boolean, worldLoadDuration: java.time.Duration | null | undefined, minigameName: string | null | undefined): net.minecraft.client.telemetry.WorldSessionTelemetryManager; - getOutsideSessionSender(): net.minecraft.client.telemetry.TelemetryEventSender; - getLogDirectory(): java.nio.file.Path; + const SoundBufferLibrary$DebugOutput$Counter: { + new(): unknown; } - const WorldSessionTelemetryManager: { - new(eventSender: net.minecraft.client.telemetry.TelemetryEventSender, newWorld: boolean, worldLoadDuration: java.time.Duration | null | undefined, minigameName: string | null | undefined): net.minecraft.client.telemetry.WorldSessionTelemetryManager; + interface SoundBufferLibrary$DebugOutput$Counter extends net.minecraft.client.sounds.SoundBufferLibrary$DebugOutput { + totalCount(): number; + totalSize(): number; } - interface WorldSessionTelemetryManager { - tick(): void; - onPlayerInfoReceived(type: net.minecraft.world.level.GameType, hardcore: boolean): void; - onServerBrandReceived(serverBrand: string): void; - setTime(gameTime: number): void; - worldSessionStart(): void; - onDisconnect(): void; - onAdvancementDone(level: net.minecraft.world.level.Level, holder: net.minecraft.advancements.AdvancementHolder): void; + interface SoundEventListener { + onPlaySound(sound: net.minecraft.client.resources.sounds.SoundInstance, soundEvent: net.minecraft.client.sounds.WeighedSoundEvents, range: number): void; } - const TelemetryEventSender: { - DISABLED: net.minecraft.client.telemetry.TelemetryEventSender; + const SoundEngine$PlayResult: { + STARTED: net.minecraft.client.sounds.SoundEngine$PlayResult; + STARTED_SILENTLY: net.minecraft.client.sounds.SoundEngine$PlayResult; + NOT_STARTED: net.minecraft.client.sounds.SoundEngine$PlayResult; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.sounds.SoundEngine$PlayResult; } - interface TelemetryEventSender { - decorate(decorator: unknown): net.minecraft.client.telemetry.TelemetryEventSender; - send(type: net.minecraft.client.telemetry.TelemetryEventType, buildFunction: unknown): void; - (type: net.minecraft.client.telemetry.TelemetryEventType, buildFunction: unknown): void; + interface SoundEngine$PlayResult extends kotlin.Enum { } - const TelemetryEventType: { - Builder: typeof net.minecraft.client.telemetry.TelemetryEventType$Builder; - CODEC: com.mojang.serialization.Codec; - WORLD_LOADED: net.minecraft.client.telemetry.TelemetryEventType; - PERFORMANCE_METRICS: net.minecraft.client.telemetry.TelemetryEventType; - WORLD_LOAD_TIMES: net.minecraft.client.telemetry.TelemetryEventType; - WORLD_UNLOADED: net.minecraft.client.telemetry.TelemetryEventType; - ADVANCEMENT_MADE: net.minecraft.client.telemetry.TelemetryEventType; - GAME_LOAD_TIMES: net.minecraft.client.telemetry.TelemetryEventType; - builder(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryEventType$Builder; - values(): Array; + const MusicManager: { + MusicFrequency: typeof net.minecraft.client.sounds.MusicManager$MusicFrequency; + new(minecraft: net.minecraft.client.Minecraft): net.minecraft.client.sounds.MusicManager; } - interface TelemetryEventType { - id(): string; - properties(): Array>; - isOptIn(): boolean; - codec(): com.mojang.serialization.MapCodec; - contains(property: net.minecraft.client.telemetry.TelemetryProperty): boolean; - title(): net.minecraft.network.chat.MutableComponent; - description(): net.minecraft.network.chat.MutableComponent; + interface MusicManager { + tick(): void; + startPlaying(music: net.minecraft.sounds.Music): void; + showNowPlayingToastIfNeeded(): void; + stopPlaying(music: net.minecraft.sounds.Music): void; + stopPlaying(): void; + isPlayingMusic(music: net.minecraft.sounds.Music): boolean; + getCurrentMusicTranslationKey(): string | null | undefined; + setMinutesBetweenSongs(musicFrequency: net.minecraft.client.sounds.MusicManager$MusicFrequency): void; } - const TelemetryPropertyMap: { - Builder: typeof net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; - builder(): net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; - createCodec(properties: Array>): com.mojang.serialization.MapCodec; + const MusicManager$MusicFrequency: { + DEFAULT: net.minecraft.client.sounds.MusicManager$MusicFrequency; + FREQUENT: net.minecraft.client.sounds.MusicManager$MusicFrequency; + CONSTANT: net.minecraft.client.sounds.MusicManager$MusicFrequency; + CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.sounds.MusicManager$MusicFrequency; } - interface TelemetryPropertyMap { - get(property: net.minecraft.client.telemetry.TelemetryProperty): T; - propertySet(): Set>; + interface MusicManager$MusicFrequency extends kotlin.Enum, net.minecraft.util.StringRepresentable { + caption(): net.minecraft.network.chat.Component; } - const TelemetryProperty: { - GameMode: typeof net.minecraft.client.telemetry.TelemetryProperty$GameMode; - ServerType: typeof net.minecraft.client.telemetry.TelemetryProperty$ServerType; - USER_ID: net.minecraft.client.telemetry.TelemetryProperty; - CLIENT_ID: net.minecraft.client.telemetry.TelemetryProperty; - MINECRAFT_SESSION_ID: net.minecraft.client.telemetry.TelemetryProperty; - GAME_VERSION: net.minecraft.client.telemetry.TelemetryProperty; - OPERATING_SYSTEM: net.minecraft.client.telemetry.TelemetryProperty; - PLATFORM: net.minecraft.client.telemetry.TelemetryProperty; - CLIENT_MODDED: net.minecraft.client.telemetry.TelemetryProperty; - LAUNCHER_NAME: net.minecraft.client.telemetry.TelemetryProperty; - WORLD_SESSION_ID: net.minecraft.client.telemetry.TelemetryProperty; - SERVER_MODDED: net.minecraft.client.telemetry.TelemetryProperty; - SERVER_TYPE: net.minecraft.client.telemetry.TelemetryProperty; - OPT_IN: net.minecraft.client.telemetry.TelemetryProperty; - EVENT_TIMESTAMP_UTC: net.minecraft.client.telemetry.TelemetryProperty; - GAME_MODE: net.minecraft.client.telemetry.TelemetryProperty; - REALMS_MAP_CONTENT: net.minecraft.client.telemetry.TelemetryProperty; - SECONDS_SINCE_LOAD: net.minecraft.client.telemetry.TelemetryProperty; - TICKS_SINCE_LOAD: net.minecraft.client.telemetry.TelemetryProperty; - FRAME_RATE_SAMPLES: net.minecraft.client.telemetry.TelemetryProperty; - RENDER_TIME_SAMPLES: net.minecraft.client.telemetry.TelemetryProperty; - USED_MEMORY_SAMPLES: net.minecraft.client.telemetry.TelemetryProperty; - NUMBER_OF_SAMPLES: net.minecraft.client.telemetry.TelemetryProperty; - RENDER_DISTANCE: net.minecraft.client.telemetry.TelemetryProperty; - DEDICATED_MEMORY_KB: net.minecraft.client.telemetry.TelemetryProperty; - WORLD_LOAD_TIME_MS: net.minecraft.client.telemetry.TelemetryProperty; - NEW_WORLD: net.minecraft.client.telemetry.TelemetryProperty; - LOAD_TIME_TOTAL_TIME_MS: net.minecraft.client.telemetry.TelemetryProperty; - LOAD_TIME_PRE_WINDOW_MS: net.minecraft.client.telemetry.TelemetryProperty; - LOAD_TIME_BOOTSTRAP_MS: net.minecraft.client.telemetry.TelemetryProperty; - LOAD_TIME_LOADING_OVERLAY_MS: net.minecraft.client.telemetry.TelemetryProperty; - ADVANCEMENT_ID: net.minecraft.client.telemetry.TelemetryProperty; - ADVANCEMENT_GAME_TIME: net.minecraft.client.telemetry.TelemetryProperty; - new(id: string, exportKey: string, codec: com.mojang.serialization.Codec, exporter: net.minecraft.client.telemetry.TelemetryProperty$Exporter): net.minecraft.client.telemetry.TelemetryProperty; - create(id: string, exportKey: string, codec: com.mojang.serialization.Codec, exporter: net.minecraft.client.telemetry.TelemetryProperty$Exporter): net.minecraft.client.telemetry.TelemetryProperty; - bool(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; - string(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; - integer(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; - makeLong(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; - uuid(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; - gameLoadMeasurement(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; - longSamples(id: string, exportKey: string): net.minecraft.client.telemetry.TelemetryProperty; + } + namespace tutorial { + const TutorialSteps: { + MOVEMENT: net.minecraft.client.tutorial.TutorialSteps; + FIND_TREE: net.minecraft.client.tutorial.TutorialSteps; + PUNCH_TREE: net.minecraft.client.tutorial.TutorialSteps; + OPEN_INVENTORY: net.minecraft.client.tutorial.TutorialSteps; + CRAFT_PLANKS: net.minecraft.client.tutorial.TutorialSteps; + NONE: net.minecraft.client.tutorial.TutorialSteps; + entries: kotlin.enums.EnumEntries; + getByName(name: string): net.minecraft.client.tutorial.TutorialSteps; + values(): Array; + valueOf(value: string): net.minecraft.client.tutorial.TutorialSteps; } - interface TelemetryProperty extends java.lang.Record { - title(): net.minecraft.network.chat.MutableComponent; - id(): string; - exportKey(): string; - codec(): com.mojang.serialization.Codec; - exporter(): net.minecraft.client.telemetry.TelemetryProperty$Exporter; + interface TutorialSteps extends kotlin.Enum { + create(tutorial: net.minecraft.client.tutorial.Tutorial): net.minecraft.client.tutorial.TutorialStepInstance; + getName(): string; } - interface TelemetryProperty$Exporter { - apply(output: com.mojang.authlib.minecraft.TelemetryPropertyContainer, key: string, value: T): void; + const Tutorial: { + new(minecraft: net.minecraft.client.Minecraft, options: net.minecraft.client.Options): net.minecraft.client.tutorial.Tutorial; + key(name: string): net.minecraft.network.chat.Component; } - const TelemetryProperty$GameMode: { - SURVIVAL: net.minecraft.client.telemetry.TelemetryProperty$GameMode; - CREATIVE: net.minecraft.client.telemetry.TelemetryProperty$GameMode; - ADVENTURE: net.minecraft.client.telemetry.TelemetryProperty$GameMode; - SPECTATOR: net.minecraft.client.telemetry.TelemetryProperty$GameMode; - HARDCORE: net.minecraft.client.telemetry.TelemetryProperty$GameMode; - CODEC: com.mojang.serialization.Codec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.client.telemetry.TelemetryProperty$GameMode; + interface Tutorial { + onInput(input: net.minecraft.client.player.ClientInput): void; + onMouse(xd: number, yd: number): void; + onLookAt(level: net.minecraft.client.multiplayer.ClientLevel | null | undefined, hit: net.minecraft.world.phys.HitResult | null | undefined): void; + onDestroyBlock(level: net.minecraft.client.multiplayer.ClientLevel, pos: net.minecraft.core.BlockPos, state: net.minecraft.world.level.block.state.BlockState, percent: number): void; + onOpenInventory(): void; + onGetItem(itemStack: net.minecraft.world.item.ItemStack): void; + stop(): void; + start(): void; + tick(): void; + setStep(step: net.minecraft.client.tutorial.TutorialSteps): void; + getMinecraft(): net.minecraft.client.Minecraft; + isSurvival(): boolean; + onInventoryAction(itemCarried: net.minecraft.world.item.ItemStack, itemInSlot: net.minecraft.world.item.ItemStack, clickAction: net.minecraft.world.inventory.ClickAction): void; } - interface TelemetryProperty$GameMode extends kotlin.Enum, net.minecraft.util.StringRepresentable { - id(): number; + interface TutorialStepInstance { + clear(): void; + tick(): void; + onInput(input: net.minecraft.client.player.ClientInput): void; + onMouse(xd: number, yd: number): void; + onLookAt(level: net.minecraft.client.multiplayer.ClientLevel, hit: net.minecraft.world.phys.HitResult): void; + onDestroyBlock(level: net.minecraft.client.multiplayer.ClientLevel, pos: net.minecraft.core.BlockPos, state: net.minecraft.world.level.block.state.BlockState, percent: number): void; + onOpenInventory(): void; + onGetItem(itemStack: net.minecraft.world.item.ItemStack): void; } - const TelemetryProperty$ServerType: { - REALM: net.minecraft.client.telemetry.TelemetryProperty$ServerType; - LOCAL: net.minecraft.client.telemetry.TelemetryProperty$ServerType; - OTHER: net.minecraft.client.telemetry.TelemetryProperty$ServerType; - CODEC: com.mojang.serialization.Codec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.client.telemetry.TelemetryProperty$ServerType; + } + namespace color { + namespace block { + const BlockColors: { + LILY_PAD_IN_WORLD: number; + LILY_PAD_DEFAULT: number; + new(): net.minecraft.client.color.block.BlockColors; + createDefault(): net.minecraft.client.color.block.BlockColors; + } + interface BlockColors { + getTintSources(state: net.minecraft.world.level.block.state.BlockState): Array; + getTintSource(state: net.minecraft.world.level.block.state.BlockState, layer: number): net.minecraft.client.color.block.BlockTintSource | null | undefined; + register(layers: Array, blocks: net.minecraft.world.level.block.Block): void; + getColoringProperties(block: net.minecraft.world.level.block.Block): Set>; + } + interface BlockTintSource { + color(state: net.minecraft.world.level.block.state.BlockState): number; + colorInWorld(state: net.minecraft.world.level.block.state.BlockState, level: net.minecraft.client.renderer.block.BlockAndTintGetter, pos: net.minecraft.core.BlockPos): number; + colorAsTerrainParticle(state: net.minecraft.world.level.block.state.BlockState, level: net.minecraft.client.renderer.block.BlockAndTintGetter, pos: net.minecraft.core.BlockPos): number; + relevantProperties(): Set>; + } } - interface TelemetryProperty$ServerType extends kotlin.Enum, net.minecraft.util.StringRepresentable { + } + namespace quickplay { + const QuickPlayLog: { + Type: typeof net.minecraft.client.quickplay.QuickPlayLog$Type; + of(path: string | null | undefined): net.minecraft.client.quickplay.QuickPlayLog; } - interface TelemetryPropertyMap$Builder { - put(property: net.minecraft.client.telemetry.TelemetryProperty, value: T): net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; - putIfNotNull(property: net.minecraft.client.telemetry.TelemetryProperty, value: T): net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; - putAll(properties: net.minecraft.client.telemetry.TelemetryPropertyMap): net.minecraft.client.telemetry.TelemetryPropertyMap$Builder; - build(): net.minecraft.client.telemetry.TelemetryPropertyMap; + interface QuickPlayLog { + setWorldData(type: net.minecraft.client.quickplay.QuickPlayLog$Type, id: string, name: string): void; + log(minecraft: net.minecraft.client.Minecraft): void; } - interface TelemetryEventType$Builder { - defineAll(properties: Array>): net.minecraft.client.telemetry.TelemetryEventType$Builder; - define(property: net.minecraft.client.telemetry.TelemetryProperty): net.minecraft.client.telemetry.TelemetryEventType$Builder; - optIn(): net.minecraft.client.telemetry.TelemetryEventType$Builder; - register(): net.minecraft.client.telemetry.TelemetryEventType; + const QuickPlayLog$Type: { + SINGLEPLAYER: net.minecraft.client.quickplay.QuickPlayLog$Type; + MULTIPLAYER: net.minecraft.client.quickplay.QuickPlayLog$Type; + REALMS: net.minecraft.client.quickplay.QuickPlayLog$Type; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.quickplay.QuickPlayLog$Type; + } + interface QuickPlayLog$Type extends kotlin.Enum, net.minecraft.util.StringRepresentable { } } namespace server { @@ -16639,27 +16740,16 @@ declare global { new(serverThread: java.lang.Thread, minecraft: net.minecraft.client.Minecraft, levelStorageAccess: net.minecraft.world.level.storage.LevelStorageSource$LevelStorageAccess, packRepository: net.minecraft.server.packs.repository.PackRepository, worldStem: net.minecraft.server.WorldStem, gameRules: java.util.Optional, services: net.minecraft.server.Services, levelLoadListener: net.minecraft.server.level.progress.LevelLoadListener): net.minecraft.client.server.IntegratedServer; } interface IntegratedServer extends net.minecraft.server.MinecraftServer { + commandsAllowedForOtherPlayers(): boolean; + publishServer(scope: net.minecraft.server.MinecraftServer$MultiplayerScope, port: number): boolean; + setWorldGameType(gameMode: net.minecraft.world.level.GameType): void; + getGameTypeForOtherPlayers(): net.minecraft.world.level.GameType; + setGameTypeForOtherPlayers(gameMode: net.minecraft.world.level.GameType): void; + setWorldAllowCommands(allowCommands: boolean): void; + setCommandsAllowedForOtherPlayers(allowCommands: boolean): void; setUUID(uuid: java.util.UUID): void; getPerTickGizmos(): Array; - } - } - namespace searchtree { - const SearchTree: { - empty(): net.minecraft.client.searchtree.SearchTree; - plainText(elements: Array, idGetter: unknown): net.minecraft.client.searchtree.SearchTree; - } - interface SearchTree { - search(text: string): Array; - (text: string): Array; - } - } - namespace waypoints { - const ClientWaypointManager: { - new(): net.minecraft.client.waypoints.ClientWaypointManager; - } - interface ClientWaypointManager extends net.minecraft.world.waypoints.TrackedWaypointManager { - hasWaypoints(): boolean; - forEachWaypoint(fromEntity: net.minecraft.world.entity.Entity, consumer: unknown): void; + getMultiplayerScope(): net.minecraft.server.MinecraftServer$MultiplayerScope; } } const KeyMapping: { @@ -16687,6 +16777,7 @@ declare global { same(that: net.minecraft.client.KeyMapping): boolean; isUnbound(): boolean; matches(event: net.minecraft.client.input.KeyEvent): boolean; + matches(key: com.mojang.blaze3d.platform.InputConstants$Key): boolean; matchesMouse(event: net.minecraft.client.input.MouseButtonEvent): boolean; getTranslatedKeyMessage(): net.minecraft.network.chat.Component; isDefault(): boolean; @@ -16735,31 +16826,22 @@ declare global { getWidth(codepoint: number, style: net.minecraft.network.chat.Style): number; (codepoint: number, style: net.minecraft.network.chat.Style): number; } - const ClientClockManager: { - new(): net.minecraft.client.ClientClockManager; - } - interface ClientClockManager extends net.minecraft.world.clock.ClockManager { - tick(gameTime: number): void; - handleUpdates(gameTime: number, updates: Map, unknown>): void; - } const Minecraft: { DEFAULT_FONT: net.minecraft.resources.Identifier; - UNIFORM_FONT: net.minecraft.resources.Identifier; - ALT_FONT: net.minecraft.resources.Identifier; UPDATE_DRIVERS_ADVICE: string; new(gameConfig: net.minecraft.client.main.GameConfig): net.minecraft.client.Minecraft; checkModStatus(): net.minecraft.util.ModCheck; - saveReport(gameDirectory: java.io.File, crash: net.minecraft.CrashReport): number; - crash(minecraft: net.minecraft.client.Minecraft | null | undefined, gameDirectory: java.io.File, crash: net.minecraft.CrashReport): void; - renderNames(): boolean; - useShaderTransparency(): boolean; - fillReport(minecraft: net.minecraft.client.Minecraft | null | undefined, languageManager: net.minecraft.client.resources.language.LanguageManager | null | undefined, launchedVersion: string, options: net.minecraft.client.Options | null | undefined, report: net.minecraft.CrashReport): void; + saveReport(gameDirectory: java.io.File, crash: net.minecraft.CrashReport): void; + saveReport(gameDirectory: java.io.File, crash: net.minecraft.CrashReport, reportExitCode: number): number; + crash(minecraft: net.minecraft.client.Minecraft | null | undefined, gameDirectory: java.io.File, crash: net.minecraft.CrashReport, exitCode: number): void; + saveReportAndShutdownSoundManager(minecraft: net.minecraft.client.Minecraft | null | undefined, gameDirectory: java.io.File, crash: net.minecraft.CrashReport, exitCode: number): number; + fillReport(minecraft: net.minecraft.client.Minecraft | null | undefined, languageManager: net.minecraft.client.resources.language.LanguageManager | null | undefined, launchedVersion: string | null | undefined, options: net.minecraft.client.Options | null | undefined, report: net.minecraft.CrashReport): void; getInstance(): net.minecraft.client.Minecraft; getLauncherBrand(): string | null | undefined; } interface Minecraft extends net.minecraft.util.thread.ReentrantBlockableEventLoop, com.mojang.blaze3d.platform.WindowEventHandler { + levelExtractor: net.minecraft.client.renderer.extract.LevelExtractor; levelRenderer: net.minecraft.client.renderer.LevelRenderer; - blockModelResolver: net.minecraft.client.renderer.block.BlockModelResolver; particleEngine: net.minecraft.client.particle.ParticleEngine; font: net.minecraft.client.gui.Font; fontFilterFishy: net.minecraft.client.gui.Font; @@ -16776,18 +16858,16 @@ declare global { crosshairPickEntity: net.minecraft.world.entity.Entity | null | undefined; hitResult: net.minecraft.world.phys.HitResult | null | undefined; missTime: number; - screen: net.minecraft.client.gui.screens.Screen | null | undefined; wireframe: boolean; smartCull: boolean; + windowSurface(): com.mojang.blaze3d.systems.GpuSurface; textInputManager(): com.mojang.blaze3d.platform.TextInputManager; - renderBuffers(): net.minecraft.client.renderer.RenderBuffers; allowsMultiplayer(): boolean; realmsDataFetcher(): com.mojang.realmsclient.gui.RealmsDataFetcher; quickPlayLog(): net.minecraft.client.quickplay.QuickPlayLog; services(): net.minecraft.server.Services; playerSkinRenderCache(): net.minecraft.client.renderer.PlayerSkinRenderCache; isLocalServer(): boolean; - commandHistory(): net.minecraft.client.CommandHistory; directoryValidator(): net.minecraft.world.level.validation.DirectoryValidator; packetProcessor(): net.minecraft.network.PacketProcessor; hasShiftDown(): boolean; @@ -16796,20 +16876,16 @@ declare global { isGameLoadFinished(): boolean; updateTitle(): void; isOfflineDeveloperMode(): boolean; - clearResourcePacksOnError(t: kotlin.Throwable, message: net.minecraft.network.chat.Component | null | undefined, loadCookie: unknown): void; + clearResourcePacksOnError(t: kotlin.Throwable, message: net.minecraft.network.chat.Component | null | undefined, loadCookie: net.minecraft.client.GameLoadCookie | null | undefined): void; triggerResourcePackRecovery(exception: java.lang.Exception): void; run(): void; - getMainRenderTarget(): com.mojang.blaze3d.pipeline.RenderTarget; getLaunchedVersion(): string; - getVersionType(): string; emergencySaveAndCrash(partialReport: net.minecraft.CrashReport): void; isEnforceUnicode(): boolean; reloadResourcePacks(): java.util.concurrent.CompletableFuture; getLevelSource(): net.minecraft.world.level.storage.LevelStorageSource; - openChatScreen(chatMethod: net.minecraft.client.gui.components.ChatComponent$ChatMethod): void; - setScreen(screen: net.minecraft.client.gui.screens.Screen | null | undefined): void; - setOverlay(overlay: net.minecraft.client.gui.screens.Overlay | null | undefined): void; - destroy(): void; + exitWorldAndClose(): void; + renderFrame(advanceGameTime: boolean): void; getFps(): number; getFrameTimeNs(): number; sendLowDiskSpaceWarning(): void; @@ -16819,7 +16895,9 @@ declare global { pauseGame(suppressPauseMenuIfWeReallyArePausing: boolean): void; getMusicManager(): net.minecraft.client.sounds.MusicManager; tick(): void; + isMultiplayerServer(): boolean; getTelemetryManager(): net.minecraft.client.telemetry.ClientTelemetryManager; + getMetricsRecorder(): net.minecraft.util.profiling.metrics.profiling.MetricsRecorder; getGpuUtilization(): number; getProfileKeyPairManager(): net.minecraft.client.multiplayer.ProfileKeyPairManager; createWorldOpenFlows(): net.minecraft.client.gui.screens.worldselection.WorldOpenFlows; @@ -16838,9 +16916,14 @@ declare global { extraTelemetryAvailable(): boolean; allowsTelemetry(): boolean; allowsRealms(): boolean; + friendsEnabled(): boolean; + handleGlobalKeyPress(key: com.mojang.blaze3d.platform.InputConstants$Key, controlDown: boolean): boolean; + allowFriendRequests(): boolean; + allowChatOnlyWithFriend(): boolean; multiplayerBan(): com.mojang.authlib.minecraft.BanDetails | null | undefined; isNameBanned(): boolean; isBlocked(uuid: java.util.UUID): boolean; + isFriendOnlyRestricted(uuid: java.util.UUID): boolean; computeChatAbilities(): net.minecraft.client.multiplayer.chat.ChatAbilities; isDemo(): boolean; canSwitchGameMode(): boolean; @@ -16851,9 +16934,9 @@ declare global { getCurrentServer(): net.minecraft.client.multiplayer.ServerData | null | undefined; hasSingleplayerServer(): boolean; getSingleplayerServer(): net.minecraft.client.server.IntegratedServer | null | undefined; - isSingleplayer(): boolean; isLocalPlayer(profileId: java.util.UUID): boolean; getUser(): net.minecraft.client.User; + getProfileResult(): com.mojang.authlib.yggdrasil.ProfileResult | null | undefined; getGameProfile(): com.mojang.authlib.GameProfile; getProxy(): java.net.Proxy; getTextureManager(): net.minecraft.client.renderer.texture.TextureManager; @@ -16880,17 +16963,13 @@ declare global { getDeltaTracker(): net.minecraft.client.DeltaTracker; getBlockColors(): net.minecraft.client.color.block.BlockColors; showOnlyReducedInfo(): boolean; - getToastManager(): net.minecraft.client.gui.components.toasts.ToastManager; getTutorial(): net.minecraft.client.tutorial.Tutorial; isWindowActive(): boolean; getHotbarManager(): net.minecraft.client.HotbarManager; getModelManager(): net.minecraft.client.resources.model.ModelManager; getAtlasManager(): net.minecraft.client.resources.model.sprite.AtlasManager; getMapTextureManager(): net.minecraft.client.resources.MapTextureManager; - getWaypointStyles(): net.minecraft.client.resources.WaypointStyleManager; grabPanoramixScreenshot(folder: java.io.File): net.minecraft.network.chat.Component; - getSplashManager(): net.minecraft.client.resources.SplashManager; - getOverlay(): net.minecraft.client.gui.screens.Overlay | null | undefined; getPlayerSocialManager(): net.minecraft.client.gui.screens.social.PlayerSocialManager; getWindow(): com.mojang.blaze3d.platform.Window; onTextInputFocusChange(element: net.minecraft.client.gui.components.events.GuiEventListener, isFocused: boolean): void; @@ -16903,12 +16982,35 @@ declare global { getLastInputType(): net.minecraft.client.InputType; setLastInputType(lastInputType: net.minecraft.client.InputType): void; getNarrator(): net.minecraft.client.GameNarrator; - getChatListener(): net.minecraft.client.multiplayer.chat.ChatListener; getReportingContext(): net.minecraft.client.multiplayer.chat.report.ReportingContext; getItemModelResolver(): net.minecraft.client.renderer.item.ItemModelResolver; canInterruptScreen(): boolean; + invalidateSurfaceConfiguration(): void; collectPerTickGizmos(): net.minecraft.gizmos.Gizmos$TemporaryCollection; getPerTickGizmos(): Array; + showDebugChat(message: net.minecraft.network.chat.Component): void; + } + const DeltaTracker: { + DefaultValue: typeof net.minecraft.client.DeltaTracker$DefaultValue; + Timer: typeof net.minecraft.client.DeltaTracker$Timer; + ZERO: net.minecraft.client.DeltaTracker; + ONE: net.minecraft.client.DeltaTracker; + } + interface DeltaTracker { + getGameTimeDeltaTicks(): number; + getGameTimeDeltaPartialTick(ignoreFrozenGame: boolean): number; + getRealtimeDeltaTicks(): number; + } + interface DeltaTracker$DefaultValue extends net.minecraft.client.DeltaTracker { + } + const DeltaTracker$Timer: { + new(ticksPerSecond: number, currentMs: number, targetMsptProvider: it.unimi.dsi.fastutil.floats.FloatUnaryOperator): net.minecraft.client.DeltaTracker$Timer; + } + interface DeltaTracker$Timer extends net.minecraft.client.DeltaTracker { + advanceGameTime(currentMs: number): number; + advanceRealTime(currentMs: number): void; + updatePauseState(pauseState: boolean): void; + updateFrozenState(frozen: boolean): void; } const Camera: { NearPlane: typeof net.minecraft.client.Camera$NearPlane; @@ -16949,28 +17051,6 @@ declare global { enablePanoramicMode(): void; disablePanoramicMode(): void; } - const DeltaTracker: { - DefaultValue: typeof net.minecraft.client.DeltaTracker$DefaultValue; - Timer: typeof net.minecraft.client.DeltaTracker$Timer; - ZERO: net.minecraft.client.DeltaTracker; - ONE: net.minecraft.client.DeltaTracker; - } - interface DeltaTracker { - getGameTimeDeltaTicks(): number; - getGameTimeDeltaPartialTick(ignoreFrozenGame: boolean): number; - getRealtimeDeltaTicks(): number; - } - interface DeltaTracker$DefaultValue extends net.minecraft.client.DeltaTracker { - } - const DeltaTracker$Timer: { - new(ticksPerSecond: number, currentMs: number, targetMsptProvider: it.unimi.dsi.fastutil.floats.FloatUnaryOperator): net.minecraft.client.DeltaTracker$Timer; - } - interface DeltaTracker$Timer extends net.minecraft.client.DeltaTracker { - advanceGameTime(currentMs: number): number; - advanceRealTime(currentMs: number): void; - updatePauseState(pauseState: boolean): void; - updateFrozenState(frozen: boolean): void; - } interface Camera$NearPlane { getTopLeft(): net.minecraft.world.phys.Vec3; getTopRight(): net.minecraft.world.phys.Vec3; @@ -16978,6 +17058,35 @@ declare global { getBottomRight(): net.minecraft.world.phys.Vec3; getPointOnPlane(x: number, y: number): net.minecraft.world.phys.Vec3; } + const ClientClockManager: { + new(): net.minecraft.client.ClientClockManager; + } + interface ClientClockManager extends net.minecraft.world.clock.ClockManager { + tick(gameTime: number): void; + handleUpdates(gameTime: number, updates: Map, unknown>): void; + } + const ClientRecipeBook: { + new(): net.minecraft.client.ClientRecipeBook; + } + interface ClientRecipeBook extends net.minecraft.stats.RecipeBook { + add(display: net.minecraft.world.item.crafting.display.RecipeDisplayEntry): void; + remove(id: net.minecraft.world.item.crafting.display.RecipeDisplayId): void; + clear(): void; + willHighlight(recipe: net.minecraft.world.item.crafting.display.RecipeDisplayId): boolean; + removeHighlight(id: net.minecraft.world.item.crafting.display.RecipeDisplayId): void; + addHighlight(id: net.minecraft.world.item.crafting.display.RecipeDisplayId): void; + rebuildCollections(): void; + getCollections(): Array; + getCollection(category: net.minecraft.world.item.crafting.ExtendedRecipeBookCategory): Array; + } + const DebugQueryHandler: { + new(connection: net.minecraft.client.multiplayer.ClientPacketListener): net.minecraft.client.DebugQueryHandler; + } + interface DebugQueryHandler { + handleResponse(transactionId: number, tag: net.minecraft.nbt.CompoundTag | null | undefined): boolean; + queryEntityTag(entityId: number, callback: unknown): void; + queryBlockEntityTag(blockPos: net.minecraft.core.BlockPos, callback: unknown): void; + } const Options: { RENDER_DISTANCE_SHORT: number; RENDER_DISTANCE_FAR: number; @@ -17020,6 +17129,7 @@ declare global { keyChat: net.minecraft.client.KeyMapping; keyPlayerList: net.minecraft.client.KeyMapping; keyCommand: net.minecraft.client.KeyMapping; + keyFriends: net.minecraft.client.KeyMapping; keySocialInteractions: net.minecraft.client.KeyMapping; keyScreenshot: net.minecraft.client.KeyMapping; keyTogglePerspective: net.minecraft.client.KeyMapping; @@ -17058,7 +17168,6 @@ declare global { keyDebugLightmapTexture: net.minecraft.client.KeyMapping; debugKeys: Array; keyMappings: Array; - hideGui: boolean; lastMpIp: string; smoothCamera: boolean; languageCode: string; @@ -17073,6 +17182,7 @@ declare global { simulationDistance(): net.minecraft.client.OptionInstance; entityDistanceScaling(): net.minecraft.client.OptionInstance; framerateLimit(): net.minecraft.client.OptionInstance; + preferredGraphicsBackend(): net.minecraft.client.OptionInstance; graphicsPreset(): net.minecraft.client.OptionInstance; inactivityFpsLimit(): net.minecraft.client.OptionInstance; cloudStatus(): net.minecraft.client.OptionInstance; @@ -17083,7 +17193,7 @@ declare global { improvedTransparency(): net.minecraft.client.OptionInstance; ambientOcclusion(): net.minecraft.client.OptionInstance; chunkSectionFadeInTime(): net.minecraft.client.OptionInstance; - prioritizeChunkUpdates(): net.minecraft.client.OptionInstance; + prioritizeChunkUpdates(): net.minecraft.client.OptionInstance; chatVisibility(): net.minecraft.client.OptionInstance; chatOpacity(): net.minecraft.client.OptionInstance; chatLineSpacing(): net.minecraft.client.OptionInstance; @@ -17124,10 +17234,11 @@ declare global { realmsNotifications(): net.minecraft.client.OptionInstance; allowServerListing(): net.minecraft.client.OptionInstance; reducedDebugInfo(): net.minecraft.client.OptionInstance; + inGameNotification(): net.minecraft.client.OptionInstance; + sharePresence(): net.minecraft.client.OptionInstance; showSubtitles(): net.minecraft.client.OptionInstance; directionalAudio(): net.minecraft.client.OptionInstance; backgroundForChatOnly(): net.minecraft.client.OptionInstance; - touchscreen(): net.minecraft.client.OptionInstance; fullscreen(): net.minecraft.client.OptionInstance; exclusiveFullscreen(): net.minecraft.client.OptionInstance; bobView(): net.minecraft.client.OptionInstance; @@ -17155,6 +17266,7 @@ declare global { soundDevice(): net.minecraft.client.OptionInstance; musicFrequency(): net.minecraft.client.OptionInstance; musicToast(): net.minecraft.client.OptionInstance; + isRestartRequiredToApplyVideoSettings(): boolean; applyGraphicsPreset(value: net.minecraft.client.GraphicsPreset): void; updateResourcePacks(packRepository: net.minecraft.server.packs.repository.PackRepository): void; getMenuBackgroundBlurriness(): number; @@ -17194,64 +17306,97 @@ declare global { AltEnum: typeof net.minecraft.client.OptionInstance$AltEnum; BOOLEAN_VALUES: net.minecraft.client.OptionInstance$Enum; BOOLEAN_TO_STRING: net.minecraft.client.OptionInstance$CaptionBasedToString; - new(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, toString: net.minecraft.client.OptionInstance$CaptionBasedToString, values: unknown, initialValue: T, onValueUpdate: unknown): net.minecraft.client.OptionInstance; - new(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, toString: net.minecraft.client.OptionInstance$CaptionBasedToString, values: unknown, codec: com.mojang.serialization.Codec, initialValue: T, onValueUpdate: unknown): net.minecraft.client.OptionInstance; - createBoolean(captionId: string, initialValue: boolean, onValueUpdate: unknown): net.minecraft.client.OptionInstance; + NO_ACTION: net.minecraft.client.OptionInstance$ValueUpdateListener; + new(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, toString: net.minecraft.client.OptionInstance$CaptionBasedToString, values: net.minecraft.client.OptionInstance$ValueSet, initialValue: T, onValueUpdate: net.minecraft.client.OptionInstance$ValueUpdateListener): net.minecraft.client.OptionInstance; + new(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, toString: net.minecraft.client.OptionInstance$CaptionBasedToString, values: net.minecraft.client.OptionInstance$ValueSet, codec: com.mojang.serialization.Codec, initialValue: T, onValueUpdate: net.minecraft.client.OptionInstance$ValueUpdateListener): net.minecraft.client.OptionInstance; + createBoolean(captionId: string, initialValue: boolean, onValueUpdate: net.minecraft.client.OptionInstance$ValueUpdateListener): net.minecraft.client.OptionInstance; createBoolean(captionId: string, initialValue: boolean): net.minecraft.client.OptionInstance; createBoolean(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, initialValue: boolean): net.minecraft.client.OptionInstance; - createBoolean(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, initialValue: boolean, onValueUpdate: unknown): net.minecraft.client.OptionInstance; - createBoolean(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, toString: net.minecraft.client.OptionInstance$CaptionBasedToString, initialValue: boolean, onValueUpdate: unknown): net.minecraft.client.OptionInstance; + createBoolean(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, initialValue: boolean, onValueUpdate: net.minecraft.client.OptionInstance$ValueUpdateListener): net.minecraft.client.OptionInstance; + createBoolean(captionId: string, tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, toString: net.minecraft.client.OptionInstance$CaptionBasedToString, initialValue: boolean, onValueUpdate: net.minecraft.client.OptionInstance$ValueUpdateListener): net.minecraft.client.OptionInstance; noTooltip(): net.minecraft.client.OptionInstance$TooltipSupplier; cachedConstantTooltip(tooltipComponent: net.minecraft.network.chat.Component): net.minecraft.client.OptionInstance$TooltipSupplier; } interface OptionInstance { - values(): unknown; + values(): net.minecraft.client.OptionInstance$ValueSet; codec(): com.mojang.serialization.Codec; createButton(options: net.minecraft.client.Options): net.minecraft.client.gui.components.AbstractWidget; createButton(options: net.minecraft.client.Options, x: number, y: number, width: number): net.minecraft.client.gui.components.AbstractWidget; - createButton(options: net.minecraft.client.Options, x: number, y: number, width: number, onValueChanged: unknown): net.minecraft.client.gui.components.AbstractWidget; + createButton(options: net.minecraft.client.Options, x: number, y: number, width: number, onValueChanged: net.minecraft.client.OptionInstance$ValueUpdateListener): net.minecraft.client.gui.components.AbstractWidget; get(): T; set(value: T): void; } + interface OptionInstance$ValueSet { + createButton(tooltip: net.minecraft.client.OptionInstance$TooltipSupplier, options: net.minecraft.client.Options, x: number, y: number, width: number, onValueChanged: net.minecraft.client.OptionInstance$ValueUpdateListener): unknown; + validateValue(value: T): java.util.Optional; + codec(): com.mojang.serialization.Codec; + } interface OptionInstance$TooltipSupplier { apply(value: T): net.minecraft.client.gui.components.Tooltip | null | undefined; (value: T): net.minecraft.client.gui.components.Tooltip | null | undefined; } + interface OptionInstance$ValueUpdateListener { + valueChanged(newValue: T): void; + (newValue: T): void; + } interface OptionInstance$CaptionBasedToString { + (caption: net.minecraft.network.chat.Component, value: T): net.minecraft.network.chat.Component; } const OptionInstance$Enum: { new(values: Array, codec: com.mojang.serialization.Codec): net.minecraft.client.OptionInstance$Enum; } - interface OptionInstance$Enum extends java.lang.Record { + interface OptionInstance$Enum extends java.lang.Record, net.minecraft.client.OptionInstance$CycleableValueSet { values(): Array; } + interface OptionInstance$CycleableValueSet extends net.minecraft.client.OptionInstance$ValueSet { + valueListSupplier(): net.minecraft.client.gui.components.CycleButton$ValueListSupplier; + valueSetter(): unknown; + } + interface OptionInstance$CycleableValueSet$ValueSetter { + set(instance: net.minecraft.client.OptionInstance, value: T): void; + } const OptionInstance$UnitDouble: { INSTANCE: net.minecraft.client.OptionInstance$UnitDouble; entries: kotlin.enums.EnumEntries; values(): Array; valueOf(value: string): net.minecraft.client.OptionInstance$UnitDouble; } - interface OptionInstance$UnitDouble extends kotlin.Enum { - xmap(to: unknown, from: unknown): unknown; + interface OptionInstance$UnitDouble extends kotlin.Enum, net.minecraft.client.OptionInstance$SliderableValueSet { + xmap(to: unknown, from: unknown): net.minecraft.client.OptionInstance$SliderableValueSet; + } + interface OptionInstance$SliderableValueSet extends net.minecraft.client.OptionInstance$ValueSet { + toSliderValue(value: T): number; + next(current: T): java.util.Optional; + previous(current: T): java.util.Optional; + fromSliderValue(slider: number): T; + applyValueImmediately(): boolean; } const OptionInstance$SliderableEnum: { new(values: Array, codec: com.mojang.serialization.Codec): net.minecraft.client.OptionInstance$SliderableEnum; } - interface OptionInstance$SliderableEnum extends java.lang.Record { + interface OptionInstance$SliderableEnum extends java.lang.Record, net.minecraft.client.OptionInstance$SliderableValueSet { values(): Array; } const OptionInstance$ClampingLazyMaxIntRange: { new(minInclusive: number, maxSupplier: unknown, encodableMaxInclusive: number): net.minecraft.client.OptionInstance$ClampingLazyMaxIntRange; } - interface OptionInstance$ClampingLazyMaxIntRange extends java.lang.Record { + interface OptionInstance$ClampingLazyMaxIntRange extends java.lang.Record, net.minecraft.client.OptionInstance$IntRangeBase, net.minecraft.client.OptionInstance$SliderableOrCyclableValueSet { maxSupplier(): unknown; encodableMaxInclusive(): number; } + interface OptionInstance$IntRangeBase extends net.minecraft.client.OptionInstance$SliderableValueSet { + minInclusive(): number; + maxInclusive(): number; + xmap(to: unknown, from: unknown, discrete: boolean): net.minecraft.client.OptionInstance$SliderableValueSet; + } + interface OptionInstance$SliderableOrCyclableValueSet extends net.minecraft.client.OptionInstance$SliderableValueSet, net.minecraft.client.OptionInstance$CycleableValueSet { + createCycleButton(): boolean; + } const OptionInstance$IntRange: { new(minInclusive: number, maxInclusive: number): net.minecraft.client.OptionInstance$IntRange; new(minInclusive: number, maxInclusive: number, applyValueImmediately: boolean): net.minecraft.client.OptionInstance$IntRange; } - interface OptionInstance$IntRange extends java.lang.Record { + interface OptionInstance$IntRange extends java.lang.Record, net.minecraft.client.OptionInstance$IntRangeBase { } interface OptionInstance$OptionInstanceSliderButton extends net.minecraft.client.gui.components.AbstractOptionSliderButton, net.minecraft.client.gui.components.ResettableOptionWidget { applyUnsavedValue(): void; @@ -17259,21 +17404,18 @@ declare global { const OptionInstance$LazyEnum: { new(values: unknown, validateValue: unknown, codec: com.mojang.serialization.Codec): net.minecraft.client.OptionInstance$LazyEnum; } - interface OptionInstance$LazyEnum extends java.lang.Record { + interface OptionInstance$LazyEnum extends java.lang.Record, net.minecraft.client.OptionInstance$CycleableValueSet { validateValue(): unknown; values(): unknown; } const OptionInstance$AltEnum: { new(values: Array, altValues: Array, altCondition: unknown, valueSetter: unknown, codec: com.mojang.serialization.Codec): net.minecraft.client.OptionInstance$AltEnum; } - interface OptionInstance$AltEnum extends java.lang.Record { + interface OptionInstance$AltEnum extends java.lang.Record, net.minecraft.client.OptionInstance$CycleableValueSet { values(): Array; altValues(): Array; altCondition(): unknown; } - interface OptionInstance$CycleableValueSet$ValueSetter { - set(instance: net.minecraft.client.OptionInstance, value: T): void; - } const GraphicsPreset: { FAST: net.minecraft.client.GraphicsPreset; FANCY: net.minecraft.client.GraphicsPreset; @@ -17287,7 +17429,6 @@ declare global { interface GraphicsPreset extends kotlin.Enum, net.minecraft.util.StringRepresentable { getKey(): string; apply(minecraft: net.minecraft.client.Minecraft): void; - set(screen: net.minecraft.client.gui.screens.options.OptionsSubScreen | null | undefined, option: net.minecraft.client.OptionInstance, value: T): void; } const CloudStatus: { OFF: net.minecraft.client.CloudStatus; @@ -17321,19 +17462,9 @@ declare global { process(name: string, value: number): number; process(name: string, value: T, reader: unknown, writer: unknown): T; } - const ClientRecipeBook: { - new(): net.minecraft.client.ClientRecipeBook; - } - interface ClientRecipeBook extends net.minecraft.stats.RecipeBook { - add(display: net.minecraft.world.item.crafting.display.RecipeDisplayEntry): void; - remove(id: net.minecraft.world.item.crafting.display.RecipeDisplayId): void; - clear(): void; - willHighlight(recipe: net.minecraft.world.item.crafting.display.RecipeDisplayId): boolean; - removeHighlight(id: net.minecraft.world.item.crafting.display.RecipeDisplayId): void; - addHighlight(id: net.minecraft.world.item.crafting.display.RecipeDisplayId): void; - rebuildCollections(): void; - getCollections(): Array; - getCollection(category: net.minecraft.world.item.crafting.ExtendedRecipeBookCategory): Array; + interface RotatingSectionStorage$Value { + setSectionNode(sectionNode: number): void; + getSectionNode(): number; } const TextureFilteringMethod: { NONE: net.minecraft.client.TextureFilteringMethod; @@ -17347,6 +17478,51 @@ declare global { interface TextureFilteringMethod extends kotlin.Enum { caption(): net.minecraft.network.chat.Component; } + const PrioritizeChunkUpdates: { + NONE: net.minecraft.client.PrioritizeChunkUpdates; + PLAYER_AFFECTED: net.minecraft.client.PrioritizeChunkUpdates; + NEARBY: net.minecraft.client.PrioritizeChunkUpdates; + LEGACY_CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.PrioritizeChunkUpdates; + } + interface PrioritizeChunkUpdates extends kotlin.Enum { + caption(): net.minecraft.network.chat.Component; + } + const User: { + new(name: string, uuid: java.util.UUID, accessToken: string, xuid: java.util.Optional, clientId: java.util.Optional): net.minecraft.client.User; + } + interface User { + getSessionId(): string; + getProfileId(): java.util.UUID; + getName(): string; + getAccessToken(): string; + getClientId(): java.util.Optional; + getXuid(): java.util.Optional; + } + const MusicToastDisplayState: { + NEVER: net.minecraft.client.MusicToastDisplayState; + PAUSE: net.minecraft.client.MusicToastDisplayState; + PAUSE_AND_TOAST: net.minecraft.client.MusicToastDisplayState; + CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.MusicToastDisplayState; + } + interface MusicToastDisplayState extends kotlin.Enum, net.minecraft.util.StringRepresentable { + text(): net.minecraft.network.chat.Component; + tooltip(): net.minecraft.network.chat.Component; + renderInPauseScreen(): boolean; + renderToast(): boolean; + } + const GameLoadCookie: { + new(realmsClient: com.mojang.realmsclient.client.RealmsClient, quickPlayData: net.minecraft.client.main.GameConfig$QuickPlayData): net.minecraft.client.GameLoadCookie; + } + interface GameLoadCookie extends java.lang.Record { + realmsClient(): com.mojang.realmsclient.client.RealmsClient; + quickPlayData(): net.minecraft.client.main.GameConfig$QuickPlayData; + } const MouseHandler: { DOUBLE_CLICK_THRESHOLD_MS: number; new(minecraft: net.minecraft.client.Minecraft): net.minecraft.client.MouseHandler; @@ -17383,39 +17559,6 @@ declare global { setClipboard(clipboard: string): void; tick(): void; } - const CommandHistory: { - new(gameFolder: java.nio.file.Path): net.minecraft.client.CommandHistory; - } - interface CommandHistory { - addCommand(command: string): void; - history(): Array; - } - const User: { - new(name: string, uuid: java.util.UUID, accessToken: string, xuid: java.util.Optional, clientId: java.util.Optional): net.minecraft.client.User; - } - interface User { - getSessionId(): string; - getProfileId(): java.util.UUID; - getName(): string; - getAccessToken(): string; - getClientId(): java.util.Optional; - getXuid(): java.util.Optional; - } - const MusicToastDisplayState: { - NEVER: net.minecraft.client.MusicToastDisplayState; - PAUSE: net.minecraft.client.MusicToastDisplayState; - PAUSE_AND_TOAST: net.minecraft.client.MusicToastDisplayState; - CODEC: com.mojang.serialization.Codec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.client.MusicToastDisplayState; - } - interface MusicToastDisplayState extends kotlin.Enum, net.minecraft.util.StringRepresentable { - text(): net.minecraft.network.chat.Component; - tooltip(): net.minecraft.network.chat.Component; - renderInPauseScreen(): boolean; - renderToast(): boolean; - } const HotbarManager: { NUM_HOTBAR_GROUPS: number; new(workingDirectory: java.nio.file.Path, fixerUpper: com.mojang.datafixers.DataFixer): net.minecraft.client.HotbarManager; @@ -17477,13 +17620,18 @@ declare global { } interface GameNarrator$NarratorInitException extends net.minecraft.client.main.SilentInitException { } - const DebugQueryHandler: { - new(connection: net.minecraft.client.multiplayer.ClientPacketListener): net.minecraft.client.DebugQueryHandler; + const PreferredGraphicsApi: { + DEFAULT: net.minecraft.client.PreferredGraphicsApi; + OPENGL: net.minecraft.client.PreferredGraphicsApi; + VULKAN: net.minecraft.client.PreferredGraphicsApi; + CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.client.PreferredGraphicsApi; } - interface DebugQueryHandler { - handleResponse(transactionId: number, tag: net.minecraft.nbt.CompoundTag | null | undefined): boolean; - queryEntityTag(entityId: number, callback: unknown): void; - queryBlockEntityTag(blockPos: net.minecraft.core.BlockPos, callback: unknown): void; + interface PreferredGraphicsApi extends kotlin.Enum, net.minecraft.util.StringRepresentable { + caption(): net.minecraft.network.chat.Component; + getBackendsToTry(): Array; } } namespace network { @@ -17607,6 +17755,22 @@ declare global { } const TextColor: { CODEC: com.mojang.serialization.Codec; + BLACK: net.minecraft.network.chat.TextColor; + DARK_BLUE: net.minecraft.network.chat.TextColor; + DARK_GREEN: net.minecraft.network.chat.TextColor; + DARK_AQUA: net.minecraft.network.chat.TextColor; + DARK_RED: net.minecraft.network.chat.TextColor; + DARK_PURPLE: net.minecraft.network.chat.TextColor; + GOLD: net.minecraft.network.chat.TextColor; + GRAY: net.minecraft.network.chat.TextColor; + DARK_GRAY: net.minecraft.network.chat.TextColor; + BLUE: net.minecraft.network.chat.TextColor; + GREEN: net.minecraft.network.chat.TextColor; + AQUA: net.minecraft.network.chat.TextColor; + RED: net.minecraft.network.chat.TextColor; + LIGHT_PURPLE: net.minecraft.network.chat.TextColor; + YELLOW: net.minecraft.network.chat.TextColor; + WHITE: net.minecraft.network.chat.TextColor; fromLegacyFormat(format: net.minecraft.ChatFormatting): net.minecraft.network.chat.TextColor | null | undefined; fromRgb(rgb: number): net.minecraft.network.chat.TextColor; parseColor(color: string): com.mojang.serialization.DataResult; @@ -17758,6 +17922,7 @@ declare global { withStyle(formats: net.minecraft.ChatFormatting): net.minecraft.network.chat.MutableComponent; withStyle(format: net.minecraft.ChatFormatting): net.minecraft.network.chat.MutableComponent; withColor(color: number): net.minecraft.network.chat.MutableComponent; + withColor(color: net.minecraft.network.chat.TextColor): net.minecraft.network.chat.MutableComponent; withoutShadow(): net.minecraft.network.chat.MutableComponent; } interface ComponentContents { @@ -19041,7 +19206,7 @@ declare global { } const ClientboundLoginPacket: { STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(playerId: number, hardcore: boolean, levels: Set>, maxPlayers: number, chunkRadius: number, simulationDistance: number, reducedDebugInfo: boolean, showDeathScreen: boolean, doLimitedCrafting: boolean, commonPlayerSpawnInfo: net.minecraft.network.protocol.game.CommonPlayerSpawnInfo, enforcesSecureChat: boolean): net.minecraft.network.protocol.game.ClientboundLoginPacket; + new(playerId: number, hardcore: boolean, levels: Set>, maxPlayers: number, chunkRadius: number, simulationDistance: number, reducedDebugInfo: boolean, showDeathScreen: boolean, doLimitedCrafting: boolean, commonPlayerSpawnInfo: net.minecraft.network.protocol.game.CommonPlayerSpawnInfo, onlineMode: boolean, enforcesSecureChat: boolean): net.minecraft.network.protocol.game.ClientboundLoginPacket; } interface ClientboundLoginPacket extends java.lang.Record, net.minecraft.network.protocol.Packet { playerId(): number; @@ -19054,6 +19219,7 @@ declare global { showDeathScreen(): boolean; doLimitedCrafting(): boolean; commonPlayerSpawnInfo(): net.minecraft.network.protocol.game.CommonPlayerSpawnInfo; + onlineMode(): boolean; enforcesSecureChat(): boolean; } const CommonPlayerSpawnInfo: { @@ -19348,18 +19514,18 @@ declare global { interface ClientboundSetPlayerTeamPacket$Action extends kotlin.Enum { } const ClientboundSetPlayerTeamPacket$Parameters: { + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; new(team: net.minecraft.world.scores.PlayerTeam): net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket$Parameters; - new(input: net.minecraft.network.RegistryFriendlyByteBuf): net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket$Parameters; + new(displayName: net.minecraft.network.chat.Component, playerPrefix: net.minecraft.network.chat.Component, playerSuffix: net.minecraft.network.chat.Component, nameTagVisibility: net.minecraft.world.scores.Team$Visibility, collisionRule: net.minecraft.world.scores.Team$CollisionRule, color: java.util.Optional, options: number): net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket$Parameters; } - interface ClientboundSetPlayerTeamPacket$Parameters { - getDisplayName(): net.minecraft.network.chat.Component; - getOptions(): number; - getColor(): net.minecraft.ChatFormatting; - getNametagVisibility(): net.minecraft.world.scores.Team$Visibility; - getCollisionRule(): net.minecraft.world.scores.Team$CollisionRule; - getPlayerPrefix(): net.minecraft.network.chat.Component; - getPlayerSuffix(): net.minecraft.network.chat.Component; - write(output: net.minecraft.network.RegistryFriendlyByteBuf): void; + interface ClientboundSetPlayerTeamPacket$Parameters extends java.lang.Record { + displayName(): net.minecraft.network.chat.Component; + playerPrefix(): net.minecraft.network.chat.Component; + playerSuffix(): net.minecraft.network.chat.Component; + nameTagVisibility(): net.minecraft.world.scores.Team$Visibility; + collisionRule(): net.minecraft.world.scores.Team$CollisionRule; + color(): java.util.Optional; + options(): number; } const ClientboundSetScorePacket: { STREAM_CODEC: net.minecraft.network.codec.StreamCodec; @@ -19997,7 +20163,7 @@ declare global { handleContainerClose(packet: net.minecraft.network.protocol.game.ServerboundContainerClosePacket): void; handleAttack(packet: net.minecraft.network.protocol.game.ServerboundAttackPacket): void; handleInteract(packet: net.minecraft.network.protocol.game.ServerboundInteractPacket): void; - handleSpectateEntity(packet: net.minecraft.network.protocol.game.ServerboundSpectateEntityPacket): void; + handleSpectatorAction(packet: net.minecraft.network.protocol.game.ServerboundSpectatorActionPacket): void; handleMovePlayer(packet: net.minecraft.network.protocol.game.ServerboundMovePlayerPacket): void; handlePlayerAbilities(packet: net.minecraft.network.protocol.game.ServerboundPlayerAbilitiesPacket): void; handlePlayerAction(packet: net.minecraft.network.protocol.game.ServerboundPlayerActionPacket): void; @@ -20159,12 +20325,12 @@ declare global { location(): net.minecraft.world.phys.Vec3; usingSecondaryAction(): boolean; } - const ServerboundSpectateEntityPacket: { - STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(entityId: number): net.minecraft.network.protocol.game.ServerboundSpectateEntityPacket; + const ServerboundSpectatorActionPacket: { + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + new(spectateEntityId: java.util.OptionalInt): net.minecraft.network.protocol.game.ServerboundSpectatorActionPacket; } - interface ServerboundSpectateEntityPacket extends java.lang.Record, net.minecraft.network.protocol.Packet { - entityId(): number; + interface ServerboundSpectatorActionPacket extends java.lang.Record, net.minecraft.network.protocol.Packet { + spectateEntityId(): java.util.OptionalInt; } const ServerboundMovePlayerPacket: { StatusOnly: typeof net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$StatusOnly; @@ -20753,10 +20919,11 @@ declare global { } const ClientboundLoginFinishedPacket: { STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(gameProfile: com.mojang.authlib.GameProfile): net.minecraft.network.protocol.login.ClientboundLoginFinishedPacket; + new(gameProfile: com.mojang.authlib.GameProfile, sessionId: java.util.UUID): net.minecraft.network.protocol.login.ClientboundLoginFinishedPacket; } interface ClientboundLoginFinishedPacket extends java.lang.Record, net.minecraft.network.protocol.Packet { gameProfile(): com.mojang.authlib.GameProfile; + sessionId(): java.util.UUID; } const ClientboundLoginDisconnectPacket: { STREAM_CODEC: net.minecraft.network.codec.StreamCodec; @@ -20980,14 +21147,6 @@ declare global { } interface ClientboundPacketListener extends net.minecraft.network.PacketListener { } - const PacketProcessor: { - new(runningThread: java.lang.Thread): net.minecraft.network.PacketProcessor; - } - interface PacketProcessor extends java.lang.AutoCloseable { - isSameThread(): boolean; - scheduleIfPossible(listener: T, packet: net.minecraft.network.protocol.Packet): void; - processQueuedPackets(): void; - } const Connection: { ROOT_MARKER: org.slf4j.Marker; PACKET_MARKER: org.slf4j.Marker; @@ -20999,6 +21158,7 @@ declare global { configureSerialization(pipeline: io.netty.channel.ChannelPipeline, inboundDirection: net.minecraft.network.protocol.PacketFlow, local: boolean, monitor: net.minecraft.network.BandwidthDebugMonitor | null | undefined): void; configureInMemoryPipeline(pipeline: io.netty.channel.ChannelPipeline, packetFlow: net.minecraft.network.protocol.PacketFlow): void; connectToLocalServer(address: java.net.SocketAddress): net.minecraft.network.Connection; + fromChannel(channel: io.netty.channel.Channel, flow: net.minecraft.network.protocol.PacketFlow, bandwidthLogger: net.minecraft.util.debugchart.LocalSampleLogger | null | undefined): net.minecraft.network.Connection; } interface Connection extends io.netty.channel.SimpleChannelInboundHandler>, net.fabricmc.fabric.api.networking.v1.context.PacketContextProvider { setupInboundProtocol(protocol: net.minecraft.network.ProtocolInfo, packetListener: T): void; @@ -21022,7 +21182,6 @@ declare global { getSending(): net.minecraft.network.protocol.PacketFlow; configurePacketHandler(pipeline: io.netty.channel.ChannelPipeline): void; setEncryptionKey(decryptCipher: javax.crypto.Cipher, encryptCipher: javax.crypto.Cipher): void; - isEncrypted(): boolean; isConnected(): boolean; isConnecting(): boolean; getPacketListener(): net.minecraft.network.PacketListener | null | undefined; @@ -21033,6 +21192,8 @@ declare global { getAverageReceivedPackets(): number; getAverageSentPackets(): number; setBandwidthLogger(bandwidthLogger: net.minecraft.util.debugchart.LocalSampleLogger): void; + setIntendedProfileId(profileId: java.util.UUID): void; + getIntendedProfileId(): java.util.UUID | null | undefined; } interface ProtocolInfo { id(): net.minecraft.network.ConnectionProtocol; @@ -21059,6 +21220,14 @@ declare global { onReceive(bytes: number): void; tick(): void; } + const PacketProcessor: { + new(runningThread: java.lang.Thread): net.minecraft.network.PacketProcessor; + } + interface PacketProcessor extends java.lang.AutoCloseable { + isSameThread(): boolean; + scheduleIfPossible(listener: T, packet: net.minecraft.network.protocol.Packet): void; + processQueuedPackets(): void; + } const HashedStack: { ActualItem: typeof net.minecraft.network.HashedStack$ActualItem; EMPTY: net.minecraft.network.HashedStack; @@ -21308,6 +21477,17 @@ declare global { } namespace profiling { namespace metrics { + namespace profiling { + interface MetricsRecorder { + end(): void; + cancel(): void; + startTick(): void; + sampleDuringExtract(): void; + isRecording(): boolean; + getProfiler(): net.minecraft.util.profiling.ProfilerFiller; + endTick(): void; + } + } interface ProfilerMeasured { profiledMetrics(): Array; } @@ -21445,6 +21625,7 @@ declare global { Builder: typeof net.minecraft.util.random.WeightedList$Builder; of(): net.minecraft.util.random.WeightedList; of(value: E): net.minecraft.util.random.WeightedList; + of(items: E): net.minecraft.util.random.WeightedList; of(items: net.minecraft.util.random.Weighted): net.minecraft.util.random.WeightedList; of(items: Array>): net.minecraft.util.random.WeightedList; builder(): net.minecraft.util.random.WeightedList$Builder; @@ -21483,11 +21664,6 @@ declare global { } } namespace debugchart { - interface SampleLogger { - logFullSample(sample: Array): void; - logSample(sample: number): void; - logPartialSample(sample: number, dimension: number): void; - } const LocalSampleLogger: { CAPACITY: number; new(dimensions: number): net.minecraft.util.debugchart.LocalSampleLogger; @@ -21497,6 +21673,11 @@ declare global { } interface AbstractSampleLogger extends net.minecraft.util.debugchart.SampleLogger { } + interface SampleLogger { + logFullSample(sample: Array): void; + logSample(sample: number): void; + logPartialSample(sample: number, dimension: number): void; + } interface SampleStorage { capacity(): number; size(): number; @@ -21585,10 +21766,6 @@ declare global { minInclusive(): T; maxInclusive(): T; } - interface ToFloatFunction { - applyAsFloat(value: T): number; - (value: T): number; - } const KeyDispatchDataCodec: { new(codec: com.mojang.serialization.MapCodec): net.minecraft.util.KeyDispatchDataCodec; of(codec: com.mojang.serialization.MapCodec): net.minecraft.util.KeyDispatchDataCodec; @@ -21596,6 +21773,10 @@ declare global { interface KeyDispatchDataCodec extends java.lang.Record { codec(): com.mojang.serialization.MapCodec; } + interface ToFloatFunction { + applyAsFloat(value: T): number; + (value: T): number; + } const ProblemReporter: { ScopedCollector: typeof net.minecraft.util.ProblemReporter$ScopedCollector; Collector: typeof net.minecraft.util.ProblemReporter$Collector; @@ -21838,6 +22019,9 @@ declare global { tick(): void; isUnderThreshold(): boolean; } + interface RegistryContextSwapper { + swapTo(codec: com.mojang.serialization.Codec, value: T, newContext: net.minecraft.core.HolderLookup$Provider): com.mojang.serialization.DataResult; + } const ArrayListDeque: { new(): net.minecraft.util.ArrayListDeque; new(capacity: number): net.minecraft.util.ArrayListDeque; @@ -21847,15 +22031,15 @@ declare global { } interface ListAndDeque extends Array, java.util.RandomAccess, kotlin.Cloneable, java.io.Serializable, java.util.Deque { } + const TimeSource: { + constant(value: number): net.minecraft.util.TimeSource$NanoTimeSource; + } interface TimeSource { get(timeUnit: java.util.concurrent.TimeUnit): number; (timeUnit: java.util.concurrent.TimeUnit): number; } interface TimeSource$NanoTimeSource extends net.minecraft.util.TimeSource { } - interface RegistryContextSwapper { - swapTo(codec: com.mojang.serialization.Codec, value: T, newContext: net.minecraft.core.HolderLookup$Provider): com.mojang.serialization.DataResult; - } } namespace resources { const Identifier: { @@ -21906,6 +22090,8 @@ declare global { identifier(): net.minecraft.resources.Identifier; isFor(registry: net.minecraft.resources.ResourceKey>): boolean; cast(registry: net.minecraft.resources.ResourceKey>): java.util.Optional>; + dependent(registryKey: net.minecraft.resources.ResourceKey>, suffix: string): net.minecraft.resources.ResourceKey; + dependent(registryKey: net.minecraft.resources.ResourceKey>, decoration: unknown): net.minecraft.resources.ResourceKey; registry(): net.minecraft.resources.Identifier; registryKey(): net.minecraft.resources.ResourceKey>; } @@ -22213,6 +22399,7 @@ declare global { betweenClosedStream(boundingBox: net.minecraft.world.level.levelgen.structure.BoundingBox): java.util.stream.Stream; betweenClosedStream(box: net.minecraft.world.phys.AABB): java.util.stream.Stream; betweenClosedStream(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): java.util.stream.Stream; + neighborColumn(startX: number, startY: number, startZ: number, endY: number): kotlin.collections.MutableIterable; spiralAround(center: net.minecraft.core.BlockPos, radius: number, firstDirection: net.minecraft.core.Direction, secondDirection: net.minecraft.core.Direction): kotlin.collections.MutableIterable; breadthFirstTraversal(startPos: net.minecraft.core.BlockPos, maxDepth: number, maxCount: number, neighbourProvider: unknown, nodeProcessor: unknown): number; betweenCornersInDirection(aabb: net.minecraft.world.phys.AABB, direction: net.minecraft.world.phys.Vec3): kotlin.collections.MutableIterable; @@ -22221,8 +22408,6 @@ declare global { } interface BlockPos extends net.minecraft.core.Vec3i { asLong(): number; - getCenter(): net.minecraft.world.phys.Vec3; - getBottomCenter(): net.minecraft.world.phys.Vec3; rotate(rotation: net.minecraft.world.level.block.Rotation): net.minecraft.core.BlockPos; atY(y: number): net.minecraft.core.BlockPos; immutable(): net.minecraft.core.BlockPos; @@ -22620,6 +22805,7 @@ declare global { const SectionPos: { SECTION_BITS: number; SECTION_SIZE: number; + SECTION_BLOCK_COUNT: number; SECTION_MASK: number; SECTION_HALF_SIZE: number; SECTION_MAX_INDEX: number; @@ -22977,9 +23163,9 @@ declare global { const MoveControl: { MIN_SPEED: number; MIN_SPEED_SQR: number; - new(mob: net.minecraft.world.entity.Mob): net.minecraft.world.entity.ai.control.MoveControl; + new(mob: T): net.minecraft.world.entity.ai.control.MoveControl; } - interface MoveControl extends net.minecraft.world.entity.ai.control.Control { + interface MoveControl extends net.minecraft.world.entity.ai.control.Control { hasWanted(): boolean; getSpeedModifier(): number; setWantedPosition(x: number, y: number, z: number, speedModifier: number): void; @@ -23039,6 +23225,7 @@ declare global { canFloat(): boolean; shouldRecomputePath(pos: net.minecraft.core.BlockPos): boolean; getMaxDistanceToWaypoint(): number; + getMaxVerticalDistanceToWaypoint(): number; canNavigateGround(): boolean; setCanOpenDoors(canOpenDoors: boolean): void; } @@ -23572,10 +23759,6 @@ declare global { flyingSpeed(): number; walkingSpeed(): number; } - interface StackedContents$IngredientInfo { - acceptsItem(item: T): boolean; - (item: T): boolean; - } const ChatVisiblity: { FULL: net.minecraft.world.entity.player.ChatVisiblity; SYSTEM: net.minecraft.world.entity.player.ChatVisiblity; @@ -23602,6 +23785,10 @@ declare global { getBiggestCraftableStack(recipe: net.minecraft.world.item.crafting.Recipe, maxSize: number, output: net.minecraft.world.entity.player.StackedContents$Output> | null | undefined): number; clear(): void; } + interface StackedContents$IngredientInfo { + acceptsItem(item: T): boolean; + (item: T): boolean; + } interface StackedContents$Output { accept(item: T): void; (item: T): void; @@ -23873,6 +24060,7 @@ declare global { BREEDING_CROSS_FACTOR: number; INVENTORY_ROWS: number; createBaseHorseAttributes(): net.minecraft.world.entity.ai.attributes.AttributeSupplier$Builder; + createOffspringAttribute(parentAValue: number, parentBValue: number, attributeRangeMin: number, attributeRangeMax: number, random: net.minecraft.util.RandomSource): number; } interface AbstractHorse extends net.minecraft.world.entity.animal.Animal, net.minecraft.world.entity.PlayerRideableJumping, net.minecraft.world.entity.HasCustomInventoryScreen, net.minecraft.world.entity.OwnableEntity { tailCounter: number; @@ -24187,6 +24375,9 @@ declare global { } interface Raider$ObtainRaidLeaderBannerGoal extends net.minecraft.world.entity.ai.goal.Goal { } + const Raider$RaiderCelebration: { + new(mob: net.minecraft.world.entity.raid.Raider): net.minecraft.world.entity.raid.Raider$RaiderCelebration; + } interface Raider$RaiderCelebration extends net.minecraft.world.entity.ai.goal.Goal { } } @@ -24344,177 +24535,20 @@ declare global { Builder: typeof net.minecraft.world.entity.EntityType$Builder; CODEC: com.mojang.serialization.Codec>; STREAM_CODEC: net.minecraft.network.codec.StreamCodec>; - ACACIA_BOAT: net.minecraft.world.entity.EntityType; - ACACIA_CHEST_BOAT: net.minecraft.world.entity.EntityType; - ALLAY: net.minecraft.world.entity.EntityType; - AREA_EFFECT_CLOUD: net.minecraft.world.entity.EntityType; - ARMADILLO: net.minecraft.world.entity.EntityType; - ARMOR_STAND: net.minecraft.world.entity.EntityType; - ARROW: net.minecraft.world.entity.EntityType; - AXOLOTL: net.minecraft.world.entity.EntityType; - BAMBOO_CHEST_RAFT: net.minecraft.world.entity.EntityType; - BAMBOO_RAFT: net.minecraft.world.entity.EntityType; - BAT: net.minecraft.world.entity.EntityType; - BEE: net.minecraft.world.entity.EntityType; - BIRCH_BOAT: net.minecraft.world.entity.EntityType; - BIRCH_CHEST_BOAT: net.minecraft.world.entity.EntityType; - BLAZE: net.minecraft.world.entity.EntityType; - BLOCK_DISPLAY: net.minecraft.world.entity.EntityType; - BOGGED: net.minecraft.world.entity.EntityType; - BREEZE: net.minecraft.world.entity.EntityType; - BREEZE_WIND_CHARGE: net.minecraft.world.entity.EntityType; - CAMEL: net.minecraft.world.entity.EntityType; - CAMEL_HUSK: net.minecraft.world.entity.EntityType; - CAT: net.minecraft.world.entity.EntityType; - CAVE_SPIDER: net.minecraft.world.entity.EntityType; - CHERRY_BOAT: net.minecraft.world.entity.EntityType; - CHERRY_CHEST_BOAT: net.minecraft.world.entity.EntityType; - CHEST_MINECART: net.minecraft.world.entity.EntityType; - CHICKEN: net.minecraft.world.entity.EntityType; - COD: net.minecraft.world.entity.EntityType; - COPPER_GOLEM: net.minecraft.world.entity.EntityType; - COMMAND_BLOCK_MINECART: net.minecraft.world.entity.EntityType; - COW: net.minecraft.world.entity.EntityType; - CREAKING: net.minecraft.world.entity.EntityType; - CREEPER: net.minecraft.world.entity.EntityType; - DARK_OAK_BOAT: net.minecraft.world.entity.EntityType; - DARK_OAK_CHEST_BOAT: net.minecraft.world.entity.EntityType; - DOLPHIN: net.minecraft.world.entity.EntityType; - DONKEY: net.minecraft.world.entity.EntityType; - DRAGON_FIREBALL: net.minecraft.world.entity.EntityType; - DROWNED: net.minecraft.world.entity.EntityType; - EGG: net.minecraft.world.entity.EntityType; - ELDER_GUARDIAN: net.minecraft.world.entity.EntityType; - ENDERMAN: net.minecraft.world.entity.EntityType; - ENDERMITE: net.minecraft.world.entity.EntityType; - ENDER_DRAGON: net.minecraft.world.entity.EntityType; - ENDER_PEARL: net.minecraft.world.entity.EntityType; - END_CRYSTAL: net.minecraft.world.entity.EntityType; - EVOKER: net.minecraft.world.entity.EntityType; - EVOKER_FANGS: net.minecraft.world.entity.EntityType; - EXPERIENCE_BOTTLE: net.minecraft.world.entity.EntityType; - EXPERIENCE_ORB: net.minecraft.world.entity.EntityType; - EYE_OF_ENDER: net.minecraft.world.entity.EntityType; - FALLING_BLOCK: net.minecraft.world.entity.EntityType; - FIREBALL: net.minecraft.world.entity.EntityType; - FIREWORK_ROCKET: net.minecraft.world.entity.EntityType; - FOX: net.minecraft.world.entity.EntityType; - FROG: net.minecraft.world.entity.EntityType; - FURNACE_MINECART: net.minecraft.world.entity.EntityType; - GHAST: net.minecraft.world.entity.EntityType; - HAPPY_GHAST: net.minecraft.world.entity.EntityType; - GIANT: net.minecraft.world.entity.EntityType; - GLOW_ITEM_FRAME: net.minecraft.world.entity.EntityType; - GLOW_SQUID: net.minecraft.world.entity.EntityType; - GOAT: net.minecraft.world.entity.EntityType; - GUARDIAN: net.minecraft.world.entity.EntityType; - HOGLIN: net.minecraft.world.entity.EntityType; - HOPPER_MINECART: net.minecraft.world.entity.EntityType; - HORSE: net.minecraft.world.entity.EntityType; - HUSK: net.minecraft.world.entity.EntityType; - ILLUSIONER: net.minecraft.world.entity.EntityType; - INTERACTION: net.minecraft.world.entity.EntityType; - IRON_GOLEM: net.minecraft.world.entity.EntityType; - ITEM: net.minecraft.world.entity.EntityType; - ITEM_DISPLAY: net.minecraft.world.entity.EntityType; - ITEM_FRAME: net.minecraft.world.entity.EntityType; - JUNGLE_BOAT: net.minecraft.world.entity.EntityType; - JUNGLE_CHEST_BOAT: net.minecraft.world.entity.EntityType; - LEASH_KNOT: net.minecraft.world.entity.EntityType; - LIGHTNING_BOLT: net.minecraft.world.entity.EntityType; - LLAMA: net.minecraft.world.entity.EntityType; - LLAMA_SPIT: net.minecraft.world.entity.EntityType; - MAGMA_CUBE: net.minecraft.world.entity.EntityType; - MANGROVE_BOAT: net.minecraft.world.entity.EntityType; - MANGROVE_CHEST_BOAT: net.minecraft.world.entity.EntityType; - MANNEQUIN: net.minecraft.world.entity.EntityType; - MARKER: net.minecraft.world.entity.EntityType; - MINECART: net.minecraft.world.entity.EntityType; - MOOSHROOM: net.minecraft.world.entity.EntityType; - MULE: net.minecraft.world.entity.EntityType; - NAUTILUS: net.minecraft.world.entity.EntityType; - OAK_BOAT: net.minecraft.world.entity.EntityType; - OAK_CHEST_BOAT: net.minecraft.world.entity.EntityType; - OCELOT: net.minecraft.world.entity.EntityType; - OMINOUS_ITEM_SPAWNER: net.minecraft.world.entity.EntityType; - PAINTING: net.minecraft.world.entity.EntityType; - PALE_OAK_BOAT: net.minecraft.world.entity.EntityType; - PALE_OAK_CHEST_BOAT: net.minecraft.world.entity.EntityType; - PANDA: net.minecraft.world.entity.EntityType; - PARCHED: net.minecraft.world.entity.EntityType; - PARROT: net.minecraft.world.entity.EntityType; - PHANTOM: net.minecraft.world.entity.EntityType; - PIG: net.minecraft.world.entity.EntityType; - PIGLIN: net.minecraft.world.entity.EntityType; - PIGLIN_BRUTE: net.minecraft.world.entity.EntityType; - PILLAGER: net.minecraft.world.entity.EntityType; - POLAR_BEAR: net.minecraft.world.entity.EntityType; - SPLASH_POTION: net.minecraft.world.entity.EntityType; - LINGERING_POTION: net.minecraft.world.entity.EntityType; - PUFFERFISH: net.minecraft.world.entity.EntityType; - RABBIT: net.minecraft.world.entity.EntityType; - RAVAGER: net.minecraft.world.entity.EntityType; - SALMON: net.minecraft.world.entity.EntityType; - SHEEP: net.minecraft.world.entity.EntityType; - SHULKER: net.minecraft.world.entity.EntityType; - SHULKER_BULLET: net.minecraft.world.entity.EntityType; - SILVERFISH: net.minecraft.world.entity.EntityType; - SKELETON: net.minecraft.world.entity.EntityType; - SKELETON_HORSE: net.minecraft.world.entity.EntityType; - SLIME: net.minecraft.world.entity.EntityType; - SMALL_FIREBALL: net.minecraft.world.entity.EntityType; - SNIFFER: net.minecraft.world.entity.EntityType; - SNOWBALL: net.minecraft.world.entity.EntityType; - SNOW_GOLEM: net.minecraft.world.entity.EntityType; - SPAWNER_MINECART: net.minecraft.world.entity.EntityType; - SPECTRAL_ARROW: net.minecraft.world.entity.EntityType; - SPIDER: net.minecraft.world.entity.EntityType; - SPRUCE_BOAT: net.minecraft.world.entity.EntityType; - SPRUCE_CHEST_BOAT: net.minecraft.world.entity.EntityType; - SQUID: net.minecraft.world.entity.EntityType; - STRAY: net.minecraft.world.entity.EntityType; - STRIDER: net.minecraft.world.entity.EntityType; - TADPOLE: net.minecraft.world.entity.EntityType; - TEXT_DISPLAY: net.minecraft.world.entity.EntityType; - TNT: net.minecraft.world.entity.EntityType; - TNT_MINECART: net.minecraft.world.entity.EntityType; - TRADER_LLAMA: net.minecraft.world.entity.EntityType; - TRIDENT: net.minecraft.world.entity.EntityType; - TROPICAL_FISH: net.minecraft.world.entity.EntityType; - TURTLE: net.minecraft.world.entity.EntityType; - VEX: net.minecraft.world.entity.EntityType; - VILLAGER: net.minecraft.world.entity.EntityType; - VINDICATOR: net.minecraft.world.entity.EntityType; - WANDERING_TRADER: net.minecraft.world.entity.EntityType; - WARDEN: net.minecraft.world.entity.EntityType; - WIND_CHARGE: net.minecraft.world.entity.EntityType; - WITCH: net.minecraft.world.entity.EntityType; - WITHER: net.minecraft.world.entity.EntityType; - WITHER_SKELETON: net.minecraft.world.entity.EntityType; - WITHER_SKULL: net.minecraft.world.entity.EntityType; - WOLF: net.minecraft.world.entity.EntityType; - ZOGLIN: net.minecraft.world.entity.EntityType; - ZOMBIE: net.minecraft.world.entity.EntityType; - ZOMBIE_HORSE: net.minecraft.world.entity.EntityType; - ZOMBIE_NAUTILUS: net.minecraft.world.entity.EntityType; - ZOMBIE_VILLAGER: net.minecraft.world.entity.EntityType; - ZOMBIFIED_PIGLIN: net.minecraft.world.entity.EntityType; - PLAYER: net.minecraft.world.entity.EntityType; - FISHING_BOBBER: net.minecraft.world.entity.EntityType; - new(factory: net.minecraft.world.entity.EntityType$EntityFactory, category: net.minecraft.world.entity.MobCategory, serialize: boolean, summon: boolean, fireImmune: boolean, canSpawnFarFromPlayer: boolean, immuneTo: com.google.common.collect.ImmutableSet, dimensions: net.minecraft.world.entity.EntityDimensions, spawnDimensionsScale: number, clientTrackingRange: number, updateInterval: number, descriptionId: string, lootTable: java.util.Optional>, requiredFeatures: net.minecraft.world.flag.FeatureFlagSet, allowedInPeaceful: boolean): net.minecraft.world.entity.EntityType; + new(factory: net.minecraft.world.entity.EntityType$EntityFactory, category: net.minecraft.world.entity.MobCategory, serialize: boolean, summon: boolean, fireImmune: boolean, canSpawnFarFromPlayer: boolean, immuneTo: net.minecraft.tags.TagKey, dimensions: net.minecraft.world.entity.EntityDimensions, spawnDimensionsScale: number, clientTrackingRange: number, updateInterval: number, descriptionId: string, lootTable: java.util.Optional>, requiredFeatures: net.minecraft.world.flag.FeatureFlagSet, allowedInPeaceful: boolean): net.minecraft.world.entity.EntityType; getKey(type: net.minecraft.world.entity.EntityType): net.minecraft.resources.Identifier; - byString(id: string): java.util.Optional>; - createDefaultStackConfig(level: net.minecraft.world.level.Level, itemStack: net.minecraft.world.item.ItemStack, user: net.minecraft.world.entity.LivingEntity | null | undefined): unknown; - appendDefaultStackConfig(initialConfig: unknown, level: net.minecraft.world.level.Level, itemStack: net.minecraft.world.item.ItemStack, user: net.minecraft.world.entity.LivingEntity | null | undefined): unknown; - appendComponentsConfig(initialConfig: unknown, itemStack: net.minecraft.world.item.ItemStack): unknown; - appendCustomEntityStackConfig(initialConfig: unknown, level: net.minecraft.world.level.Level, itemStack: net.minecraft.world.item.ItemStack, user: net.minecraft.world.entity.LivingEntity | null | undefined): unknown; - create(input: net.minecraft.world.level.storage.ValueInput, level: net.minecraft.world.level.Level, reason: net.minecraft.world.entity.EntitySpawnReason): java.util.Optional; + createDefaultStackConfig(level: net.minecraft.world.level.Level, itemStack: net.minecraft.world.item.ItemStack, user: net.minecraft.world.entity.LivingEntity | null | undefined): net.minecraft.world.entity.PostSpawnProcessor; + appendDefaultStackConfig(initialConfig: net.minecraft.world.entity.PostSpawnProcessor, level: net.minecraft.world.level.Level, itemStack: net.minecraft.world.item.ItemStack, user: net.minecraft.world.entity.LivingEntity | null | undefined): net.minecraft.world.entity.PostSpawnProcessor; + appendComponentsConfig(initialConfig: net.minecraft.world.entity.PostSpawnProcessor, itemStack: net.minecraft.world.item.ItemStack): net.minecraft.world.entity.PostSpawnProcessor; + appendCustomEntityStackConfig(initialConfig: net.minecraft.world.entity.PostSpawnProcessor, level: net.minecraft.world.level.Level, itemStack: net.minecraft.world.item.ItemStack, user: net.minecraft.world.entity.LivingEntity | null | undefined): net.minecraft.world.entity.PostSpawnProcessor; + create(input: net.minecraft.world.level.storage.ValueInput, level: net.minecraft.world.level.Level, request: net.minecraft.world.entity.EntitySpawnRequest): java.util.Optional; create(type: net.minecraft.world.entity.EntityType, input: net.minecraft.world.level.storage.ValueInput, level: net.minecraft.world.level.Level, reason: net.minecraft.world.entity.EntitySpawnReason): java.util.Optional; updateCustomEntityTag(level: net.minecraft.world.level.Level, user: net.minecraft.world.entity.LivingEntity | null | undefined, entity: net.minecraft.world.entity.Entity | null | undefined, entityData: net.minecraft.world.item.component.TypedEntityData>): void; by(input: net.minecraft.world.level.storage.ValueInput): java.util.Optional>; - loadEntityRecursive(tag: net.minecraft.nbt.CompoundTag, level: net.minecraft.world.level.Level, reason: net.minecraft.world.entity.EntitySpawnReason, postLoad: net.minecraft.world.entity.EntityProcessor): net.minecraft.world.entity.Entity | null | undefined; + loadEntityRecursive(tag: net.minecraft.nbt.CompoundTag, level: net.minecraft.world.level.Level, request: net.minecraft.world.entity.EntitySpawnRequest, postLoad: net.minecraft.world.entity.EntityProcessor): net.minecraft.world.entity.Entity | null | undefined; loadEntityRecursive(type: net.minecraft.world.entity.EntityType, tag: net.minecraft.nbt.CompoundTag, level: net.minecraft.world.level.Level, reason: net.minecraft.world.entity.EntitySpawnReason, postLoad: net.minecraft.world.entity.EntityProcessor): net.minecraft.world.entity.Entity | null | undefined; loadEntityRecursive(input: net.minecraft.world.level.storage.ValueInput, level: net.minecraft.world.level.Level, reason: net.minecraft.world.entity.EntitySpawnReason, postLoad: net.minecraft.world.entity.EntityProcessor): net.minecraft.world.entity.Entity | null | undefined; + loadEntityRecursive(input: net.minecraft.world.level.storage.ValueInput, level: net.minecraft.world.level.Level, request: net.minecraft.world.entity.EntitySpawnRequest, postLoad: net.minecraft.world.entity.EntityProcessor): net.minecraft.world.entity.Entity | null | undefined; loadEntityRecursive(type: net.minecraft.world.entity.EntityType, input: net.minecraft.world.level.storage.ValueInput, level: net.minecraft.world.level.Level, reason: net.minecraft.world.entity.EntitySpawnReason, postLoad: net.minecraft.world.entity.EntityProcessor): net.minecraft.world.entity.Entity | null | undefined; loadEntitiesRecursive(entities: net.minecraft.world.level.storage.ValueInput$ValueInputList, level: net.minecraft.world.level.Level, reason: net.minecraft.world.entity.EntitySpawnReason): java.util.stream.Stream; } @@ -24526,9 +24560,10 @@ declare global { updateInterval(): number; spawn(level: net.minecraft.server.level.ServerLevel, itemStack: net.minecraft.world.item.ItemStack | null | undefined, user: net.minecraft.world.entity.LivingEntity | null | undefined, spawnPos: net.minecraft.core.BlockPos, spawnReason: net.minecraft.world.entity.EntitySpawnReason, tryMoveDown: boolean, movedUp: boolean): T; spawn(level: net.minecraft.server.level.ServerLevel, spawnPos: net.minecraft.core.BlockPos, spawnReason: net.minecraft.world.entity.EntitySpawnReason): T; - spawn(level: net.minecraft.server.level.ServerLevel, postSpawnConfig: unknown, spawnPos: net.minecraft.core.BlockPos, spawnReason: net.minecraft.world.entity.EntitySpawnReason, tryMoveDown: boolean, movedUp: boolean): T; - create(level: net.minecraft.server.level.ServerLevel, postSpawnConfig: unknown, spawnPos: net.minecraft.core.BlockPos, spawnReason: net.minecraft.world.entity.EntitySpawnReason, tryMoveDown: boolean, movedUp: boolean): T; + spawn(level: net.minecraft.server.level.ServerLevel, postSpawnConfig: net.minecraft.world.entity.PostSpawnProcessor | null | undefined, spawnPos: net.minecraft.core.BlockPos, spawnReason: net.minecraft.world.entity.EntitySpawnReason, tryMoveDown: boolean, movedUp: boolean): T; + create(level: net.minecraft.server.level.ServerLevel, postSpawnConfig: net.minecraft.world.entity.PostSpawnProcessor | null | undefined, spawnPos: net.minecraft.core.BlockPos, spawnReason: net.minecraft.world.entity.EntitySpawnReason, tryMoveDown: boolean, movedUp: boolean): T; create(level: net.minecraft.world.level.Level, reason: net.minecraft.world.entity.EntitySpawnReason): T; + create(level: net.minecraft.world.level.Level, request: net.minecraft.world.entity.EntitySpawnRequest): T; canSerialize(): boolean; canSummon(): boolean; getCategory(): net.minecraft.world.entity.MobCategory; @@ -24538,6 +24573,7 @@ declare global { getDefaultLootTable(): java.util.Optional>; getWidth(): number; getHeight(): number; + canSpawn(level: net.minecraft.world.level.Level): boolean; getSpawnAABB(x: number, y: number, z: number): net.minecraft.world.phys.AABB; isBlockDangerous(state: net.minecraft.world.level.block.state.BlockState): boolean; getDimensions(): net.minecraft.world.entity.EntityDimensions; @@ -24565,10 +24601,14 @@ declare global { TAG_GLOWING: string; TAG_INVULNERABLE: string; TAG_CUSTOM_NAME: string; + INVALID_ENTITY_ID: number; CONTENTS_SLOT_INDEX: number; BOARDING_COOLDOWN: number; TOTAL_AIR_SUPPLY: number; MAX_ENTITY_TAG_COUNT: number; + DEFAULT_NAME_TAG_DISTANCE: number; + DEFAULT_BELOW_NAME_DISTANCE: number; + MAX_NAME_TAG_DISTANCE: number; DELTA_AFFECTED_BY_BLOCKS_BELOW_0_2: number; DELTA_AFFECTED_BY_BLOCKS_BELOW_0_5: number; DELTA_AFFECTED_BY_BLOCKS_BELOW_1_0: number; @@ -24579,7 +24619,8 @@ declare global { DEFAULT_BB_HEIGHT: number; MAX_MOVEMENTS_HANDELED_PER_TICK: number; new(type: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.Level): net.minecraft.world.entity.Entity; - collideBoundingBox(source: net.minecraft.world.entity.Entity | null | undefined, movement: net.minecraft.world.phys.Vec3, boundingBox: net.minecraft.world.phys.AABB, level: net.minecraft.world.level.Level, entityColliders: Array): net.minecraft.world.phys.Vec3; + collideBoundingBox(source: net.minecraft.world.entity.Entity, movement: net.minecraft.world.phys.Vec3, boundingBox: net.minecraft.world.phys.AABB, level: net.minecraft.world.level.Level, entityColliders: Array): net.minecraft.world.phys.Vec3; + collideBoundingBox(source: net.minecraft.world.phys.shapes.CollisionContext, movement: net.minecraft.world.phys.Vec3, boundingBox: net.minecraft.world.phys.AABB, level: net.minecraft.world.level.Level, entityColliders: Array): net.minecraft.world.phys.Vec3; collectAllColliders(source: net.minecraft.world.entity.Entity | null | undefined, level: net.minecraft.world.level.Level, boundingBox: net.minecraft.world.phys.AABB): Array; getViewScale(): number; setViewScale(viewScale: number): void; @@ -24606,6 +24647,7 @@ declare global { tickCount: number; invulnerableTime: number; needsSync: boolean; + syncPosition: boolean; portalProcess: net.minecraft.world.entity.PortalProcessor | null | undefined; isInPowderSnow: boolean; wasInPowderSnow: boolean; @@ -24741,6 +24783,7 @@ declare global { pick(range: number, a: number, withLiquids: boolean): net.minecraft.world.phys.HitResult; canBeHitByProjectile(): boolean; isPickable(): boolean; + canBePickedFromInside(): boolean; isPushable(): boolean; awardKillScore(victim: net.minecraft.world.entity.Entity, killingBlow: net.minecraft.world.damagesource.DamageSource): void; shouldRender(camX: number, camY: number, camZ: number): boolean; @@ -24841,6 +24884,7 @@ declare global { isAttackable(): boolean; skipAttackInteraction(source: net.minecraft.world.entity.Entity): boolean; isInvulnerable(): boolean; + isInvulnerableToPiercingWeapon(): boolean; setInvulnerable(invulnerable: boolean): void; copyPosition(target: net.minecraft.world.entity.Entity): void; restoreFrom(oldEntity: net.minecraft.world.entity.Entity): void; @@ -25001,7 +25045,6 @@ declare global { TAG_FALL_FLYING: string; TAG_HURT_TIME: string; TAG_DEATH_TIME: string; - TAG_HURT_BY_TIMESTAMP: string; TAG_HEALTH: string; EQUIPMENT_SLOT_OFFSET: number; ARMOR_SLOT_OFFSET: number; @@ -25014,6 +25057,20 @@ declare global { BASE_JUMP_POWER: number; EXTRA_RENDER_CULLING_SIZE_WITH_BIG_HAT: number; DEFAULT_BABY_SCALE: number; + BASE_HORIZONTAL_AIR_DRAG: number; + BASE_VERTICAL_AIR_DRAG: number; + WATER_DRAG: number; + SPRINTING_WATER_DRAG: number; + LAVA_DRAG: number; + LAVA_SHALLOW_VERTICAL_DRAG: number; + DOLPHINS_GRACE_WATER_DRAG: number; + FLYING_AIR_DRAG: number; + FLYING_VERTICAL_AIR_DRAG: number; + FLYING_LAVA_DRAG: number; + FLYING_WATER_DRAG: number; + ELYTRA_HORIZONTAL_AIR_DRAG: number; + ELYTRA_VERTICAL_AIR_DRAG: number; + BASE_SWIM_SPEED: number; PLAYER_NOT_WEARING_DISGUISE_ITEM: unknown; createLivingAttributes(): net.minecraft.world.entity.ai.attributes.AttributeSupplier$Builder; areAllEffectsAmbient(effects: Array): boolean; @@ -25041,7 +25098,6 @@ declare global { yya: number; zza: number; currentImpulseImpactPos: net.minecraft.world.phys.Vec3 | null | undefined; - currentExplosionCause: net.minecraft.world.entity.Entity | null | undefined; skipDropExperience(): void; activeLocationDependentEnchantments(slot: net.minecraft.world.entity.EquipmentSlot): Map>; getBrain(): net.minecraft.world.entity.ai.Brain; @@ -25092,6 +25148,7 @@ declare global { getHealth(): number; setHealth(health: number): void; isDeadOrDying(): boolean; + dealDefaultKnockback(source: net.minecraft.world.damagesource.DamageSource, damage: number, blocked: boolean): void; applyItemBlocking(level: net.minecraft.server.level.ServerLevel, source: net.minecraft.world.damagesource.DamageSource, damage: number): number; getLastDamageSource(): net.minecraft.world.damagesource.DamageSource | null | undefined; makeSound(sound: net.minecraft.sounds.SoundEvent | null | undefined): void; @@ -25101,7 +25158,8 @@ declare global { dropFromLootTable(level: net.minecraft.server.level.ServerLevel, source: net.minecraft.world.damagesource.DamageSource, playerKilled: boolean, lootTable: net.minecraft.resources.ResourceKey, itemStackConsumer: unknown): void; dropFromEntityInteractLootTable(level: net.minecraft.server.level.ServerLevel, key: net.minecraft.resources.ResourceKey, interactingEntity: net.minecraft.world.entity.Entity | null | undefined, tool: net.minecraft.world.item.ItemInstance, consumer: unknown): boolean; dropFromGiftLootTable(level: net.minecraft.server.level.ServerLevel, key: net.minecraft.resources.ResourceKey, consumer: unknown): boolean; - knockback(power: number, xd: number, zd: number): void; + knockback(power: number, xd: number, zd: number, source: net.minecraft.world.damagesource.DamageSource, damage: number, comesFromEffect: boolean): void; + knockback(power: number, xd: number, zd: number, source: net.minecraft.world.damagesource.DamageSource, damage: number): void; indicateDamage(xd: number, zd: number): void; wasExperienceConsumed(): boolean; getHurtDir(): number; @@ -25161,7 +25219,7 @@ declare global { getSpeed(): number; setSpeed(speed: number): void; doHurtTarget(level: net.minecraft.server.level.ServerLevel, target: net.minecraft.world.entity.Entity): boolean; - causeExtraKnockback(target: net.minecraft.world.entity.Entity, knockback: number, oldMovement: net.minecraft.world.phys.Vec3): void; + causeExtraKnockback(target: net.minecraft.world.entity.Entity, knockback: number, oldMovement: net.minecraft.world.phys.Vec3, damageSource: net.minecraft.world.damagesource.DamageSource, damage: number, comesFromEffect: boolean): void; wasRecentlyStabbed(target: net.minecraft.world.entity.Entity, allowedTime: number): boolean; rememberStabbedEntity(target: net.minecraft.world.entity.Entity): void; stabbedEntities(filter: unknown): number; @@ -25222,6 +25280,7 @@ declare global { hasInfiniteMaterials(): boolean; isInvulnerableTo(level: net.minecraft.server.level.ServerLevel, source: net.minecraft.world.damagesource.DamageSource): boolean; getLastHurtByPlayerMemoryTime(): number; + createDamageSource(): net.minecraft.world.damagesource.DamageSource; } interface Attackable { getLastAttacker(): net.minecraft.world.entity.LivingEntity | null | undefined; @@ -25467,6 +25526,7 @@ declare global { isFriendly(): boolean; isPersistent(): boolean; getName(): string; + getDebugAbbreviation(): string; getMaxInstancesPerChunk(): number; getDespawnDistance(): number; getNoDespawnDistance(): number; @@ -25561,6 +25621,7 @@ declare global { TAG_LEFT_HANDED: string; TAG_CAN_PICK_UP_LOOT: string; TAG_NO_AI: string; + TAG_PERSISTENCE_REQUIRED: string; createMobAttributes(): net.minecraft.world.entity.ai.attributes.AttributeSupplier$Builder; checkMobSpawnRules(type: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.LevelAccessor, spawnReason: net.minecraft.world.entity.EntitySpawnReason, pos: net.minecraft.core.BlockPos, random: net.minecraft.util.RandomSource): boolean; getEquipmentForSlot(slot: net.minecraft.world.entity.EquipmentSlot, type: number): net.minecraft.world.item.Item | null | undefined; @@ -25572,7 +25633,7 @@ declare global { onPathfindingStart(): void; onPathfindingDone(): void; getLookControl(): net.minecraft.world.entity.ai.control.LookControl; - getMoveControl(): net.minecraft.world.entity.ai.control.MoveControl; + getMoveControl(): net.minecraft.world.entity.ai.control.MoveControl; getJumpControl(): net.minecraft.world.entity.ai.control.JumpControl; getNavigation(): net.minecraft.world.entity.ai.navigation.PathNavigation; getSensing(): net.minecraft.world.entity.ai.sensing.Sensing; @@ -25606,7 +25667,6 @@ declare global { getBodyArmorItem(): net.minecraft.world.item.ItemStack; isSaddled(): boolean; isWearingBodyArmor(): boolean; - setBodyArmorItem(item: net.minecraft.world.item.ItemStack): void; createEquipmentSlotContainer(slot: net.minecraft.world.entity.EquipmentSlot): net.minecraft.world.Container; getDropChances(): net.minecraft.world.entity.DropChances; dropPreservedEquipment(level: net.minecraft.server.level.ServerLevel): void; @@ -25636,6 +25696,7 @@ declare global { setBaby(baby: boolean): void; isWithinMeleeAttackRange(target: net.minecraft.world.entity.LivingEntity): boolean; removeFreeWill(): void; + getGoalSelector(): net.minecraft.world.entity.ai.goal.GoalSelector; removeAllGoals(predicate: unknown): void; chargeSpeedModifier(): number; } @@ -25720,7 +25781,10 @@ declare global { setLeashHolder(leashHolder: net.minecraft.world.entity.Entity): void; } const Leashable$Wrench: { + ZERO: net.minecraft.world.entity.Leashable$Wrench; new(force: net.minecraft.world.phys.Vec3, torque: number): net.minecraft.world.entity.Leashable$Wrench; + torqueFromForce(leverArm: net.minecraft.world.phys.Vec3, force: net.minecraft.world.phys.Vec3): number; + accumulate(wrenches: Array): net.minecraft.world.entity.Leashable$Wrench; } interface Leashable$Wrench extends java.lang.Record { scale(scale: number): net.minecraft.world.entity.Leashable$Wrench; @@ -25805,6 +25869,7 @@ declare global { } interface ConversionType extends kotlin.Enum { shouldDiscardAfterConversion(): boolean; + convert(from: net.minecraft.world.entity.Mob, to: net.minecraft.world.entity.Mob, params: net.minecraft.world.entity.ConversionParams): void; } interface ConversionParams$AfterConversion { finalizeConversion(mob: T): void; @@ -25970,204 +26035,117 @@ declare global { interface SpawnPlacementType { isSpawnPositionOk(level: net.minecraft.world.level.LevelReader, blockPos: net.minecraft.core.BlockPos, type: net.minecraft.world.entity.EntityType | null | undefined): boolean; adjustSpawnPosition(level: net.minecraft.world.level.LevelReader, candidate: net.minecraft.core.BlockPos): net.minecraft.core.BlockPos; - } - interface ReputationEventHandler { - onReputationEventFrom(type: net.minecraft.world.entity.ai.village.ReputationEventType, source: net.minecraft.world.entity.Entity): void; - } - interface EntityType$EntityFactory { - create(entityType: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.Level): T; - (entityType: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.Level): T; - } - const EntityProcessor: { - NOP: net.minecraft.world.entity.EntityProcessor; - } - interface EntityProcessor { - process(input: net.minecraft.world.entity.Entity): net.minecraft.world.entity.Entity | null | undefined; - (input: net.minecraft.world.entity.Entity): net.minecraft.world.entity.Entity | null | undefined; - } - const EntityType$Builder: { - of(factory: net.minecraft.world.entity.EntityType$EntityFactory, category: net.minecraft.world.entity.MobCategory): net.minecraft.world.entity.EntityType$Builder; - createNothing(category: net.minecraft.world.entity.MobCategory): net.minecraft.world.entity.EntityType$Builder; - } - interface EntityType$Builder extends net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityType$Builder { - immuneTo(blocks: net.minecraft.world.level.block.Block): net.minecraft.world.entity.EntityType$Builder; - fireImmune(): net.minecraft.world.entity.EntityType$Builder; - canSpawnFarFromPlayer(): net.minecraft.world.entity.EntityType$Builder; - clientTrackingRange(clientChunkRange: number): net.minecraft.world.entity.EntityType$Builder; - updateInterval(updateInterval: number): net.minecraft.world.entity.EntityType$Builder; - spawnDimensionsScale(scale: number): net.minecraft.world.entity.EntityType$Builder; - requiredFeatures(flags: net.minecraft.world.flag.FeatureFlag): net.minecraft.world.entity.EntityType$Builder; - sized(width: number, height: number): net.minecraft.world.entity.EntityType$Builder; - eyeHeight(eyeHeight: number): net.minecraft.world.entity.EntityType$Builder; - passengerAttachments(offsetYs: number): net.minecraft.world.entity.EntityType$Builder; - passengerAttachments(points: net.minecraft.world.phys.Vec3): net.minecraft.world.entity.EntityType$Builder; - vehicleAttachment(point: net.minecraft.world.phys.Vec3): net.minecraft.world.entity.EntityType$Builder; - ridingOffset(ridingOffset: number): net.minecraft.world.entity.EntityType$Builder; - nameTagOffset(nameTagOffset: number): net.minecraft.world.entity.EntityType$Builder; - attach(attachment: net.minecraft.world.entity.EntityAttachment, x: number, y: number, z: number): net.minecraft.world.entity.EntityType$Builder; - attach(attachment: net.minecraft.world.entity.EntityAttachment, point: net.minecraft.world.phys.Vec3): net.minecraft.world.entity.EntityType$Builder; - noSummon(): net.minecraft.world.entity.EntityType$Builder; - noSave(): net.minecraft.world.entity.EntityType$Builder; - noLootTable(): net.minecraft.world.entity.EntityType$Builder; - notInPeaceful(): net.minecraft.world.entity.EntityType$Builder; - build(name: net.minecraft.resources.ResourceKey>): net.minecraft.world.entity.EntityType; - } - interface SpawnPlacements$SpawnPredicate { - test(type: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.ServerLevelAccessor, spawnReason: net.minecraft.world.entity.EntitySpawnReason, pos: net.minecraft.core.BlockPos, random: net.minecraft.util.RandomSource): boolean; - (type: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.ServerLevelAccessor, spawnReason: net.minecraft.world.entity.EntitySpawnReason, pos: net.minecraft.core.BlockPos, random: net.minecraft.util.RandomSource): boolean; - } - } - namespace level { - namespace entity { - const EntityTypeTest: { - forClass(cls: java.lang.Class): net.minecraft.world.level.entity.EntityTypeTest; - forExactClass(cls: java.lang.Class): net.minecraft.world.level.entity.EntityTypeTest; - } - interface EntityTypeTest { - tryCast(entity: B): T; - getBaseClass(): java.lang.Class; - } - interface EntityAccess extends net.minecraft.world.level.entity.UniquelyIdentifyable { - getId(): number; - blockPosition(): net.minecraft.core.BlockPos; - getBoundingBox(): net.minecraft.world.phys.AABB; - setLevelCallback(callback: net.minecraft.world.level.entity.EntityInLevelCallback): void; - getSelfAndPassengers(): java.util.stream.Stream; - getPassengersAndSelf(): java.util.stream.Stream; - setRemoved(removalReason: net.minecraft.world.entity.Entity$RemovalReason): void; - shouldBeSaved(): boolean; - isAlwaysTicking(): boolean; - } - interface UniquelyIdentifyable { - getUUID(): java.util.UUID; - isRemoved(): boolean; - } - const EntityInLevelCallback: { - NULL: net.minecraft.world.level.entity.EntityInLevelCallback; - } - interface EntityInLevelCallback { - onMove(): void; - onRemove(reason: net.minecraft.world.entity.Entity$RemovalReason): void; - } - interface ChunkStatusUpdateListener { - onChunkStatusChange(pos: net.minecraft.world.level.ChunkPos, chunkStatus: net.minecraft.server.level.FullChunkStatus): void; - (pos: net.minecraft.world.level.ChunkPos, chunkStatus: net.minecraft.server.level.FullChunkStatus): void; - } - interface UUIDLookup { - lookup(uuid: java.util.UUID): IdentifiedType; - } - interface LevelEntityGetter { - get(id: number): T; - get(id: java.util.UUID): T; - get(type: net.minecraft.world.level.entity.EntityTypeTest, consumer: net.minecraft.util.AbortableIterationConsumer): void; - get(bb: net.minecraft.world.phys.AABB, output: unknown): void; - get(type: net.minecraft.world.level.entity.EntityTypeTest, bb: net.minecraft.world.phys.AABB, consumer: net.minecraft.util.AbortableIterationConsumer): void; - getAll(): kotlin.collections.MutableIterable; - } - } - namespace levelgen { - namespace structure { - namespace pieces { - const StructurePieceSerializationContext: { - new(resourceManager: net.minecraft.server.packs.resources.ResourceManager, registryAccess: net.minecraft.core.RegistryAccess, structureTemplateManager: net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager): net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; - fromLevel(level: net.minecraft.server.level.ServerLevel): net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; - } - interface StructurePieceSerializationContext extends java.lang.Record { - resourceManager(): net.minecraft.server.packs.resources.ResourceManager; - registryAccess(): net.minecraft.core.RegistryAccess; - structureTemplateManager(): net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; - } - const PiecesContainer: { - new(pieces: Array): net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; - load(children: net.minecraft.nbt.ListTag, context: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext): net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; - } - interface PiecesContainer extends java.lang.Record { - isEmpty(): boolean; - isInsidePiece(startPos: net.minecraft.core.BlockPos): boolean; - save(context: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext): net.minecraft.nbt.Tag; - calculateBoundingBox(): net.minecraft.world.level.levelgen.structure.BoundingBox; - pieces(): Array; - } - const StructurePiecesBuilder: { - new(): net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; - } - interface StructurePiecesBuilder extends net.minecraft.world.level.levelgen.structure.StructurePieceAccessor { - offsetPiecesVertically(dy: number): void; - moveBelowSeaLevel(seaLevel: number, minY: number, random: net.minecraft.util.RandomSource, offset: number): number; - moveInsideHeights(random: net.minecraft.util.RandomSource, lowestAllowed: number, highestAllowed: number): void; - build(): net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; - clear(): void; - isEmpty(): boolean; - getBoundingBox(): net.minecraft.world.level.levelgen.structure.BoundingBox; - } - const StructurePieceType: { - MINE_SHAFT_CORRIDOR: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - MINE_SHAFT_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - MINE_SHAFT_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - MINE_SHAFT_STAIRS: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_BRIDGE_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_BRIDGE_END_FILLER: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_BRIDGE_STRAIGHT: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_CASTLE_CORRIDOR_STAIRS: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_CASTLE_CORRIDOR_T_BALCONY: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_CASTLE_ENTRANCE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_CASTLE_SMALL_CORRIDOR_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_CASTLE_SMALL_CORRIDOR_LEFT_TURN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_CASTLE_SMALL_CORRIDOR: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_CASTLE_SMALL_CORRIDOR_RIGHT_TURN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_CASTLE_STALK_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_MONSTER_THRONE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_ROOM_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_STAIRS_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FORTRESS_START: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_CHEST_CORRIDOR: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_FILLER_CORRIDOR: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_FIVE_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_LEFT_TURN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_LIBRARY: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_PORTAL_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_PRISON_HALL: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_RIGHT_TURN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_ROOM_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_STAIRS_DOWN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_START: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_STRAIGHT: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - STRONGHOLD_STRAIGHT_STAIRS_DOWN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - JUNGLE_PYRAMID_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_RUIN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - IGLOO: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - RUINED_PORTAL: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - SWAMPLAND_HUT: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - DESERT_PYRAMID_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_BUILDING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_CORE_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_DOUBLE_X_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_DOUBLE_XY_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_DOUBLE_Y_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_DOUBLE_YZ_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_DOUBLE_Z_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_ENTRY_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_PENTHOUSE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_SIMPLE_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_SIMPLE_TOP_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - OCEAN_MONUMENT_WING_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - END_CITY_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - WOODLAND_MANSION_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - BURIED_TREASURE_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - SHIPWRECK_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - NETHER_FOSSIL: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - JIGSAW: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - } - interface StructurePieceType { - load(context: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext, tag: net.minecraft.nbt.CompoundTag): net.minecraft.world.level.levelgen.structure.StructurePiece; - } - interface StructurePieceType$ContextlessType extends net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType { - load(tag: net.minecraft.nbt.CompoundTag): net.minecraft.world.level.levelgen.structure.StructurePiece; - } - interface StructurePieceType$StructureTemplateType extends net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType { - load(structureTemplateManager: net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager, tag: net.minecraft.nbt.CompoundTag): net.minecraft.world.level.levelgen.structure.StructurePiece; - } - } + } + interface ReputationEventHandler { + onReputationEventFrom(type: net.minecraft.world.entity.ai.village.ReputationEventType, source: net.minecraft.world.entity.Entity): void; + } + const PostSpawnProcessor: { + nop(): net.minecraft.world.entity.PostSpawnProcessor; + } + interface PostSpawnProcessor { + apply(target: T): void; + andThen(after: net.minecraft.world.entity.PostSpawnProcessor): net.minecraft.world.entity.PostSpawnProcessor; + } + const EntitySpawnRequest: { + new(reason: net.minecraft.world.entity.EntitySpawnReason, ignoreChecks: boolean): net.minecraft.world.entity.EntitySpawnRequest; + } + interface EntitySpawnRequest extends java.lang.Record { + reason(): net.minecraft.world.entity.EntitySpawnReason; + ignoreChecks(): boolean; + } + interface EntityType$EntityFactory { + create(entityType: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.Level): T; + (entityType: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.Level): T; + } + const EntityProcessor: { + NOP: net.minecraft.world.entity.EntityProcessor; + } + interface EntityProcessor { + process(input: net.minecraft.world.entity.Entity): net.minecraft.world.entity.Entity | null | undefined; + (input: net.minecraft.world.entity.Entity): net.minecraft.world.entity.Entity | null | undefined; + } + const EntityType$Builder: { + of(factory: net.minecraft.world.entity.EntityType$EntityFactory, category: net.minecraft.world.entity.MobCategory): net.minecraft.world.entity.EntityType$Builder; + createNothing(category: net.minecraft.world.entity.MobCategory): net.minecraft.world.entity.EntityType$Builder; + } + interface EntityType$Builder extends net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityType$Builder { + immuneTo(tag: net.minecraft.tags.TagKey): net.minecraft.world.entity.EntityType$Builder; + fireImmune(): net.minecraft.world.entity.EntityType$Builder; + canSpawnFarFromPlayer(): net.minecraft.world.entity.EntityType$Builder; + clientTrackingRange(clientChunkRange: number): net.minecraft.world.entity.EntityType$Builder; + updateInterval(updateInterval: number): net.minecraft.world.entity.EntityType$Builder; + spawnDimensionsScale(scale: number): net.minecraft.world.entity.EntityType$Builder; + requiredFeatures(flags: net.minecraft.world.flag.FeatureFlag): net.minecraft.world.entity.EntityType$Builder; + sized(width: number, height: number): net.minecraft.world.entity.EntityType$Builder; + eyeHeight(eyeHeight: number): net.minecraft.world.entity.EntityType$Builder; + passengerAttachments(offsetYs: number): net.minecraft.world.entity.EntityType$Builder; + passengerAttachments(points: net.minecraft.world.phys.Vec3): net.minecraft.world.entity.EntityType$Builder; + vehicleAttachment(point: net.minecraft.world.phys.Vec3): net.minecraft.world.entity.EntityType$Builder; + ridingOffset(ridingOffset: number): net.minecraft.world.entity.EntityType$Builder; + nameTagOffset(nameTagOffset: number): net.minecraft.world.entity.EntityType$Builder; + attach(attachment: net.minecraft.world.entity.EntityAttachment, x: number, y: number, z: number): net.minecraft.world.entity.EntityType$Builder; + attach(attachment: net.minecraft.world.entity.EntityAttachment, point: net.minecraft.world.phys.Vec3): net.minecraft.world.entity.EntityType$Builder; + noSummon(): net.minecraft.world.entity.EntityType$Builder; + noSave(): net.minecraft.world.entity.EntityType$Builder; + noLootTable(): net.minecraft.world.entity.EntityType$Builder; + notInPeaceful(): net.minecraft.world.entity.EntityType$Builder; + build(name: net.minecraft.resources.ResourceKey>): net.minecraft.world.entity.EntityType; + } + interface SpawnPlacements$SpawnPredicate { + test(type: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.ServerLevelAccessor, spawnReason: net.minecraft.world.entity.EntitySpawnReason, pos: net.minecraft.core.BlockPos, random: net.minecraft.util.RandomSource): boolean; + (type: net.minecraft.world.entity.EntityType, level: net.minecraft.world.level.ServerLevelAccessor, spawnReason: net.minecraft.world.entity.EntitySpawnReason, pos: net.minecraft.core.BlockPos, random: net.minecraft.util.RandomSource): boolean; + } + } + namespace level { + namespace entity { + const EntityTypeTest: { + forClass(cls: java.lang.Class): net.minecraft.world.level.entity.EntityTypeTest; + forExactClass(cls: java.lang.Class): net.minecraft.world.level.entity.EntityTypeTest; + } + interface EntityTypeTest { + tryCast(entity: B): T; + getBaseClass(): java.lang.Class; + } + interface EntityAccess extends net.minecraft.world.level.entity.UniquelyIdentifyable { + getId(): number; + blockPosition(): net.minecraft.core.BlockPos; + getBoundingBox(): net.minecraft.world.phys.AABB; + setLevelCallback(callback: net.minecraft.world.level.entity.EntityInLevelCallback): void; + getSelfAndPassengers(): java.util.stream.Stream; + getPassengersAndSelf(): java.util.stream.Stream; + setRemoved(removalReason: net.minecraft.world.entity.Entity$RemovalReason): void; + shouldBeSaved(): boolean; + isAlwaysTicking(): boolean; + } + interface UniquelyIdentifyable { + getUUID(): java.util.UUID; + isRemoved(): boolean; + } + const EntityInLevelCallback: { + NULL: net.minecraft.world.level.entity.EntityInLevelCallback; + } + interface EntityInLevelCallback { + onMove(): void; + onRemove(reason: net.minecraft.world.entity.Entity$RemovalReason): void; + } + interface ChunkStatusUpdateListener { + onChunkStatusChange(pos: net.minecraft.world.level.ChunkPos, chunkStatus: net.minecraft.server.level.FullChunkStatus): void; + (pos: net.minecraft.world.level.ChunkPos, chunkStatus: net.minecraft.server.level.FullChunkStatus): void; + } + interface UUIDLookup { + lookup(uuid: java.util.UUID): IdentifiedType; + } + interface LevelEntityGetter { + get(id: number): T; + get(id: java.util.UUID): T; + get(type: net.minecraft.world.level.entity.EntityTypeTest, consumer: net.minecraft.util.AbortableIterationConsumer): void; + get(bb: net.minecraft.world.phys.AABB, output: unknown): void; + get(type: net.minecraft.world.level.entity.EntityTypeTest, bb: net.minecraft.world.phys.AABB, consumer: net.minecraft.util.AbortableIterationConsumer): void; + getAll(): kotlin.collections.MutableIterable; + } + } + namespace levelgen { + namespace structure { namespace templatesystem { namespace loader { const TemplatePathFactory: { @@ -26279,12 +26257,11 @@ declare global { } interface LiquidSettings extends kotlin.Enum, net.minecraft.util.StringRepresentable { } - const StructureProcessor: { - new(): net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; - } interface StructureProcessor { - processBlock(level: net.minecraft.world.level.LevelReader, targetPosition: net.minecraft.core.BlockPos, referencePos: net.minecraft.core.BlockPos, originalBlockInfo: net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate$StructureBlockInfo, processedBlockInfo: net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate$StructureBlockInfo, settings: net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings): net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate$StructureBlockInfo | null | undefined; + processBlock(level: net.minecraft.world.level.LevelReader, targetPosition: net.minecraft.core.BlockPos, referencePos: net.minecraft.core.BlockPos, templateRelativePos: net.minecraft.core.BlockPos, processedBlockInfo: net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate$StructureBlockInfo, settings: net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings): net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate$StructureBlockInfo | null | undefined; + codec(): com.mojang.serialization.MapCodec; finalizeProcessing(level: net.minecraft.world.level.ServerLevelAccessor, position: net.minecraft.core.BlockPos, referencePos: net.minecraft.core.BlockPos, originalBlockInfoList: Array, processedBlockInfoList: Array, settings: net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings): Array; + evaluatesEntirePieceState(): boolean; } const StructureTemplate$StructureBlockInfo: { new(pos: net.minecraft.core.BlockPos, state: net.minecraft.world.level.block.state.BlockState, nbt: net.minecraft.nbt.CompoundTag | null | undefined): net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate$StructureBlockInfo; @@ -26294,27 +26271,6 @@ declare global { state(): net.minecraft.world.level.block.state.BlockState; nbt(): net.minecraft.nbt.CompoundTag | null | undefined; } - const StructureProcessorType: { - SINGLE_CODEC: com.mojang.serialization.Codec; - LIST_OBJECT_CODEC: com.mojang.serialization.Codec; - DIRECT_CODEC: com.mojang.serialization.Codec; - LIST_CODEC: com.mojang.serialization.Codec>; - BLOCK_IGNORE: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - BLOCK_ROT: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - GRAVITY: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - JIGSAW_REPLACEMENT: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - RULE: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - NOP: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - BLOCK_AGE: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - BLACKSTONE_REPLACE: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - LAVA_SUBMERGED_BLOCK: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - PROTECTED_BLOCKS: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - CAPPED: net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; - register

(id: string, codec: com.mojang.serialization.MapCodec

): net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType

; - } - interface StructureProcessorType

{ - codec(): com.mojang.serialization.MapCodec

; - } interface StructureTemplate$Palette { blocks(): Array; blocks(filter: net.minecraft.world.level.block.Block): Array; @@ -26344,6 +26300,17 @@ declare global { } } namespace placement { + const ConcentricRingsStructurePlacement: { + CODEC: com.mojang.serialization.MapCodec; + new(locateOffset: net.minecraft.core.Vec3i, frequencyReductionMethod: net.minecraft.world.level.levelgen.structure.placement.StructurePlacement$FrequencyReductionMethod, frequency: number, salt: number, exclusionZone: java.util.Optional, distance: number, spread: number, count: number, preferredBiomes: net.minecraft.core.HolderSet): net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; + new(distance: number, spread: number, count: number, preferredBiomes: net.minecraft.core.HolderSet): net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; + } + interface ConcentricRingsStructurePlacement extends net.minecraft.world.level.levelgen.structure.placement.StructurePlacement { + distance(): number; + spread(): number; + count(): number; + preferredBiomes(): net.minecraft.core.HolderSet; + } const StructurePlacement: { FrequencyReductionMethod: typeof net.minecraft.world.level.levelgen.structure.placement.StructurePlacement$FrequencyReductionMethod; ExclusionZone: typeof net.minecraft.world.level.levelgen.structure.placement.StructurePlacement$ExclusionZone; @@ -26369,17 +26336,6 @@ declare global { interface StructurePlacement$FrequencyReductionMethod extends kotlin.Enum, net.minecraft.util.StringRepresentable { shouldGenerate(seed: number, salt: number, sourceX: number, sourceZ: number, probability: number): boolean; } - const ConcentricRingsStructurePlacement: { - CODEC: com.mojang.serialization.MapCodec; - new(locateOffset: net.minecraft.core.Vec3i, frequencyReductionMethod: net.minecraft.world.level.levelgen.structure.placement.StructurePlacement$FrequencyReductionMethod, frequency: number, salt: number, exclusionZone: java.util.Optional, distance: number, spread: number, count: number, preferredBiomes: net.minecraft.core.HolderSet): net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; - new(distance: number, spread: number, count: number, preferredBiomes: net.minecraft.core.HolderSet): net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; - } - interface ConcentricRingsStructurePlacement extends net.minecraft.world.level.levelgen.structure.placement.StructurePlacement { - distance(): number; - spread(): number; - count(): number; - preferredBiomes(): net.minecraft.core.HolderSet; - } const StructurePlacementType: { RANDOM_SPREAD: net.minecraft.world.level.levelgen.structure.placement.StructurePlacementType; CONCENTRIC_RINGS: net.minecraft.world.level.levelgen.structure.placement.StructurePlacementType; @@ -26400,6 +26356,107 @@ declare global { (seed: number, salt: number, sourceX: number, sourceZ: number, probability: number): boolean; } } + namespace pieces { + const StructurePieceSerializationContext: { + new(resourceManager: net.minecraft.server.packs.resources.ResourceManager, registryAccess: net.minecraft.core.RegistryAccess, structureTemplateManager: net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager): net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; + fromLevel(level: net.minecraft.server.level.ServerLevel): net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; + } + interface StructurePieceSerializationContext extends java.lang.Record { + resourceManager(): net.minecraft.server.packs.resources.ResourceManager; + registryAccess(): net.minecraft.core.RegistryAccess; + structureTemplateManager(): net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; + } + const PiecesContainer: { + new(pieces: Array): net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; + load(children: net.minecraft.nbt.ListTag, context: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext): net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; + } + interface PiecesContainer extends java.lang.Record { + isEmpty(): boolean; + isInsidePiece(startPos: net.minecraft.core.BlockPos): boolean; + save(context: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext): net.minecraft.nbt.Tag; + calculateBoundingBox(): net.minecraft.world.level.levelgen.structure.BoundingBox; + pieces(): Array; + } + const StructurePiecesBuilder: { + new(): net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; + } + interface StructurePiecesBuilder extends net.minecraft.world.level.levelgen.structure.StructurePieceAccessor { + offsetPiecesVertically(dy: number): void; + moveBelowSeaLevel(seaLevel: number, minY: number, random: net.minecraft.util.RandomSource, offset: number): number; + moveInsideHeights(random: net.minecraft.util.RandomSource, lowestAllowed: number, highestAllowed: number): void; + build(): net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; + clear(): void; + isEmpty(): boolean; + getBoundingBox(): net.minecraft.world.level.levelgen.structure.BoundingBox; + } + const StructurePieceType: { + MINE_SHAFT_CORRIDOR: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + MINE_SHAFT_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + MINE_SHAFT_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + MINE_SHAFT_STAIRS: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_BRIDGE_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_BRIDGE_END_FILLER: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_BRIDGE_STRAIGHT: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_CASTLE_CORRIDOR_STAIRS: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_CASTLE_CORRIDOR_T_BALCONY: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_CASTLE_ENTRANCE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_CASTLE_SMALL_CORRIDOR_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_CASTLE_SMALL_CORRIDOR_LEFT_TURN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_CASTLE_SMALL_CORRIDOR: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_CASTLE_SMALL_CORRIDOR_RIGHT_TURN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_CASTLE_STALK_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_MONSTER_THRONE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_ROOM_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_STAIRS_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FORTRESS_START: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_CHEST_CORRIDOR: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_FILLER_CORRIDOR: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_FIVE_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_LEFT_TURN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_LIBRARY: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_PORTAL_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_PRISON_HALL: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_RIGHT_TURN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_ROOM_CROSSING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_STAIRS_DOWN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_START: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_STRAIGHT: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + STRONGHOLD_STRAIGHT_STAIRS_DOWN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + JUNGLE_PYRAMID_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_RUIN: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + IGLOO: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + RUINED_PORTAL: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + SWAMPLAND_HUT: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + DESERT_PYRAMID_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_BUILDING: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_CORE_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_DOUBLE_X_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_DOUBLE_XY_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_DOUBLE_Y_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_DOUBLE_YZ_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_DOUBLE_Z_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_ENTRY_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_PENTHOUSE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_SIMPLE_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_SIMPLE_TOP_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + OCEAN_MONUMENT_WING_ROOM: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + END_CITY_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + WOODLAND_MANSION_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + BURIED_TREASURE_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + SHIPWRECK_PIECE: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + NETHER_FOSSIL: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + JIGSAW: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; + } + interface StructurePieceType { + load(context: net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext, tag: net.minecraft.nbt.CompoundTag): net.minecraft.world.level.levelgen.structure.StructurePiece; + } + interface StructurePieceType$ContextlessType extends net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType { + load(tag: net.minecraft.nbt.CompoundTag): net.minecraft.world.level.levelgen.structure.StructurePiece; + } + interface StructurePieceType$StructureTemplateType extends net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType { + load(structureTemplateManager: net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager, tag: net.minecraft.nbt.CompoundTag): net.minecraft.world.level.levelgen.structure.StructurePiece; + } + } const BoundingBox: { CODEC: com.mojang.serialization.Codec; STREAM_CODEC: net.minecraft.network.codec.StreamCodec; @@ -26610,51 +26667,6 @@ declare global { getNext(): net.minecraft.world.level.block.state.BlockState; } } - namespace blending { - const Blender: { - BlendingOutput: typeof net.minecraft.world.level.levelgen.blending.Blender$BlendingOutput; - empty(): net.minecraft.world.level.levelgen.blending.Blender; - of(region: net.minecraft.server.level.WorldGenRegion | null | undefined): net.minecraft.world.level.levelgen.blending.Blender; - generateBorderTicks(region: net.minecraft.server.level.WorldGenRegion, chunk: net.minecraft.world.level.chunk.ChunkAccess): void; - addAroundOldChunksCarvingMaskFilter(region: net.minecraft.world.level.WorldGenLevel, chunk: net.minecraft.world.level.chunk.ProtoChunk): void; - makeOldChunkDistanceGetter(centerBlendingData: net.minecraft.world.level.levelgen.blending.BlendingData | null | undefined, oldSidesBlendingData: Map): net.minecraft.world.level.levelgen.blending.Blender$DistanceGetter; - } - interface Blender { - isEmpty(): boolean; - blendOffsetAndFactor(blockX: number, blockZ: number): net.minecraft.world.level.levelgen.blending.Blender$BlendingOutput; - blendDensity(context: net.minecraft.world.level.levelgen.DensityFunction$FunctionContext, noiseValue: number): number; - getBiomeResolver(biomeResolver: net.minecraft.world.level.biome.BiomeResolver): net.minecraft.world.level.biome.BiomeResolver; - } - const Blender$BlendingOutput: { - new(alpha: number, blendingOffset: number): net.minecraft.world.level.levelgen.blending.Blender$BlendingOutput; - } - interface Blender$BlendingOutput extends java.lang.Record { - alpha(): number; - blendingOffset(): number; - } - const BlendingData: { - Packed: typeof net.minecraft.world.level.levelgen.blending.BlendingData$Packed; - unpack(packed: net.minecraft.world.level.levelgen.blending.BlendingData$Packed | null | undefined): net.minecraft.world.level.levelgen.blending.BlendingData | null | undefined; - getOrUpdateBlendingData(region: net.minecraft.server.level.WorldGenRegion, chunkX: number, chunkZ: number): net.minecraft.world.level.levelgen.blending.BlendingData | null | undefined; - sideByGenerationAge(region: net.minecraft.world.level.WorldGenLevel, chunkX: number, chunkZ: number, wantedOldGen: boolean): Set; - } - interface BlendingData { - pack(): net.minecraft.world.level.levelgen.blending.BlendingData$Packed; - getAreaWithOldGeneration(): net.minecraft.world.level.LevelHeightAccessor; - } - const BlendingData$Packed: { - CODEC: com.mojang.serialization.Codec; - new(minSection: number, maxSection: number, heights: java.util.Optional): net.minecraft.world.level.levelgen.blending.BlendingData$Packed; - } - interface BlendingData$Packed extends java.lang.Record { - minSection(): number; - maxSection(): number; - heights(): java.util.Optional; - } - interface Blender$DistanceGetter { - getDistance(x: number, y: number, z: number): number; - } - } namespace synth { const NormalNoise: { NoiseParameters: typeof net.minecraft.world.level.levelgen.synth.NormalNoise$NoiseParameters; @@ -26686,14 +26698,49 @@ declare global { getValue(x: number, y: number, useNoiseStart: boolean): number; } } - namespace carver { - const CarvingContext: { - new(generator: net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator, registryAccess: net.minecraft.core.RegistryAccess, heightAccessor: net.minecraft.world.level.LevelHeightAccessor, noiseChunk: net.minecraft.world.level.levelgen.NoiseChunk, randomState: net.minecraft.world.level.levelgen.RandomState, surfaceRule: net.minecraft.world.level.levelgen.SurfaceRules$RuleSource): net.minecraft.world.level.levelgen.carver.CarvingContext; + namespace blending { + const BlendingData: { + Packed: typeof net.minecraft.world.level.levelgen.blending.BlendingData$Packed; + unpack(packed: net.minecraft.world.level.levelgen.blending.BlendingData$Packed | null | undefined): net.minecraft.world.level.levelgen.blending.BlendingData | null | undefined; + getOrUpdateBlendingData(region: net.minecraft.server.level.WorldGenRegion, chunkX: number, chunkZ: number): net.minecraft.world.level.levelgen.blending.BlendingData | null | undefined; + sideByGenerationAge(region: net.minecraft.world.level.WorldGenLevel, chunkX: number, chunkZ: number, wantedOldGen: boolean): Set; } - interface CarvingContext extends net.minecraft.world.level.levelgen.WorldGenerationContext { - registryAccess(): net.minecraft.core.RegistryAccess; - randomState(): net.minecraft.world.level.levelgen.RandomState; - topMaterial(biomeGetter: unknown, chunk: net.minecraft.world.level.chunk.ChunkAccess, pos: net.minecraft.core.BlockPos, underFluid: boolean): java.util.Optional; + interface BlendingData { + pack(): net.minecraft.world.level.levelgen.blending.BlendingData$Packed; + getAreaWithOldGeneration(): net.minecraft.world.level.LevelHeightAccessor; + } + const BlendingData$Packed: { + CODEC: com.mojang.serialization.Codec; + new(minSection: number, maxSection: number, heights: java.util.Optional): net.minecraft.world.level.levelgen.blending.BlendingData$Packed; + } + interface BlendingData$Packed extends java.lang.Record { + minSection(): number; + maxSection(): number; + heights(): java.util.Optional; + } + const Blender: { + BlendingOutput: typeof net.minecraft.world.level.levelgen.blending.Blender$BlendingOutput; + empty(): net.minecraft.world.level.levelgen.blending.Blender; + of(region: net.minecraft.server.level.WorldGenRegion | null | undefined): net.minecraft.world.level.levelgen.blending.Blender; + generateBorderTicks(region: net.minecraft.server.level.WorldGenRegion, chunk: net.minecraft.world.level.chunk.ChunkAccess): void; + addAroundOldChunksCarvingMaskFilter(region: net.minecraft.world.level.WorldGenLevel, chunk: net.minecraft.world.level.chunk.ProtoChunk): void; + makeOldChunkDistanceGetter(centerBlendingData: net.minecraft.world.level.levelgen.blending.BlendingData | null | undefined, oldSidesBlendingData: Map): net.minecraft.world.level.levelgen.blending.Blender$DistanceGetter; + } + interface Blender { + isEmpty(): boolean; + blendOffsetAndFactor(blockX: number, blockZ: number): net.minecraft.world.level.levelgen.blending.Blender$BlendingOutput; + blendDensity(context: net.minecraft.world.level.levelgen.DensityFunction$FunctionContext, noiseValue: number): number; + getBiomeResolver(biomeResolver: net.minecraft.world.level.biome.BiomeResolver): net.minecraft.world.level.biome.BiomeResolver; + } + const Blender$BlendingOutput: { + new(alpha: number, blendingOffset: number): net.minecraft.world.level.levelgen.blending.Blender$BlendingOutput; + } + interface Blender$BlendingOutput extends java.lang.Record { + alpha(): number; + blendingOffset(): number; + } + interface Blender$DistanceGetter { + getDistance(x: number, y: number, z: number): number; } } namespace placement { @@ -26712,6 +26759,16 @@ declare global { placement(): Array; } } + namespace carver { + const CarvingContext: { + new(generator: net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator, registryAccess: net.minecraft.core.RegistryAccess, heightAccessor: net.minecraft.world.level.LevelHeightAccessor, noiseChunk: net.minecraft.world.level.levelgen.NoiseChunk, randomState: net.minecraft.world.level.levelgen.RandomState, surfaceRule: net.minecraft.world.level.levelgen.SurfaceRules$RuleSource): net.minecraft.world.level.levelgen.carver.CarvingContext; + } + interface CarvingContext extends net.minecraft.world.level.levelgen.WorldGenerationContext { + registryAccess(): net.minecraft.core.RegistryAccess; + randomState(): net.minecraft.world.level.levelgen.RandomState; + topMaterial(biomeGetter: unknown, chunk: net.minecraft.world.level.chunk.ChunkAccess, pos: net.minecraft.core.BlockPos, underFluid: boolean): java.util.Optional; + } + } namespace flat { const FlatLevelGeneratorSettings: { CODEC: com.mojang.serialization.Codec; @@ -26789,13 +26846,12 @@ declare global { const DensityFunction: { SinglePointContext: typeof net.minecraft.world.level.levelgen.DensityFunction$SinglePointContext; NoiseHolder: typeof net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder; - DIRECT_CODEC: com.mojang.serialization.Codec; - CODEC: com.mojang.serialization.Codec>; - HOLDER_HELPER_CODEC: com.mojang.serialization.Codec; + CODEC: com.mojang.serialization.Codec; } interface DensityFunction { compute(context: net.minecraft.world.level.levelgen.DensityFunction$FunctionContext): number; fillArray(output: kotlin.DoubleArray, contextProvider: net.minecraft.world.level.levelgen.DensityFunction$ContextProvider): void; + mapChildren(visitor: net.minecraft.world.level.levelgen.DensityFunction$Visitor): net.minecraft.world.level.levelgen.DensityFunction; mapAll(visitor: net.minecraft.world.level.levelgen.DensityFunction$Visitor): net.minecraft.world.level.levelgen.DensityFunction; minValue(): number; maxValue(): number; @@ -26813,27 +26869,32 @@ declare global { blockX(): number; blockY(): number; blockZ(): number; - getBlender(): net.minecraft.world.level.levelgen.blending.Blender; } - const GenerationStep$Decoration: { - RAW_GENERATION: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - LAKES: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - LOCAL_MODIFICATIONS: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - UNDERGROUND_STRUCTURES: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - SURFACE_STRUCTURES: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - STRONGHOLDS: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - UNDERGROUND_ORES: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - UNDERGROUND_DECORATION: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - FLUID_SPRINGS: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - VEGETAL_DECORATION: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - TOP_LAYER_MODIFICATION: net.minecraft.world.level.levelgen.GenerationStep$Decoration; - CODEC: com.mojang.serialization.Codec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.levelgen.GenerationStep$Decoration; + interface DensityFunction$ContextProvider { + forIndex(index: number): net.minecraft.world.level.levelgen.DensityFunction$FunctionContext; + fillAllDirectly(output: kotlin.DoubleArray, function_: net.minecraft.world.level.levelgen.DensityFunction): void; } - interface GenerationStep$Decoration extends kotlin.Enum, net.minecraft.util.StringRepresentable { - getName(): string; + interface DensityFunction$Visitor { + apply(input: net.minecraft.world.level.levelgen.DensityFunction): net.minecraft.world.level.levelgen.DensityFunction; + visitNoise(noise: net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder): net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder; + } + const DensityFunction$NoiseHolder: { + CODEC: com.mojang.serialization.Codec; + new(noiseData: net.minecraft.core.Holder): net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder; + new(noiseData: net.minecraft.core.Holder, noise: net.minecraft.world.level.levelgen.synth.NormalNoise | null | undefined): net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder; + } + interface DensityFunction$NoiseHolder extends java.lang.Record { + getValue(x: number, y: number, z: number): number; + maxValue(): number; + noiseData(): net.minecraft.core.Holder; + noise(): net.minecraft.world.level.levelgen.synth.NormalNoise | null | undefined; + } + const DensityFunction$SinglePointContext: { + new(blockX: number, blockY: number, blockZ: number): net.minecraft.world.level.levelgen.DensityFunction$SinglePointContext; + } + interface DensityFunction$SinglePointContext extends java.lang.Record, net.minecraft.world.level.levelgen.DensityFunction$FunctionContext { + } + interface DensityFunction$SimpleFunction extends net.minecraft.world.level.levelgen.DensityFunction { } const RandomState: { create(holders: net.minecraft.core.HolderGetter$Provider, noiseSettings: net.minecraft.resources.ResourceKey, seed: number): net.minecraft.world.level.levelgen.RandomState; @@ -26870,26 +26931,11 @@ declare global { veinRidged(): net.minecraft.world.level.levelgen.DensityFunction; veinGap(): net.minecraft.world.level.levelgen.DensityFunction; } - interface DensityFunction$Visitor { - apply(input: net.minecraft.world.level.levelgen.DensityFunction): net.minecraft.world.level.levelgen.DensityFunction; - visitNoise(noise: net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder): net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder; - } - const DensityFunction$NoiseHolder: { - CODEC: com.mojang.serialization.Codec; - new(noiseData: net.minecraft.core.Holder): net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder; - new(noiseData: net.minecraft.core.Holder, noise: net.minecraft.world.level.levelgen.synth.NormalNoise | null | undefined): net.minecraft.world.level.levelgen.DensityFunction$NoiseHolder; - } - interface DensityFunction$NoiseHolder extends java.lang.Record { - getValue(x: number, y: number, z: number): number; - maxValue(): number; - noiseData(): net.minecraft.core.Holder; - noise(): net.minecraft.world.level.levelgen.synth.NormalNoise | null | undefined; - } const SurfaceSystem: { new(randomState: net.minecraft.world.level.levelgen.RandomState, defaultBlock: net.minecraft.world.level.block.state.BlockState, seaLevel: number, noiseRandom: net.minecraft.world.level.levelgen.PositionalRandomFactory): net.minecraft.world.level.levelgen.SurfaceSystem; } interface SurfaceSystem { - buildSurface(randomState: net.minecraft.world.level.levelgen.RandomState, biomeManager: net.minecraft.world.level.biome.BiomeManager, biomes: net.minecraft.core.Registry, useLegacyRandom: boolean, generationContext: net.minecraft.world.level.levelgen.WorldGenerationContext, protoChunk: net.minecraft.world.level.chunk.ChunkAccess, noiseChunk: net.minecraft.world.level.levelgen.NoiseChunk, ruleSource: net.minecraft.world.level.levelgen.SurfaceRules$RuleSource): void; + buildSurface(randomState: net.minecraft.world.level.levelgen.RandomState, biomeManager: net.minecraft.world.level.biome.BiomeManager, useLegacyRandom: boolean, generationContext: net.minecraft.world.level.levelgen.WorldGenerationContext, protoChunk: net.minecraft.world.level.chunk.ChunkAccess, noiseChunk: net.minecraft.world.level.levelgen.NoiseChunk, ruleSource: net.minecraft.world.level.levelgen.SurfaceRules$RuleSource, possibleBiomes: Set> | null | undefined): void; getSeaLevel(): number; topMaterial(ruleSource: net.minecraft.world.level.levelgen.SurfaceRules$RuleSource, carvingContext: net.minecraft.world.level.levelgen.carver.CarvingContext, biomeGetter: unknown, chunk: net.minecraft.world.level.chunk.ChunkAccess, noiseChunk: net.minecraft.world.level.levelgen.NoiseChunk, pos: net.minecraft.core.BlockPos, underFluid: boolean): java.util.Optional; } @@ -26900,6 +26946,120 @@ declare global { getMinGenY(): number; getGenDepth(): number; } + const GenerationStep$Decoration: { + RAW_GENERATION: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + LAKES: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + LOCAL_MODIFICATIONS: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + UNDERGROUND_STRUCTURES: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + SURFACE_STRUCTURES: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + STRONGHOLDS: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + UNDERGROUND_ORES: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + UNDERGROUND_DECORATION: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + FLUID_SPRINGS: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + VEGETAL_DECORATION: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + TOP_LAYER_MODIFICATION: net.minecraft.world.level.levelgen.GenerationStep$Decoration; + CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.world.level.levelgen.GenerationStep$Decoration; + } + interface GenerationStep$Decoration extends kotlin.Enum, net.minecraft.util.StringRepresentable { + getName(): string; + } + const BelowZeroRetrogen: { + CODEC: com.mojang.serialization.Codec; + UPGRADE_HEIGHT_ACCESSOR: net.minecraft.world.level.LevelHeightAccessor; + replaceOldBedrock(chunk: net.minecraft.world.level.chunk.ProtoChunk): void; + getBiomeResolver(biomeResolver: net.minecraft.world.level.biome.BiomeResolver, protoChunk: net.minecraft.world.level.chunk.ChunkAccess): net.minecraft.world.level.biome.BiomeResolver; + } + interface BelowZeroRetrogen { + targetStatus(): net.minecraft.world.level.chunk.status.ChunkStatus; + applyBedrockMask(chunk: net.minecraft.world.level.chunk.ProtoChunk): void; + hasBedrockHoles(): boolean; + hasBedrockHole(x: number, z: number): boolean; + } + const Heightmap$Types: { + WORLD_SURFACE_WG: net.minecraft.world.level.levelgen.Heightmap$Types; + WORLD_SURFACE: net.minecraft.world.level.levelgen.Heightmap$Types; + OCEAN_FLOOR_WG: net.minecraft.world.level.levelgen.Heightmap$Types; + OCEAN_FLOOR: net.minecraft.world.level.levelgen.Heightmap$Types; + MOTION_BLOCKING: net.minecraft.world.level.levelgen.Heightmap$Types; + MOTION_BLOCKING_NO_LEAVES: net.minecraft.world.level.levelgen.Heightmap$Types; + CODEC: com.mojang.serialization.Codec; + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.world.level.levelgen.Heightmap$Types; + } + interface Heightmap$Types extends kotlin.Enum, net.minecraft.util.StringRepresentable { + isOpaque(): unknown; + getSerializationKey(): string; + sendToClient(): boolean; + keepAfterWorldgen(): boolean; + } + const Heightmap: { + Types: typeof net.minecraft.world.level.levelgen.Heightmap$Types; + Usage: typeof net.minecraft.world.level.levelgen.Heightmap$Usage; + new(chunk: net.minecraft.world.level.chunk.ChunkAccess, heightmapType: net.minecraft.world.level.levelgen.Heightmap$Types): net.minecraft.world.level.levelgen.Heightmap; + primeHeightmaps(chunk: net.minecraft.world.level.chunk.ChunkAccess, types: Set): void; + } + interface Heightmap { + update(localX: number, localY: number, localZ: number, state: net.minecraft.world.level.block.state.BlockState): boolean; + getFirstAvailable(x: number, z: number): number; + getHighestTaken(x: number, z: number): number; + setRawData(chunk: net.minecraft.world.level.chunk.ChunkAccess, type: net.minecraft.world.level.levelgen.Heightmap$Types, data: Array): void; + getRawData(): Array; + } + const Heightmap$Usage: { + WORLDGEN: net.minecraft.world.level.levelgen.Heightmap$Usage; + LIVE_WORLD: net.minecraft.world.level.levelgen.Heightmap$Usage; + CLIENT: net.minecraft.world.level.levelgen.Heightmap$Usage; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.world.level.levelgen.Heightmap$Usage; + } + interface Heightmap$Usage extends kotlin.Enum { + } + const WorldgenRandom: { + Algorithm: typeof net.minecraft.world.level.levelgen.WorldgenRandom$Algorithm; + new(randomSource: net.minecraft.util.RandomSource): net.minecraft.world.level.levelgen.WorldgenRandom; + seedSlimeChunk(x: number, z: number, seed: number, salt: number): net.minecraft.util.RandomSource; + } + interface WorldgenRandom extends net.minecraft.world.level.levelgen.LegacyRandomSource { + getCount(): number; + setDecorationSeed(seed: number, chunkX: number, chunkZ: number): number; + setFeatureSeed(seed: number, index: number, step: number): void; + setLargeFeatureSeed(seed: number, chunkX: number, chunkZ: number): void; + setLargeFeatureWithSalt(seed: number, x: number, z: number, blend: number): void; + } + const LegacyRandomSource: { + LegacyPositionalRandomFactory: typeof net.minecraft.world.level.levelgen.LegacyRandomSource$LegacyPositionalRandomFactory; + new(seed: number): net.minecraft.world.level.levelgen.LegacyRandomSource; + } + interface LegacyRandomSource extends net.minecraft.world.level.levelgen.BitRandomSource { + } + const BitRandomSource: { + FLOAT_MULTIPLIER: number; + DOUBLE_MULTIPLIER: number; + } + interface BitRandomSource extends net.minecraft.util.RandomSource { + next(bits: number): number; + } + const LegacyRandomSource$LegacyPositionalRandomFactory: { + new(seed: number): net.minecraft.world.level.levelgen.LegacyRandomSource$LegacyPositionalRandomFactory; + } + interface LegacyRandomSource$LegacyPositionalRandomFactory extends net.minecraft.world.level.levelgen.PositionalRandomFactory { + } + const WorldgenRandom$Algorithm: { + LEGACY: net.minecraft.world.level.levelgen.WorldgenRandom$Algorithm; + XOROSHIRO: net.minecraft.world.level.levelgen.WorldgenRandom$Algorithm; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.world.level.levelgen.WorldgenRandom$Algorithm; + } + interface WorldgenRandom$Algorithm extends kotlin.Enum { + newInstance(seed: number): net.minecraft.util.RandomSource; + } const NoiseChunk: { NoiseInterpolator: typeof net.minecraft.world.level.levelgen.NoiseChunk$NoiseInterpolator; new(cellCountXZ: number, randomState: net.minecraft.world.level.levelgen.RandomState, chunkMinBlockX: number, chunkMinBlockZ: number, noiseSettings: net.minecraft.world.level.levelgen.NoiseSettings, beardifier: net.minecraft.world.level.levelgen.DensityFunctions$BeardifierOrMarker, settings: net.minecraft.world.level.levelgen.NoiseGeneratorSettings, globalFluidPicker: net.minecraft.world.level.levelgen.Aquifer$FluidPicker, blender: net.minecraft.world.level.levelgen.blending.Blender): net.minecraft.world.level.levelgen.NoiseChunk; @@ -26918,10 +27078,6 @@ declare global { stopInterpolation(): void; swapSlices(): void; } - interface DensityFunction$ContextProvider { - forIndex(index: number): net.minecraft.world.level.levelgen.DensityFunction$FunctionContext; - fillAllDirectly(output: kotlin.DoubleArray, function_: net.minecraft.world.level.levelgen.DensityFunction): void; - } const Aquifer: { NoiseBasedAquifer: typeof net.minecraft.world.level.levelgen.Aquifer$NoiseBasedAquifer; FluidStatus: typeof net.minecraft.world.level.levelgen.Aquifer$FluidStatus; @@ -26951,6 +27107,19 @@ declare global { type(): unknown; wrapped(): net.minecraft.world.level.levelgen.DensityFunction; } + const DensityFunctions$Marker$Type: { + Interpolated: net.minecraft.world.level.levelgen.DensityFunctions.DensityFunctions$Marker$Type; + FlatCache: net.minecraft.world.level.levelgen.DensityFunctions.DensityFunctions$Marker$Type; + Cache2D: net.minecraft.world.level.levelgen.DensityFunctions.DensityFunctions$Marker$Type; + CacheOnce: net.minecraft.world.level.levelgen.DensityFunctions.DensityFunctions$Marker$Type; + CacheAllInCell: net.minecraft.world.level.levelgen.DensityFunctions.DensityFunctions$Marker$Type; + BlendDensity: net.minecraft.world.level.levelgen.DensityFunctions.DensityFunctions$Marker$Type; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): unknown; + } + interface DensityFunctions$Marker$Type extends kotlin.Enum, net.minecraft.util.StringRepresentable { + } const NoiseSettings: { CODEC: com.mojang.serialization.Codec; new(minY: number, height: number, noiseSizeHorizontal: number, noiseSizeVertical: number): net.minecraft.world.level.levelgen.NoiseSettings; @@ -26970,8 +27139,6 @@ declare global { } interface DensityFunctions$BeardifierOrMarker extends net.minecraft.world.level.levelgen.DensityFunction$SimpleFunction { } - interface DensityFunction$SimpleFunction extends net.minecraft.world.level.levelgen.DensityFunction { - } const NoiseGeneratorSettings: { DIRECT_CODEC: com.mojang.serialization.Codec; CODEC: com.mojang.serialization.Codec>; @@ -27001,22 +27168,12 @@ declare global { aquifersEnabled(): boolean; useLegacyRandomSource(): boolean; } - const WorldgenRandom$Algorithm: { - LEGACY: net.minecraft.world.level.levelgen.WorldgenRandom$Algorithm; - XOROSHIRO: net.minecraft.world.level.levelgen.WorldgenRandom$Algorithm; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.levelgen.WorldgenRandom$Algorithm; - } - interface WorldgenRandom$Algorithm extends kotlin.Enum { - newInstance(seed: number): net.minecraft.util.RandomSource; - } const SurfaceRules$RuleSource: { CODEC: com.mojang.serialization.Codec; bootstrap(registry: net.minecraft.core.Registry>): com.mojang.serialization.MapCodec; } interface SurfaceRules$RuleSource { - codec(): net.minecraft.util.KeyDispatchDataCodec; + codec(): com.mojang.serialization.MapCodec; } interface NoiseChunk$BlockStateFiller { calculate(context: net.minecraft.world.level.levelgen.DensityFunction$FunctionContext): net.minecraft.world.level.block.state.BlockState | null | undefined; @@ -27030,96 +27187,7 @@ declare global { generatorSettings(): net.minecraft.core.Holder; stable(expectedPreset: net.minecraft.resources.ResourceKey): boolean; getInterpolatedNoiseValue(randomState: net.minecraft.world.level.levelgen.RandomState, context: net.minecraft.world.level.levelgen.DensityFunction$FunctionContext): number; - buildSurface(protoChunk: net.minecraft.world.level.chunk.ChunkAccess, context: net.minecraft.world.level.levelgen.WorldGenerationContext, randomState: net.minecraft.world.level.levelgen.RandomState, structureManager: net.minecraft.world.level.StructureManager, biomeManager: net.minecraft.world.level.biome.BiomeManager, biomeRegistry: net.minecraft.core.Registry, blender: net.minecraft.world.level.levelgen.blending.Blender): void; - } - const Heightmap$Types: { - WORLD_SURFACE_WG: net.minecraft.world.level.levelgen.Heightmap$Types; - WORLD_SURFACE: net.minecraft.world.level.levelgen.Heightmap$Types; - OCEAN_FLOOR_WG: net.minecraft.world.level.levelgen.Heightmap$Types; - OCEAN_FLOOR: net.minecraft.world.level.levelgen.Heightmap$Types; - MOTION_BLOCKING: net.minecraft.world.level.levelgen.Heightmap$Types; - MOTION_BLOCKING_NO_LEAVES: net.minecraft.world.level.levelgen.Heightmap$Types; - CODEC: com.mojang.serialization.Codec; - STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.levelgen.Heightmap$Types; - } - interface Heightmap$Types extends kotlin.Enum, net.minecraft.util.StringRepresentable { - isOpaque(): unknown; - getSerializationKey(): string; - sendToClient(): boolean; - keepAfterWorldgen(): boolean; - } - const WorldgenRandom: { - Algorithm: typeof net.minecraft.world.level.levelgen.WorldgenRandom$Algorithm; - new(randomSource: net.minecraft.util.RandomSource): net.minecraft.world.level.levelgen.WorldgenRandom; - seedSlimeChunk(x: number, z: number, seed: number, salt: number): net.minecraft.util.RandomSource; - } - interface WorldgenRandom extends net.minecraft.world.level.levelgen.LegacyRandomSource { - getCount(): number; - setDecorationSeed(seed: number, chunkX: number, chunkZ: number): number; - setFeatureSeed(seed: number, index: number, step: number): void; - setLargeFeatureSeed(seed: number, chunkX: number, chunkZ: number): void; - setLargeFeatureWithSalt(seed: number, x: number, z: number, blend: number): void; - } - const LegacyRandomSource: { - LegacyPositionalRandomFactory: typeof net.minecraft.world.level.levelgen.LegacyRandomSource$LegacyPositionalRandomFactory; - new(seed: number): net.minecraft.world.level.levelgen.LegacyRandomSource; - } - interface LegacyRandomSource extends net.minecraft.world.level.levelgen.BitRandomSource { - } - const BitRandomSource: { - FLOAT_MULTIPLIER: number; - DOUBLE_MULTIPLIER: number; - } - interface BitRandomSource extends net.minecraft.util.RandomSource { - next(bits: number): number; - } - const LegacyRandomSource$LegacyPositionalRandomFactory: { - new(seed: number): net.minecraft.world.level.levelgen.LegacyRandomSource$LegacyPositionalRandomFactory; - } - interface LegacyRandomSource$LegacyPositionalRandomFactory extends net.minecraft.world.level.levelgen.PositionalRandomFactory { - } - const BelowZeroRetrogen: { - CODEC: com.mojang.serialization.Codec; - UPGRADE_HEIGHT_ACCESSOR: net.minecraft.world.level.LevelHeightAccessor; - replaceOldBedrock(chunk: net.minecraft.world.level.chunk.ProtoChunk): void; - getBiomeResolver(biomeResolver: net.minecraft.world.level.biome.BiomeResolver, protoChunk: net.minecraft.world.level.chunk.ChunkAccess): net.minecraft.world.level.biome.BiomeResolver; - } - interface BelowZeroRetrogen { - targetStatus(): net.minecraft.world.level.chunk.status.ChunkStatus; - applyBedrockMask(chunk: net.minecraft.world.level.chunk.ProtoChunk): void; - hasBedrockHoles(): boolean; - hasBedrockHole(x: number, z: number): boolean; - } - const Heightmap: { - Types: typeof net.minecraft.world.level.levelgen.Heightmap$Types; - Usage: typeof net.minecraft.world.level.levelgen.Heightmap$Usage; - new(chunk: net.minecraft.world.level.chunk.ChunkAccess, heightmapType: net.minecraft.world.level.levelgen.Heightmap$Types): net.minecraft.world.level.levelgen.Heightmap; - primeHeightmaps(chunk: net.minecraft.world.level.chunk.ChunkAccess, types: Set): void; - } - interface Heightmap { - update(localX: number, localY: number, localZ: number, state: net.minecraft.world.level.block.state.BlockState): boolean; - getFirstAvailable(x: number, z: number): number; - getHighestTaken(x: number, z: number): number; - setRawData(chunk: net.minecraft.world.level.chunk.ChunkAccess, type: net.minecraft.world.level.levelgen.Heightmap$Types, data: Array): void; - getRawData(): Array; - } - const Heightmap$Usage: { - WORLDGEN: net.minecraft.world.level.levelgen.Heightmap$Usage; - LIVE_WORLD: net.minecraft.world.level.levelgen.Heightmap$Usage; - CLIENT: net.minecraft.world.level.levelgen.Heightmap$Usage; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.levelgen.Heightmap$Usage; - } - interface Heightmap$Usage extends kotlin.Enum { - } - const DensityFunction$SinglePointContext: { - new(blockX: number, blockY: number, blockZ: number): net.minecraft.world.level.levelgen.DensityFunction$SinglePointContext; - } - interface DensityFunction$SinglePointContext extends java.lang.Record, net.minecraft.world.level.levelgen.DensityFunction$FunctionContext { + buildSurface(protoChunk: net.minecraft.world.level.chunk.ChunkAccess, context: net.minecraft.world.level.levelgen.WorldGenerationContext, randomState: net.minecraft.world.level.levelgen.RandomState, structureManager: net.minecraft.world.level.StructureManager, biomeManager: net.minecraft.world.level.biome.BiomeManager, blender: net.minecraft.world.level.levelgen.blending.Blender, possibleBiomes: Set> | null | undefined): void; } const WorldDimensions$Complete: { new(dimensions: net.minecraft.core.Registry, specialWorldProperty: net.minecraft.world.level.storage.PrimaryLevelData$SpecialWorldProperty): net.minecraft.world.level.levelgen.WorldDimensions$Complete; @@ -27294,9 +27362,19 @@ declare global { const LootPoolEntryContainer: { Builder: typeof net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer$Builder; } - interface LootPoolEntryContainer extends net.minecraft.world.level.storage.loot.Validatable { + interface LootPoolEntryContainer extends net.minecraft.world.level.storage.loot.entries.ComposableEntryContainer, net.minecraft.world.level.storage.loot.Validatable { codec(): com.mojang.serialization.MapCodec; } + const ComposableEntryContainer: { + ALWAYS_FALSE: net.minecraft.world.level.storage.loot.entries.ComposableEntryContainer; + ALWAYS_TRUE: net.minecraft.world.level.storage.loot.entries.ComposableEntryContainer; + } + interface ComposableEntryContainer { + expand(context: net.minecraft.world.level.storage.loot.LootContext, output: unknown): boolean; + and(other: net.minecraft.world.level.storage.loot.entries.ComposableEntryContainer): net.minecraft.world.level.storage.loot.entries.ComposableEntryContainer; + or(other: net.minecraft.world.level.storage.loot.entries.ComposableEntryContainer): net.minecraft.world.level.storage.loot.entries.ComposableEntryContainer; + (context: net.minecraft.world.level.storage.loot.LootContext, output: unknown): boolean; + } const LootPoolEntryContainer$Builder: { new(): net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer$Builder; } @@ -27519,6 +27597,7 @@ declare global { setRolls(rolls: net.minecraft.world.level.storage.loot.providers.number.NumberProvider): net.minecraft.world.level.storage.loot.LootPool$Builder; setBonusRolls(bonusRolls: net.minecraft.world.level.storage.loot.providers.number.NumberProvider): net.minecraft.world.level.storage.loot.LootPool$Builder; add(entry: net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer$Builder): net.minecraft.world.level.storage.loot.LootPool$Builder; + addAll(entries: Array): net.minecraft.world.level.storage.loot.LootPool$Builder; build(): net.minecraft.world.level.storage.loot.LootPool; } const LootContext$ItemStackTarget: { @@ -27746,6 +27825,7 @@ declare global { getGameType(): net.minecraft.world.level.GameType; setGameType(gameType: net.minecraft.world.level.GameType): void; isAllowCommands(): boolean; + setAllowCommands(allowCommands: boolean): void; getDifficulty(): net.minecraft.world.Difficulty; setDifficulty(difficulty: net.minecraft.world.Difficulty): void; isDifficultyLocked(): boolean; @@ -27762,6 +27842,7 @@ declare global { isInitialized(): boolean; setInitialized(initialized: boolean): void; isAllowCommands(): boolean; + setAllowCommands(allowCommands: boolean): void; setGameType(gameType: net.minecraft.world.level.GameType): void; setGameTime(time: number): void; } @@ -28058,81 +28139,6 @@ declare global { getName(): string; isSlope(): boolean; } - const WoodType: { - CODEC: com.mojang.serialization.Codec; - OAK: net.minecraft.world.level.block.state.properties.WoodType; - SPRUCE: net.minecraft.world.level.block.state.properties.WoodType; - BIRCH: net.minecraft.world.level.block.state.properties.WoodType; - ACACIA: net.minecraft.world.level.block.state.properties.WoodType; - CHERRY: net.minecraft.world.level.block.state.properties.WoodType; - JUNGLE: net.minecraft.world.level.block.state.properties.WoodType; - DARK_OAK: net.minecraft.world.level.block.state.properties.WoodType; - PALE_OAK: net.minecraft.world.level.block.state.properties.WoodType; - CRIMSON: net.minecraft.world.level.block.state.properties.WoodType; - WARPED: net.minecraft.world.level.block.state.properties.WoodType; - MANGROVE: net.minecraft.world.level.block.state.properties.WoodType; - BAMBOO: net.minecraft.world.level.block.state.properties.WoodType; - new(name: string, setType: net.minecraft.world.level.block.state.properties.BlockSetType): net.minecraft.world.level.block.state.properties.WoodType; - new(name: string, setType: net.minecraft.world.level.block.state.properties.BlockSetType, soundType: net.minecraft.world.level.block.SoundType, hangingSignSoundType: net.minecraft.world.level.block.SoundType, fenceGateClose: net.minecraft.sounds.SoundEvent, fenceGateOpen: net.minecraft.sounds.SoundEvent): net.minecraft.world.level.block.state.properties.WoodType; - values(): java.util.stream.Stream; - } - interface WoodType extends java.lang.Record { - name(): string; - setType(): net.minecraft.world.level.block.state.properties.BlockSetType; - soundType(): net.minecraft.world.level.block.SoundType; - hangingSignSoundType(): net.minecraft.world.level.block.SoundType; - fenceGateClose(): net.minecraft.sounds.SoundEvent; - fenceGateOpen(): net.minecraft.sounds.SoundEvent; - } - const BlockSetType: { - PressurePlateSensitivity: typeof net.minecraft.world.level.block.state.properties.BlockSetType$PressurePlateSensitivity; - CODEC: com.mojang.serialization.Codec; - IRON: net.minecraft.world.level.block.state.properties.BlockSetType; - COPPER: net.minecraft.world.level.block.state.properties.BlockSetType; - GOLD: net.minecraft.world.level.block.state.properties.BlockSetType; - STONE: net.minecraft.world.level.block.state.properties.BlockSetType; - POLISHED_BLACKSTONE: net.minecraft.world.level.block.state.properties.BlockSetType; - OAK: net.minecraft.world.level.block.state.properties.BlockSetType; - SPRUCE: net.minecraft.world.level.block.state.properties.BlockSetType; - BIRCH: net.minecraft.world.level.block.state.properties.BlockSetType; - ACACIA: net.minecraft.world.level.block.state.properties.BlockSetType; - CHERRY: net.minecraft.world.level.block.state.properties.BlockSetType; - JUNGLE: net.minecraft.world.level.block.state.properties.BlockSetType; - DARK_OAK: net.minecraft.world.level.block.state.properties.BlockSetType; - PALE_OAK: net.minecraft.world.level.block.state.properties.BlockSetType; - CRIMSON: net.minecraft.world.level.block.state.properties.BlockSetType; - WARPED: net.minecraft.world.level.block.state.properties.BlockSetType; - MANGROVE: net.minecraft.world.level.block.state.properties.BlockSetType; - BAMBOO: net.minecraft.world.level.block.state.properties.BlockSetType; - new(name: string): net.minecraft.world.level.block.state.properties.BlockSetType; - new(name: string, canOpenByHand: boolean, canOpenByWindCharge: boolean, canButtonBeActivatedByArrows: boolean, pressurePlateSensitivity: net.minecraft.world.level.block.state.properties.BlockSetType$PressurePlateSensitivity, soundType: net.minecraft.world.level.block.SoundType, doorClose: net.minecraft.sounds.SoundEvent, doorOpen: net.minecraft.sounds.SoundEvent, trapdoorClose: net.minecraft.sounds.SoundEvent, trapdoorOpen: net.minecraft.sounds.SoundEvent, pressurePlateClickOff: net.minecraft.sounds.SoundEvent, pressurePlateClickOn: net.minecraft.sounds.SoundEvent, buttonClickOff: net.minecraft.sounds.SoundEvent, buttonClickOn: net.minecraft.sounds.SoundEvent): net.minecraft.world.level.block.state.properties.BlockSetType; - values(): java.util.stream.Stream; - } - interface BlockSetType extends java.lang.Record { - name(): string; - canOpenByHand(): boolean; - canOpenByWindCharge(): boolean; - canButtonBeActivatedByArrows(): boolean; - pressurePlateSensitivity(): net.minecraft.world.level.block.state.properties.BlockSetType$PressurePlateSensitivity; - soundType(): net.minecraft.world.level.block.SoundType; - doorClose(): net.minecraft.sounds.SoundEvent; - doorOpen(): net.minecraft.sounds.SoundEvent; - trapdoorClose(): net.minecraft.sounds.SoundEvent; - trapdoorOpen(): net.minecraft.sounds.SoundEvent; - pressurePlateClickOff(): net.minecraft.sounds.SoundEvent; - pressurePlateClickOn(): net.minecraft.sounds.SoundEvent; - buttonClickOff(): net.minecraft.sounds.SoundEvent; - buttonClickOn(): net.minecraft.sounds.SoundEvent; - } - const BlockSetType$PressurePlateSensitivity: { - EVERYTHING: net.minecraft.world.level.block.state.properties.BlockSetType$PressurePlateSensitivity; - MOBS: net.minecraft.world.level.block.state.properties.BlockSetType$PressurePlateSensitivity; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.block.state.properties.BlockSetType$PressurePlateSensitivity; - } - interface BlockSetType$PressurePlateSensitivity extends kotlin.Enum { - } } namespace pattern { const BlockInWorld: { @@ -28162,7 +28168,7 @@ declare global { isRedstoneConductor(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos): boolean; isSuffocating(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos): boolean; isViewBlocking(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos): boolean; - emissiveRendering(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos): boolean; + emissiveRendering(): boolean; instrument(): net.minecraft.world.level.block.state.properties.NoteBlockInstrument; isRandomlyTicking(): boolean; propagatesSkylightDown(): boolean; @@ -28182,6 +28188,7 @@ declare global { getRenderShape(): net.minecraft.world.level.block.RenderShape; getShadeBrightness(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos): number; isSignalSource(): boolean; + getOwnSignal(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos): number; getSignal(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction): number; hasAnalogOutputSignal(): boolean; getAnalogOutputSignal(level: net.minecraft.world.level.Level, pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction): number; @@ -28289,6 +28296,7 @@ declare global { friction(friction: number): net.minecraft.world.level.block.state.BlockBehaviour$Properties; speedFactor(speedFactor: number): net.minecraft.world.level.block.state.BlockBehaviour$Properties; jumpFactor(jumpFactor: number): net.minecraft.world.level.block.state.BlockBehaviour$Properties; + bounceRestitution(bounceRestitution: number): net.minecraft.world.level.block.state.BlockBehaviour$Properties; ignitedByLava(): net.minecraft.world.level.block.state.BlockBehaviour$Properties; liquid(): net.minecraft.world.level.block.state.BlockBehaviour$Properties; forceSolidOff(): net.minecraft.world.level.block.state.BlockBehaviour$Properties; @@ -28301,7 +28309,7 @@ declare global { isSuffocating(isSuffocating: net.minecraft.world.level.block.state.BlockBehaviour$StatePredicate): net.minecraft.world.level.block.state.BlockBehaviour$Properties; isViewBlocking(isViewBlocking: net.minecraft.world.level.block.state.BlockBehaviour$StatePredicate): net.minecraft.world.level.block.state.BlockBehaviour$Properties; postProcess(postProcess: net.minecraft.world.level.block.state.BlockBehaviour$PostProcess): net.minecraft.world.level.block.state.BlockBehaviour$Properties; - emissiveRendering(emissiveRendering: net.minecraft.world.level.block.state.BlockBehaviour$StatePredicate): net.minecraft.world.level.block.state.BlockBehaviour$Properties; + emissiveRendering(emissiveRendering: unknown): net.minecraft.world.level.block.state.BlockBehaviour$Properties; dynamicShape(): net.minecraft.world.level.block.state.BlockBehaviour$Properties; requiredFeatures(flags: net.minecraft.world.flag.FeatureFlag): net.minecraft.world.level.block.state.BlockBehaviour$Properties; noCollision(): net.minecraft.world.level.block.state.BlockBehaviour$Properties; @@ -28425,55 +28433,7 @@ declare global { problemPath(): net.minecraft.util.ProblemReporter$PathElement; } const BlockEntityType: { - FURNACE: net.minecraft.world.level.block.entity.BlockEntityType; - CHEST: net.minecraft.world.level.block.entity.BlockEntityType; - TRAPPED_CHEST: net.minecraft.world.level.block.entity.BlockEntityType; - ENDER_CHEST: net.minecraft.world.level.block.entity.BlockEntityType; - JUKEBOX: net.minecraft.world.level.block.entity.BlockEntityType; - DISPENSER: net.minecraft.world.level.block.entity.BlockEntityType; - DROPPER: net.minecraft.world.level.block.entity.BlockEntityType; - SIGN: net.minecraft.world.level.block.entity.BlockEntityType; - HANGING_SIGN: net.minecraft.world.level.block.entity.BlockEntityType; - MOB_SPAWNER: net.minecraft.world.level.block.entity.BlockEntityType; - CREAKING_HEART: net.minecraft.world.level.block.entity.BlockEntityType; - PISTON: net.minecraft.world.level.block.entity.BlockEntityType; - BREWING_STAND: net.minecraft.world.level.block.entity.BlockEntityType; - ENCHANTING_TABLE: net.minecraft.world.level.block.entity.BlockEntityType; - END_PORTAL: net.minecraft.world.level.block.entity.BlockEntityType; - BEACON: net.minecraft.world.level.block.entity.BlockEntityType; - SKULL: net.minecraft.world.level.block.entity.BlockEntityType; - DAYLIGHT_DETECTOR: net.minecraft.world.level.block.entity.BlockEntityType; - HOPPER: net.minecraft.world.level.block.entity.BlockEntityType; - COMPARATOR: net.minecraft.world.level.block.entity.BlockEntityType; - BANNER: net.minecraft.world.level.block.entity.BlockEntityType; - STRUCTURE_BLOCK: net.minecraft.world.level.block.entity.BlockEntityType; - END_GATEWAY: net.minecraft.world.level.block.entity.BlockEntityType; - COMMAND_BLOCK: net.minecraft.world.level.block.entity.BlockEntityType; - SHULKER_BOX: net.minecraft.world.level.block.entity.BlockEntityType; - BED: net.minecraft.world.level.block.entity.BlockEntityType; - CONDUIT: net.minecraft.world.level.block.entity.BlockEntityType; - BARREL: net.minecraft.world.level.block.entity.BlockEntityType; - SMOKER: net.minecraft.world.level.block.entity.BlockEntityType; - BLAST_FURNACE: net.minecraft.world.level.block.entity.BlockEntityType; - LECTERN: net.minecraft.world.level.block.entity.BlockEntityType; - BELL: net.minecraft.world.level.block.entity.BlockEntityType; - JIGSAW: net.minecraft.world.level.block.entity.BlockEntityType; - CAMPFIRE: net.minecraft.world.level.block.entity.BlockEntityType; - BEEHIVE: net.minecraft.world.level.block.entity.BlockEntityType; - SCULK_SENSOR: net.minecraft.world.level.block.entity.BlockEntityType; - CALIBRATED_SCULK_SENSOR: net.minecraft.world.level.block.entity.BlockEntityType; - SCULK_CATALYST: net.minecraft.world.level.block.entity.BlockEntityType; - SCULK_SHRIEKER: net.minecraft.world.level.block.entity.BlockEntityType; - CHISELED_BOOKSHELF: net.minecraft.world.level.block.entity.BlockEntityType; - SHELF: net.minecraft.world.level.block.entity.BlockEntityType; - BRUSHABLE_BLOCK: net.minecraft.world.level.block.entity.BlockEntityType; - DECORATED_POT: net.minecraft.world.level.block.entity.BlockEntityType; - CRAFTER: net.minecraft.world.level.block.entity.BlockEntityType; - TRIAL_SPAWNER: net.minecraft.world.level.block.entity.BlockEntityType; - VAULT: net.minecraft.world.level.block.entity.BlockEntityType; - TEST_BLOCK: net.minecraft.world.level.block.entity.BlockEntityType; - TEST_INSTANCE_BLOCK: net.minecraft.world.level.block.entity.BlockEntityType; - COPPER_GOLEM_STATUE: net.minecraft.world.level.block.entity.BlockEntityType; + new(factory: net.minecraft.world.level.block.entity.BlockEntityType$BlockEntitySupplier, validBlocks: Set): net.minecraft.world.level.block.entity.BlockEntityType; } interface BlockEntityType extends net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityType { builtInRegistryHolder(): net.minecraft.core.Holder$Reference>; @@ -28482,6 +28442,10 @@ declare global { getBlockEntity(level: net.minecraft.world.level.BlockGetter, pos: net.minecraft.core.BlockPos): T; onlyOpCanSetNbt(): boolean; } + interface BlockEntityType$BlockEntitySupplier { + create(worldPosition: net.minecraft.core.BlockPos, blockState: net.minecraft.world.level.block.state.BlockState): T; + (worldPosition: net.minecraft.core.BlockPos, blockState: net.minecraft.world.level.block.state.BlockState): T; + } const JigsawBlockEntity$JointType: { ROLLABLE: net.minecraft.world.level.block.entity.JigsawBlockEntity$JointType; ALIGNED: net.minecraft.world.level.block.entity.JigsawBlockEntity$JointType; @@ -28514,6 +28478,7 @@ declare global { } interface BlockEntityTicker { tick(level: net.minecraft.world.level.Level, pos: net.minecraft.core.BlockPos, state: net.minecraft.world.level.block.state.BlockState, entity: T): void; + andThen(after: net.minecraft.world.level.block.entity.BlockEntityTicker): net.minecraft.world.level.block.entity.BlockEntityTicker; (level: net.minecraft.world.level.Level, pos: net.minecraft.core.BlockPos, state: net.minecraft.world.level.block.state.BlockState, entity: T): void; } const CommandBlockEntity$Mode: { @@ -28925,7 +28890,7 @@ declare global { isPossibleToRespawnInThis(state: net.minecraft.world.level.block.state.BlockState): boolean; getName(): net.minecraft.network.chat.MutableComponent; fallOn(level: net.minecraft.world.level.Level, state: net.minecraft.world.level.block.state.BlockState, pos: net.minecraft.core.BlockPos, entity: net.minecraft.world.entity.Entity, fallDistance: number): void; - updateEntityMovementAfterFallOn(level: net.minecraft.world.level.BlockGetter, entity: net.minecraft.world.entity.Entity): void; + getBounceRestitution(): number; getFriction(): number; getSpeedFactor(): number; getJumpFactor(): number; @@ -29060,6 +29025,10 @@ declare global { RESIN_BRICKS: net.minecraft.world.level.block.SoundType; IRON: net.minecraft.world.level.block.SoundType; DRIED_GHAST: net.minecraft.world.level.block.SoundType; + SULFUR: net.minecraft.world.level.block.SoundType; + POTENT_SULFUR: net.minecraft.world.level.block.SoundType; + SULFUR_SPIKE: net.minecraft.world.level.block.SoundType; + CINNABAR: net.minecraft.world.level.block.SoundType; new(volume: number, pitch: number, breakSound: net.minecraft.sounds.SoundEvent, stepSound: net.minecraft.sounds.SoundEvent, placeSound: net.minecraft.sounds.SoundEvent, hitSound: net.minecraft.sounds.SoundEvent, fallSound: net.minecraft.sounds.SoundEvent): net.minecraft.world.level.block.SoundType; } interface SoundType { @@ -29569,9 +29538,6 @@ declare global { dimension(): net.minecraft.resources.ResourceKey; type(): string; } - interface ChunkScanAccess { - scanChunk(pos: net.minecraft.world.level.ChunkPos, visitor: net.minecraft.nbt.StreamTagVisitor): java.util.concurrent.CompletableFuture; - } const SimpleRegionStorage: { new(info: net.minecraft.world.level.chunk.storage.RegionStorageInfo, folder: java.nio.file.Path, fixerUpper: com.mojang.datafixers.DataFixer, syncWrites: boolean, dataFixType: net.minecraft.util.datafix.DataFixTypes): net.minecraft.world.level.chunk.storage.SimpleRegionStorage; injectDatafixingContext(chunkTag: net.minecraft.nbt.CompoundTag, contextTag: net.minecraft.nbt.CompoundTag | null | undefined): void; @@ -29588,6 +29554,9 @@ declare global { chunkScanner(): net.minecraft.world.level.chunk.storage.ChunkScanAccess; storageInfo(): net.minecraft.world.level.chunk.storage.RegionStorageInfo; } + interface ChunkScanAccess { + scanChunk(pos: net.minecraft.world.level.ChunkPos, visitor: net.minecraft.nbt.StreamTagVisitor): java.util.concurrent.CompletableFuture; + } const SectionStorage: { new(simpleRegionStorage: net.minecraft.world.level.chunk.storage.SimpleRegionStorage, codec: com.mojang.serialization.Codec

, packer: unknown, unpacker: unknown, factory: unknown, registryAccess: net.minecraft.core.RegistryAccess, errorReporter: net.minecraft.world.level.chunk.storage.ChunkIOErrorReporter, levelHeightAccessor: net.minecraft.world.level.LevelHeightAccessor): net.minecraft.world.level.chunk.storage.SectionStorage; } @@ -29750,7 +29719,7 @@ declare global { getPersistedStatus(): net.minecraft.world.level.chunk.status.ChunkStatus; getHighestGeneratedStatus(): net.minecraft.world.level.chunk.status.ChunkStatus; removeBlockEntity(pos: net.minecraft.core.BlockPos): void; - markPosForPostprocessing(blockPos: net.minecraft.core.BlockPos): void; + markPosForPostProcessing(blockPos: net.minecraft.core.BlockPos): void; getPostProcessing(): Array; addPackedPostProcess(packedOffsets: it.unimi.dsi.fastutil.shorts.ShortList, sectionIndex: number): void; setBlockEntityNbt(entityTag: net.minecraft.nbt.CompoundTag): void; @@ -29759,6 +29728,7 @@ declare global { findBlocks(predicate: unknown, consumer: unknown): void; getBlockTicks(): net.minecraft.world.ticks.TickContainerAccess; getFluidTicks(): net.minecraft.world.ticks.TickContainerAccess; + collectBiomesInPalette(output: Set>): void; canBeSerialized(): boolean; getTicksForSerialization(currentTick: number): net.minecraft.world.level.chunk.ChunkAccess$PackedTicks; getUpgradeData(): net.minecraft.world.level.chunk.UpgradeData; @@ -29790,32 +29760,48 @@ declare global { getAllReferences(): Map; setAllReferences(data: Map): void; } - const ChunkGeneratorStructureState: { - createForFlat(randomState: net.minecraft.world.level.levelgen.RandomState, levelSeed: number, biomeSource: net.minecraft.world.level.biome.BiomeSource, structureOverrides: java.util.stream.Stream>): net.minecraft.world.level.chunk.ChunkGeneratorStructureState; - createForNormal(randomState: net.minecraft.world.level.levelgen.RandomState, levelSeed: number, biomeSource: net.minecraft.world.level.biome.BiomeSource, allStructures: net.minecraft.core.HolderLookup): net.minecraft.world.level.chunk.ChunkGeneratorStructureState; + const DataLayer: { + LAYER_COUNT: number; + LAYER_SIZE: number; + SIZE: number; + new(): net.minecraft.world.level.chunk.DataLayer; + new(defaultValue: number): net.minecraft.world.level.chunk.DataLayer; + new(data: Array): net.minecraft.world.level.chunk.DataLayer; } - interface ChunkGeneratorStructureState { - randomState(): net.minecraft.world.level.levelgen.RandomState; - possibleStructureSets(): Array>; - ensureStructuresGenerated(): void; - getRingPositionsFor(placement: net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement): Array | null | undefined; - getPlacementsForStructure(structure: net.minecraft.core.Holder): Array; - hasStructureChunkInRange(structureSet: net.minecraft.core.Holder, sourceX: number, sourceZ: number, range: number): boolean; - getLevelSeed(): number; + interface DataLayer { + get(x: number, y: number, z: number): number; + get(index: number): number; + set(x: number, y: number, z: number, val: number): void; + set(index: number, val: number): void; + fill(value: number): void; + getData(): Array; + copy(): net.minecraft.world.level.chunk.DataLayer; + layerToString(layer: number): string; + isDefinitelyHomogenous(): boolean; + isDefinitelyFilledWith(value: number): boolean; + isEmpty(): boolean; } - interface BlockColumn { - getBlock(blockY: number): net.minecraft.world.level.block.state.BlockState; - setBlock(blockY: number, state: net.minecraft.world.level.block.state.BlockState): void; + interface LightChunkGetter { + getChunkForLighting(x: number, z: number): net.minecraft.world.level.chunk.LightChunk | null | undefined; + onLightUpdate(layer: net.minecraft.world.level.LightLayer, pos: net.minecraft.core.SectionPos): void; + getLevel(): net.minecraft.world.level.BlockGetter; } - const UpgradeData: { - EMPTY: net.minecraft.world.level.chunk.UpgradeData; - new(tag: net.minecraft.nbt.CompoundTag, levelHeightAccessor: net.minecraft.world.level.LevelHeightAccessor): net.minecraft.world.level.chunk.UpgradeData; + const ChunkSource: { + new(): net.minecraft.world.level.chunk.ChunkSource; } - interface UpgradeData { - upgrade(chunk: net.minecraft.world.level.chunk.LevelChunk): void; - isEmpty(): boolean; - write(): net.minecraft.nbt.CompoundTag; - copy(): net.minecraft.world.level.chunk.UpgradeData; + interface ChunkSource extends java.lang.AutoCloseable, net.minecraft.world.level.chunk.LightChunkGetter { + getChunk(x: number, z: number, loadOrGenerate: boolean): net.minecraft.world.level.chunk.LevelChunk | null | undefined; + getChunk(x: number, z: number, targetStatus: net.minecraft.world.level.chunk.status.ChunkStatus, loadOrGenerate: boolean): net.minecraft.world.level.chunk.ChunkAccess | null | undefined; + getChunkNow(x: number, z: number): net.minecraft.world.level.chunk.LevelChunk | null | undefined; + hasChunk(x: number, z: number): boolean; + tick(haveTime: unknown, tickChunks: boolean): void; + onSectionEmptinessChanged(sectionX: number, sectionY: number, sectionZ: number, empty: boolean): void; + gatherStats(): string; + getLoadedChunksCount(): number; + getLightEngine(): net.minecraft.world.level.lighting.LevelLightEngine; + setSpawnSettings(spawnEnemies: boolean): void; + updateChunkForced(pos: net.minecraft.world.level.ChunkPos, forced: boolean): boolean; + getForceLoadedChunks(): it.unimi.dsi.fastutil.longs.LongSet; } const LevelChunk: { EntityCreationType: typeof net.minecraft.world.level.chunk.LevelChunk$EntityCreationType; @@ -29865,6 +29851,20 @@ declare global { } interface LevelChunk$EntityCreationType extends kotlin.Enum { } + const UpgradeData: { + EMPTY: net.minecraft.world.level.chunk.UpgradeData; + new(tag: net.minecraft.nbt.CompoundTag, levelHeightAccessor: net.minecraft.world.level.LevelHeightAccessor): net.minecraft.world.level.chunk.UpgradeData; + } + interface UpgradeData { + upgrade(chunk: net.minecraft.world.level.chunk.LevelChunk): void; + isEmpty(): boolean; + write(): net.minecraft.nbt.CompoundTag; + copy(): net.minecraft.world.level.chunk.UpgradeData; + } + interface UpgradeData$BlockFixer { + updateShape(state: net.minecraft.world.level.block.state.BlockState, direction: net.minecraft.core.Direction, neighbour: net.minecraft.world.level.block.state.BlockState, level: net.minecraft.world.level.LevelAccessor, pos: net.minecraft.core.BlockPos, neighbourPos: net.minecraft.core.BlockPos): net.minecraft.world.level.block.state.BlockState; + processChunk(level: net.minecraft.world.level.LevelAccessor): void; + } interface LevelChunk$PostLoadProcessor { run(levelChunk: net.minecraft.world.level.chunk.LevelChunk): void; (levelChunk: net.minecraft.world.level.chunk.LevelChunk): void; @@ -29872,8 +29872,8 @@ declare global { const ProtoChunk: { new(chunkPos: net.minecraft.world.level.ChunkPos, upgradeData: net.minecraft.world.level.chunk.UpgradeData, levelHeightAccessor: net.minecraft.world.level.LevelHeightAccessor, containerFactory: net.minecraft.world.level.chunk.PalettedContainerFactory, blendingData: net.minecraft.world.level.levelgen.blending.BlendingData | null | undefined): net.minecraft.world.level.chunk.ProtoChunk; new(chunkPos: net.minecraft.world.level.ChunkPos, upgradeData: net.minecraft.world.level.chunk.UpgradeData, sections: Array | null | undefined, blockTicks: net.minecraft.world.ticks.ProtoChunkTicks, fluidTicks: net.minecraft.world.ticks.ProtoChunkTicks, levelHeightAccessor: net.minecraft.world.level.LevelHeightAccessor, containerFactory: net.minecraft.world.level.chunk.PalettedContainerFactory, blendingData: net.minecraft.world.level.levelgen.blending.BlendingData | null | undefined): net.minecraft.world.level.chunk.ProtoChunk; - packOffsetCoordinates(blockPos: net.minecraft.core.BlockPos): number; - unpackOffsetCoordinates(packedCoord: number, sectionY: number, chunkPos: net.minecraft.world.level.ChunkPos): net.minecraft.core.BlockPos; + packOffsetCoordinates(pos: net.minecraft.core.BlockPos): number; + unpackOffsetCoordinates(packedData: number, sectionY: number, chunkPos: net.minecraft.world.level.ChunkPos): net.minecraft.core.BlockPos; } interface ProtoChunk extends net.minecraft.world.level.chunk.ChunkAccess { getBlockEntities(): Map; @@ -29903,32 +29903,6 @@ declare global { interface CarvingMask$Mask { test(x: number, y: number, z: number): boolean; } - const DataLayer: { - LAYER_COUNT: number; - LAYER_SIZE: number; - SIZE: number; - new(): net.minecraft.world.level.chunk.DataLayer; - new(defaultValue: number): net.minecraft.world.level.chunk.DataLayer; - new(data: Array): net.minecraft.world.level.chunk.DataLayer; - } - interface DataLayer { - get(x: number, y: number, z: number): number; - get(index: number): number; - set(x: number, y: number, z: number, val: number): void; - set(index: number, val: number): void; - fill(value: number): void; - getData(): Array; - copy(): net.minecraft.world.level.chunk.DataLayer; - layerToString(layer: number): string; - isDefinitelyHomogenous(): boolean; - isDefinitelyFilledWith(value: number): boolean; - isEmpty(): boolean; - } - interface LightChunkGetter { - getChunkForLighting(x: number, z: number): net.minecraft.world.level.chunk.LightChunk | null | undefined; - onLightUpdate(layer: net.minecraft.world.level.LightLayer, pos: net.minecraft.core.SectionPos): void; - getLevel(): net.minecraft.world.level.BlockGetter; - } const PalettedContainerFactory: { new(blockStatesStrategy: net.minecraft.world.level.chunk.Strategy, defaultBlockState: net.minecraft.world.level.block.state.BlockState, blockStatesContainerCodec: com.mojang.serialization.Codec>, biomeStrategy: net.minecraft.world.level.chunk.Strategy>, defaultBiome: net.minecraft.core.Holder, biomeContainerCodec: com.mojang.serialization.Codec>>): net.minecraft.world.level.chunk.PalettedContainerFactory; create(registries: net.minecraft.core.RegistryAccess): net.minecraft.world.level.chunk.PalettedContainerFactory; @@ -29975,6 +29949,7 @@ declare global { getSerializedSize(): number; bitsPerEntry(): number; maybeHas(predicate: unknown): boolean; + forEachInPalette(consumer: unknown): void; count(output: net.minecraft.world.level.chunk.PalettedContainer$CountConsumer): void; copy(): net.minecraft.world.level.chunk.PalettedContainer; recreate(): net.minecraft.world.level.chunk.PalettedContainer; @@ -30047,14 +30022,13 @@ declare global { interface PalettedContainerRO$Unpacker { read(strategy: net.minecraft.world.level.chunk.Strategy, discData: net.minecraft.world.level.chunk.PalettedContainerRO$PackedData): com.mojang.serialization.DataResult; } - interface UpgradeData$BlockFixer { - updateShape(state: net.minecraft.world.level.block.state.BlockState, direction: net.minecraft.core.Direction, neighbour: net.minecraft.world.level.block.state.BlockState, level: net.minecraft.world.level.LevelAccessor, pos: net.minecraft.core.BlockPos, neighbourPos: net.minecraft.core.BlockPos): net.minecraft.world.level.block.state.BlockState; - processChunk(level: net.minecraft.world.level.LevelAccessor): void; + const ImposterProtoChunk: { + new(wrapped: net.minecraft.world.level.chunk.LevelChunk, allowWrites: boolean): net.minecraft.world.level.chunk.ImposterProtoChunk; + } + interface ImposterProtoChunk extends net.minecraft.world.level.chunk.ProtoChunk { + getWrapped(): net.minecraft.world.level.chunk.LevelChunk; } const LevelChunkSection: { - SECTION_WIDTH: number; - SECTION_HEIGHT: number; - SECTION_SIZE: number; BIOME_CONTAINER_BITS: number; new(states: net.minecraft.world.level.chunk.PalettedContainer, biomes: net.minecraft.world.level.chunk.PalettedContainerRO>): net.minecraft.world.level.chunk.LevelChunkSection; new(containerFactory: net.minecraft.world.level.chunk.PalettedContainerFactory): net.minecraft.world.level.chunk.LevelChunkSection; @@ -30083,28 +30057,22 @@ declare global { fillBiomesFromNoise(biomeResolver: net.minecraft.world.level.biome.BiomeResolver, sampler: net.minecraft.world.level.biome.Climate$Sampler, quartMinX: number, quartMinY: number, quartMinZ: number): void; copy(): net.minecraft.world.level.chunk.LevelChunkSection; } - const ChunkSource: { - new(): net.minecraft.world.level.chunk.ChunkSource; - } - interface ChunkSource extends java.lang.AutoCloseable, net.minecraft.world.level.chunk.LightChunkGetter { - getChunk(x: number, z: number, loadOrGenerate: boolean): net.minecraft.world.level.chunk.LevelChunk | null | undefined; - getChunk(x: number, z: number, targetStatus: net.minecraft.world.level.chunk.status.ChunkStatus, loadOrGenerate: boolean): net.minecraft.world.level.chunk.ChunkAccess | null | undefined; - getChunkNow(x: number, z: number): net.minecraft.world.level.chunk.LevelChunk | null | undefined; - hasChunk(x: number, z: number): boolean; - tick(haveTime: unknown, tickChunks: boolean): void; - onSectionEmptinessChanged(sectionX: number, sectionY: number, sectionZ: number, empty: boolean): void; - gatherStats(): string; - getLoadedChunksCount(): number; - getLightEngine(): net.minecraft.world.level.lighting.LevelLightEngine; - setSpawnSettings(spawnEnemies: boolean): void; - updateChunkForced(pos: net.minecraft.world.level.ChunkPos, forced: boolean): boolean; - getForceLoadedChunks(): it.unimi.dsi.fastutil.longs.LongSet; + const ChunkGeneratorStructureState: { + createForFlat(randomState: net.minecraft.world.level.levelgen.RandomState, levelSeed: number, biomeSource: net.minecraft.world.level.biome.BiomeSource, structureOverrides: java.util.stream.Stream>): net.minecraft.world.level.chunk.ChunkGeneratorStructureState; + createForNormal(randomState: net.minecraft.world.level.levelgen.RandomState, levelSeed: number, biomeSource: net.minecraft.world.level.biome.BiomeSource, allStructures: net.minecraft.core.HolderLookup): net.minecraft.world.level.chunk.ChunkGeneratorStructureState; } - const ImposterProtoChunk: { - new(wrapped: net.minecraft.world.level.chunk.LevelChunk, allowWrites: boolean): net.minecraft.world.level.chunk.ImposterProtoChunk; + interface ChunkGeneratorStructureState { + randomState(): net.minecraft.world.level.levelgen.RandomState; + possibleStructureSets(): Array>; + ensureStructuresGenerated(): void; + getRingPositionsFor(placement: net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement): Array | null | undefined; + getPlacementsForStructure(structure: net.minecraft.core.Holder): Array; + hasStructureChunkInRange(structureSet: net.minecraft.core.Holder, sourceX: number, sourceZ: number, range: number): boolean; + getLevelSeed(): number; } - interface ImposterProtoChunk extends net.minecraft.world.level.chunk.ProtoChunk { - getWrapped(): net.minecraft.world.level.chunk.LevelChunk; + interface BlockColumn { + getBlock(blockY: number): net.minecraft.world.level.block.state.BlockState; + setBlock(blockY: number, state: net.minecraft.world.level.block.state.BlockState): void; } } namespace validation { @@ -30347,6 +30315,72 @@ declare global { build(): net.minecraft.world.level.biome.Biome; } } + namespace lighting { + const ChunkSkyLightSources: { + NEGATIVE_INFINITY: number; + new(level: net.minecraft.world.level.LevelHeightAccessor): net.minecraft.world.level.lighting.ChunkSkyLightSources; + } + interface ChunkSkyLightSources { + fillFrom(chunk: net.minecraft.world.level.chunk.ChunkAccess): void; + update(level: net.minecraft.world.level.BlockGetter, x: number, y: number, z: number): boolean; + getLowestSourceY(x: number, z: number): number; + getHighestLowestSourceY(): number; + set(index: number, value: number): void; + get(index: number): number; + } + const LevelLightEngine: { + LIGHT_SECTION_PADDING: number; + EMPTY: net.minecraft.world.level.lighting.LevelLightEngine; + new(chunkSource: net.minecraft.world.level.chunk.LightChunkGetter, hasBlockLight: boolean, hasSkyLight: boolean): net.minecraft.world.level.lighting.LevelLightEngine; + } + interface LevelLightEngine extends net.minecraft.world.level.lighting.LightEventListener { + getLayerListener(layer: net.minecraft.world.level.LightLayer): net.minecraft.world.level.lighting.LayerLightEventListener; + getDebugData(layer: net.minecraft.world.level.LightLayer, pos: net.minecraft.core.SectionPos): string; + getDebugSectionType(layer: net.minecraft.world.level.LightLayer, pos: net.minecraft.core.SectionPos): net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; + queueSectionData(layer: net.minecraft.world.level.LightLayer, pos: net.minecraft.core.SectionPos, data: net.minecraft.world.level.chunk.DataLayer | null | undefined): void; + retainData(pos: net.minecraft.world.level.ChunkPos, retain: boolean): void; + getRawBrightness(pos: net.minecraft.core.BlockPos, skyDampen: number): number; + lightOnInColumn(sectionZeroNode: number): boolean; + getLightSectionCount(): number; + getMinLightSection(): number; + getMaxLightSection(): number; + } + interface LightEventListener { + checkBlock(pos: net.minecraft.core.BlockPos): void; + hasLightWork(): boolean; + runLightUpdates(): number; + updateSectionStatus(pos: net.minecraft.core.BlockPos, sectionEmpty: boolean): void; + updateSectionStatus(pos: net.minecraft.core.SectionPos, sectionEmpty: boolean): void; + setLightEnabled(pos: net.minecraft.world.level.ChunkPos, enable: boolean): void; + propagateLightSources(pos: net.minecraft.world.level.ChunkPos): void; + } + const LayerLightEventListener: { + DummyLightLayerEventListener: typeof net.minecraft.world.level.lighting.LayerLightEventListener$DummyLightLayerEventListener; + } + interface LayerLightEventListener extends net.minecraft.world.level.lighting.LightEventListener { + getDataLayerData(pos: net.minecraft.core.SectionPos): net.minecraft.world.level.chunk.DataLayer | null | undefined; + getLightValue(pos: net.minecraft.core.BlockPos): number; + } + const LayerLightEventListener$DummyLightLayerEventListener: { + INSTANCE: net.minecraft.world.level.lighting.LayerLightEventListener$DummyLightLayerEventListener; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.world.level.lighting.LayerLightEventListener$DummyLightLayerEventListener; + } + interface LayerLightEventListener$DummyLightLayerEventListener extends kotlin.Enum, net.minecraft.world.level.lighting.LayerLightEventListener { + } + const LayerLightSectionStorage$SectionType: { + EMPTY: net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; + LIGHT_ONLY: net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; + LIGHT_AND_DATA: net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; + } + interface LayerLightSectionStorage$SectionType extends kotlin.Enum { + display(): string; + } + } namespace dimension { namespace end { const EnderDragonFight: { @@ -30402,7 +30436,7 @@ declare global { STREAM_CODEC: net.minecraft.network.codec.StreamCodec>; MOON_BRIGHTNESS_PER_PHASE: kotlin.FloatArray; CODEC: com.mojang.serialization.Codec>; - new(hasFixedTime: boolean, hasSkyLight: boolean, hasCeiling: boolean, hasEnderDragonFight: boolean, coordinateScale: number, minY: number, height: number, logicalHeight: number, infiniburn: net.minecraft.tags.TagKey, ambientLight: number, monsterSettings: net.minecraft.world.level.dimension.DimensionType$MonsterSettings, skybox: net.minecraft.world.level.dimension.DimensionType$Skybox, cardinalLightType: net.minecraft.world.level.CardinalLighting$Type, attributes: net.minecraft.world.attribute.EnvironmentAttributeMap, timelines: net.minecraft.core.HolderSet, defaultClock: java.util.Optional>): net.minecraft.world.level.dimension.DimensionType; + new(hasFixedTime: boolean, hasSkyLight: boolean, hasCeiling: boolean, hasEnderDragonFight: boolean, coordinateScale: number, minY: number, height: number, logicalHeight: number, infiniburn: net.minecraft.core.HolderSet, ambientLight: number, monsterSettings: net.minecraft.world.level.dimension.DimensionType$MonsterSettings, skybox: net.minecraft.world.level.dimension.DimensionType$Skybox, cardinalLightType: net.minecraft.world.level.CardinalLighting$Type, attributes: net.minecraft.world.attribute.EnvironmentAttributeMap, timelines: net.minecraft.core.HolderSet, defaultClock: java.util.Optional>): net.minecraft.world.level.dimension.DimensionType; getTeleportationScale(lastDimensionType: net.minecraft.world.level.dimension.DimensionType, newDimensionType: net.minecraft.world.level.dimension.DimensionType): number; getStorageFolder(name: net.minecraft.resources.ResourceKey, baseFolder: java.nio.file.Path): java.nio.file.Path; } @@ -30418,7 +30452,7 @@ declare global { minY(): number; height(): number; logicalHeight(): number; - infiniburn(): net.minecraft.tags.TagKey; + infiniburn(): net.minecraft.core.HolderSet; ambientLight(): number; monsterSettings(): net.minecraft.world.level.dimension.DimensionType$MonsterSettings; skybox(): net.minecraft.world.level.dimension.DimensionType$Skybox; @@ -30458,135 +30492,6 @@ declare global { generator(): net.minecraft.world.level.chunk.ChunkGenerator; } } - namespace lighting { - const ChunkSkyLightSources: { - NEGATIVE_INFINITY: number; - new(level: net.minecraft.world.level.LevelHeightAccessor): net.minecraft.world.level.lighting.ChunkSkyLightSources; - } - interface ChunkSkyLightSources { - fillFrom(chunk: net.minecraft.world.level.chunk.ChunkAccess): void; - update(level: net.minecraft.world.level.BlockGetter, x: number, y: number, z: number): boolean; - getLowestSourceY(x: number, z: number): number; - getHighestLowestSourceY(): number; - set(index: number, value: number): void; - get(index: number): number; - } - const LevelLightEngine: { - LIGHT_SECTION_PADDING: number; - EMPTY: net.minecraft.world.level.lighting.LevelLightEngine; - new(chunkSource: net.minecraft.world.level.chunk.LightChunkGetter, hasBlockLight: boolean, hasSkyLight: boolean): net.minecraft.world.level.lighting.LevelLightEngine; - } - interface LevelLightEngine extends net.minecraft.world.level.lighting.LightEventListener { - getLayerListener(layer: net.minecraft.world.level.LightLayer): net.minecraft.world.level.lighting.LayerLightEventListener; - getDebugData(layer: net.minecraft.world.level.LightLayer, pos: net.minecraft.core.SectionPos): string; - getDebugSectionType(layer: net.minecraft.world.level.LightLayer, pos: net.minecraft.core.SectionPos): net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; - queueSectionData(layer: net.minecraft.world.level.LightLayer, pos: net.minecraft.core.SectionPos, data: net.minecraft.world.level.chunk.DataLayer | null | undefined): void; - retainData(pos: net.minecraft.world.level.ChunkPos, retain: boolean): void; - getRawBrightness(pos: net.minecraft.core.BlockPos, skyDampen: number): number; - lightOnInColumn(sectionZeroNode: number): boolean; - getLightSectionCount(): number; - getMinLightSection(): number; - getMaxLightSection(): number; - } - interface LightEventListener { - checkBlock(pos: net.minecraft.core.BlockPos): void; - hasLightWork(): boolean; - runLightUpdates(): number; - updateSectionStatus(pos: net.minecraft.core.BlockPos, sectionEmpty: boolean): void; - updateSectionStatus(pos: net.minecraft.core.SectionPos, sectionEmpty: boolean): void; - setLightEnabled(pos: net.minecraft.world.level.ChunkPos, enable: boolean): void; - propagateLightSources(pos: net.minecraft.world.level.ChunkPos): void; - } - const LayerLightEventListener: { - DummyLightLayerEventListener: typeof net.minecraft.world.level.lighting.LayerLightEventListener$DummyLightLayerEventListener; - } - interface LayerLightEventListener extends net.minecraft.world.level.lighting.LightEventListener { - getDataLayerData(pos: net.minecraft.core.SectionPos): net.minecraft.world.level.chunk.DataLayer | null | undefined; - getLightValue(pos: net.minecraft.core.BlockPos): number; - } - const LayerLightEventListener$DummyLightLayerEventListener: { - INSTANCE: net.minecraft.world.level.lighting.LayerLightEventListener$DummyLightLayerEventListener; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.lighting.LayerLightEventListener$DummyLightLayerEventListener; - } - interface LayerLightEventListener$DummyLightLayerEventListener extends kotlin.Enum, net.minecraft.world.level.lighting.LayerLightEventListener { - } - const LayerLightSectionStorage$SectionType: { - EMPTY: net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; - LIGHT_ONLY: net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; - LIGHT_AND_DATA: net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.lighting.LayerLightSectionStorage$SectionType; - } - interface LayerLightSectionStorage$SectionType extends kotlin.Enum { - display(): string; - } - } - namespace gameevent { - const GameEventListenerRegistry: { - NOOP: net.minecraft.world.level.gameevent.GameEventListenerRegistry; - } - interface GameEventListenerRegistry { - isEmpty(): boolean; - register(listener: net.minecraft.world.level.gameevent.GameEventListener): void; - unregister(listener: net.minecraft.world.level.gameevent.GameEventListener): void; - visitInRangeListeners(event: net.minecraft.core.Holder, sourcePosition: net.minecraft.world.phys.Vec3, context: net.minecraft.world.level.gameevent.GameEvent$Context, action: net.minecraft.world.level.gameevent.GameEventListenerRegistry$ListenerVisitor): boolean; - } - const GameEventListener: { - DeliveryMode: typeof net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; - } - interface GameEventListener { - getListenerSource(): net.minecraft.world.level.gameevent.PositionSource; - getListenerRadius(): number; - handleGameEvent(level: net.minecraft.server.level.ServerLevel, event: net.minecraft.core.Holder, context: net.minecraft.world.level.gameevent.GameEvent$Context, sourcePosition: net.minecraft.world.phys.Vec3): boolean; - getDeliveryMode(): net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; - } - const PositionSource: { - CODEC: com.mojang.serialization.Codec; - STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - } - interface PositionSource { - getPosition(level: net.minecraft.world.level.Level): java.util.Optional; - getType(): net.minecraft.world.level.gameevent.PositionSourceType; - } - const PositionSourceType: { - BLOCK: net.minecraft.world.level.gameevent.PositionSourceType; - ENTITY: net.minecraft.world.level.gameevent.PositionSourceType; - register(name: string, serializer: S): S; - } - interface PositionSourceType { - codec(): com.mojang.serialization.MapCodec; - streamCodec(): net.minecraft.network.codec.StreamCodec; - } - const GameEvent$Context: { - new(sourceEntity: net.minecraft.world.entity.Entity | null | undefined, affectedState: net.minecraft.world.level.block.state.BlockState | null | undefined): net.minecraft.world.level.gameevent.GameEvent$Context; - of(sourceEntity: net.minecraft.world.entity.Entity | null | undefined): net.minecraft.world.level.gameevent.GameEvent$Context; - of(state: net.minecraft.world.level.block.state.BlockState | null | undefined): net.minecraft.world.level.gameevent.GameEvent$Context; - of(sourceEntity: net.minecraft.world.entity.Entity | null | undefined, state: net.minecraft.world.level.block.state.BlockState | null | undefined): net.minecraft.world.level.gameevent.GameEvent$Context; - } - interface GameEvent$Context extends java.lang.Record { - sourceEntity(): net.minecraft.world.entity.Entity | null | undefined; - affectedState(): net.minecraft.world.level.block.state.BlockState | null | undefined; - } - const GameEventListener$DeliveryMode: { - UNSPECIFIED: net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; - BY_DISTANCE: net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; - } - interface GameEventListener$DeliveryMode extends kotlin.Enum { - } - interface GameEventListener$Provider { - getListener(): T; - } - interface GameEventListenerRegistry$ListenerVisitor { - visit(listener: net.minecraft.world.level.gameevent.GameEventListener, position: net.minecraft.world.phys.Vec3): void; - (listener: net.minecraft.world.level.gameevent.GameEventListener, position: net.minecraft.world.phys.Vec3): void; - } - } namespace border { const WorldBorder: { Settings: typeof net.minecraft.world.level.border.WorldBorder$Settings; @@ -30684,6 +30589,69 @@ declare global { lerpTarget(): number; } } + namespace gameevent { + const GameEventListenerRegistry: { + NOOP: net.minecraft.world.level.gameevent.GameEventListenerRegistry; + } + interface GameEventListenerRegistry { + isEmpty(): boolean; + register(listener: net.minecraft.world.level.gameevent.GameEventListener): void; + unregister(listener: net.minecraft.world.level.gameevent.GameEventListener): void; + visitInRangeListeners(event: net.minecraft.core.Holder, sourcePosition: net.minecraft.world.phys.Vec3, context: net.minecraft.world.level.gameevent.GameEvent$Context, action: net.minecraft.world.level.gameevent.GameEventListenerRegistry$ListenerVisitor): boolean; + } + const GameEventListener: { + DeliveryMode: typeof net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; + } + interface GameEventListener { + getListenerSource(): net.minecraft.world.level.gameevent.PositionSource; + getListenerRadius(): number; + handleGameEvent(level: net.minecraft.server.level.ServerLevel, event: net.minecraft.core.Holder, context: net.minecraft.world.level.gameevent.GameEvent$Context, sourcePosition: net.minecraft.world.phys.Vec3): boolean; + getDeliveryMode(): net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; + } + const PositionSource: { + CODEC: com.mojang.serialization.Codec; + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + } + interface PositionSource { + getPosition(level: net.minecraft.world.level.Level): java.util.Optional; + getType(): net.minecraft.world.level.gameevent.PositionSourceType; + } + const PositionSourceType: { + BLOCK: net.minecraft.world.level.gameevent.PositionSourceType; + ENTITY: net.minecraft.world.level.gameevent.PositionSourceType; + register(name: string, serializer: S): S; + } + interface PositionSourceType { + codec(): com.mojang.serialization.MapCodec; + streamCodec(): net.minecraft.network.codec.StreamCodec; + } + const GameEvent$Context: { + new(sourceEntity: net.minecraft.world.entity.Entity | null | undefined, affectedState: net.minecraft.world.level.block.state.BlockState | null | undefined): net.minecraft.world.level.gameevent.GameEvent$Context; + of(sourceEntity: net.minecraft.world.entity.Entity | null | undefined): net.minecraft.world.level.gameevent.GameEvent$Context; + of(state: net.minecraft.world.level.block.state.BlockState | null | undefined): net.minecraft.world.level.gameevent.GameEvent$Context; + of(sourceEntity: net.minecraft.world.entity.Entity | null | undefined, state: net.minecraft.world.level.block.state.BlockState | null | undefined): net.minecraft.world.level.gameevent.GameEvent$Context; + } + interface GameEvent$Context extends java.lang.Record { + sourceEntity(): net.minecraft.world.entity.Entity | null | undefined; + affectedState(): net.minecraft.world.level.block.state.BlockState | null | undefined; + } + const GameEventListener$DeliveryMode: { + UNSPECIFIED: net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; + BY_DISTANCE: net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.world.level.gameevent.GameEventListener$DeliveryMode; + } + interface GameEventListener$DeliveryMode extends kotlin.Enum { + } + interface GameEventListener$Provider { + getListener(): T; + } + interface GameEventListenerRegistry$ListenerVisitor { + visit(listener: net.minecraft.world.level.gameevent.GameEventListener, position: net.minecraft.world.phys.Vec3): void; + (listener: net.minecraft.world.level.gameevent.GameEventListener, position: net.minecraft.world.phys.Vec3): void; + } + } namespace gamerules { const GameRules: { ADVANCE_TIME: net.minecraft.world.level.gamerules.GameRule; @@ -30940,6 +30908,7 @@ declare global { NETHER: net.minecraft.resources.ResourceKey; END: net.minecraft.resources.ResourceKey; MAX_LEVEL_SIZE: number; + ACROSS_THE_WHOLE_WORLD: number; LONG_PARTICLE_CLIP_RANGE: number; SHORT_PARTICLE_CLIP_RANGE: number; MAX_BRIGHTNESS: number; @@ -30953,6 +30922,7 @@ declare global { dimension(): net.minecraft.resources.ResourceKey; damageSources(): net.minecraft.world.damagesource.DamageSources; palettedContainerFactory(): net.minecraft.world.level.chunk.PalettedContainerFactory; + getNextEntityId(): number; isInWorldBounds(pos: net.minecraft.core.BlockPos): boolean; isInValidBounds(pos: net.minecraft.core.BlockPos): boolean; getChunkAt(pos: net.minecraft.core.BlockPos): net.minecraft.world.level.chunk.LevelChunk; @@ -31154,7 +31124,6 @@ declare global { CODEC: com.mojang.serialization.Codec; STREAM_CODEC: net.minecraft.network.codec.StreamCodec; INVALID_CHUNK_POS: number; - MAX_COORDINATE_VALUE: number; ZERO: net.minecraft.world.level.ChunkPos; REGION_SIZE: number; REGION_MAX_INDEX: number; @@ -31166,6 +31135,7 @@ declare global { isValid(x: number, z: number): boolean; pack(x: number, z: number): number; pack(pos: net.minecraft.core.BlockPos): number; + fromSectionNode(sectionNode: number): number; getX(pos: number): number; getZ(pos: number): number; hash(x: number, z: number): number; @@ -31294,6 +31264,7 @@ declare global { } interface LevelSettings extends java.lang.Record { withGameType(gameType: net.minecraft.world.level.GameType): net.minecraft.world.level.LevelSettings; + withAllowCommands(allowCommands: boolean): net.minecraft.world.level.LevelSettings; withDifficulty(difficulty: net.minecraft.world.Difficulty): net.minecraft.world.level.LevelSettings; withDifficultyLock(locked: boolean): net.minecraft.world.level.LevelSettings; withDataConfiguration(dataConfiguration: net.minecraft.world.level.WorldDataConfiguration): net.minecraft.world.level.LevelSettings; @@ -31314,41 +31285,15 @@ declare global { hardcore(): boolean; locked(): boolean; } - interface WorldGenLevel extends net.minecraft.world.level.ServerLevelAccessor { - getSeed(): number; - ensureCanWrite(pos: net.minecraft.core.BlockPos): boolean; - setCurrentlyGenerating(currentlyGenerating: unknown): void; - } interface ServerLevelAccessor extends net.minecraft.world.level.LevelAccessor { getLevel(): net.minecraft.server.level.ServerLevel; getCurrentDifficultyAt(pos: net.minecraft.core.BlockPos): net.minecraft.world.DifficultyInstance; addFreshEntityWithPassengers(entity: net.minecraft.world.entity.Entity): void; } - const CardinalLighting$Type: { - DEFAULT: net.minecraft.world.level.CardinalLighting$Type; - NETHER: net.minecraft.world.level.CardinalLighting$Type; - CODEC: com.mojang.serialization.Codec; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): net.minecraft.world.level.CardinalLighting$Type; - } - interface CardinalLighting$Type extends kotlin.Enum, net.minecraft.util.StringRepresentable { - get(): net.minecraft.world.level.CardinalLighting; - } - const CardinalLighting: { - Type: typeof net.minecraft.world.level.CardinalLighting$Type; - DEFAULT: net.minecraft.world.level.CardinalLighting; - NETHER: net.minecraft.world.level.CardinalLighting; - new(down: number, up: number, north: number, south: number, west: number, east: number): net.minecraft.world.level.CardinalLighting; - } - interface CardinalLighting extends java.lang.Record { - byFace(direction: net.minecraft.core.Direction): number; - down(): number; - up(): number; - north(): number; - south(): number; - west(): number; - east(): number; + interface WorldGenLevel extends net.minecraft.world.level.ServerLevelAccessor { + getSeed(): number; + ensureCanWrite(pos: net.minecraft.core.BlockPos): boolean; + setCurrentlyGenerating(currentlyGenerating: unknown): void; } const StructureManager: { new(level: net.minecraft.world.level.LevelAccessor, worldOptions: net.minecraft.world.level.levelgen.WorldOptions, structureCheck: net.minecraft.world.level.levelgen.structure.StructureCheck): net.minecraft.world.level.StructureManager; @@ -31374,10 +31319,31 @@ declare global { addReference(start: net.minecraft.world.level.levelgen.structure.StructureStart): void; registryAccess(): net.minecraft.core.RegistryAccess; } - const NoiseColumn: { - new(minY: number, column: Array): net.minecraft.world.level.NoiseColumn; + const CardinalLighting$Type: { + DEFAULT: net.minecraft.world.level.CardinalLighting$Type; + NETHER: net.minecraft.world.level.CardinalLighting$Type; + CODEC: com.mojang.serialization.Codec; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.world.level.CardinalLighting$Type; } - interface NoiseColumn extends net.minecraft.world.level.chunk.BlockColumn { + interface CardinalLighting$Type extends kotlin.Enum, net.minecraft.util.StringRepresentable { + get(): net.minecraft.world.level.CardinalLighting; + } + const CardinalLighting: { + Type: typeof net.minecraft.world.level.CardinalLighting$Type; + DEFAULT: net.minecraft.world.level.CardinalLighting; + NETHER: net.minecraft.world.level.CardinalLighting; + new(down: number, up: number, north: number, south: number, west: number, east: number): net.minecraft.world.level.CardinalLighting; + } + interface CardinalLighting extends java.lang.Record { + byFace(direction: net.minecraft.core.Direction): number; + down(): number; + up(): number; + north(): number; + south(): number; + west(): number; + east(): number; } const LightLayer: { SKY: net.minecraft.world.level.LightLayer; @@ -31422,6 +31388,11 @@ declare global { interface TicketStorage$TicketPredicate { test(ticket: net.minecraft.server.level.Ticket, chunkPos: number): boolean; } + const NoiseColumn: { + new(minY: number, column: Array): net.minecraft.world.level.NoiseColumn; + } + interface NoiseColumn extends net.minecraft.world.level.chunk.BlockColumn { + } interface CollisionGetter extends net.minecraft.world.level.BlockGetter { getWorldBorder(): net.minecraft.world.level.border.WorldBorder; getChunkForCollisions(chunkX: number, chunkZ: number): net.minecraft.world.level.BlockGetter | null | undefined; @@ -31441,6 +31412,7 @@ declare global { getPreMoveCollisions(source: net.minecraft.world.entity.Entity | null | undefined, box: net.minecraft.world.phys.AABB, oldPos: net.minecraft.world.phys.Vec3): kotlin.collections.MutableIterable; getBlockCollisions(source: net.minecraft.world.entity.Entity | null | undefined, box: net.minecraft.world.phys.AABB): kotlin.collections.MutableIterable; getBlockAndLiquidCollisions(source: net.minecraft.world.entity.Entity | null | undefined, box: net.minecraft.world.phys.AABB): kotlin.collections.MutableIterable; + getBlockCollisionsFromContext(source: net.minecraft.world.phys.shapes.CollisionContext, box: net.minecraft.world.phys.AABB): kotlin.collections.MutableIterable; clipIncludingBorder(c: net.minecraft.world.level.ClipContext): net.minecraft.world.phys.BlockHitResult; collidesWithSuffocatingBlock(source: net.minecraft.world.entity.Entity | null | undefined, box: net.minecraft.world.phys.AABB): boolean; findSupportingBlock(source: net.minecraft.world.entity.Entity, box: net.minecraft.world.phys.AABB): java.util.Optional; @@ -31532,6 +31504,7 @@ declare global { getControlInputSignal(pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction, onlyDiodes: boolean): number; hasSignal(pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction): boolean; getSignal(pos: net.minecraft.core.BlockPos, direction: net.minecraft.core.Direction): number; + getBestOwnOrNeighbourSignal(pos: net.minecraft.core.BlockPos): number; hasNeighborSignal(blockPos: net.minecraft.core.BlockPos): boolean; getBestNeighborSignal(pos: net.minecraft.core.BlockPos): number; } @@ -31702,6 +31675,7 @@ declare global { emptyWithFluidCollisions(): net.minecraft.world.phys.shapes.CollisionContext; of(entity: net.minecraft.world.entity.Entity): net.minecraft.world.phys.shapes.CollisionContext; of(entity: net.minecraft.world.entity.Entity, alwaysCollideWithFluid: boolean): net.minecraft.world.phys.shapes.CollisionContext; + positionContext(y: number): net.minecraft.world.phys.shapes.CollisionContext; placementContext(player: net.minecraft.world.entity.player.Player | null | undefined): net.minecraft.world.phys.shapes.CollisionContext; withPosition(entity: net.minecraft.world.entity.Entity | null | undefined, position: number): net.minecraft.world.phys.shapes.CollisionContext; } @@ -31803,6 +31777,7 @@ declare global { lengthSquared(): number; distanceToSqr(p: net.minecraft.world.phys.Vec2): number; negated(): net.minecraft.world.phys.Vec2; + rotate(angleRadians: number): net.minecraft.world.phys.Vec2; } const AABB: { Builder: typeof net.minecraft.world.phys.AABB$Builder; @@ -31940,8 +31915,8 @@ declare global { ARMOR: net.minecraft.world.scores.criteria.ObjectiveCriteria; EXPERIENCE: net.minecraft.world.scores.criteria.ObjectiveCriteria; LEVEL: net.minecraft.world.scores.criteria.ObjectiveCriteria; - TEAM_KILL: Array; - KILLED_BY_TEAM: Array; + TEAM_KILL: Map; + KILLED_BY_TEAM: Map; registerCustom(name: string, readOnly: boolean, renderType: net.minecraft.world.scores.criteria.ObjectiveCriteria$RenderType): net.minecraft.world.scores.criteria.ObjectiveCriteria; registerCustom(name: string): net.minecraft.world.scores.criteria.ObjectiveCriteria; getCustomCriteriaNames(): Set; @@ -32038,9 +32013,6 @@ declare global { display(display: net.minecraft.network.chat.Component | null | undefined): void; numberFormatOverride(numberFormat: net.minecraft.network.chat.numbers.NumberFormat | null | undefined): void; } - const ReadOnlyScoreInfo: { - safeFormatValue(scoreInfo: net.minecraft.world.scores.ReadOnlyScoreInfo | null | undefined, defaultFormat: net.minecraft.network.chat.numbers.NumberFormat): net.minecraft.network.chat.MutableComponent; - } interface ReadOnlyScoreInfo { value(): number; isLocked(): boolean; @@ -32070,7 +32042,6 @@ declare global { CODEC: net.minecraft.util.StringRepresentable$EnumCodec; BY_ID: unknown; entries: kotlin.enums.EnumEntries; - teamColorToSlot(color: net.minecraft.ChatFormatting): net.minecraft.world.scores.DisplaySlot | null | undefined; values(): Array; valueOf(value: string): net.minecraft.world.scores.DisplaySlot; } @@ -32099,7 +32070,7 @@ declare global { setCollisionRule(collisionRule: net.minecraft.world.scores.Team$CollisionRule): void; packOptions(): number; unpackOptions(options: number): void; - setColor(color: net.minecraft.ChatFormatting): void; + setColor(color: java.util.Optional): void; } const Team: { CollisionRule: typeof net.minecraft.world.scores.Team$CollisionRule; @@ -32113,7 +32084,7 @@ declare global { canSeeFriendlyInvisibles(): boolean; isAllowFriendlyFire(): boolean; getNameTagVisibility(): net.minecraft.world.scores.Team$Visibility; - getColor(): net.minecraft.ChatFormatting; + getColor(): java.util.Optional; getPlayers(): Array; getDeathMessageVisibility(): net.minecraft.world.scores.Team$Visibility; getCollisionRule(): net.minecraft.world.scores.Team$CollisionRule; @@ -32152,12 +32123,12 @@ declare global { } const PlayerTeam$Packed: { CODEC: com.mojang.serialization.Codec; - new(name: string, displayName: java.util.Optional, color: java.util.Optional, allowFriendlyFire: boolean, seeFriendlyInvisibles: boolean, memberNamePrefix: net.minecraft.network.chat.Component, memberNameSuffix: net.minecraft.network.chat.Component, nameTagVisibility: net.minecraft.world.scores.Team$Visibility, deathMessageVisibility: net.minecraft.world.scores.Team$Visibility, collisionRule: net.minecraft.world.scores.Team$CollisionRule, players: Array): net.minecraft.world.scores.PlayerTeam$Packed; + new(name: string, displayName: java.util.Optional, color: java.util.Optional, allowFriendlyFire: boolean, seeFriendlyInvisibles: boolean, memberNamePrefix: net.minecraft.network.chat.Component, memberNameSuffix: net.minecraft.network.chat.Component, nameTagVisibility: net.minecraft.world.scores.Team$Visibility, deathMessageVisibility: net.minecraft.world.scores.Team$Visibility, collisionRule: net.minecraft.world.scores.Team$CollisionRule, players: Array): net.minecraft.world.scores.PlayerTeam$Packed; } interface PlayerTeam$Packed extends java.lang.Record { name(): string; displayName(): java.util.Optional; - color(): java.util.Optional; + color(): java.util.Optional; allowFriendlyFire(): boolean; seeFriendlyInvisibles(): boolean; memberNamePrefix(): net.minecraft.network.chat.Component; @@ -32167,6 +32138,11 @@ declare global { collisionRule(): net.minecraft.world.scores.Team$CollisionRule; players(): Array; } + const PlayerTeam$OptionFlags: { + new(): net.minecraft.world.scores.PlayerTeam$OptionFlags; + } + interface PlayerTeam$OptionFlags extends kotlin.Annotation { + } const Score: { Packed: typeof net.minecraft.world.scores.Score$Packed; new(): net.minecraft.world.scores.Score; @@ -32249,7 +32225,6 @@ declare global { } const Waypoint: { Icon: typeof net.minecraft.world.waypoints.Waypoint$Icon; - MAX_RANGE: number; WAYPOINT_TRANSMIT_RANGE_HIDE_MODIFIER: net.minecraft.world.entity.ai.attributes.AttributeModifier; addHideAttribute(properties: net.minecraft.world.item.Item$Properties): net.minecraft.world.item.Item$Properties; } @@ -32624,37 +32599,28 @@ declare global { slots(): net.minecraft.world.item.slot.SlotCollection; } } - namespace alchemy { - const PotionBrewing: { - Builder: typeof net.minecraft.world.item.alchemy.PotionBrewing$Builder; - BREWING_TIME_SECONDS: number; - EMPTY: net.minecraft.world.item.alchemy.PotionBrewing; - bootstrap(enabledFeatures: net.minecraft.world.flag.FeatureFlagSet): net.minecraft.world.item.alchemy.PotionBrewing; - addVanillaMixes(builder: net.minecraft.world.item.alchemy.PotionBrewing$Builder): void; - } - interface PotionBrewing { - isIngredient(ingredient: net.minecraft.world.item.ItemStack): boolean; - isContainerIngredient(ingredient: net.minecraft.world.item.ItemStack): boolean; - isPotionIngredient(ingredient: net.minecraft.world.item.ItemStack): boolean; - isBrewablePotion(potion: net.minecraft.core.Holder): boolean; - hasMix(source: net.minecraft.world.item.ItemStack, ingredient: net.minecraft.world.item.ItemStack): boolean; - hasContainerMix(source: net.minecraft.world.item.ItemStack, ingredient: net.minecraft.world.item.ItemStack): boolean; - hasPotionMix(source: net.minecraft.world.item.ItemStack, ingredient: net.minecraft.world.item.ItemStack): boolean; - mix(ingredient: net.minecraft.world.item.ItemStack, source: net.minecraft.world.item.ItemStack): net.minecraft.world.item.ItemStack; - } - const PotionBrewing$Builder: { - new(enabledFeatures: net.minecraft.world.flag.FeatureFlagSet): net.minecraft.world.item.alchemy.PotionBrewing$Builder; - } - interface PotionBrewing$Builder extends net.fabricmc.fabric.api.registry.FabricPotionBrewingBuilder { - addContainerRecipe(from: net.minecraft.world.item.Item, ingredient: net.minecraft.world.item.Item, to: net.minecraft.world.item.Item): void; - addContainer(item: net.minecraft.world.item.Item): void; - addMix(from: net.minecraft.core.Holder, ingredient: net.minecraft.world.item.Item, to: net.minecraft.core.Holder): void; - addStartMix(ingredient: net.minecraft.world.item.Item, potion: net.minecraft.core.Holder): void; - build(): net.minecraft.world.item.alchemy.PotionBrewing; - } - } namespace crafting { namespace display { + const RecipeDisplayId: { + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + new(index: number): net.minecraft.world.item.crafting.display.RecipeDisplayId; + } + interface RecipeDisplayId extends java.lang.Record { + index(): number; + } + const RecipeDisplayEntry: { + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + new(id: net.minecraft.world.item.crafting.display.RecipeDisplayId, display: net.minecraft.world.item.crafting.display.RecipeDisplay, group: java.util.OptionalInt, category: net.minecraft.world.item.crafting.RecipeBookCategory, craftingRequirements: java.util.Optional>): net.minecraft.world.item.crafting.display.RecipeDisplayEntry; + } + interface RecipeDisplayEntry extends java.lang.Record { + resultItems(context: net.minecraft.util.context.ContextMap): Array; + canCraft(providedContents: net.minecraft.world.entity.player.StackedItemContents): boolean; + id(): net.minecraft.world.item.crafting.display.RecipeDisplayId; + display(): net.minecraft.world.item.crafting.display.RecipeDisplay; + group(): java.util.OptionalInt; + category(): net.minecraft.world.item.crafting.RecipeBookCategory; + craftingRequirements(): java.util.Optional>; + } const SlotDisplay: { ItemStackContentsFactory: typeof net.minecraft.world.item.crafting.display.SlotDisplay$ItemStackContentsFactory; WithRemainder: typeof net.minecraft.world.item.crafting.display.SlotDisplay$WithRemainder; @@ -32805,26 +32771,6 @@ declare global { } interface SlotDisplay$Empty extends net.minecraft.world.item.crafting.display.SlotDisplay { } - const RecipeDisplayId: { - STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(index: number): net.minecraft.world.item.crafting.display.RecipeDisplayId; - } - interface RecipeDisplayId extends java.lang.Record { - index(): number; - } - const RecipeDisplayEntry: { - STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(id: net.minecraft.world.item.crafting.display.RecipeDisplayId, display: net.minecraft.world.item.crafting.display.RecipeDisplay, group: java.util.OptionalInt, category: net.minecraft.world.item.crafting.RecipeBookCategory, craftingRequirements: java.util.Optional>): net.minecraft.world.item.crafting.display.RecipeDisplayEntry; - } - interface RecipeDisplayEntry extends java.lang.Record { - resultItems(context: net.minecraft.util.context.ContextMap): Array; - canCraft(providedContents: net.minecraft.world.entity.player.StackedItemContents): boolean; - id(): net.minecraft.world.item.crafting.display.RecipeDisplayId; - display(): net.minecraft.world.item.crafting.display.RecipeDisplay; - group(): java.util.OptionalInt; - category(): net.minecraft.world.item.crafting.RecipeBookCategory; - craftingRequirements(): java.util.Optional>; - } const RecipeDisplay: { Type: typeof net.minecraft.world.item.crafting.display.RecipeDisplay$Type; CODEC: com.mojang.serialization.Codec; @@ -32844,23 +32790,6 @@ declare global { streamCodec(): net.minecraft.network.codec.StreamCodec; } } - const Ingredient: { - CONTENTS_STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - OPTIONAL_CONTENTS_STREAM_CODEC: net.minecraft.network.codec.StreamCodec>; - NON_AIR_HOLDER_SET_CODEC: com.mojang.serialization.Codec>; - CODEC: com.mojang.serialization.Codec; - testOptionalIngredient(ingredient: java.util.Optional, stack: net.minecraft.world.item.ItemStack): boolean; - of(itemLike: net.minecraft.world.level.ItemLike): net.minecraft.world.item.crafting.Ingredient; - of(items: net.minecraft.world.level.ItemLike): net.minecraft.world.item.crafting.Ingredient; - of(stream: java.util.stream.Stream): net.minecraft.world.item.crafting.Ingredient; - of(tag: net.minecraft.core.HolderSet): net.minecraft.world.item.crafting.Ingredient; - optionalIngredientToDisplay(ingredient: java.util.Optional): net.minecraft.world.item.crafting.display.SlotDisplay; - } - interface Ingredient extends net.minecraft.world.entity.player.StackedContents$IngredientInfo>, net.fabricmc.fabric.api.recipe.v1.ingredient.FabricIngredient { - items(): java.util.stream.Stream>; - isEmpty(): boolean; - display(): net.minecraft.world.item.crafting.display.SlotDisplay; - } const RecipeManager: { ServerDisplayInfo: typeof net.minecraft.world.item.crafting.RecipeManager$ServerDisplayInfo; IngredientCollector: typeof net.minecraft.world.item.crafting.RecipeManager$IngredientCollector; @@ -32914,6 +32843,7 @@ declare global { CAMPFIRE_INPUT: net.minecraft.resources.ResourceKey; STREAM_CODEC: net.minecraft.network.codec.StreamCodec; EMPTY: net.minecraft.world.item.crafting.RecipePropertySet; + create(ingredients: Array): net.minecraft.world.item.crafting.RecipePropertySet; } interface RecipePropertySet { test(itemStack: net.minecraft.world.item.ItemStack): boolean; @@ -32984,6 +32914,23 @@ declare global { slotsToIngredientIndex(): it.unimi.dsi.fastutil.ints.IntList; isImpossibleToPlace(): boolean; } + const Ingredient: { + CONTENTS_STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + OPTIONAL_CONTENTS_STREAM_CODEC: net.minecraft.network.codec.StreamCodec>; + NON_AIR_HOLDER_SET_CODEC: com.mojang.serialization.Codec>; + CODEC: com.mojang.serialization.Codec; + testOptionalIngredient(ingredient: java.util.Optional, stack: net.minecraft.world.item.ItemStack): boolean; + of(itemLike: net.minecraft.world.level.ItemLike): net.minecraft.world.item.crafting.Ingredient; + of(items: net.minecraft.world.level.ItemLike): net.minecraft.world.item.crafting.Ingredient; + of(stream: java.util.stream.Stream): net.minecraft.world.item.crafting.Ingredient; + of(tag: net.minecraft.core.HolderSet): net.minecraft.world.item.crafting.Ingredient; + optionalIngredientToDisplay(ingredient: java.util.Optional): net.minecraft.world.item.crafting.display.SlotDisplay; + } + interface Ingredient extends net.minecraft.world.entity.player.StackedContents$IngredientInfo>, net.fabricmc.fabric.api.recipe.v1.ingredient.FabricIngredient { + items(): java.util.stream.Stream>; + isEmpty(): boolean; + display(): net.minecraft.world.item.crafting.display.SlotDisplay; + } const RecipeBookCategory: { new(): net.minecraft.world.item.crafting.RecipeBookCategory; } @@ -33048,6 +32995,35 @@ declare global { top(): number; } } + namespace alchemy { + const PotionBrewing: { + Builder: typeof net.minecraft.world.item.alchemy.PotionBrewing$Builder; + BREWING_TIME_SECONDS: number; + EMPTY: net.minecraft.world.item.alchemy.PotionBrewing; + bootstrap(enabledFeatures: net.minecraft.world.flag.FeatureFlagSet): net.minecraft.world.item.alchemy.PotionBrewing; + addVanillaMixes(builder: net.minecraft.world.item.alchemy.PotionBrewing$Builder): void; + } + interface PotionBrewing { + isIngredient(ingredient: net.minecraft.world.item.ItemStack): boolean; + isContainerIngredient(ingredient: net.minecraft.world.item.ItemStack): boolean; + isPotionIngredient(ingredient: net.minecraft.world.item.ItemStack): boolean; + isBrewablePotion(potion: net.minecraft.core.Holder): boolean; + hasMix(source: net.minecraft.world.item.ItemStack, ingredient: net.minecraft.world.item.ItemStack): boolean; + hasContainerMix(source: net.minecraft.world.item.ItemStack, ingredient: net.minecraft.world.item.ItemStack): boolean; + hasPotionMix(source: net.minecraft.world.item.ItemStack, ingredient: net.minecraft.world.item.ItemStack): boolean; + mix(ingredient: net.minecraft.world.item.ItemStack, source: net.minecraft.world.item.ItemStack): net.minecraft.world.item.ItemStack; + } + const PotionBrewing$Builder: { + new(enabledFeatures: net.minecraft.world.flag.FeatureFlagSet): net.minecraft.world.item.alchemy.PotionBrewing$Builder; + } + interface PotionBrewing$Builder extends net.fabricmc.fabric.api.registry.FabricPotionBrewingBuilder { + addContainerRecipe(from: net.minecraft.world.item.Item, ingredient: net.minecraft.world.item.Item, to: net.minecraft.world.item.Item): void; + addContainer(item: net.minecraft.world.item.Item): void; + addMix(from: net.minecraft.core.Holder, ingredient: net.minecraft.world.item.Item, to: net.minecraft.core.Holder): void; + addStartMix(ingredient: net.minecraft.world.item.Item, potion: net.minecraft.core.Holder): void; + build(): net.minecraft.world.item.alchemy.PotionBrewing; + } + } namespace trading { const MerchantOffers: { CODEC: com.mojang.serialization.Codec; @@ -33398,7 +33374,7 @@ declare global { canBeHurtBy(source: net.minecraft.world.damagesource.DamageSource): boolean; isValidRepairItem(repairItem: net.minecraft.world.item.ItemStack): boolean; canDestroyBlock(state: net.minecraft.world.level.block.state.BlockState, level: net.minecraft.world.level.Level, pos: net.minecraft.core.BlockPos, player: net.minecraft.world.entity.player.Player): boolean; - getDamageSource(attacker: net.minecraft.world.entity.LivingEntity, defaultSource: unknown): net.minecraft.world.damagesource.DamageSource; + getDamageSource(attacker: net.minecraft.world.entity.LivingEntity): net.minecraft.world.damagesource.DamageSource; } const ItemInstance: { FIELD_ID: string; @@ -33418,6 +33394,7 @@ declare global { new(item: net.minecraft.world.item.Item, patch: net.minecraft.core.component.DataComponentPatch): net.minecraft.world.item.ItemStackTemplate; new(item: net.minecraft.core.Holder, count: number, components: net.minecraft.core.component.DataComponentPatch): net.minecraft.world.item.ItemStackTemplate; fromNonEmptyStack(itemStack: net.minecraft.world.item.ItemStack): net.minecraft.world.item.ItemStackTemplate; + fromStack(itemStack: net.minecraft.world.item.ItemStack): net.minecraft.world.item.ItemStackTemplate; } interface ItemStackTemplate extends java.lang.Record, net.minecraft.world.item.ItemInstance { withCount(count: number): net.minecraft.world.item.ItemStackTemplate; @@ -33545,6 +33522,7 @@ declare global { getName(): string; getTextureDiffuseColor(): number; getMapColor(): net.minecraft.world.level.material.MapColor; + getTerracottaColor(): net.minecraft.world.level.material.MapColor; getFireworkColor(): number; getTextColor(): number; } @@ -34025,6 +34003,7 @@ declare global { isActive(): boolean; tryRemove(amount: number, maxAmount: number, player: net.minecraft.world.entity.player.Player): java.util.Optional; safeTake(amount: number, maxAmount: number, player: net.minecraft.world.entity.player.Player): net.minecraft.world.item.ItemStack; + safeClone(player: net.minecraft.world.entity.player.Player): net.minecraft.world.item.ItemStack; safeInsert(stack: net.minecraft.world.item.ItemStack): net.minecraft.world.item.ItemStack; safeInsert(inputStack: net.minecraft.world.item.ItemStack, inputAmount: number): net.minecraft.world.item.ItemStack; allowModification(player: net.minecraft.world.entity.player.Player): boolean; @@ -34286,6 +34265,7 @@ declare global { partialTickLerp(): net.minecraft.world.attribute.LerpFunction; } const LerpFunction: { + CONSTANT: net.minecraft.world.attribute.LerpFunction; ofFloat(): net.minecraft.world.attribute.LerpFunction; ofInteger(): net.minecraft.world.attribute.LerpFunction; ofDegrees(maxDelta: number): net.minecraft.world.attribute.LerpFunction; @@ -34467,13 +34447,13 @@ declare global { getBlendOutDurationTicks(): number; getBlendOutAdvanceTicks(): number; applyEffectTick(serverLevel: net.minecraft.server.level.ServerLevel, mob: net.minecraft.world.entity.LivingEntity, amplification: number): boolean; - applyInstantenousEffect(level: net.minecraft.server.level.ServerLevel, source: net.minecraft.world.entity.Entity | null | undefined, owner: net.minecraft.world.entity.Entity | null | undefined, mob: net.minecraft.world.entity.LivingEntity, amplification: number, scale: number): void; + applyInstantaneousEffect(level: net.minecraft.server.level.ServerLevel, source: net.minecraft.world.entity.Entity | null | undefined, owner: net.minecraft.world.entity.Entity | null | undefined, mob: net.minecraft.world.entity.LivingEntity, amplification: number, scale: number): void; shouldApplyEffectTickThisTick(tickCount: number, amplification: number): boolean; onEffectStarted(mob: net.minecraft.world.entity.LivingEntity, amplifier: number): void; onEffectAdded(mob: net.minecraft.world.entity.LivingEntity, amplifier: number): void; onMobRemoved(level: net.minecraft.server.level.ServerLevel, mob: net.minecraft.world.entity.LivingEntity, amplifier: number, reason: net.minecraft.world.entity.Entity$RemovalReason): void; onMobHurt(level: net.minecraft.server.level.ServerLevel, mob: net.minecraft.world.entity.LivingEntity, amplifier: number, source: net.minecraft.world.damagesource.DamageSource, damage: number): void; - isInstantenous(): boolean; + isInstantaneous(): boolean; getDescriptionId(): string; getDisplayName(): net.minecraft.network.chat.Component; getCategory(): net.minecraft.world.effect.MobEffectCategory; @@ -34585,6 +34565,8 @@ declare global { interface InteractionResult$SwingSource extends kotlin.Enum { } const InteractionResult$ItemContext: { + NONE: net.minecraft.world.InteractionResult$ItemContext; + DEFAULT: net.minecraft.world.InteractionResult$ItemContext; new(wasItemInteraction: boolean, heldItemTransformedTo: net.minecraft.world.item.ItemStack | null | undefined): net.minecraft.world.InteractionResult$ItemContext; } interface InteractionResult$ItemContext extends java.lang.Record { @@ -35045,6 +35027,7 @@ declare global { interface WorldGenRegion extends net.minecraft.world.level.WorldGenLevel { isOldChunkAround(pos: net.minecraft.world.level.ChunkPos, range: number): boolean; getCenter(): net.minecraft.world.level.ChunkPos; + isWithinWriteZone(pos: net.minecraft.core.BlockPos): boolean; } const FullChunkStatus: { INACCESSIBLE: net.minecraft.server.level.FullChunkStatus; @@ -35088,8 +35071,13 @@ declare global { getChunkToSend(key: number): net.minecraft.world.level.chunk.LevelChunk | null | undefined; size(): number; getDistanceManager(): net.minecraft.server.level.DistanceManager; + collectSpawningChunks(output: Array): void; + forEachBlockTickingChunk(tickingChunkConsumer: unknown): void; + anyPlayerCloseEnoughForSpawning(pos: net.minecraft.world.level.ChunkPos): boolean; + anyPlayerCloseEnoughTo(pos: net.minecraft.core.BlockPos, maxDistance: number): boolean; getPlayersCloseForSpawning(pos: net.minecraft.world.level.ChunkPos): Array; move(player: net.minecraft.server.level.ServerPlayer): void; + hasEntityWithId(id: number): boolean; sendToTrackingPlayers(entity: net.minecraft.world.entity.Entity, packet: net.minecraft.network.protocol.Packet): void; sendToTrackingPlayersFiltered(entity: net.minecraft.world.entity.Entity, packet: net.minecraft.network.protocol.Packet, targetPredicate: unknown): void; isTrackedByAnyPlayer(entity: net.minecraft.world.entity.Entity): boolean; @@ -35374,6 +35362,7 @@ declare global { getNearestPlayer(targetConditions: net.minecraft.world.entity.ai.targeting.TargetingConditions, x: number, y: number, z: number): net.minecraft.world.entity.player.Player | null | undefined; getNearestEntity(type: java.lang.Class, targetConditions: net.minecraft.world.entity.ai.targeting.TargetingConditions, source: net.minecraft.world.entity.LivingEntity | null | undefined, x: number, y: number, z: number, bb: net.minecraft.world.phys.AABB): T; getNearestEntity(tag: net.minecraft.tags.TagKey>, targetConditions: net.minecraft.world.entity.ai.targeting.TargetingConditions, source: net.minecraft.world.entity.LivingEntity | null | undefined, x: number, y: number, z: number, bb: net.minecraft.world.phys.AABB): net.minecraft.world.entity.LivingEntity | null | undefined; + getNearestEntity(entities: Array, x: number, y: number, z: number): T; getNearestEntity(entities: Array, targetConditions: net.minecraft.world.entity.ai.targeting.TargetingConditions, source: net.minecraft.world.entity.LivingEntity | null | undefined, x: number, y: number, z: number): T; getNearbyPlayers(targetConditions: net.minecraft.world.entity.ai.targeting.TargetingConditions, source: net.minecraft.world.entity.LivingEntity, bb: net.minecraft.world.phys.AABB): Array; getNearbyEntities(type: java.lang.Class, targetConditions: net.minecraft.world.entity.ai.targeting.TargetingConditions, source: net.minecraft.world.entity.LivingEntity, bb: net.minecraft.world.phys.AABB): Array; @@ -35398,6 +35387,7 @@ declare global { addTicketWithRadius(type: net.minecraft.server.level.TicketType, pos: net.minecraft.world.level.ChunkPos, radius: number): void; removeTicketWithRadius(type: net.minecraft.server.level.TicketType, pos: net.minecraft.world.level.ChunkPos, radius: number): void; move(player: net.minecraft.server.level.ServerPlayer): void; + hasEntityWithId(id: number): boolean; removeEntity(entity: net.minecraft.world.entity.Entity): void; addEntity(entity: net.minecraft.world.entity.Entity): void; sendToTrackingPlayersAndSelf(entity: net.minecraft.world.entity.Entity, packet: net.minecraft.network.protocol.Packet): void; @@ -35467,6 +35457,15 @@ declare global { clientInformation(): net.minecraft.server.level.ClientInformation; transferred(): boolean; } + const TextFilter: { + DUMMY: net.minecraft.server.network.TextFilter; + } + interface TextFilter { + join(): void; + leave(): void; + processStreamMessage(message: string): java.util.concurrent.CompletableFuture; + processMessageBundle(messages: Array): java.util.concurrent.CompletableFuture>; + } const ServerConnectionListener: { new(server: net.minecraft.server.MinecraftServer): net.minecraft.server.network.ServerConnectionListener; } @@ -35474,19 +35473,13 @@ declare global { running: boolean; startTcpServerListener(address: java.net.InetAddress | null | undefined, port: number): void; startMemoryChannel(): java.net.SocketAddress; + acceptChannel(channel: io.netty.channel.Channel, profileId: java.util.UUID): void; stop(): void; + stopTcpServerListener(): void; tick(): void; getServer(): net.minecraft.server.MinecraftServer; getConnections(): Array; - } - const TextFilter: { - DUMMY: net.minecraft.server.network.TextFilter; - } - interface TextFilter { - join(): void; - leave(): void; - processStreamMessage(message: string): java.util.concurrent.CompletableFuture; - processMessageBundle(messages: Array): java.util.concurrent.CompletableFuture>; + getSessionId(): java.util.UUID; } interface ServerPlayerConnection { getPlayer(): net.minecraft.server.level.ServerPlayer; @@ -35861,6 +35854,19 @@ declare global { interface ResourceManagerReloadListener extends net.minecraft.server.packs.resources.PreparableReloadListener { onResourceManagerReload(resourceManager: net.minecraft.server.packs.resources.ResourceManager): void; } + const ReloadableResourceManager: { + new(type: net.minecraft.server.packs.PackType): net.minecraft.server.packs.resources.ReloadableResourceManager; + } + interface ReloadableResourceManager extends java.lang.AutoCloseable, net.minecraft.server.packs.resources.ResourceManager { + registerReloadListener(listener: net.minecraft.server.packs.resources.PreparableReloadListener): void; + createReload(backgroundExecutor: java.util.concurrent.Executor, mainThreadExecutor: java.util.concurrent.Executor, initialTask: java.util.concurrent.CompletableFuture, resourcePacks: Array): net.minecraft.server.packs.resources.ReloadInstance; + } + interface ReloadInstance { + done(): java.util.concurrent.CompletableFuture; + getActualProgress(): number; + isDone(): boolean; + checkExceptions(): void; + } } const PackLocationInfo: { new(id: string, title: net.minecraft.network.chat.Component, source: net.minecraft.server.packs.repository.PackSource, knownPackInfo: java.util.Optional): net.minecraft.server.packs.PackLocationInfo; @@ -35958,6 +35964,7 @@ declare global { } interface StoredUserEntry { getUser(): T; + hasExpired(): boolean; } const IpBanListEntry: { new(address: string): net.minecraft.server.players.IpBanListEntry; @@ -36047,6 +36054,7 @@ declare global { setViewDistance(viewDistance: number): void; setSimulationDistance(simulationDistance: number): void; getPlayers(): Array; + getPlayersByUUID(): Map; getPlayer(uuid: java.util.UUID): net.minecraft.server.level.ServerPlayer | null | undefined; getPlayer(playerName: string): net.minecraft.server.level.ServerPlayer | null | undefined; canBypassPlayerLimit(nameAndId: net.minecraft.server.players.NameAndId): boolean; @@ -36108,7 +36116,9 @@ declare global { new(): net.minecraft.server.notifications.NotificationManager; } interface NotificationManager extends net.minecraft.server.notifications.NotificationService { + server(): net.minecraft.server.dedicated.DedicatedServer | null | undefined; registerService(notificationService: net.minecraft.server.notifications.NotificationService): void; + setServer(server: net.minecraft.server.dedicated.DedicatedServer): void; } interface NotificationService { playerJoined(player: net.minecraft.server.level.ServerPlayer): void; @@ -36137,6 +36147,327 @@ declare global { reportLoginActivity(): void; } } + namespace dedicated { + const DedicatedServer: { + new(serverThread: java.lang.Thread, levelStorageSource: net.minecraft.world.level.storage.LevelStorageSource$LevelStorageAccess, packRepository: net.minecraft.server.packs.repository.PackRepository, worldStem: net.minecraft.server.WorldStem, gameRules: java.util.Optional, settings: net.minecraft.server.dedicated.DedicatedServerSettings, fixerUpper: com.mojang.datafixers.DataFixer, services: net.minecraft.server.Services, jsonRpcServer: net.minecraft.server.jsonrpc.ManagementServer | null | undefined, notificationManager: net.minecraft.server.notifications.NotificationManager): net.minecraft.server.dedicated.DedicatedServer; + } + interface DedicatedServer extends net.minecraft.server.MinecraftServer, net.minecraft.server.ServerInterface { + setAllowFlight(allowed: boolean): void; + setDifficulty(difficulty: net.minecraft.world.Difficulty): void; + viewDistance(): number; + setViewDistance(viewDistance: number): void; + simulationDistance(): number; + setSimulationDistance(simulationDistance: number): void; + handleConsoleInput(msg: string, source: net.minecraft.commands.CommandSourceStack): void; + handleConsoleInputs(): void; + setMaxPlayers(maxPlayers: number): void; + showGui(): void; + spawnProtectionRadius(): number; + setSpawnProtectionRadius(spawnProtectionRadius: number): void; + setRepliesToStatus(enable: boolean): void; + setHidesOnlinePlayers(hide: boolean): void; + setOperatorUserPermissions(permissions: net.minecraft.server.permissions.LevelBasedPermissionSet): void; + statusHeartbeatInterval(): number; + setStatusHeartbeatInterval(statusHeartbeatInterval: number): boolean; + getMaxTickLength(): number; + entityBroadcastRangePercentage(): number; + setEntityBroadcastRangePercentage(range: number): void; + forceGameMode(): boolean; + setForceGameMode(forceGameMode: boolean): void; + gameMode(): net.minecraft.world.level.GameType; + setGameMode(gameMode: net.minecraft.world.level.GameType): void; + setAcceptsTransfers(acceptTransfers: boolean): void; + setPauseWhenEmptySeconds(seconds: number): void; + } + const DedicatedServerProperties: { + MANAGEMENT_SERVER_TLS_ENABLED_KEY: string; + MANAGEMENT_SERVER_TLS_KEYSTORE_KEY: string; + MANAGEMENT_SERVER_TLS_KEYSTORE_PASSWORD_KEY: string; + new(settings: java.util.Properties): net.minecraft.server.dedicated.DedicatedServerProperties; + fromFile(file: java.nio.file.Path): net.minecraft.server.dedicated.DedicatedServerProperties; + deserializePermission(value: string): net.minecraft.server.permissions.LevelBasedPermissionSet | null | undefined; + serializePermission(permission: net.minecraft.server.permissions.LevelBasedPermissionSet): string; + } + interface DedicatedServerProperties extends net.minecraft.server.dedicated.Settings { + onlineMode: boolean; + preventProxyConnections: boolean; + serverIp: string; + allowFlight: net.minecraft.server.dedicated.Settings$MutableValue; + motd: net.minecraft.server.dedicated.Settings$MutableValue; + codeOfConduct: boolean; + bugReportLink: string; + forceGameMode: net.minecraft.server.dedicated.Settings$MutableValue; + enforceWhitelist: net.minecraft.server.dedicated.Settings$MutableValue; + difficulty: net.minecraft.server.dedicated.Settings$MutableValue; + gameMode: net.minecraft.server.dedicated.Settings$MutableValue; + levelName: string; + serverPort: number; + managementServerEnabled: boolean; + managementServerHost: string; + managementServerPort: number; + managementServerSecret: string; + managementServerTlsEnabled: boolean; + managementServerTlsKeystore: string; + managementServerTlsKeystorePassword: string; + managementServerAllowedOrigins: string; + announcePlayerAchievements: boolean | null | undefined; + enableQuery: boolean; + queryPort: number; + enableRcon: boolean; + rconPort: number; + rconPassword: string; + hardcore: boolean; + useNativeTransport: boolean; + spawnProtection: net.minecraft.server.dedicated.Settings$MutableValue; + opPermissions: net.minecraft.server.dedicated.Settings$MutableValue; + functionPermissions: net.minecraft.server.permissions.LevelBasedPermissionSet; + maxTickTime: number; + maxChainedNeighborUpdates: number; + rateLimitPacketsPerSecond: number; + commandSpamThresholdSeconds: number; + chatSpamThresholdSeconds: number; + viewDistance: net.minecraft.server.dedicated.Settings$MutableValue; + simulationDistance: net.minecraft.server.dedicated.Settings$MutableValue; + maxPlayers: net.minecraft.server.dedicated.Settings$MutableValue; + networkCompressionThreshold: number; + broadcastRconToOps: boolean; + broadcastConsoleToOps: boolean; + maxWorldSize: number; + syncChunkWrites: boolean; + regionFileComression: string; + enableJmxMonitoring: boolean; + enableStatus: net.minecraft.server.dedicated.Settings$MutableValue; + hideOnlinePlayers: net.minecraft.server.dedicated.Settings$MutableValue; + entityBroadcastRangePercentage: net.minecraft.server.dedicated.Settings$MutableValue; + textFilteringConfig: string; + textFilteringVersion: number; + serverResourcePackInfo: java.util.Optional; + initialDataPackConfiguration: net.minecraft.world.level.DataPackConfig; + playerIdleTimeout: net.minecraft.server.dedicated.Settings$MutableValue; + statusHeartbeatInterval: net.minecraft.server.dedicated.Settings$MutableValue; + whiteList: net.minecraft.server.dedicated.Settings$MutableValue; + enforceSecureProfile: boolean; + logIPs: boolean; + pauseWhenEmptySeconds: net.minecraft.server.dedicated.Settings$MutableValue; + worldOptions: net.minecraft.world.level.levelgen.WorldOptions; + acceptsTransfers: net.minecraft.server.dedicated.Settings$MutableValue; + createDimensions(registries: net.minecraft.core.HolderLookup$Provider): net.minecraft.world.level.levelgen.WorldDimensions; + } + const Settings: { + MutableValue: typeof net.minecraft.server.dedicated.Settings$MutableValue; + new(properties: java.util.Properties): net.minecraft.server.dedicated.Settings; + loadFromFile(file: java.nio.file.Path): java.util.Properties; + } + interface Settings { + store(output: java.nio.file.Path): void; + get(key: string, deserializer: unknown, serializer: unknown, defaultValue: V): V; + get(key: string, deserializer: unknown, validator: unknown, serializer: unknown, defaultValue: V): V; + get(key: string, deserializer: unknown, defaultValue: V): V; + get(key: string, defaultValue: string): string; + get(key: string, defaultValue: number): number; + get(key: string, validator: unknown, defaultValue: number): number; + get(key: string, defaultValue: number): number; + get(key: string, defaultValue: boolean): boolean; + } + interface Settings$MutableValue { + update(registryAccess: net.minecraft.core.RegistryAccess, value: V): T; + } + const DedicatedPlayerList: { + new(server: net.minecraft.server.dedicated.DedicatedServer, registries: net.minecraft.core.LayeredRegistryAccess, playerDataStorage: net.minecraft.world.level.storage.PlayerDataStorage): net.minecraft.server.dedicated.DedicatedPlayerList; + } + interface DedicatedPlayerList extends net.minecraft.server.players.PlayerList { + } + const DedicatedServerSettings: { + new(source: java.nio.file.Path): net.minecraft.server.dedicated.DedicatedServerSettings; + } + interface DedicatedServerSettings { + getProperties(): net.minecraft.server.dedicated.DedicatedServerProperties; + forceSave(): void; + update(mutator: unknown): net.minecraft.server.dedicated.DedicatedServerSettings; + } + } + namespace jsonrpc { + namespace internalapi { + const MinecraftApi: { + new(notificationManager: net.minecraft.server.notifications.NotificationManager, allowListService: net.minecraft.server.jsonrpc.internalapi.MinecraftAllowListService, banListService: net.minecraft.server.jsonrpc.internalapi.MinecraftBanListService, minecraftPlayerListService: net.minecraft.server.jsonrpc.internalapi.MinecraftPlayerListService, gameRuleService: net.minecraft.server.jsonrpc.internalapi.MinecraftGameRuleService, minecraftOperatorListService: net.minecraft.server.jsonrpc.internalapi.MinecraftOperatorListService, minecraftServerSettingsService: net.minecraft.server.jsonrpc.internalapi.MinecraftServerSettingsService, minecraftServerStateService: net.minecraft.server.jsonrpc.internalapi.MinecraftServerStateService, executorService: net.minecraft.server.jsonrpc.internalapi.MinecraftExecutorService): net.minecraft.server.jsonrpc.internalapi.MinecraftApi; + of(notificationManager: net.minecraft.server.notifications.NotificationManager): net.minecraft.server.jsonrpc.internalapi.MinecraftApi; + } + interface MinecraftApi { + notificationManager(): net.minecraft.server.notifications.NotificationManager; + allowListService(): net.minecraft.server.jsonrpc.internalapi.MinecraftAllowListService; + banListService(): net.minecraft.server.jsonrpc.internalapi.MinecraftBanListService; + gameRuleService(): net.minecraft.server.jsonrpc.internalapi.MinecraftGameRuleService; + submit(supplier: unknown): java.util.concurrent.CompletableFuture; + submit(runnable: java.lang.Runnable): java.util.concurrent.CompletableFuture; + playerListService(): net.minecraft.server.jsonrpc.internalapi.MinecraftPlayerListService; + operatorListService(): net.minecraft.server.jsonrpc.internalapi.MinecraftOperatorListService; + serverSettingsService(): net.minecraft.server.jsonrpc.internalapi.MinecraftServerSettingsService; + serverStateService(): net.minecraft.server.jsonrpc.internalapi.MinecraftServerStateService; + } + interface MinecraftAllowListService { + getEntries(): Array; + add(infos: net.minecraft.server.players.UserWhiteListEntry, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + clear(clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + remove(nameAndId: net.minecraft.server.players.NameAndId, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + kickUnlistedPlayers(clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + } + interface MinecraftBanListService { + addUserBan(ban: net.minecraft.server.players.UserBanListEntry, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + removeUserBan(nameAndId: net.minecraft.server.players.NameAndId, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + getUserBanEntries(): Array; + getIpBanEntries(): Array; + addIpBan(ipBanEntry: net.minecraft.server.players.IpBanListEntry, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + clearIpBans(clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + removeIpBan(ip: string, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + clearUserBans(clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + } + interface MinecraftGameRuleService { + updateGameRule(update: net.minecraft.server.jsonrpc.methods.GameRulesService$GameRuleUpdate, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): net.minecraft.server.jsonrpc.methods.GameRulesService$GameRuleUpdate; + getRuleValue(gameRule: net.minecraft.world.level.gamerules.GameRule): T; + getTypedRule(gameRule: net.minecraft.world.level.gamerules.GameRule, value: T): net.minecraft.server.jsonrpc.methods.GameRulesService$GameRuleUpdate; + getAvailableGameRules(): java.util.stream.Stream>; + } + interface MinecraftPlayerListService { + getPlayers(): Array; + getPlayer(uuid: java.util.UUID): net.minecraft.server.level.ServerPlayer | null | undefined; + getPlayer(id: java.util.Optional, name: java.util.Optional): java.util.Optional; + getUser(id: java.util.Optional, name: java.util.Optional): java.util.concurrent.CompletableFuture>; + fetchUserByName(name: string): java.util.Optional; + fetchUserById(id: java.util.UUID): java.util.Optional; + getCachedUserById(id: java.util.UUID): java.util.Optional; + getPlayersWithAddress(ip: string): Array; + getPlayerByName(name: string): net.minecraft.server.level.ServerPlayer | null | undefined; + remove(player: net.minecraft.server.level.ServerPlayer, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + } + interface MinecraftOperatorListService { + getEntries(): Array; + op(nameAndId: net.minecraft.server.players.NameAndId, permissionLevel: java.util.Optional, canBypassPlayerLimit: java.util.Optional, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + op(nameAndId: net.minecraft.server.players.NameAndId, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + deop(nameAndId: net.minecraft.server.players.NameAndId, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + clear(clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + } + interface MinecraftServerSettingsService { + isAutoSave(): boolean; + setAutoSave(enabled: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + getDifficulty(): net.minecraft.world.Difficulty; + setDifficulty(difficulty: net.minecraft.world.Difficulty, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): net.minecraft.world.Difficulty; + isEnforceWhitelist(): boolean; + setEnforceWhitelist(enforce: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + isUsingWhitelist(): boolean; + setUsingWhitelist(use: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + getMaxPlayers(): number; + setMaxPlayers(maxPlayers: number, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): number; + getPauseWhenEmptySeconds(): number; + setPauseWhenEmptySeconds(emptySeconds: number, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): number; + getPlayerIdleTimeout(): number; + setPlayerIdleTimeout(idleTime: number, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): number; + allowFlight(): boolean; + setAllowFlight(allow: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + getSpawnProtectionRadius(): number; + setSpawnProtectionRadius(spawnProtection: number, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): number; + getMotd(): string; + setMotd(motd: string, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): string; + forceGameMode(): boolean; + setForceGameMode(force: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + getGameMode(): net.minecraft.world.level.GameType; + setGameMode(gameMode: net.minecraft.world.level.GameType, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): net.minecraft.world.level.GameType; + getViewDistance(): number; + setViewDistance(viewDistance: number, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): number; + getSimulationDistance(): number; + setSimulationDistance(simulationDistance: number, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): number; + acceptsTransfers(): boolean; + setAcceptsTransfers(accept: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + getStatusHeartbeatInterval(): number; + setStatusHeartbeatInterval(statusHeartbeatInterval: number, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): number; + getOperatorUserPermissions(): net.minecraft.server.permissions.LevelBasedPermissionSet; + setOperatorUserPermissions(level: net.minecraft.server.permissions.LevelBasedPermissionSet, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): net.minecraft.server.permissions.LevelBasedPermissionSet; + hidesOnlinePlayers(): boolean; + setHidesOnlinePlayers(hide: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + repliesToStatus(): boolean; + setRepliesToStatus(enable: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + getEntityBroadcastRangePercentage(): number; + setEntityBroadcastRangePercentage(percentage: number, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): number; + } + interface MinecraftServerStateService { + isReady(): boolean; + saveEverything(suppressLogs: boolean, flush: boolean, force: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): boolean; + halt(waitForShutdown: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + sendSystemMessage(message: net.minecraft.network.chat.Component, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + sendSystemMessage(message: net.minecraft.network.chat.Component, overlay: boolean, players: Array, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + broadcastSystemMessage(message: net.minecraft.network.chat.Component, overlay: boolean, clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo): void; + } + interface MinecraftExecutorService { + submit(supplier: unknown): java.util.concurrent.CompletableFuture; + submit(runnable: java.lang.Runnable): java.util.concurrent.CompletableFuture; + } + } + namespace methods { + const ClientInfo: { + new(connectionId: number): net.minecraft.server.jsonrpc.methods.ClientInfo; + of(connectionId: number): net.minecraft.server.jsonrpc.methods.ClientInfo; + } + interface ClientInfo extends java.lang.Record { + connectionId(): number; + } + const GameRulesService$GameRuleUpdate: { + TYPED_CODEC: com.mojang.serialization.Codec>; + CODEC: com.mojang.serialization.Codec>; + new(gameRule: net.minecraft.world.level.gamerules.GameRule, value: T): net.minecraft.server.jsonrpc.methods.GameRulesService$GameRuleUpdate; + } + interface GameRulesService$GameRuleUpdate extends java.lang.Record { + gameRule(): net.minecraft.world.level.gamerules.GameRule; + value(): T; + } + } + namespace security { + const AuthenticationHandler: { + BEARER_PREFIX: string; + new(securityConfig: net.minecraft.server.jsonrpc.security.SecurityConfig, allowedOrigins: string): net.minecraft.server.jsonrpc.security.AuthenticationHandler; + } + interface AuthenticationHandler extends io.netty.channel.ChannelDuplexHandler { + isValidApiKey(suppliedKey: string): boolean; + } + const SecurityConfig: { + new(secretKey: string): net.minecraft.server.jsonrpc.security.SecurityConfig; + isValid(secretKey: string): boolean; + generateSecretKey(): string; + } + interface SecurityConfig extends java.lang.Record { + secretKey(): string; + } + } + const ManagementServer: { + new(hostAndPort: com.google.common.net.HostAndPort, authenticationHandler: net.minecraft.server.jsonrpc.security.AuthenticationHandler): net.minecraft.server.jsonrpc.ManagementServer; + new(hostAndPort: com.google.common.net.HostAndPort, authenticationHandler: net.minecraft.server.jsonrpc.security.AuthenticationHandler, eventLoopGroup: io.netty.channel.EventLoopGroup): net.minecraft.server.jsonrpc.ManagementServer; + } + interface ManagementServer { + scheduleHeartbeat(notificationManager: net.minecraft.server.notifications.NotificationManager, period: number): boolean; + onConnected(connection: net.minecraft.server.jsonrpc.Connection): void; + onDisconnected(connection: net.minecraft.server.jsonrpc.Connection): void; + startWithoutTls(minecraftApi: net.minecraft.server.jsonrpc.internalapi.MinecraftApi): void; + startWithTls(minecraftApi: net.minecraft.server.jsonrpc.internalapi.MinecraftApi, sslContext: io.netty.handler.ssl.SslContext): void; + stop(closeNioEventLoopGroup: boolean): void; + tick(): void; + getPort(): number; + } + const Connection: { + new(channel: io.netty.channel.Channel, managementServer: net.minecraft.server.jsonrpc.ManagementServer, minecraftApi: net.minecraft.server.jsonrpc.internalapi.MinecraftApi, jsonrpcLogger: net.minecraft.server.jsonrpc.JsonRpcLogger): net.minecraft.server.jsonrpc.Connection; + } + interface Connection extends io.netty.channel.SimpleChannelInboundHandler { + tick(): void; + sendNotification(method: net.minecraft.core.Holder$Reference): void; + sendNotification(method: net.minecraft.core.Holder$Reference, params: Params): void; + sendRequest(method: net.minecraft.core.Holder$Reference): java.util.concurrent.CompletableFuture; + sendRequest(method: net.minecraft.core.Holder$Reference, params: Params): java.util.concurrent.CompletableFuture; + dispatchIncomingRequest(method: string, params: com.google.gson.JsonElement | null | undefined): com.google.gson.JsonElement | null | undefined; + } + const JsonRpcLogger: { + new(): net.minecraft.server.jsonrpc.JsonRpcLogger; + } + interface JsonRpcLogger { + log(clientInfo: net.minecraft.server.jsonrpc.methods.ClientInfo, message: string, args: any): void; + } + } namespace bossevents { const CustomBossEvents: { TYPE: net.minecraft.world.level.saveddata.SavedDataType; @@ -36200,13 +36531,15 @@ declare global { } const MinecraftServer: { ServerResourcePackInfo: typeof net.minecraft.server.MinecraftServer$ServerResourcePackInfo; + MultiplayerScope: typeof net.minecraft.server.MinecraftServer$MultiplayerScope; VANILLA_BRAND: string; SPAWN_POSITION_SEARCH_RADIUS: number; ABSOLUTE_MAX_WORLD_SIZE: number; DEMO_SETTINGS: net.minecraft.world.level.LevelSettings; DEFAULT_GAME_RULES: unknown; ANONYMOUS_PLAYER_PROFILE: net.minecraft.server.players.NameAndId; - new(serverThread: java.lang.Thread, storageSource: net.minecraft.world.level.storage.LevelStorageSource$LevelStorageAccess, packRepository: net.minecraft.server.packs.repository.PackRepository, worldStem: net.minecraft.server.WorldStem, gameRules: java.util.Optional, proxy: java.net.Proxy, fixerUpper: com.mojang.datafixers.DataFixer, services: net.minecraft.server.Services, levelLoadListener: net.minecraft.server.level.progress.LevelLoadListener, propagatesCrashes: boolean): net.minecraft.server.MinecraftServer; + SERVER_THREAD_NAME: string; + new(serverThread: java.lang.Thread, storageSource: net.minecraft.world.level.storage.LevelStorageSource$LevelStorageAccess, packRepository: net.minecraft.server.packs.repository.PackRepository, worldStem: net.minecraft.server.WorldStem, gameRules: java.util.Optional, proxy: java.net.Proxy, fixerUpper: com.mojang.datafixers.DataFixer, services: net.minecraft.server.Services, levelLoadListener: net.minecraft.server.level.progress.LevelLoadListener, propagatesCrashes: boolean, notificationManager: net.minecraft.server.notifications.NotificationManager): net.minecraft.server.MinecraftServer; spin(factory: unknown): S; configurePackRepository(packRepository: net.minecraft.server.packs.repository.PackRepository, initialDataConfig: net.minecraft.world.level.WorldDataConfiguration, initMode: boolean, safeMode: boolean): net.minecraft.world.level.WorldDataConfiguration; } @@ -36270,6 +36603,8 @@ declare global { isResourcePackRequired(): boolean; isDedicatedServer(): boolean; getRateLimitPacketsPerSecond(): number; + getCommandSpamThresholdSeconds(): number; + getChatSpamThresholdSeconds(): number; usesAuthentication(): boolean; setUsesAuthentication(onlineMode: boolean): void; getPreventProxyConnections(): boolean; @@ -36284,7 +36619,8 @@ declare global { setDefaultGameType(gameType: net.minecraft.world.level.GameType): void; enforceGameTypeForPlayers(gameType: net.minecraft.world.level.GameType | null | undefined): number; getConnection(): net.minecraft.server.network.ServerConnectionListener; - publishServer(gameMode: net.minecraft.world.level.GameType | null | undefined, allowCommands: boolean, port: number): boolean; + publishServer(scope: net.minecraft.server.MinecraftServer$MultiplayerScope, gameMode: net.minecraft.world.level.GameType | null | undefined, allowCommands: boolean, port: number): boolean; + unpublishServer(): boolean; getTickCount(): number; isUnderSpawnProtection(level: net.minecraft.server.level.ServerLevel, pos: net.minecraft.core.BlockPos, player: net.minecraft.world.entity.player.Player): boolean; repliesToStatus(): boolean; @@ -36394,89 +36730,15 @@ declare global { nameToIdCache(): net.minecraft.server.players.UserNameToIdResolver; profileResolver(): net.minecraft.server.players.ProfileResolver; } - const ServerTickRateManager: { - new(server: net.minecraft.server.MinecraftServer): net.minecraft.server.ServerTickRateManager; - } - interface ServerTickRateManager extends net.minecraft.world.TickRateManager { - isSprinting(): boolean; - stepGameIfPaused(ticks: number): boolean; - stopStepping(): boolean; - stopSprinting(): boolean; - requestGameToSprint(time: number): boolean; - checkShouldSprintThisTick(): boolean; - endTickWork(): void; - updateJoiningPlayer(player: net.minecraft.server.level.ServerPlayer): void; - } - const TickTask: { - new(tick: number, runnable: java.lang.Runnable): net.minecraft.server.TickTask; - } - interface TickTask extends java.lang.Runnable { - getTick(): number; - } - const ServerScoreboard: { - new(server: net.minecraft.server.MinecraftServer): net.minecraft.server.ServerScoreboard; - } - interface ServerScoreboard extends net.minecraft.world.scores.Scoreboard { - load(data: net.minecraft.world.scores.ScoreboardSaveData$Packed): void; - storeToSaveDataIfDirty(saveData: net.minecraft.world.scores.ScoreboardSaveData): void; - getStartTrackingPackets(objective: net.minecraft.world.scores.Objective): Array>; - startTrackingObjective(objective: net.minecraft.world.scores.Objective): void; - getStopTrackingPackets(objective: net.minecraft.world.scores.Objective): Array>; - stopTrackingObjective(objective: net.minecraft.world.scores.Objective): void; - getObjectiveDisplaySlotCount(objective: net.minecraft.world.scores.Objective): number; - } - const PlayerAdvancements: { - new(dataFixer: com.mojang.datafixers.DataFixer, playerList: net.minecraft.server.players.PlayerList, manager: net.minecraft.server.ServerAdvancementManager, playerSavePath: java.nio.file.Path, player: net.minecraft.server.level.ServerPlayer): net.minecraft.server.PlayerAdvancements; - } - interface PlayerAdvancements { - setPlayer(player: net.minecraft.server.level.ServerPlayer): void; - stopListening(): void; - reload(manager: net.minecraft.server.ServerAdvancementManager): void; - save(): void; - award(holder: net.minecraft.advancements.AdvancementHolder, criterion: string): boolean; - revoke(advancement: net.minecraft.advancements.AdvancementHolder, criterion: string): boolean; - flushDirty(player: net.minecraft.server.level.ServerPlayer, showAdvancements: boolean): void; - setSelectedTab(holder: net.minecraft.advancements.AdvancementHolder | null | undefined): void; - getOrStartProgress(advancement: net.minecraft.advancements.AdvancementHolder): net.minecraft.advancements.AdvancementProgress; - } - const ServerAdvancementManager: { - new(registries: net.minecraft.core.HolderLookup$Provider): net.minecraft.server.ServerAdvancementManager; - } - interface ServerAdvancementManager extends net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener { - tree(): net.minecraft.advancements.AdvancementTree; - get(id: net.minecraft.resources.Identifier): net.minecraft.advancements.AdvancementHolder | null | undefined; - getAllAdvancements(): Array; - } - const ServerFunctionManager: { - new(server: net.minecraft.server.MinecraftServer, library: net.minecraft.server.ServerFunctionLibrary): net.minecraft.server.ServerFunctionManager; - } - interface ServerFunctionManager { - getDispatcher(): com.mojang.brigadier.CommandDispatcher; - tick(): void; - execute(functionIn: net.minecraft.commands.functions.CommandFunction, sender: net.minecraft.commands.CommandSourceStack): void; - replaceLibrary(library: net.minecraft.server.ServerFunctionLibrary): void; - getGameLoopSender(): net.minecraft.commands.CommandSourceStack; - get(id: net.minecraft.resources.Identifier): java.util.Optional>; - getTag(id: net.minecraft.resources.Identifier): Array>; - getFunctionNames(): kotlin.collections.MutableIterable; - getTagNames(): kotlin.collections.MutableIterable; - } - const ServerFunctionLibrary: { - TYPE_KEY: net.minecraft.resources.ResourceKey>>; - new(functionCompilationPermissions: net.minecraft.server.permissions.PermissionSet, dispatcher: com.mojang.brigadier.CommandDispatcher): net.minecraft.server.ServerFunctionLibrary; - } - interface ServerFunctionLibrary extends net.minecraft.server.packs.resources.PreparableReloadListener { - getFunction(id: net.minecraft.resources.Identifier): java.util.Optional>; - getFunctions(): Map>; - getTag(tag: net.minecraft.resources.Identifier): Array>; - getAvailableTags(): kotlin.collections.MutableIterable; - } - const ReloadableServerRegistries$Holder: { - new(registries: net.minecraft.core.HolderLookup$Provider): net.minecraft.server.ReloadableServerRegistries$Holder; - } - interface ReloadableServerRegistries$Holder { - lookup(): net.minecraft.core.HolderLookup$Provider; - getLootTable(id: net.minecraft.resources.ResourceKey): net.minecraft.world.level.storage.loot.LootTable; + interface ServerInterface extends net.minecraft.server.ServerInfo { + getProperties(): net.minecraft.server.dedicated.DedicatedServerProperties; + getServerIp(): string; + getServerPort(): number; + getServerName(): string; + getPlayerNames(): Array; + getLevelIdName(): string; + getPluginNames(): string; + runCommand(command: string): string; } const ServerLinks: { KnownLinkType: typeof net.minecraft.server.ServerLinks$KnownLinkType; @@ -36530,6 +36792,49 @@ declare global { type(): com.mojang.datafixers.util.Either; link(): string; } + const ServerScoreboard: { + new(server: net.minecraft.server.MinecraftServer): net.minecraft.server.ServerScoreboard; + } + interface ServerScoreboard extends net.minecraft.world.scores.Scoreboard { + load(data: net.minecraft.world.scores.ScoreboardSaveData$Packed): void; + storeToSaveDataIfDirty(saveData: net.minecraft.world.scores.ScoreboardSaveData): void; + getStartTrackingPackets(objective: net.minecraft.world.scores.Objective): Array>; + startTrackingObjective(objective: net.minecraft.world.scores.Objective): void; + getStopTrackingPackets(objective: net.minecraft.world.scores.Objective): Array>; + stopTrackingObjective(objective: net.minecraft.world.scores.Objective): void; + getObjectiveDisplaySlotCount(objective: net.minecraft.world.scores.Objective): number; + } + const PlayerAdvancements: { + TriggerInstanceKey: typeof net.minecraft.server.PlayerAdvancements$TriggerInstanceKey; + new(dataFixer: com.mojang.datafixers.DataFixer, playerList: net.minecraft.server.players.PlayerList, manager: net.minecraft.server.ServerAdvancementManager, playerSavePath: java.nio.file.Path, player: net.minecraft.server.level.ServerPlayer): net.minecraft.server.PlayerAdvancements; + } + interface PlayerAdvancements { + setPlayer(player: net.minecraft.server.level.ServerPlayer): void; + clearTriggers(): void; + reload(manager: net.minecraft.server.ServerAdvancementManager): void; + save(): void; + award(holder: net.minecraft.advancements.AdvancementHolder, criterion: string): boolean; + revoke(advancement: net.minecraft.advancements.AdvancementHolder, criterion: string): boolean; + flushDirty(player: net.minecraft.server.level.ServerPlayer, showAdvancements: boolean): void; + setSelectedTab(holder: net.minecraft.advancements.AdvancementHolder | null | undefined): void; + getOrStartProgress(advancement: net.minecraft.advancements.AdvancementHolder): net.minecraft.advancements.AdvancementProgress; + getTriggerMapForType(type: net.minecraft.advancements.triggers.CriterionTrigger): Map | null | undefined; + } + const ServerAdvancementManager: { + new(registries: net.minecraft.core.HolderLookup$Provider): net.minecraft.server.ServerAdvancementManager; + } + interface ServerAdvancementManager extends net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener { + tree(): net.minecraft.advancements.AdvancementTree; + get(id: net.minecraft.resources.Identifier): net.minecraft.advancements.AdvancementHolder | null | undefined; + getAllAdvancements(): Array; + } + const PlayerAdvancements$TriggerInstanceKey: { + new(advancement: net.minecraft.advancements.AdvancementHolder, criterion: string): net.minecraft.server.PlayerAdvancements$TriggerInstanceKey; + } + interface PlayerAdvancements$TriggerInstanceKey extends java.lang.Record { + advancement(): net.minecraft.advancements.AdvancementHolder; + criterion(): string; + } const WorldStem: { new(resourceManager: net.minecraft.server.packs.resources.CloseableResourceManager, dataPackResources: net.minecraft.server.ReloadableServerResources, registries: net.minecraft.core.LayeredRegistryAccess, worldDataAndGenSettings: net.minecraft.world.level.storage.LevelDataAndDimensions$WorldDataAndGenSettings): net.minecraft.server.WorldStem; } @@ -36551,6 +36856,67 @@ declare global { listeners(): Array; updateComponentsAndStaticRegistryTags(): void; } + const ServerFunctionLibrary: { + TYPE_KEY: net.minecraft.resources.ResourceKey>>; + new(functionCompilationPermissions: net.minecraft.server.permissions.PermissionSet, dispatcher: com.mojang.brigadier.CommandDispatcher): net.minecraft.server.ServerFunctionLibrary; + } + interface ServerFunctionLibrary extends net.minecraft.server.packs.resources.PreparableReloadListener { + getFunction(id: net.minecraft.resources.Identifier): java.util.Optional>; + getFunctions(): Map>; + getTag(tag: net.minecraft.resources.Identifier): Array>; + getAvailableTags(): kotlin.collections.MutableIterable; + } + const ReloadableServerRegistries$Holder: { + new(registries: net.minecraft.core.HolderLookup$Provider): net.minecraft.server.ReloadableServerRegistries$Holder; + } + interface ReloadableServerRegistries$Holder { + lookup(): net.minecraft.core.HolderLookup$Provider; + getLootTable(id: net.minecraft.resources.ResourceKey): net.minecraft.world.level.storage.loot.LootTable; + } + const ServerTickRateManager: { + new(server: net.minecraft.server.MinecraftServer): net.minecraft.server.ServerTickRateManager; + } + interface ServerTickRateManager extends net.minecraft.world.TickRateManager { + isSprinting(): boolean; + stepGameIfPaused(ticks: number): boolean; + stopStepping(): boolean; + stopSprinting(): boolean; + requestGameToSprint(time: number): boolean; + checkShouldSprintThisTick(): boolean; + endTickWork(): void; + updateJoiningPlayer(player: net.minecraft.server.level.ServerPlayer): void; + } + const TickTask: { + new(tick: number, runnable: java.lang.Runnable): net.minecraft.server.TickTask; + } + interface TickTask extends java.lang.Runnable { + getTick(): number; + } + const MinecraftServer$MultiplayerScope: { + OFF: net.minecraft.server.MinecraftServer$MultiplayerScope; + LAN: net.minecraft.server.MinecraftServer$MultiplayerScope; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): net.minecraft.server.MinecraftServer$MultiplayerScope; + } + interface MinecraftServer$MultiplayerScope extends kotlin.Enum { + getDisplayName(): net.minecraft.network.chat.Component; + getTooltip(): net.minecraft.network.chat.Component; + } + const ServerFunctionManager: { + new(server: net.minecraft.server.MinecraftServer, library: net.minecraft.server.ServerFunctionLibrary): net.minecraft.server.ServerFunctionManager; + } + interface ServerFunctionManager { + getDispatcher(): com.mojang.brigadier.CommandDispatcher; + tick(): void; + execute(functionIn: net.minecraft.commands.functions.CommandFunction, sender: net.minecraft.commands.CommandSourceStack): void; + replaceLibrary(library: net.minecraft.server.ServerFunctionLibrary): void; + getGameLoopSender(): net.minecraft.commands.CommandSourceStack; + get(id: net.minecraft.resources.Identifier): java.util.Optional>; + getTag(id: net.minecraft.resources.Identifier): Array>; + getFunctionNames(): kotlin.collections.MutableIterable; + getTagNames(): kotlin.collections.MutableIterable; + } const MinecraftServer$ServerResourcePackInfo: { new(id: java.util.UUID, url: string, hash: string, isRequired: boolean, prompt: net.minecraft.network.chat.Component | null | undefined): net.minecraft.server.MinecraftServer$ServerResourcePackInfo; } @@ -37048,7 +37414,7 @@ declare global { INFINITE: number; ORDER_ARBITRARY: unknown; COMPILABLE_CODEC: com.mojang.serialization.Codec>; - new(maxResults: number, includesEntities: boolean, worldLimited: boolean, contextFreePredicates: Array, range: net.minecraft.advancements.criterion.MinMaxBounds$Doubles | null | undefined, position: unknown, aabb: net.minecraft.world.phys.AABB | null | undefined, order: unknown, currentEntity: boolean, playerName: string | null | undefined, entityUUID: java.util.UUID | null | undefined, type: net.minecraft.world.entity.EntityType | null | undefined, usesSelector: boolean): net.minecraft.commands.arguments.selector.EntitySelector; + new(maxResults: number, includesEntities: boolean, worldLimited: boolean, contextFreePredicates: Array, range: net.minecraft.advancements.predicates.MinMaxBounds$Doubles | null | undefined, position: unknown, aabb: net.minecraft.world.phys.AABB | null | undefined, order: unknown, currentEntity: boolean, playerName: string | null | undefined, entityUUID: java.util.UUID | null | undefined, type: net.minecraft.world.entity.EntityType | null | undefined, usesSelector: boolean): net.minecraft.commands.arguments.selector.EntitySelector; joinNames(entities: Array): net.minecraft.network.chat.Component; } interface EntitySelector { @@ -37111,9 +37477,9 @@ declare global { } const RangeArgument$Floats: { new(): net.minecraft.commands.arguments.RangeArgument$Floats; - getRange(context: com.mojang.brigadier.context.CommandContext, name: string): net.minecraft.advancements.criterion.MinMaxBounds$Doubles; + getRange(context: com.mojang.brigadier.context.CommandContext, name: string): net.minecraft.advancements.predicates.MinMaxBounds$Doubles; } - interface RangeArgument$Floats extends net.minecraft.commands.arguments.RangeArgument { + interface RangeArgument$Floats extends net.minecraft.commands.arguments.RangeArgument { } const RangeArgument: { Ints: typeof net.minecraft.commands.arguments.RangeArgument$Ints; @@ -37125,9 +37491,9 @@ declare global { } const RangeArgument$Ints: { new(): net.minecraft.commands.arguments.RangeArgument$Ints; - getRange(context: com.mojang.brigadier.context.CommandContext, name: string): net.minecraft.advancements.criterion.MinMaxBounds$Ints; + getRange(context: com.mojang.brigadier.context.CommandContext, name: string): net.minecraft.advancements.predicates.MinMaxBounds$Ints; } - interface RangeArgument$Ints extends net.minecraft.commands.arguments.RangeArgument { + interface RangeArgument$Ints extends net.minecraft.commands.arguments.RangeArgument { } const GameModeArgument: { new(): net.minecraft.commands.arguments.GameModeArgument; @@ -37538,81 +37904,97 @@ declare global { } } namespace advancements { - namespace criterion { + namespace triggers { + const Criterion: { + CODEC: com.mojang.serialization.Codec>; + new(trigger: net.minecraft.advancements.triggers.CriterionTrigger, triggerInstance: T): net.minecraft.advancements.triggers.Criterion; + } + interface Criterion extends java.lang.Record { + trigger(): net.minecraft.advancements.triggers.CriterionTrigger; + triggerInstance(): T; + } + interface CriterionTrigger { + codec(): com.mojang.serialization.Codec; + createCriterion(instance: T): net.minecraft.advancements.triggers.Criterion; + } + } + namespace predicates { const MinMaxBounds$Ints: { - ANY: net.minecraft.advancements.criterion.MinMaxBounds$Ints; - CODEC: com.mojang.serialization.Codec; - STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(bounds: net.minecraft.advancements.criterion.MinMaxBounds$Bounds, boundsSqr: net.minecraft.advancements.criterion.MinMaxBounds$Bounds): net.minecraft.advancements.criterion.MinMaxBounds$Ints; - exactly(value: number): net.minecraft.advancements.criterion.MinMaxBounds$Ints; - between(min: number, max: number): net.minecraft.advancements.criterion.MinMaxBounds$Ints; - atLeast(value: number): net.minecraft.advancements.criterion.MinMaxBounds$Ints; - atMost(value: number): net.minecraft.advancements.criterion.MinMaxBounds$Ints; - fromReader(reader: com.mojang.brigadier.StringReader): net.minecraft.advancements.criterion.MinMaxBounds$Ints; - } - interface MinMaxBounds$Ints extends java.lang.Record, net.minecraft.advancements.criterion.MinMaxBounds { + ANY: net.minecraft.advancements.predicates.MinMaxBounds$Ints; + CODEC: com.mojang.serialization.Codec; + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + new(bounds: net.minecraft.advancements.predicates.MinMaxBounds$Bounds, boundsSqr: net.minecraft.advancements.predicates.MinMaxBounds$Bounds): net.minecraft.advancements.predicates.MinMaxBounds$Ints; + exactly(value: number): net.minecraft.advancements.predicates.MinMaxBounds$Ints; + between(min: number, max: number): net.minecraft.advancements.predicates.MinMaxBounds$Ints; + atLeast(value: number): net.minecraft.advancements.predicates.MinMaxBounds$Ints; + atMost(value: number): net.minecraft.advancements.predicates.MinMaxBounds$Ints; + fromReader(reader: com.mojang.brigadier.StringReader): net.minecraft.advancements.predicates.MinMaxBounds$Ints; + } + interface MinMaxBounds$Ints extends java.lang.Record, net.minecraft.advancements.predicates.MinMaxBounds { matches(value: number): boolean; matchesSqr(valueSqr: number): boolean; - boundsSqr(): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; + boundsSqr(): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; } const MinMaxBounds: { - Bounds: typeof net.minecraft.advancements.criterion.MinMaxBounds$Bounds; - FloatDegrees: typeof net.minecraft.advancements.criterion.MinMaxBounds$FloatDegrees; - Doubles: typeof net.minecraft.advancements.criterion.MinMaxBounds$Doubles; - Ints: typeof net.minecraft.advancements.criterion.MinMaxBounds$Ints; + Bounds: typeof net.minecraft.advancements.predicates.MinMaxBounds$Bounds; + FloatDegrees: typeof net.minecraft.advancements.predicates.MinMaxBounds$FloatDegrees; + Doubles: typeof net.minecraft.advancements.predicates.MinMaxBounds$Doubles; + Ints: typeof net.minecraft.advancements.predicates.MinMaxBounds$Ints; ERROR_EMPTY: com.mojang.brigadier.exceptions.SimpleCommandExceptionType; ERROR_SWAPPED: com.mojang.brigadier.exceptions.SimpleCommandExceptionType; - validateContainedInRange(allowed: net.minecraft.advancements.criterion.MinMaxBounds): unknown; + validateContainedInRange(allowed: net.minecraft.advancements.predicates.MinMaxBounds): unknown; } interface MinMaxBounds { - bounds(): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; + bounds(): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; min(): java.util.Optional; max(): java.util.Optional; isAny(): boolean; } const MinMaxBounds$Bounds: { - new(min: java.util.Optional, max: java.util.Optional): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; - any(): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; - exactly(value: T): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; - between(min: T, max: T): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; - atLeast(value: T): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; - atMost(value: T): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; - fromReader(reader: com.mojang.brigadier.StringReader, converter: unknown, parseExc: unknown): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; + new(min: java.util.Optional, max: java.util.Optional): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; + any(): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; + exactly(value: T): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; + between(min: T, max: T): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; + atLeast(value: T): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; + atMost(value: T): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; + createCodec(numberCodec: com.mojang.serialization.Codec): com.mojang.serialization.Codec>; + createStreamCodec(numberCodec: net.minecraft.network.codec.StreamCodec): net.minecraft.network.codec.StreamCodec>; + fromReader(reader: com.mojang.brigadier.StringReader, converter: unknown, parseExc: unknown): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; } interface MinMaxBounds$Bounds extends java.lang.Record { isAny(): boolean; - validateSwappedBoundsInCodec(): com.mojang.serialization.DataResult>; + validateSwappedBoundsInCodec(): com.mojang.serialization.DataResult>; areSwapped(): boolean; asRange(): com.google.common.collect.Range; asPoint(): java.util.Optional; - map(mapper: unknown): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; + map(mapper: unknown): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; min(): java.util.Optional; max(): java.util.Optional; } const MinMaxBounds$FloatDegrees: { - ANY: net.minecraft.advancements.criterion.MinMaxBounds$FloatDegrees; - CODEC: com.mojang.serialization.Codec; - STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(bounds: net.minecraft.advancements.criterion.MinMaxBounds$Bounds): net.minecraft.advancements.criterion.MinMaxBounds$FloatDegrees; - fromReader(reader: com.mojang.brigadier.StringReader): net.minecraft.advancements.criterion.MinMaxBounds$FloatDegrees; + ANY: net.minecraft.advancements.predicates.MinMaxBounds$FloatDegrees; + CODEC: com.mojang.serialization.Codec; + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + new(bounds: net.minecraft.advancements.predicates.MinMaxBounds$Bounds): net.minecraft.advancements.predicates.MinMaxBounds$FloatDegrees; + fromReader(reader: com.mojang.brigadier.StringReader): net.minecraft.advancements.predicates.MinMaxBounds$FloatDegrees; } - interface MinMaxBounds$FloatDegrees extends java.lang.Record, net.minecraft.advancements.criterion.MinMaxBounds { + interface MinMaxBounds$FloatDegrees extends java.lang.Record, net.minecraft.advancements.predicates.MinMaxBounds { } const MinMaxBounds$Doubles: { - ANY: net.minecraft.advancements.criterion.MinMaxBounds$Doubles; - CODEC: com.mojang.serialization.Codec; - STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(bounds: net.minecraft.advancements.criterion.MinMaxBounds$Bounds, boundsSqr: net.minecraft.advancements.criterion.MinMaxBounds$Bounds): net.minecraft.advancements.criterion.MinMaxBounds$Doubles; - exactly(value: number): net.minecraft.advancements.criterion.MinMaxBounds$Doubles; - between(min: number, max: number): net.minecraft.advancements.criterion.MinMaxBounds$Doubles; - atLeast(value: number): net.minecraft.advancements.criterion.MinMaxBounds$Doubles; - atMost(value: number): net.minecraft.advancements.criterion.MinMaxBounds$Doubles; - fromReader(reader: com.mojang.brigadier.StringReader): net.minecraft.advancements.criterion.MinMaxBounds$Doubles; - } - interface MinMaxBounds$Doubles extends java.lang.Record, net.minecraft.advancements.criterion.MinMaxBounds { + ANY: net.minecraft.advancements.predicates.MinMaxBounds$Doubles; + CODEC: com.mojang.serialization.Codec; + STREAM_CODEC: net.minecraft.network.codec.StreamCodec; + new(bounds: net.minecraft.advancements.predicates.MinMaxBounds$Bounds, boundsSqr: net.minecraft.advancements.predicates.MinMaxBounds$Bounds): net.minecraft.advancements.predicates.MinMaxBounds$Doubles; + exactly(value: number): net.minecraft.advancements.predicates.MinMaxBounds$Doubles; + between(min: number, max: number): net.minecraft.advancements.predicates.MinMaxBounds$Doubles; + atLeast(value: number): net.minecraft.advancements.predicates.MinMaxBounds$Doubles; + atMost(value: number): net.minecraft.advancements.predicates.MinMaxBounds$Doubles; + fromReader(reader: com.mojang.brigadier.StringReader): net.minecraft.advancements.predicates.MinMaxBounds$Doubles; + } + interface MinMaxBounds$Doubles extends java.lang.Record, net.minecraft.advancements.predicates.MinMaxBounds { matches(value: number): boolean; matchesSqr(valueSqr: number): boolean; - boundsSqr(): net.minecraft.advancements.criterion.MinMaxBounds$Bounds; + boundsSqr(): net.minecraft.advancements.predicates.MinMaxBounds$Bounds; } } const AdvancementTree: { @@ -37653,8 +38035,8 @@ declare global { Builder: typeof net.minecraft.advancements.Advancement$Builder; CODEC: com.mojang.serialization.Codec; STREAM_CODEC: net.minecraft.network.codec.StreamCodec; - new(parent: java.util.Optional, display: java.util.Optional, rewards: net.minecraft.advancements.AdvancementRewards, criteria: Map>, requirements: net.minecraft.advancements.AdvancementRequirements, sendsTelemetryEvent: boolean): net.minecraft.advancements.Advancement; - new(parent: java.util.Optional, display: java.util.Optional, rewards: net.minecraft.advancements.AdvancementRewards, criteria: Map>, requirements: net.minecraft.advancements.AdvancementRequirements, sendsTelemetryEvent: boolean, name: java.util.Optional): net.minecraft.advancements.Advancement; + new(parent: java.util.Optional, display: java.util.Optional, rewards: net.minecraft.advancements.AdvancementRewards, criteria: Map>, requirements: net.minecraft.advancements.AdvancementRequirements, sendsTelemetryEvent: boolean): net.minecraft.advancements.Advancement; + new(parent: java.util.Optional, display: java.util.Optional, rewards: net.minecraft.advancements.AdvancementRewards, criteria: Map>, requirements: net.minecraft.advancements.AdvancementRequirements, sendsTelemetryEvent: boolean, name: java.util.Optional): net.minecraft.advancements.Advancement; name(holder: net.minecraft.advancements.AdvancementHolder): net.minecraft.network.chat.Component; } interface Advancement extends java.lang.Record { @@ -37664,7 +38046,7 @@ declare global { parent(): java.util.Optional; display(): java.util.Optional; rewards(): net.minecraft.advancements.AdvancementRewards; - criteria(): Map>; + criteria(): Map>; requirements(): net.minecraft.advancements.AdvancementRequirements; sendsTelemetryEvent(): boolean; } @@ -37734,7 +38116,7 @@ declare global { requirements(strategy: net.minecraft.advancements.AdvancementRequirements$Strategy): net.minecraft.advancements.Advancement$Builder; requirements(requirements: net.minecraft.advancements.AdvancementRequirements): net.minecraft.advancements.Advancement$Builder; sendsTelemetryEvent(): net.minecraft.advancements.Advancement$Builder; - addCriterion(name: string, criterion: net.minecraft.advancements.Criterion): net.minecraft.advancements.Advancement$Builder; + addCriterion(name: string, criterion: net.minecraft.advancements.triggers.Criterion): net.minecraft.advancements.Advancement$Builder; build(id: net.minecraft.resources.Identifier): net.minecraft.advancements.AdvancementHolder; save(output: unknown, name: string): net.minecraft.advancements.AdvancementHolder; } @@ -37770,33 +38152,6 @@ declare global { shouldAnnounceChat(): boolean; isHidden(): boolean; } - const Criterion: { - CODEC: com.mojang.serialization.Codec>; - new(trigger: net.minecraft.advancements.CriterionTrigger, triggerInstance: T): net.minecraft.advancements.Criterion; - } - interface Criterion extends java.lang.Record { - trigger(): net.minecraft.advancements.CriterionTrigger; - triggerInstance(): T; - } - const CriterionTrigger: { - Listener: typeof net.minecraft.advancements.CriterionTrigger$Listener; - } - interface CriterionTrigger { - addPlayerListener(player: net.minecraft.server.PlayerAdvancements, listener: net.minecraft.advancements.CriterionTrigger$Listener): void; - removePlayerListener(player: net.minecraft.server.PlayerAdvancements, listener: net.minecraft.advancements.CriterionTrigger$Listener): void; - removePlayerListeners(player: net.minecraft.server.PlayerAdvancements): void; - codec(): com.mojang.serialization.Codec; - createCriterion(instance: T): net.minecraft.advancements.Criterion; - } - const CriterionTrigger$Listener: { - new(trigger: T, advancement: net.minecraft.advancements.AdvancementHolder, criterion: string): net.minecraft.advancements.CriterionTrigger$Listener; - } - interface CriterionTrigger$Listener extends java.lang.Record { - run(player: net.minecraft.server.PlayerAdvancements): void; - trigger(): T; - advancement(): net.minecraft.advancements.AdvancementHolder; - criterion(): string; - } interface AdvancementTree$Listener { onAddAdvancementRoot(root: net.minecraft.advancements.AdvancementNode): void; onRemoveAdvancementRoot(root: net.minecraft.advancements.AdvancementNode): void; @@ -37863,25 +38218,14 @@ declare global { UNDERLINE: net.minecraft.ChatFormatting; ITALIC: net.minecraft.ChatFormatting; RESET: net.minecraft.ChatFormatting; - CODEC: com.mojang.serialization.Codec; - COLOR_CODEC: com.mojang.serialization.Codec; PREFIX_CODE: number; entries: kotlin.enums.EnumEntries; stripFormatting(input: string | null | undefined): string | null | undefined; - getByName(name: string | null | undefined): net.minecraft.ChatFormatting | null | undefined; - getById(id: number): net.minecraft.ChatFormatting | null | undefined; getByCode(code: number): net.minecraft.ChatFormatting | null | undefined; - getNames(getColors: boolean, getFormats: boolean): Array; values(): Array; valueOf(value: string): net.minecraft.ChatFormatting; } - interface ChatFormatting extends kotlin.Enum, net.minecraft.util.StringRepresentable { - isFormat(): boolean; - getChar(): number; - getId(): number; - isColor(): boolean; - getColor(): number | null | undefined; - getName(): string; + interface ChatFormatting extends kotlin.Enum { } const CrashReport: { new(title: string, t: kotlin.Throwable): net.minecraft.CrashReport; @@ -37924,13 +38268,15 @@ declare global { } interface SystemReport { setDetail(key: string, value: string): void; - setDetail(key: string, valueSupplier: unknown): void; + setDetail(key: string, valueSupplier: net.minecraft.CrashReportDetail): void; appendToCrashReportString(sb: java.lang.StringBuilder): void; toLineSeparatedString(): string; } + interface CrashReportDetail extends java.util.concurrent.Callable { + } const CrashReportCategory: { + Entry: typeof net.minecraft.CrashReportCategory$Entry; new(title: string): net.minecraft.CrashReportCategory; - formatLocation(x: number, y: number, z: number): string; formatLocation(levelHeightAccessor: net.minecraft.world.level.LevelHeightAccessor, x: number, y: number, z: number): string; formatLocation(levelHeightAccessor: net.minecraft.world.level.LevelHeightAccessor, pos: net.minecraft.core.BlockPos): string; formatLocation(levelHeightAccessor: net.minecraft.world.level.LevelHeightAccessor, x: number, y: number, z: number): string; @@ -37939,22 +38285,27 @@ declare global { } interface CrashReportCategory { setDetail(key: string, callback: net.minecraft.CrashReportDetail): net.minecraft.CrashReportCategory; - setDetail(key: string, value: any): net.minecraft.CrashReportCategory; + setDetail(key: string, value: any | null | undefined): net.minecraft.CrashReportCategory; setDetailError(key: string, t: kotlin.Throwable): void; fillInStackTrace(nestedOffset: number): number; - validateStackTrace(source: java.lang.StackTraceElement, next: java.lang.StackTraceElement): boolean; - trimStacktrace(length: number): void; + validateStackTrace(source: java.lang.StackTraceElement | null | undefined, next: java.lang.StackTraceElement | null | undefined): boolean; getDetails(builder: java.lang.StringBuilder): void; getStacktrace(): Array; } - interface CrashReportDetail extends java.util.concurrent.Callable { - } const ReportedException: { new(report: net.minecraft.CrashReport): net.minecraft.ReportedException; } interface ReportedException extends java.lang.RuntimeException { getReport(): net.minecraft.CrashReport; } + const CrashReportCategory$Entry: { + new(key: string, rawValue: any | null | undefined): net.minecraft.CrashReportCategory$Entry; + new(key: string, value: string): net.minecraft.CrashReportCategory$Entry; + } + interface CrashReportCategory$Entry extends java.lang.Record { + key(): string; + value(): string; + } const TracingExecutor: { new(service: java.util.concurrent.ExecutorService): net.minecraft.TracingExecutor; } @@ -38299,23 +38650,29 @@ declare global { } } } - namespace registry { - const FabricPotionBrewingBuilder: { - BUILD: net.fabricmc.fabric.api.event.Event; - } - interface FabricPotionBrewingBuilder { - registerItemRecipe(p0: net.minecraft.world.item.Item, p1: net.minecraft.world.item.crafting.Ingredient, p2: net.minecraft.world.item.Item): void; - registerPotionRecipe(p0: net.minecraft.core.Holder, p1: net.minecraft.world.item.crafting.Ingredient, p2: net.minecraft.core.Holder): void; - registerRecipes(p0: net.minecraft.world.item.crafting.Ingredient, p1: net.minecraft.core.Holder): void; - getEnabledFeatures(): net.minecraft.world.flag.FeatureFlagSet; - } - interface FabricPotionBrewingBuilder$BuildCallback { - build(p0: net.minecraft.world.item.alchemy.PotionBrewing$Builder): void; - (p0: net.minecraft.world.item.alchemy.PotionBrewing$Builder): void; + namespace datagen { + namespace v1 { + namespace advancement { + interface FabricAdvancementBuilder { + save(p0: unknown, p1: net.minecraft.resources.Identifier): net.minecraft.advancements.AdvancementHolder; + } + } } } namespace recipe { namespace v1 { + namespace sync { + interface SynchronizedRecipes { + getAllMatches(p0: net.minecraft.world.item.crafting.RecipeType, p1: I, p2: net.minecraft.world.level.Level): java.util.stream.Stream>; + getAllOfType(p0: net.minecraft.world.item.crafting.RecipeType): Array>; + getFirstMatch(p0: net.minecraft.world.item.crafting.RecipeType, p1: I, p2: net.minecraft.world.level.Level, p3: net.minecraft.resources.ResourceKey> | null | undefined): java.util.Optional>; + getFirstMatch(p0: net.minecraft.world.item.crafting.RecipeType, p1: I, p2: net.minecraft.world.level.Level, p3: net.minecraft.world.item.crafting.RecipeHolder | null | undefined): java.util.Optional>; + getFirstMatch(p0: net.minecraft.world.item.crafting.RecipeType, p1: I, p2: net.minecraft.world.level.Level): java.util.Optional>; + get(p0: net.minecraft.resources.ResourceKey>): net.minecraft.world.item.crafting.RecipeHolder | null | undefined; + get(p0: net.minecraft.world.item.crafting.RecipeType, p1: net.minecraft.resources.ResourceKey>): net.minecraft.world.item.crafting.RecipeHolder | null | undefined; + recipes(): Array>; + } + } namespace ingredient { interface FabricIngredient { getCustomIngredient(): net.fabricmc.fabric.api.recipe.v1.ingredient.CustomIngredient | null | undefined; @@ -38339,18 +38696,6 @@ declare global { getStreamCodec(): net.minecraft.network.codec.StreamCodec; } } - namespace sync { - interface SynchronizedRecipes { - getAllMatches(p0: net.minecraft.world.item.crafting.RecipeType, p1: I, p2: net.minecraft.world.level.Level): java.util.stream.Stream>; - getAllOfType(p0: net.minecraft.world.item.crafting.RecipeType): Array>; - getFirstMatch(p0: net.minecraft.world.item.crafting.RecipeType, p1: I, p2: net.minecraft.world.level.Level, p3: net.minecraft.resources.ResourceKey> | null | undefined): java.util.Optional>; - getFirstMatch(p0: net.minecraft.world.item.crafting.RecipeType, p1: I, p2: net.minecraft.world.level.Level, p3: net.minecraft.world.item.crafting.RecipeHolder | null | undefined): java.util.Optional>; - getFirstMatch(p0: net.minecraft.world.item.crafting.RecipeType, p1: I, p2: net.minecraft.world.level.Level): java.util.Optional>; - get(p0: net.minecraft.resources.ResourceKey>): net.minecraft.world.item.crafting.RecipeHolder | null | undefined; - get(p0: net.minecraft.world.item.crafting.RecipeType, p1: net.minecraft.resources.ResourceKey>): net.minecraft.world.item.crafting.RecipeHolder | null | undefined; - recipes(): Array>; - } - } interface FabricRecipeAccess { getSynchronizedRecipes(): net.fabricmc.fabric.api.recipe.v1.sync.SynchronizedRecipes; } @@ -38360,13 +38705,19 @@ declare global { } } } - namespace datagen { - namespace v1 { - namespace advancement { - interface FabricAdvancementBuilder { - save(p0: unknown, p1: net.minecraft.resources.Identifier): net.minecraft.advancements.AdvancementHolder; - } - } + namespace registry { + const FabricPotionBrewingBuilder: { + BUILD: net.fabricmc.fabric.api.event.Event; + } + interface FabricPotionBrewingBuilder { + registerItemRecipe(p0: net.minecraft.world.item.Item, p1: net.minecraft.world.item.crafting.Ingredient, p2: net.minecraft.world.item.Item): void; + registerPotionRecipe(p0: net.minecraft.core.Holder, p1: net.minecraft.world.item.crafting.Ingredient, p2: net.minecraft.core.Holder): void; + registerRecipes(p0: net.minecraft.world.item.crafting.Ingredient, p1: net.minecraft.core.Holder): void; + getEnabledFeatures(): net.minecraft.world.flag.FeatureFlagSet; + } + interface FabricPotionBrewingBuilder$BuildCallback { + build(p0: net.minecraft.world.item.alchemy.PotionBrewing$Builder): void; + (p0: net.minecraft.world.item.alchemy.PotionBrewing$Builder): void; } } namespace util { @@ -38431,6 +38782,15 @@ declare global { withUsePipelineDrawModeForGui(p0: boolean): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; withoutUsePipelineDrawModeForGui(): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; } + interface FabricOrderedSubmitNodeCollector { + submitCustom(p0: net.fabricmc.fabric.api.client.rendering.v1.SubmitRenderPhase, p1: T): void; + } + const SubmitRenderPhase: { + new(p0: unknown): net.fabricmc.fabric.api.client.rendering.v1.SubmitRenderPhase; + } + interface SubmitRenderPhase { + submit(p0: net.minecraft.client.renderer.SubmitNodeCollection, p1: T): void; + } interface FabricModel { getChildPart(p0: string): net.minecraft.client.model.geom.ModelPart | null | undefined; copyTransforms(p0: net.minecraft.client.model.Model): void; @@ -38445,47 +38805,12 @@ declare global { } interface FabricOrderedSubmitNodeCollector { submitBlockModel(p0: com.mojang.blaze3d.vertex.PoseStack, p1: unknown, p2: boolean, p3: Array, p4: net.fabricmc.fabric.api.client.renderer.v1.mesh.Mesh | null | undefined, p5: Array, p6: number, p7: number, p8: number): void; + submitBreakingBlockModel(p0: com.mojang.blaze3d.vertex.PoseStack, p1: Array, p2: net.fabricmc.fabric.api.client.renderer.v1.mesh.Mesh, p3: number): void; submitItem(p0: com.mojang.blaze3d.vertex.PoseStack, p1: net.minecraft.world.item.ItemDisplayContext, p2: number, p3: number, p4: number, p5: Array, p6: Array, p7: net.fabricmc.fabric.api.client.renderer.v1.mesh.MeshView, p8: net.minecraft.client.renderer.item.ItemStackRenderState$FoilType): void; } interface FabricBlockModelRenderState { setupMesh(p0: org.joml.Matrix4fc, p1: boolean): net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; } - const FabricSubmitNodeCollection: { - ExtendedItemSubmit: typeof net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection$ExtendedItemSubmit; - ExtendedBlockModelSubmit: typeof net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection$ExtendedBlockModelSubmit; - } - interface FabricSubmitNodeCollection { - getExtendedBlockModelSubmits(): Array; - getExtendedItemSubmits(): Array; - } - const FabricSubmitNodeCollection$ExtendedItemSubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, displayContext: net.minecraft.world.item.ItemDisplayContext, lightCoords: number, overlayCoords: number, outlineColor: number, tintLayers: Array, quads: Array, mesh: net.fabricmc.fabric.api.client.renderer.v1.mesh.MeshView, foilType: net.minecraft.client.renderer.item.ItemStackRenderState$FoilType): net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection$ExtendedItemSubmit; - } - interface FabricSubmitNodeCollection$ExtendedItemSubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - displayContext(): net.minecraft.world.item.ItemDisplayContext; - lightCoords(): number; - overlayCoords(): number; - outlineColor(): number; - tintLayers(): Array; - quads(): Array; - mesh(): net.fabricmc.fabric.api.client.renderer.v1.mesh.MeshView; - foilType(): net.minecraft.client.renderer.item.ItemStackRenderState$FoilType; - } - const FabricSubmitNodeCollection$ExtendedBlockModelSubmit: { - new(pose: com.mojang.blaze3d.vertex.PoseStack$Pose, renderTypeFunction: unknown, translucent: boolean, modelParts: Array, mesh: net.fabricmc.fabric.api.client.renderer.v1.mesh.Mesh | null | undefined, tintLayers: Array, lightCoords: number, overlayCoords: number, outlineColor: number): net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection$ExtendedBlockModelSubmit; - } - interface FabricSubmitNodeCollection$ExtendedBlockModelSubmit extends java.lang.Record { - pose(): com.mojang.blaze3d.vertex.PoseStack$Pose; - renderTypeFunction(): unknown; - translucent(): boolean; - modelParts(): Array; - mesh(): net.fabricmc.fabric.api.client.renderer.v1.mesh.Mesh | null | undefined; - tintLayers(): Array; - lightCoords(): number; - overlayCoords(): number; - outlineColor(): number; - } } namespace mesh { interface QuadEmitter extends net.fabricmc.fabric.api.client.renderer.v1.mesh.MutableQuadView { @@ -38612,6 +38937,12 @@ declare global { } } namespace model { + interface FabricBlockStateModelPart { + emitQuads(p0: net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter, p1: unknown): void; + } + interface FabricBlockStateModelSet { + getParticleMaterial(p0: net.minecraft.world.level.block.state.BlockState, p1: net.minecraft.client.renderer.block.BlockAndTintGetter, p2: net.minecraft.core.BlockPos): net.minecraft.client.resources.model.sprite.Material$Baked; + } interface FabricBlockStateModel { emitQuads(p0: net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter, p1: net.minecraft.client.renderer.block.BlockAndTintGetter, p2: net.minecraft.core.BlockPos, p3: net.minecraft.world.level.block.state.BlockState, p4: net.minecraft.util.RandomSource, p5: unknown): void; createGeometryKey(p0: net.minecraft.client.renderer.block.BlockAndTintGetter, p1: net.minecraft.core.BlockPos, p2: net.minecraft.world.level.block.state.BlockState, p3: net.minecraft.util.RandomSource): any | null | undefined; @@ -38619,12 +38950,6 @@ declare global { materialFlags(p0: net.minecraft.client.renderer.block.BlockAndTintGetter, p1: net.minecraft.core.BlockPos, p2: net.minecraft.world.level.block.state.BlockState, p3: net.minecraft.util.RandomSource): number; hasMaterialFlag(p0: net.minecraft.client.renderer.block.BlockAndTintGetter, p1: net.minecraft.core.BlockPos, p2: net.minecraft.world.level.block.state.BlockState, p3: net.minecraft.util.RandomSource, p4: number): boolean; } - interface FabricBlockStateModelPart { - emitQuads(p0: net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter, p1: unknown): void; - } - interface FabricBlockStateModelSet { - getParticleMaterial(p0: net.minecraft.world.level.block.state.BlockState, p1: net.minecraft.client.renderer.block.BlockAndTintGetter, p2: net.minecraft.core.BlockPos): net.minecraft.client.resources.model.sprite.Material$Baked; - } } namespace sprite { interface FabricMaterialBaker extends net.fabricmc.fabric.api.client.renderer.v1.sprite.SpriteFinderGetter { @@ -38638,15 +38963,25 @@ declare global { find(p0: net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView): net.minecraft.client.renderer.texture.TextureAtlasSprite; find(p0: number, p1: number): net.minecraft.client.renderer.texture.TextureAtlasSprite; } - interface FabricTextureAtlas { + interface FabricPreparations { spriteFinder(): net.fabricmc.fabric.api.client.renderer.v1.sprite.SpriteFinder; } - interface FabricPreparations { + interface FabricTextureAtlas { spriteFinder(): net.fabricmc.fabric.api.client.renderer.v1.sprite.SpriteFinder; } } } } + namespace sound { + namespace v1 { + const FabricSoundInstance: { + EMPTY_SOUND: net.minecraft.resources.Identifier; + } + interface FabricSoundInstance { + getAudioStream(p0: net.minecraft.client.sounds.SoundBufferLibrary, p1: net.minecraft.resources.Identifier, p2: boolean): java.util.concurrent.CompletableFuture; + } + } + } namespace model { namespace loading { namespace v1 { @@ -38662,16 +38997,6 @@ declare global { } } } - namespace sound { - namespace v1 { - const FabricSoundInstance: { - EMPTY_SOUND: net.minecraft.resources.Identifier; - } - interface FabricSoundInstance { - getAudioStream(p0: net.minecraft.client.sounds.SoundBufferLibrary, p1: net.minecraft.resources.Identifier, p2: boolean): java.util.concurrent.CompletableFuture; - } - } - } } namespace entity { namespace event { @@ -38746,48 +39071,39 @@ declare global { } interface PolygonMode extends kotlin.Enum { } - const SourceFactor: { - CONSTANT_ALPHA: com.mojang.blaze3d.platform.SourceFactor; - CONSTANT_COLOR: com.mojang.blaze3d.platform.SourceFactor; - DST_ALPHA: com.mojang.blaze3d.platform.SourceFactor; - DST_COLOR: com.mojang.blaze3d.platform.SourceFactor; - ONE: com.mojang.blaze3d.platform.SourceFactor; - ONE_MINUS_CONSTANT_ALPHA: com.mojang.blaze3d.platform.SourceFactor; - ONE_MINUS_CONSTANT_COLOR: com.mojang.blaze3d.platform.SourceFactor; - ONE_MINUS_DST_ALPHA: com.mojang.blaze3d.platform.SourceFactor; - ONE_MINUS_DST_COLOR: com.mojang.blaze3d.platform.SourceFactor; - ONE_MINUS_SRC_ALPHA: com.mojang.blaze3d.platform.SourceFactor; - ONE_MINUS_SRC_COLOR: com.mojang.blaze3d.platform.SourceFactor; - SRC_ALPHA: com.mojang.blaze3d.platform.SourceFactor; - SRC_ALPHA_SATURATE: com.mojang.blaze3d.platform.SourceFactor; - SRC_COLOR: com.mojang.blaze3d.platform.SourceFactor; - ZERO: com.mojang.blaze3d.platform.SourceFactor; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.mojang.blaze3d.platform.SourceFactor; - } - interface SourceFactor extends kotlin.Enum { - } - const DestFactor: { - CONSTANT_ALPHA: com.mojang.blaze3d.platform.DestFactor; - CONSTANT_COLOR: com.mojang.blaze3d.platform.DestFactor; - DST_ALPHA: com.mojang.blaze3d.platform.DestFactor; - DST_COLOR: com.mojang.blaze3d.platform.DestFactor; - ONE: com.mojang.blaze3d.platform.DestFactor; - ONE_MINUS_CONSTANT_ALPHA: com.mojang.blaze3d.platform.DestFactor; - ONE_MINUS_CONSTANT_COLOR: com.mojang.blaze3d.platform.DestFactor; - ONE_MINUS_DST_ALPHA: com.mojang.blaze3d.platform.DestFactor; - ONE_MINUS_DST_COLOR: com.mojang.blaze3d.platform.DestFactor; - ONE_MINUS_SRC_ALPHA: com.mojang.blaze3d.platform.DestFactor; - ONE_MINUS_SRC_COLOR: com.mojang.blaze3d.platform.DestFactor; - SRC_ALPHA: com.mojang.blaze3d.platform.DestFactor; - SRC_COLOR: com.mojang.blaze3d.platform.DestFactor; - ZERO: com.mojang.blaze3d.platform.DestFactor; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.mojang.blaze3d.platform.DestFactor; - } - interface DestFactor extends kotlin.Enum { + const BlendFactor: { + CONSTANT_ALPHA: com.mojang.blaze3d.platform.BlendFactor; + CONSTANT_COLOR: com.mojang.blaze3d.platform.BlendFactor; + DST_ALPHA: com.mojang.blaze3d.platform.BlendFactor; + DST_COLOR: com.mojang.blaze3d.platform.BlendFactor; + ONE: com.mojang.blaze3d.platform.BlendFactor; + ONE_MINUS_CONSTANT_ALPHA: com.mojang.blaze3d.platform.BlendFactor; + ONE_MINUS_CONSTANT_COLOR: com.mojang.blaze3d.platform.BlendFactor; + ONE_MINUS_DST_ALPHA: com.mojang.blaze3d.platform.BlendFactor; + ONE_MINUS_DST_COLOR: com.mojang.blaze3d.platform.BlendFactor; + ONE_MINUS_SRC_ALPHA: com.mojang.blaze3d.platform.BlendFactor; + ONE_MINUS_SRC_COLOR: com.mojang.blaze3d.platform.BlendFactor; + SRC_ALPHA: com.mojang.blaze3d.platform.BlendFactor; + SRC_ALPHA_SATURATE: com.mojang.blaze3d.platform.BlendFactor; + SRC_COLOR: com.mojang.blaze3d.platform.BlendFactor; + ZERO: com.mojang.blaze3d.platform.BlendFactor; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.platform.BlendFactor; + } + interface BlendFactor extends kotlin.Enum { + } + const BlendOp: { + ADD: com.mojang.blaze3d.platform.BlendOp; + SUBTRACT: com.mojang.blaze3d.platform.BlendOp; + REVERSE_SUBTRACT: com.mojang.blaze3d.platform.BlendOp; + MIN: com.mojang.blaze3d.platform.BlendOp; + MAX: com.mojang.blaze3d.platform.BlendOp; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.platform.BlendOp; + } + interface BlendOp extends kotlin.Enum { } const CompareOp: { ALWAYS_PASS: com.mojang.blaze3d.platform.CompareOp; @@ -38852,6 +39168,7 @@ declare global { resizeSubRectTo(sourceX: number, sourceY: number, sizeX: number, sizeY: number, to: com.mojang.blaze3d.platform.NativeImage): void; untrack(): void; getPointer(): number; + getPixelBytes(): java.nio.ByteBuffer; computeTransparency(x0: number, y0: number, x1: number, y1: number): com.mojang.blaze3d.platform.Transparency; computeTransparency(): com.mojang.blaze3d.platform.Transparency; } @@ -38890,7 +39207,7 @@ declare global { WindowInitFailed: typeof com.mojang.blaze3d.platform.Window$WindowInitFailed; BASE_WIDTH: number; BASE_HEIGHT: number; - new(eventHandler: com.mojang.blaze3d.platform.WindowEventHandler, displayData: com.mojang.blaze3d.platform.DisplayData, fullscreenVideoModeString: string | null | undefined, title: string, backend: com.mojang.blaze3d.systems.GpuBackend): com.mojang.blaze3d.platform.Window; + new(eventHandler: com.mojang.blaze3d.platform.WindowEventHandler, displayData: com.mojang.blaze3d.platform.DisplayData, fullscreenVideoModeString: string | null | undefined, exclusiveFullscreen: boolean, title: string, monitorManager: com.mojang.blaze3d.platform.MonitorManager, backend: com.mojang.blaze3d.systems.GpuBackend): com.mojang.blaze3d.platform.Window; createGlfwWindow(width: number, height: number, title: string, monitor: number, backend: com.mojang.blaze3d.systems.GpuBackend): number; getPlatform(): string; checkGlfwError(errorConsumer: unknown): void; @@ -38898,14 +39215,12 @@ declare global { interface Window extends java.lang.AutoCloseable { defaultErrorCallback(errorCode: number, description: number): void; handle(): number; - isResized(): boolean; backend(): com.mojang.blaze3d.systems.GpuBackend; getRefreshRate(): number; shouldClose(): boolean; setIcon(resources: net.minecraft.server.packs.PackResources, iconSet: com.mojang.blaze3d.platform.IconSet): void; setErrorSection(string: string): void; setDefaultErrorCallback(): void; - updateVsync(enableVsync: boolean): void; updateFullscreenIfChanged(): void; getPreferredFullscreenVideoMode(): java.util.Optional; setPreferredFullscreenVideoMode(preferredFullscreenVideoMode: java.util.Optional): void; @@ -38932,7 +39247,6 @@ declare global { findBestMonitor(): com.mojang.blaze3d.platform.Monitor | null | undefined; updateRawMouseInput(value: boolean): void; setWindowCloseCallback(task: java.lang.Runnable): void; - resetIsResized(): void; isMinimized(): boolean; setAllowCursorChanges(value: boolean): void; selectCursor(cursor: com.mojang.blaze3d.platform.cursor.CursorType): void; @@ -38950,18 +39264,20 @@ declare global { getMacIcon(resources: net.minecraft.server.packs.PackResources): net.minecraft.server.packs.resources.IoSupplier; } const Monitor: { - new(monitor: number): com.mojang.blaze3d.platform.Monitor; + new(monitorName: string, monitor: number, videoModes: Array, currentMode: com.mojang.blaze3d.platform.VideoMode, x: number, y: number): com.mojang.blaze3d.platform.Monitor; + tryCreate(monitor: number): com.mojang.blaze3d.platform.Monitor | null | undefined; } - interface Monitor { - refreshVideoModes(): void; + interface Monitor extends java.lang.Record { getPreferredVidMode(expectedMode: java.util.Optional): com.mojang.blaze3d.platform.VideoMode; - getVideoModeIndex(videoMode: com.mojang.blaze3d.platform.VideoMode): number; - getCurrentMode(): com.mojang.blaze3d.platform.VideoMode; - getX(): number; - getY(): number; - getMode(mode: number): com.mojang.blaze3d.platform.VideoMode; - getModeCount(): number; - getMonitor(): number; + indexOfMode(videoMode: com.mojang.blaze3d.platform.VideoMode): number; + mode(mode: number): com.mojang.blaze3d.platform.VideoMode; + modeCount(): number; + monitorName(): string; + monitor(): number; + videoModes(): Array; + currentMode(): com.mojang.blaze3d.platform.VideoMode; + x(): number; + y(): number; } const VideoMode: { new(width: number, height: number, redBits: number, greenBits: number, blueBits: number, refreshRate: number): com.mojang.blaze3d.platform.VideoMode; @@ -38979,6 +39295,7 @@ declare global { write(): string; } interface WindowEventHandler { + framebufferSizeChanged(): void; resizeGui(): void; cursorEntered(): void; } @@ -38994,6 +39311,14 @@ declare global { fullscreenHeight(): java.util.OptionalInt; isFullscreen(): boolean; } + const MonitorManager: { + new(): com.mojang.blaze3d.platform.MonitorManager; + clamp(value: number, min: number, max: number): number; + } + interface MonitorManager extends java.lang.AutoCloseable { + getMonitor(monitor: number): com.mojang.blaze3d.platform.Monitor | null | undefined; + findBestMonitor(window: com.mojang.blaze3d.platform.Window): com.mojang.blaze3d.platform.Monitor | null | undefined; + } const Window$WindowInitFailed: { new(message: string): com.mojang.blaze3d.platform.Window$WindowInitFailed; } @@ -39059,7 +39384,6 @@ declare global { const RenderPipeline: { Builder: typeof com.mojang.blaze3d.pipeline.RenderPipeline$Builder; Snippet: typeof com.mojang.blaze3d.pipeline.RenderPipeline$Snippet; - UniformDescription: typeof com.mojang.blaze3d.pipeline.RenderPipeline$UniformDescription; updateSortKeySeed(): void; builder(snippets: com.mojang.blaze3d.pipeline.RenderPipeline$Snippet): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; } @@ -39067,33 +39391,34 @@ declare global { getSortKey(): number; getPolygonMode(): com.mojang.blaze3d.platform.PolygonMode; isCull(): boolean; - getColorTargetState(): com.mojang.blaze3d.pipeline.ColorTargetState; + getColorTargetStates(): Array; + getColorTargetState(): com.mojang.blaze3d.pipeline.ColorTargetState | null | undefined; getDepthStencilState(): com.mojang.blaze3d.pipeline.DepthStencilState | null | undefined; getLocation(): net.minecraft.resources.Identifier; - getVertexFormat(): com.mojang.blaze3d.vertex.VertexFormat; - getVertexFormatMode(): com.mojang.blaze3d.vertex.VertexFormat$Mode; + getVertexFormatBindings(): Array; + getVertexFormatBinding(bindingIndex: number): com.mojang.blaze3d.vertex.VertexFormat | null | undefined; + getPrimitiveTopology(): com.mojang.blaze3d.PrimitiveTopology; getVertexShader(): net.minecraft.resources.Identifier; getFragmentShader(): net.minecraft.resources.Identifier; getShaderDefines(): net.minecraft.client.renderer.ShaderDefines; - getSamplers(): Array; - getUniforms(): Array; + getBindGroupLayouts(): Array; wantsDepthTexture(): boolean; } const RenderPipeline$Snippet: { - new(vertexShader: java.util.Optional, fragmentShader: java.util.Optional, shaderDefines: java.util.Optional, samplers: java.util.Optional>, uniforms: java.util.Optional>, colorTargetState: java.util.Optional, depthStencilState: java.util.Optional, polygonMode: java.util.Optional, cull: java.util.Optional, vertexFormat: java.util.Optional, vertexFormatMode: java.util.Optional): com.mojang.blaze3d.pipeline.RenderPipeline$Snippet; + new(vertexShader: java.util.Optional, fragmentShader: java.util.Optional, shaderDefines: java.util.Optional, bindGroupLayouts: java.util.Optional>, colorTargetStates: Array, activeColorTargetStateCount: number, depthStencilState: java.util.Optional, polygonMode: java.util.Optional, cull: java.util.Optional, vertexFormatPerBuffer: Array, vertexFormatMode: java.util.Optional): com.mojang.blaze3d.pipeline.RenderPipeline$Snippet; } interface RenderPipeline$Snippet extends java.lang.Record, net.fabricmc.fabric.api.client.rendering.v1.FabricRenderPipeline$Snippet { vertexShader(): java.util.Optional; fragmentShader(): java.util.Optional; shaderDefines(): java.util.Optional; - samplers(): java.util.Optional>; - uniforms(): java.util.Optional>; - colorTargetState(): java.util.Optional; + bindGroupLayouts(): java.util.Optional>; + colorTargetStates(): Array; + activeColorTargetStateCount(): number; depthStencilState(): java.util.Optional; polygonMode(): java.util.Optional; cull(): java.util.Optional; - vertexFormat(): java.util.Optional; - vertexFormatMode(): java.util.Optional; + vertexFormatPerBuffer(): Array; + vertexFormatMode(): java.util.Optional; } interface RenderPipeline$Builder extends net.fabricmc.fabric.api.client.rendering.v1.FabricRenderPipeline$Builder { withLocation(location: string): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; @@ -39105,18 +39430,47 @@ declare global { withShaderDefine(key: string): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; withShaderDefine(key: string, value: number): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; withShaderDefine(key: string, value: number): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; - withSampler(sampler: string): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; - withUniform(name: string, type: com.mojang.blaze3d.shaders.UniformType): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; - withUniform(name: string, type: com.mojang.blaze3d.shaders.UniformType, format: com.mojang.blaze3d.textures.TextureFormat): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; + withBindGroupLayout(bindGroupLayout: com.mojang.blaze3d.pipeline.BindGroupLayout): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; withPolygonMode(polygonMode: com.mojang.blaze3d.platform.PolygonMode): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; withCull(cull: boolean): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; + withColorTargetState(index: number, colorTargetState: com.mojang.blaze3d.pipeline.ColorTargetState): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; withColorTargetState(colorTargetState: com.mojang.blaze3d.pipeline.ColorTargetState): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; + withUnusedColorTargetState(index: number): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; withDepthStencilState(depthStencilState: com.mojang.blaze3d.pipeline.DepthStencilState): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; withDepthStencilState(depthStencilState: java.util.Optional): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; - withVertexFormat(vertexFormat: com.mojang.blaze3d.vertex.VertexFormat, vertexFormatMode: com.mojang.blaze3d.vertex.VertexFormat$Mode): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; + withVertexBinding(bindingIndex: number, vertexFormat: com.mojang.blaze3d.vertex.VertexFormat): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; + withPrimitiveTopology(primitiveTopology: com.mojang.blaze3d.PrimitiveTopology): com.mojang.blaze3d.pipeline.RenderPipeline$Builder; buildSnippet(): com.mojang.blaze3d.pipeline.RenderPipeline$Snippet; build(): com.mojang.blaze3d.pipeline.RenderPipeline; } + const BindGroupLayout: { + Builder: typeof com.mojang.blaze3d.pipeline.BindGroupLayout$Builder; + UniformDescription: typeof com.mojang.blaze3d.pipeline.BindGroupLayout$UniformDescription; + builder(): com.mojang.blaze3d.pipeline.BindGroupLayout$Builder; + flattenSamplers(bindGroupLayouts: Array): Array; + flattenUniforms(bindGroupLayouts: Array): Array; + ensureCompatible(bindGroupLayouts: Array): void; + } + interface BindGroupLayout { + getSamplers(): Array; + getUniforms(): Array; + } + interface BindGroupLayout$Builder { + withSampler(sampler: string): com.mojang.blaze3d.pipeline.BindGroupLayout$Builder; + withUniform(name: string, type: com.mojang.blaze3d.shaders.UniformType): com.mojang.blaze3d.pipeline.BindGroupLayout$Builder; + withUniform(name: string, type: com.mojang.blaze3d.shaders.UniformType, format: com.mojang.blaze3d.GpuFormat): com.mojang.blaze3d.pipeline.BindGroupLayout$Builder; + build(): com.mojang.blaze3d.pipeline.BindGroupLayout; + } + const BindGroupLayout$UniformDescription: { + new(name: string, type: com.mojang.blaze3d.shaders.UniformType): com.mojang.blaze3d.pipeline.BindGroupLayout$UniformDescription; + new(name: string, gpuFormat: com.mojang.blaze3d.GpuFormat): com.mojang.blaze3d.pipeline.BindGroupLayout$UniformDescription; + new(name: string, type: com.mojang.blaze3d.shaders.UniformType, gpuFormat: com.mojang.blaze3d.GpuFormat | null | undefined): com.mojang.blaze3d.pipeline.BindGroupLayout$UniformDescription; + } + interface BindGroupLayout$UniformDescription extends java.lang.Record { + name(): string; + type(): com.mojang.blaze3d.shaders.UniformType; + gpuFormat(): com.mojang.blaze3d.GpuFormat | null | undefined; + } const ColorTargetState: { WRITE_RED: number; WRITE_GREEN: number; @@ -39126,8 +39480,9 @@ declare global { WRITE_ALL: number; WRITE_NONE: number; DEFAULT: com.mojang.blaze3d.pipeline.ColorTargetState; + MAX_COLOR_TARGETS: number; new(blendFunction: com.mojang.blaze3d.pipeline.BlendFunction): com.mojang.blaze3d.pipeline.ColorTargetState; - new(blendFunction: java.util.Optional, writeMask: number): com.mojang.blaze3d.pipeline.ColorTargetState; + new(blendFunction: java.util.Optional, format: com.mojang.blaze3d.GpuFormat, writeMask: number): com.mojang.blaze3d.pipeline.ColorTargetState; } interface ColorTargetState extends java.lang.Record { writeRed(): boolean; @@ -39135,6 +39490,7 @@ declare global { writeBlue(): boolean; writeAlpha(): boolean; blendFunction(): java.util.Optional; + format(): com.mojang.blaze3d.GpuFormat; writeMask(): number; } const BlendFunction: { @@ -39146,14 +39502,24 @@ declare global { ADDITIVE: com.mojang.blaze3d.pipeline.BlendFunction; ENTITY_OUTLINE_BLIT: com.mojang.blaze3d.pipeline.BlendFunction; INVERT: com.mojang.blaze3d.pipeline.BlendFunction; - new(source: com.mojang.blaze3d.platform.SourceFactor, dest: com.mojang.blaze3d.platform.DestFactor): com.mojang.blaze3d.pipeline.BlendFunction; - new(sourceColor: com.mojang.blaze3d.platform.SourceFactor, destColor: com.mojang.blaze3d.platform.DestFactor, sourceAlpha: com.mojang.blaze3d.platform.SourceFactor, destAlpha: com.mojang.blaze3d.platform.DestFactor): com.mojang.blaze3d.pipeline.BlendFunction; + new(srcColorFactor: com.mojang.blaze3d.platform.BlendFactor, dstColorFactor: com.mojang.blaze3d.platform.BlendFactor, colorOp: com.mojang.blaze3d.platform.BlendOp, srcAlphaFactor: com.mojang.blaze3d.platform.BlendFactor, dstAlphaFactor: com.mojang.blaze3d.platform.BlendFactor, alphaOp: com.mojang.blaze3d.platform.BlendOp): com.mojang.blaze3d.pipeline.BlendFunction; + new(srcColorFactor: com.mojang.blaze3d.platform.BlendFactor, dstColorFactor: com.mojang.blaze3d.platform.BlendFactor, srcAlphaFactor: com.mojang.blaze3d.platform.BlendFactor, dstAlphaFactor: com.mojang.blaze3d.platform.BlendFactor): com.mojang.blaze3d.pipeline.BlendFunction; + new(equation: com.mojang.blaze3d.pipeline.BlendEquation): com.mojang.blaze3d.pipeline.BlendFunction; + new(srcFactor: com.mojang.blaze3d.platform.BlendFactor, dstFactor: com.mojang.blaze3d.platform.BlendFactor, op: com.mojang.blaze3d.platform.BlendOp): com.mojang.blaze3d.pipeline.BlendFunction; + new(srcFactor: com.mojang.blaze3d.platform.BlendFactor, dstFactor: com.mojang.blaze3d.platform.BlendFactor): com.mojang.blaze3d.pipeline.BlendFunction; + new(color: com.mojang.blaze3d.pipeline.BlendEquation, alpha: com.mojang.blaze3d.pipeline.BlendEquation): com.mojang.blaze3d.pipeline.BlendFunction; } interface BlendFunction extends java.lang.Record { - sourceColor(): com.mojang.blaze3d.platform.SourceFactor; - destColor(): com.mojang.blaze3d.platform.DestFactor; - sourceAlpha(): com.mojang.blaze3d.platform.SourceFactor; - destAlpha(): com.mojang.blaze3d.platform.DestFactor; + color(): com.mojang.blaze3d.pipeline.BlendEquation; + alpha(): com.mojang.blaze3d.pipeline.BlendEquation; + } + const BlendEquation: { + new(sourceFactor: com.mojang.blaze3d.platform.BlendFactor, destFactor: com.mojang.blaze3d.platform.BlendFactor, op: com.mojang.blaze3d.platform.BlendOp): com.mojang.blaze3d.pipeline.BlendEquation; + } + interface BlendEquation extends java.lang.Record { + sourceFactor(): com.mojang.blaze3d.platform.BlendFactor; + destFactor(): com.mojang.blaze3d.platform.BlendFactor; + op(): com.mojang.blaze3d.platform.BlendOp; } const ColorTargetState$WriteMask: { new(): com.mojang.blaze3d.pipeline.ColorTargetState$WriteMask; @@ -39171,18 +39537,8 @@ declare global { depthBiasScaleFactor(): number; depthBiasConstant(): number; } - const RenderPipeline$UniformDescription: { - new(name: string, type: com.mojang.blaze3d.shaders.UniformType): com.mojang.blaze3d.pipeline.RenderPipeline$UniformDescription; - new(name: string, textureFormat: com.mojang.blaze3d.textures.TextureFormat): com.mojang.blaze3d.pipeline.RenderPipeline$UniformDescription; - new(name: string, type: com.mojang.blaze3d.shaders.UniformType, textureFormat: com.mojang.blaze3d.textures.TextureFormat | null | undefined): com.mojang.blaze3d.pipeline.RenderPipeline$UniformDescription; - } - interface RenderPipeline$UniformDescription extends java.lang.Record { - name(): string; - type(): com.mojang.blaze3d.shaders.UniformType; - textureFormat(): com.mojang.blaze3d.textures.TextureFormat | null | undefined; - } const RenderTarget: { - new(label: string | null | undefined, useDepth: boolean): com.mojang.blaze3d.pipeline.RenderTarget; + new(label: string | null | undefined, useDepth: boolean, format: com.mojang.blaze3d.GpuFormat): com.mojang.blaze3d.pipeline.RenderTarget; } interface RenderTarget { width: number; @@ -39192,8 +39548,7 @@ declare global { destroyBuffers(): void; copyDepthFrom(source: com.mojang.blaze3d.pipeline.RenderTarget): void; createBuffers(width: number, height: number): void; - blitToScreen(): void; - blitAndBlendToTexture(output: com.mojang.blaze3d.textures.GpuTextureView): void; + blitAndBlendToTexture(output: com.mojang.blaze3d.textures.GpuTextureView, outputDepth: com.mojang.blaze3d.textures.GpuTextureView): void; getColorTexture(): com.mojang.blaze3d.textures.GpuTexture | null | undefined; getColorTextureView(): com.mojang.blaze3d.textures.GpuTextureView | null | undefined; getDepthTexture(): com.mojang.blaze3d.textures.GpuTexture | null | undefined; @@ -39230,255 +39585,43 @@ declare global { idConverter(): net.minecraft.resources.FileToIdConverter; } const GpuDebugOptions: { - new(logLevel: number, synchronousLogs: boolean, useLabels: boolean): com.mojang.blaze3d.shaders.GpuDebugOptions; + new(logLevel: number, synchronousLogs: boolean, useLabels: boolean, useValidationLayers: boolean): com.mojang.blaze3d.shaders.GpuDebugOptions; } interface GpuDebugOptions extends java.lang.Record { logLevel(): number; synchronousLogs(): boolean; useLabels(): boolean; - } - } - namespace textures { - const TextureFormat: { - RGBA8: com.mojang.blaze3d.textures.TextureFormat; - RED8: com.mojang.blaze3d.textures.TextureFormat; - RED8I: com.mojang.blaze3d.textures.TextureFormat; - DEPTH32: com.mojang.blaze3d.textures.TextureFormat; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.mojang.blaze3d.textures.TextureFormat; - } - interface TextureFormat extends kotlin.Enum { - pixelSize(): number; - hasColorAspect(): boolean; - hasDepthAspect(): boolean; - } - const GpuTexture: { - USAGE_COPY_DST: number; - USAGE_COPY_SRC: number; - USAGE_TEXTURE_BINDING: number; - USAGE_RENDER_ATTACHMENT: number; - USAGE_CUBEMAP_COMPATIBLE: number; - new(usage: number, label: string, format: com.mojang.blaze3d.textures.TextureFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; - } - interface GpuTexture extends java.lang.AutoCloseable { - usage(): number; - getWidth(mipLevel: number): number; - getHeight(mipLevel: number): number; - getDepthOrLayers(): number; - getMipLevels(): number; - getFormat(): com.mojang.blaze3d.textures.TextureFormat; - getLabel(): string; - isClosed(): boolean; - } - const GpuTexture$Usage: { - new(): com.mojang.blaze3d.textures.GpuTexture$Usage; - } - interface GpuTexture$Usage extends kotlin.Annotation { - } - interface GpuTextureView extends java.lang.AutoCloseable { - texture(): com.mojang.blaze3d.textures.GpuTexture; - baseMipLevel(): number; - mipLevels(): number; - getWidth(mipLevel: number): number; - getHeight(mipLevel: number): number; - isClosed(): boolean; - } - const GpuSampler: { - new(): com.mojang.blaze3d.textures.GpuSampler; - } - interface GpuSampler extends java.lang.AutoCloseable { - getAddressModeU(): com.mojang.blaze3d.textures.AddressMode; - getAddressModeV(): com.mojang.blaze3d.textures.AddressMode; - getMinFilter(): com.mojang.blaze3d.textures.FilterMode; - getMagFilter(): com.mojang.blaze3d.textures.FilterMode; - getMaxAnisotropy(): number; - getMaxLod(): java.util.OptionalDouble; - } - const AddressMode: { - REPEAT: com.mojang.blaze3d.textures.AddressMode; - CLAMP_TO_EDGE: com.mojang.blaze3d.textures.AddressMode; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.mojang.blaze3d.textures.AddressMode; - } - interface AddressMode extends kotlin.Enum { - } - const FilterMode: { - NEAREST: com.mojang.blaze3d.textures.FilterMode; - LINEAR: com.mojang.blaze3d.textures.FilterMode; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.mojang.blaze3d.textures.FilterMode; - } - interface FilterMode extends kotlin.Enum { + useValidationLayers(): boolean; } } namespace vertex { const VertexFormat: { Builder: typeof com.mojang.blaze3d.vertex.VertexFormat$Builder; - Mode: typeof com.mojang.blaze3d.vertex.VertexFormat$Mode; - IndexType: typeof com.mojang.blaze3d.vertex.VertexFormat$IndexType; - UNKNOWN_ELEMENT: number; - builder(): com.mojang.blaze3d.vertex.VertexFormat$Builder; + MAX_VERTEX_ELEMENTS: number; + builder(stepRate: number): com.mojang.blaze3d.vertex.VertexFormat$Builder; } interface VertexFormat { getVertexSize(): number; + getStepRate(): number; getElements(): Array; - getElementAttributeNames(): Array; - getOffsetsByElement(): Array; - getOffset(element: com.mojang.blaze3d.vertex.VertexFormatElement): number; - contains(element: com.mojang.blaze3d.vertex.VertexFormatElement): boolean; - getElementsMask(): number; - getElementName(element: com.mojang.blaze3d.vertex.VertexFormatElement): string; - uploadImmediateVertexBuffer(buffer: java.nio.ByteBuffer): com.mojang.blaze3d.buffers.GpuBuffer; - uploadImmediateIndexBuffer(buffer: java.nio.ByteBuffer): com.mojang.blaze3d.buffers.GpuBuffer; + getElement(attributeName: string): com.mojang.blaze3d.vertex.VertexFormatElement | null | undefined; + contains(attributeName: string): boolean; } const VertexFormatElement: { - Type: typeof com.mojang.blaze3d.vertex.VertexFormatElement$Type; - MAX_COUNT: number; - POSITION: com.mojang.blaze3d.vertex.VertexFormatElement; - COLOR: com.mojang.blaze3d.vertex.VertexFormatElement; - UV0: com.mojang.blaze3d.vertex.VertexFormatElement; - UV: com.mojang.blaze3d.vertex.VertexFormatElement; - UV1: com.mojang.blaze3d.vertex.VertexFormatElement; - UV2: com.mojang.blaze3d.vertex.VertexFormatElement; - NORMAL: com.mojang.blaze3d.vertex.VertexFormatElement; - LINE_WIDTH: com.mojang.blaze3d.vertex.VertexFormatElement; - new(id: number, index: number, type: com.mojang.blaze3d.vertex.VertexFormatElement$Type, normalized: boolean, count: number): com.mojang.blaze3d.vertex.VertexFormatElement; - register(id: number, index: number, type: com.mojang.blaze3d.vertex.VertexFormatElement$Type, normalized: boolean, count: number): com.mojang.blaze3d.vertex.VertexFormatElement; - byId(id: number): com.mojang.blaze3d.vertex.VertexFormatElement | null | undefined; - elementsFromMask(mask: number): java.util.stream.Stream; + new(name: string, offset: number, format: com.mojang.blaze3d.GpuFormat): com.mojang.blaze3d.vertex.VertexFormatElement; } interface VertexFormatElement extends java.lang.Record { - mask(): number; - byteSize(): number; - id(): number; - index(): number; - type(): com.mojang.blaze3d.vertex.VertexFormatElement$Type; - normalized(): boolean; - count(): number; - } - const VertexFormatElement$Type: { - FLOAT: com.mojang.blaze3d.vertex.VertexFormatElement$Type; - UBYTE: com.mojang.blaze3d.vertex.VertexFormatElement$Type; - BYTE: com.mojang.blaze3d.vertex.VertexFormatElement$Type; - USHORT: com.mojang.blaze3d.vertex.VertexFormatElement$Type; - SHORT: com.mojang.blaze3d.vertex.VertexFormatElement$Type; - UINT: com.mojang.blaze3d.vertex.VertexFormatElement$Type; - INT: com.mojang.blaze3d.vertex.VertexFormatElement$Type; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.mojang.blaze3d.vertex.VertexFormatElement$Type; - } - interface VertexFormatElement$Type extends kotlin.Enum { - size(): number; + name(): string; + offset(): number; + format(): com.mojang.blaze3d.GpuFormat; } interface VertexFormat$Builder { - add(name: string, element: com.mojang.blaze3d.vertex.VertexFormatElement): com.mojang.blaze3d.vertex.VertexFormat$Builder; - padding(bytes: number): com.mojang.blaze3d.vertex.VertexFormat$Builder; + addAttribute(name: string, elementFormat: com.mojang.blaze3d.GpuFormat): com.mojang.blaze3d.vertex.VertexFormat$Builder; + addAttribute(name: string, stride: number, elementFormat: com.mojang.blaze3d.GpuFormat): com.mojang.blaze3d.vertex.VertexFormat$Builder; + addAttribute(name: string, elementFormat: com.mojang.blaze3d.GpuFormat, columnCount: number): com.mojang.blaze3d.vertex.VertexFormat$Builder; + addAttribute(name: string, offset: number, stride: number, elementFormat: com.mojang.blaze3d.GpuFormat, columnCount: number): com.mojang.blaze3d.vertex.VertexFormat$Builder; build(): com.mojang.blaze3d.vertex.VertexFormat; } - const VertexFormat$Mode: { - LINES: com.mojang.blaze3d.vertex.VertexFormat$Mode; - DEBUG_LINES: com.mojang.blaze3d.vertex.VertexFormat$Mode; - DEBUG_LINE_STRIP: com.mojang.blaze3d.vertex.VertexFormat$Mode; - POINTS: com.mojang.blaze3d.vertex.VertexFormat$Mode; - TRIANGLES: com.mojang.blaze3d.vertex.VertexFormat$Mode; - TRIANGLE_STRIP: com.mojang.blaze3d.vertex.VertexFormat$Mode; - TRIANGLE_FAN: com.mojang.blaze3d.vertex.VertexFormat$Mode; - QUADS: com.mojang.blaze3d.vertex.VertexFormat$Mode; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.mojang.blaze3d.vertex.VertexFormat$Mode; - } - interface VertexFormat$Mode extends kotlin.Enum { - primitiveLength: number; - primitiveStride: number; - connectedPrimitives: boolean; - indexCount(vertexCount: number): number; - } - const VertexFormat$IndexType: { - SHORT: com.mojang.blaze3d.vertex.VertexFormat$IndexType; - INT: com.mojang.blaze3d.vertex.VertexFormat$IndexType; - entries: kotlin.enums.EnumEntries; - least(length: number): com.mojang.blaze3d.vertex.VertexFormat$IndexType; - values(): Array; - valueOf(value: string): com.mojang.blaze3d.vertex.VertexFormat$IndexType; - } - interface VertexFormat$IndexType extends kotlin.Enum { - bytes: number; - } - const MeshData: { - DrawState: typeof com.mojang.blaze3d.vertex.MeshData$DrawState; - SortState: typeof com.mojang.blaze3d.vertex.MeshData$SortState; - new(vertexBuffer: com.mojang.blaze3d.vertex.ByteBufferBuilder$Result, drawState: com.mojang.blaze3d.vertex.MeshData$DrawState): com.mojang.blaze3d.vertex.MeshData; - } - interface MeshData extends java.lang.AutoCloseable { - vertexBuffer(): java.nio.ByteBuffer; - indexBuffer(): java.nio.ByteBuffer | null | undefined; - drawState(): com.mojang.blaze3d.vertex.MeshData$DrawState; - sortQuads(indexBufferTarget: com.mojang.blaze3d.vertex.ByteBufferBuilder, sorting: com.mojang.blaze3d.vertex.VertexSorting): com.mojang.blaze3d.vertex.MeshData$SortState | null | undefined; - } - const MeshData$DrawState: { - new(format: com.mojang.blaze3d.vertex.VertexFormat, vertexCount: number, indexCount: number, mode: com.mojang.blaze3d.vertex.VertexFormat$Mode, indexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType): com.mojang.blaze3d.vertex.MeshData$DrawState; - } - interface MeshData$DrawState extends java.lang.Record { - format(): com.mojang.blaze3d.vertex.VertexFormat; - vertexCount(): number; - indexCount(): number; - mode(): com.mojang.blaze3d.vertex.VertexFormat$Mode; - indexType(): com.mojang.blaze3d.vertex.VertexFormat$IndexType; - } - const ByteBufferBuilder: { - Result: typeof com.mojang.blaze3d.vertex.ByteBufferBuilder$Result; - new(initialCapacity: number, maxCapacity: number): com.mojang.blaze3d.vertex.ByteBufferBuilder; - new(initialCapacity: number): com.mojang.blaze3d.vertex.ByteBufferBuilder; - exactlySized(capacity: number): com.mojang.blaze3d.vertex.ByteBufferBuilder; - } - interface ByteBufferBuilder extends java.lang.AutoCloseable { - reserve(size: number): number; - build(): com.mojang.blaze3d.vertex.ByteBufferBuilder$Result | null | undefined; - clear(): void; - discard(): void; - } - interface ByteBufferBuilder$Result extends java.lang.AutoCloseable { - byteBuffer(): java.nio.ByteBuffer; - } - const VertexSorting: { - DISTANCE_TO_ORIGIN: com.mojang.blaze3d.vertex.VertexSorting; - ORTHOGRAPHIC_Z: com.mojang.blaze3d.vertex.VertexSorting; - byDistance(x: number, y: number, z: number): com.mojang.blaze3d.vertex.VertexSorting; - byDistance(origin: org.joml.Vector3fc): com.mojang.blaze3d.vertex.VertexSorting; - byDistance(function_: com.mojang.blaze3d.vertex.VertexSorting$DistanceFunction): com.mojang.blaze3d.vertex.VertexSorting; - } - interface VertexSorting { - sort(points: com.mojang.blaze3d.vertex.CompactVectorArray): Array; - } - const CompactVectorArray: { - new(count: number): com.mojang.blaze3d.vertex.CompactVectorArray; - } - interface CompactVectorArray { - size(): number; - set(index: number, v: org.joml.Vector3fc): void; - set(index: number, x: number, y: number, z: number): void; - get(index: number, output: org.joml.Vector3f): org.joml.Vector3f; - getX(index: number): number; - getY(index: number): number; - getZ(index: number): number; - } - interface VertexSorting$DistanceFunction { - apply(value: org.joml.Vector3f): number; - (value: org.joml.Vector3f): number; - } - const MeshData$SortState: { - new(centroids: com.mojang.blaze3d.vertex.CompactVectorArray, indexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType): com.mojang.blaze3d.vertex.MeshData$SortState; - } - interface MeshData$SortState extends java.lang.Record { - buildSortedIndexBuffer(target: com.mojang.blaze3d.vertex.ByteBufferBuilder, sorting: com.mojang.blaze3d.vertex.VertexSorting): com.mojang.blaze3d.vertex.ByteBufferBuilder$Result | null | undefined; - centroids(): com.mojang.blaze3d.vertex.CompactVectorArray; - indexType(): com.mojang.blaze3d.vertex.VertexFormat$IndexType; - } interface VertexConsumer { addVertex(x: number, y: number, z: number): com.mojang.blaze3d.vertex.VertexConsumer; addVertex(x: number, y: number, z: number, color: number, u: number, v: number, overlayCoords: number, lightCoords: number, nx: number, ny: number, nz: number): void; @@ -39555,6 +39698,119 @@ declare global { isEmpty(): boolean; setIdentity(): void; } + const ByteBufferBuilder: { + Result: typeof com.mojang.blaze3d.vertex.ByteBufferBuilder$Result; + new(initialCapacity: number, maxCapacity: number): com.mojang.blaze3d.vertex.ByteBufferBuilder; + new(initialCapacity: number): com.mojang.blaze3d.vertex.ByteBufferBuilder; + exactlySized(capacity: number): com.mojang.blaze3d.vertex.ByteBufferBuilder; + } + interface ByteBufferBuilder extends java.lang.AutoCloseable { + reserve(size: number): number; + build(): com.mojang.blaze3d.vertex.ByteBufferBuilder$Result | null | undefined; + clear(): void; + discard(): void; + } + interface ByteBufferBuilder$Result extends java.lang.AutoCloseable { + size(): number; + byteBuffer(): java.nio.ByteBuffer; + } + const VertexSorting: { + DISTANCE_TO_ORIGIN: com.mojang.blaze3d.vertex.VertexSorting; + ORTHOGRAPHIC_Z: com.mojang.blaze3d.vertex.VertexSorting; + byDistance(x: number, y: number, z: number): com.mojang.blaze3d.vertex.VertexSorting; + byDistance(origin: org.joml.Vector3fc): com.mojang.blaze3d.vertex.VertexSorting; + byDistance(function_: com.mojang.blaze3d.vertex.VertexSorting$DistanceFunction): com.mojang.blaze3d.vertex.VertexSorting; + } + interface VertexSorting { + sort(points: com.mojang.blaze3d.vertex.CompactVectorArray): Array; + } + const CompactVectorArray: { + new(count: number): com.mojang.blaze3d.vertex.CompactVectorArray; + } + interface CompactVectorArray { + size(): number; + set(index: number, v: org.joml.Vector3fc): void; + set(index: number, x: number, y: number, z: number): void; + get(index: number, output: org.joml.Vector3f): org.joml.Vector3f; + getX(index: number): number; + getY(index: number): number; + getZ(index: number): number; + } + interface VertexSorting$DistanceFunction { + apply(value: org.joml.Vector3f): number; + (value: org.joml.Vector3f): number; + } + const MeshData$SortState: { + new(centroids: com.mojang.blaze3d.vertex.CompactVectorArray, indexType: com.mojang.blaze3d.IndexType): com.mojang.blaze3d.vertex.MeshData$SortState; + } + interface MeshData$SortState extends java.lang.Record { + buildSortedIndexBuffer(target: com.mojang.blaze3d.vertex.ByteBufferBuilder, sorting: com.mojang.blaze3d.vertex.VertexSorting): com.mojang.blaze3d.vertex.ByteBufferBuilder$Result | null | undefined; + writeSortedIndexBuffer(target: java.nio.ByteBuffer, sorting: com.mojang.blaze3d.vertex.VertexSorting): void; + centroids(): com.mojang.blaze3d.vertex.CompactVectorArray; + indexType(): com.mojang.blaze3d.IndexType; + } + } + namespace textures { + const GpuTexture: { + USAGE_COPY_DST: number; + USAGE_COPY_SRC: number; + USAGE_TEXTURE_BINDING: number; + USAGE_RENDER_ATTACHMENT: number; + USAGE_CUBEMAP_COMPATIBLE: number; + new(usage: number, label: string, format: com.mojang.blaze3d.GpuFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; + } + interface GpuTexture extends java.lang.AutoCloseable { + usage(): number; + getWidth(mipLevel: number): number; + getHeight(mipLevel: number): number; + getDepthOrLayers(): number; + getMipLevels(): number; + getFormat(): com.mojang.blaze3d.GpuFormat; + getLabel(): string; + isClosed(): boolean; + } + const GpuTexture$Usage: { + new(): com.mojang.blaze3d.textures.GpuTexture$Usage; + } + interface GpuTexture$Usage extends kotlin.Annotation { + } + interface GpuTextureView extends java.lang.AutoCloseable { + texture(): com.mojang.blaze3d.textures.GpuTexture; + baseMipLevel(): number; + mipLevels(): number; + getWidth(mipLevel: number): number; + getHeight(mipLevel: number): number; + isClosed(): boolean; + } + const GpuSampler: { + new(): com.mojang.blaze3d.textures.GpuSampler; + } + interface GpuSampler extends java.lang.AutoCloseable { + getAddressModeU(): com.mojang.blaze3d.textures.AddressMode; + getAddressModeV(): com.mojang.blaze3d.textures.AddressMode; + getMinFilter(): com.mojang.blaze3d.textures.FilterMode; + getMagFilter(): com.mojang.blaze3d.textures.FilterMode; + getMaxAnisotropy(): number; + getMaxLod(): java.util.OptionalDouble; + } + const AddressMode: { + REPEAT: com.mojang.blaze3d.textures.AddressMode; + CLAMP_TO_EDGE: com.mojang.blaze3d.textures.AddressMode; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.textures.AddressMode; + } + interface AddressMode extends kotlin.Enum { + } + const FilterMode: { + NEAREST: com.mojang.blaze3d.textures.FilterMode; + LINEAR: com.mojang.blaze3d.textures.FilterMode; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.textures.FilterMode; + } + interface FilterMode extends kotlin.Enum { + } } namespace buffers { const GpuBuffer: { @@ -39567,6 +39823,7 @@ declare global { USAGE_INDEX: number; USAGE_UNIFORM: number; USAGE_UNIFORM_TEXEL_BUFFER: number; + USAGE_INDIRECT_PARAMETERS: number; new(usage: number, size: number): com.mojang.blaze3d.buffers.GpuBuffer; } interface GpuBuffer extends java.lang.AutoCloseable { @@ -39575,49 +39832,98 @@ declare global { isClosed(): boolean; slice(offset: number, length: number): com.mojang.blaze3d.buffers.GpuBufferSlice; slice(): com.mojang.blaze3d.buffers.GpuBufferSlice; + map(read: boolean, write: boolean): com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; + map(offset: number, length: number, read: boolean, write: boolean): com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; } const GpuBufferSlice: { + MappedView: typeof com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; new(buffer: com.mojang.blaze3d.buffers.GpuBuffer, offset: number, length: number): com.mojang.blaze3d.buffers.GpuBufferSlice; } interface GpuBufferSlice extends java.lang.Record { slice(offset: number, length: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + map(read: boolean, write: boolean): com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; buffer(): com.mojang.blaze3d.buffers.GpuBuffer; offset(): number; length(): number; } + const GpuBufferSlice$MappedView: { + new(slice: com.mojang.blaze3d.buffers.GpuBufferSlice, data: java.nio.ByteBuffer, onClose: java.lang.Runnable): com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; + } + interface GpuBufferSlice$MappedView extends java.lang.Record, java.lang.AutoCloseable { + slice(): com.mojang.blaze3d.buffers.GpuBufferSlice; + data(): java.nio.ByteBuffer; + onClose(): java.lang.Runnable; + } const GpuBuffer$Usage: { new(): com.mojang.blaze3d.buffers.GpuBuffer$Usage; } interface GpuBuffer$Usage extends kotlin.Annotation { } - interface GpuBuffer$MappedView extends java.lang.AutoCloseable { - data(): java.nio.ByteBuffer; - } interface GpuFence extends java.lang.AutoCloseable { - awaitCompletion(timeoutMs: number): boolean; + awaitCompletion(timeoutNS: number): boolean; } } namespace systems { + const ScissorState: { + new(): com.mojang.blaze3d.systems.ScissorState; + new(state: com.mojang.blaze3d.systems.ScissorState): com.mojang.blaze3d.systems.ScissorState; + } + interface ScissorState { + enabled(): boolean; + x(): number; + y(): number; + width(): number; + height(): number; + enable(x: number, y: number, width: number, height: number): void; + disable(): void; + setFrom(state: com.mojang.blaze3d.systems.ScissorState): void; + } + const SamplerCache: { + new(): com.mojang.blaze3d.systems.SamplerCache; + } + interface SamplerCache { + initialize(): void; + getSampler(addressModeU: com.mojang.blaze3d.textures.AddressMode, addressModeV: com.mojang.blaze3d.textures.AddressMode, minFilter: com.mojang.blaze3d.textures.FilterMode, magFilter: com.mojang.blaze3d.textures.FilterMode, useMipmaps: boolean): com.mojang.blaze3d.textures.GpuSampler; + getClampToEdge(minMag: com.mojang.blaze3d.textures.FilterMode): com.mojang.blaze3d.textures.GpuSampler; + getClampToEdge(minMag: com.mojang.blaze3d.textures.FilterMode, mipmaps: boolean): com.mojang.blaze3d.textures.GpuSampler; + getRepeat(minMag: com.mojang.blaze3d.textures.FilterMode): com.mojang.blaze3d.textures.GpuSampler; + getRepeat(minMag: com.mojang.blaze3d.textures.FilterMode, mipmaps: boolean): com.mojang.blaze3d.textures.GpuSampler; + close(): void; + } const RenderPass: { + RenderArea: typeof com.mojang.blaze3d.systems.RenderPass$RenderArea; Draw: typeof com.mojang.blaze3d.systems.RenderPass$Draw; - new(backend: com.mojang.blaze3d.systems.RenderPassBackend, device: com.mojang.blaze3d.systems.GpuDeviceBackend): com.mojang.blaze3d.systems.RenderPass; + MAX_VERTEX_BUFFERS: number; + new(backend: com.mojang.blaze3d.systems.RenderPassBackend, device: com.mojang.blaze3d.systems.GpuDeviceBackend, colorAttachments: Array> | null | undefined>, onFinish: java.lang.Runnable, renderArea: com.mojang.blaze3d.systems.RenderPass$RenderArea | null | undefined): com.mojang.blaze3d.systems.RenderPass; } interface RenderPass extends java.lang.AutoCloseable { pushDebugGroup(label: unknown): void; popDebugGroup(): void; + writeTimestamp(pool: com.mojang.blaze3d.systems.GpuQueryPool, index: number): void; setPipeline(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline): void; bindTexture(name: string, textureView: com.mojang.blaze3d.textures.GpuTextureView | null | undefined, sampler: com.mojang.blaze3d.textures.GpuSampler | null | undefined): void; setUniform(name: string, value: com.mojang.blaze3d.buffers.GpuBuffer): void; setUniform(name: string, value: com.mojang.blaze3d.buffers.GpuBufferSlice): void; enableScissor(x: number, y: number, width: number, height: number): void; disableScissor(): void; - setVertexBuffer(slot: number, vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer): void; - setIndexBuffer(indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType): void; - drawIndexed(baseVertex: number, firstIndex: number, indexCount: number, instanceCount: number): void; - drawMultipleIndexed(draws: Array>, defaultIndexBuffer: com.mojang.blaze3d.buffers.GpuBuffer | null | undefined, defaultIndexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType | null | undefined, dynamicUniforms: Array, uniformArgument: T): void; - draw(firstVertex: number, vertexCount: number): void; + setVertexBuffer(slot: number, vertexBuffer: com.mojang.blaze3d.buffers.GpuBufferSlice | null | undefined): void; + setIndexBuffer(indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexType: com.mojang.blaze3d.IndexType): void; + drawIndexed(indexCount: number, instanceCount: number, firstIndex: number, vertexOffset: number, firstInstance: number): void; + multiDrawIndexed(drawParameters: java.nio.IntBuffer, instanceCount: number, firstInstance: number, drawCount: number): void; + multiDrawIndexed(firstIndexOffsets: org.lwjgl.PointerBuffer, indexCounts: java.nio.IntBuffer, vertexOffsets: java.nio.IntBuffer, drawCount: number): void; + drawIndexedIndirect(commands: com.mojang.blaze3d.buffers.GpuBufferSlice, drawCount: number): void; + drawMultipleIndexed(draws: Array>, defaultIndexBuffer: com.mojang.blaze3d.buffers.GpuBuffer | null | undefined, defaultIndexType: com.mojang.blaze3d.IndexType | null | undefined, dynamicUniforms: Array, uniformArgument: T): void; + draw(vertexCount: number, instanceCount: number, firstVertex: number, firstInstance: number): void; + multiDraw(drawParameters: java.nio.IntBuffer, instanceCount: number, firstInstance: number, drawCount: number): void; + multiDraw(firstVertices: java.nio.IntBuffer, vertexCounts: java.nio.IntBuffer, drawCount: number): void; + drawIndirect(commands: com.mojang.blaze3d.buffers.GpuBufferSlice, drawCount: number): void; + } + interface GpuQueryPool extends java.lang.AutoCloseable { + size(): number; + getValue(index: number): java.util.OptionalLong; + getValues(index: number, count: number): Array; } - interface RenderPassBackend extends java.lang.AutoCloseable { + interface RenderPassBackend { pushDebugGroup(label: unknown): void; popDebugGroup(): void; setPipeline(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline): void; @@ -39626,73 +39932,206 @@ declare global { setUniform(name: string, value: com.mojang.blaze3d.buffers.GpuBufferSlice): void; enableScissor(x: number, y: number, width: number, height: number): void; disableScissor(): void; - setVertexBuffer(slot: number, vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer): void; - setIndexBuffer(indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType): void; - drawIndexed(baseVertex: number, firstIndex: number, indexCount: number, instanceCount: number): void; - drawMultipleIndexed(draws: Array>, defaultIndexBuffer: com.mojang.blaze3d.buffers.GpuBuffer | null | undefined, defaultIndexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType | null | undefined, dynamicUniforms: Array, uniformArgument: T): void; - draw(firstVertex: number, vertexCount: number): void; - isClosed(): boolean; + setVertexBuffer(slot: number, vertexBuffer: com.mojang.blaze3d.buffers.GpuBufferSlice | null | undefined): void; + setIndexBuffer(indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexType: com.mojang.blaze3d.IndexType): void; + drawIndexed(indexCount: number, instanceCount: number, firstIndex: number, vertexOffset: number, firstInstance: number): void; + multiDrawIndexed(drawParameters: java.nio.IntBuffer, instanceCount: number, firstInstance: number, drawCount: number): void; + multiDrawIndexed(firstIndexOffsets: org.lwjgl.PointerBuffer, indexCounts: java.nio.IntBuffer, vertexOffsets: java.nio.IntBuffer, drawCount: number): void; + drawIndexedIndirect(commands: com.mojang.blaze3d.buffers.GpuBufferSlice, drawCount: number): void; + drawMultipleIndexed(draws: Array>, defaultIndexBuffer: com.mojang.blaze3d.buffers.GpuBuffer | null | undefined, defaultIndexType: com.mojang.blaze3d.IndexType | null | undefined, dynamicUniforms: Array, uniformArgument: T): void; + draw(vertexCount: number, instanceCount: number, firstVertex: number, firstInstance: number): void; + multiDraw(drawParameters: java.nio.IntBuffer, instanceCount: number, firstInstance: number, drawCount: number): void; + multiDraw(firstVertices: java.nio.IntBuffer, vertexCounts: java.nio.IntBuffer, drawCount: number): void; + drawIndirect(commands: com.mojang.blaze3d.buffers.GpuBufferSlice, drawCount: number): void; + writeTimestamp(pool: com.mojang.blaze3d.systems.GpuQueryPool, index: number): void; } interface GpuDeviceBackend { + createSurface(windowHandle: number): com.mojang.blaze3d.systems.GpuSurfaceBackend; createCommandEncoder(): com.mojang.blaze3d.systems.CommandEncoderBackend; createSampler(addressModeU: com.mojang.blaze3d.textures.AddressMode, addressModeV: com.mojang.blaze3d.textures.AddressMode, minFilter: com.mojang.blaze3d.textures.FilterMode, magFilter: com.mojang.blaze3d.textures.FilterMode, maxAnisotropy: number, maxLod: java.util.OptionalDouble): com.mojang.blaze3d.textures.GpuSampler; - createTexture(label: unknown, usage: number, format: com.mojang.blaze3d.textures.TextureFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; - createTexture(label: string | null | undefined, usage: number, format: com.mojang.blaze3d.textures.TextureFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; + createTexture(label: unknown, usage: number, format: com.mojang.blaze3d.GpuFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; + createTexture(label: string | null | undefined, usage: number, format: com.mojang.blaze3d.GpuFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; createTextureView(texture: com.mojang.blaze3d.textures.GpuTexture): com.mojang.blaze3d.textures.GpuTextureView; createTextureView(texture: com.mojang.blaze3d.textures.GpuTexture, baseMipLevel: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTextureView; createBuffer(label: unknown, usage: number, size: number): com.mojang.blaze3d.buffers.GpuBuffer; createBuffer(label: unknown, usage: number, data: java.nio.ByteBuffer): com.mojang.blaze3d.buffers.GpuBuffer; - getImplementationInformation(): string; getLastDebugMessages(): Array; isDebuggingEnabled(): boolean; - getVendor(): string; - getBackendName(): string; - getVersion(): string; - getRenderer(): string; - getMaxTextureSize(): number; - getUniformOffsetAlignment(): number; precompilePipeline(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline, shaderSource: com.mojang.blaze3d.shaders.ShaderSource | null | undefined): com.mojang.blaze3d.pipeline.CompiledRenderPipeline; clearPipelineCache(): void; - getEnabledExtensions(): Array; - getMaxSupportedAnisotropy(): number; close(): void; - setVsync(enabled: boolean): void; - presentFrame(): void; - isZZeroToOne(): boolean; + createTimestampQueryPool(size: number): com.mojang.blaze3d.systems.GpuQueryPool; + getTimestampNow(): number; + getDeviceInfo(): com.mojang.blaze3d.systems.DeviceInfo; + } + interface GpuSurfaceBackend extends java.lang.AutoCloseable { + configure(config: com.mojang.blaze3d.systems.GpuSurface$Configuration): void; + isSuboptimal(): boolean; + acquireNextTexture(): void; + blitFromTexture(commandEncoder: com.mojang.blaze3d.systems.CommandEncoderBackend, textureView: com.mojang.blaze3d.textures.GpuTextureView): void; + present(): void; + supportedPresentModes(): Array; + } + const GpuSurface$Configuration: { + new(width: number, height: number, presentMode: com.mojang.blaze3d.systems.GpuSurface$PresentMode): com.mojang.blaze3d.systems.GpuSurface$Configuration; + } + interface GpuSurface$Configuration extends java.lang.Record { + width(): number; + height(): number; + presentMode(): com.mojang.blaze3d.systems.GpuSurface$PresentMode; + } + const GpuSurface$PresentMode: { + IMMEDIATE: com.mojang.blaze3d.systems.GpuSurface$PresentMode; + MAILBOX: com.mojang.blaze3d.systems.GpuSurface$PresentMode; + FIFO: com.mojang.blaze3d.systems.GpuSurface$PresentMode; + FIFO_RELAXED: com.mojang.blaze3d.systems.GpuSurface$PresentMode; + entries: kotlin.enums.EnumEntries; + getSupportedVsyncMode(supportedModes: Array, vsync: boolean): com.mojang.blaze3d.systems.GpuSurface$PresentMode; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.systems.GpuSurface$PresentMode; + } + interface GpuSurface$PresentMode extends kotlin.Enum { } interface CommandEncoderBackend { - createRenderPass(label: unknown, colorTexture: com.mojang.blaze3d.textures.GpuTextureView, clearColor: java.util.OptionalInt): com.mojang.blaze3d.systems.RenderPassBackend; - createRenderPass(label: unknown, colorTexture: com.mojang.blaze3d.textures.GpuTextureView, clearColor: java.util.OptionalInt, depthTexture: com.mojang.blaze3d.textures.GpuTextureView | null | undefined, clearDepth: java.util.OptionalDouble): com.mojang.blaze3d.systems.RenderPassBackend; - isInRenderPass(): boolean; - clearColorTexture(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: number): void; - clearColorAndDepthTextures(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: number, depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number): void; - clearColorAndDepthTextures(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: number, depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number, regionX: number, regionY: number, regionWidth: number, regionHeight: number): void; + submit(): void; + transientMemory(): com.mojang.blaze3d.systems.TransientMemory; + createRenderPass(descriptor: com.mojang.blaze3d.systems.RenderPassDescriptor): com.mojang.blaze3d.systems.RenderPassBackend; + submitRenderPass(): void; + clearColorTexture(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: org.joml.Vector4fc): void; + clearColorAndDepthTextures(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: org.joml.Vector4fc, depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number): void; + clearColorAndDepthTextures(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: org.joml.Vector4fc, depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number, regionX: number, regionY: number, regionWidth: number, regionHeight: number): void; clearDepthTexture(depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number): void; writeToBuffer(destination: com.mojang.blaze3d.buffers.GpuBufferSlice, data: java.nio.ByteBuffer): void; - mapBuffer(buffer: com.mojang.blaze3d.buffers.GpuBufferSlice, read: boolean, write: boolean): com.mojang.blaze3d.buffers.GpuBuffer$MappedView; copyToBuffer(source: com.mojang.blaze3d.buffers.GpuBufferSlice, target: com.mojang.blaze3d.buffers.GpuBufferSlice): void; - writeToTexture(destination: com.mojang.blaze3d.textures.GpuTexture, source: com.mojang.blaze3d.platform.NativeImage, mipLevel: number, depthOrLayer: number, destX: number, destY: number, width: number, height: number, sourceX: number, sourceY: number): void; - writeToTexture(destination: com.mojang.blaze3d.textures.GpuTexture, source: java.nio.ByteBuffer, format: com.mojang.blaze3d.platform.NativeImage$Format, mipLevel: number, depthOrLayer: number, destX: number, destY: number, width: number, height: number): void; + writeToTexture(destination: com.mojang.blaze3d.textures.GpuTexture, source: java.nio.ByteBuffer, mipLevel: number, depthOrLayer: number, destX: number, destY: number, width: number, height: number): void; + copyBufferToTexture(source: com.mojang.blaze3d.buffers.GpuBufferSlice, sourceX: number, sourceY: number, sourceWidth: number, sourceHeight: number, destination: com.mojang.blaze3d.textures.GpuTexture, destinationX: number, destinationY: number, copyWidth: number, copyHeight: number, mipLevel: number, arrayLayer: number): void; copyTextureToBuffer(source: com.mojang.blaze3d.textures.GpuTexture, destination: com.mojang.blaze3d.buffers.GpuBuffer, offset: number, callback: java.lang.Runnable, mipLevel: number): void; copyTextureToBuffer(source: com.mojang.blaze3d.textures.GpuTexture, destination: com.mojang.blaze3d.buffers.GpuBuffer, offset: number, callback: java.lang.Runnable, mipLevel: number, x: number, y: number, width: number, height: number): void; copyTextureToTexture(source: com.mojang.blaze3d.textures.GpuTexture, destination: com.mojang.blaze3d.textures.GpuTexture, mipLevel: number, destX: number, destY: number, sourceX: number, sourceY: number, width: number, height: number): void; - presentTexture(texture: com.mojang.blaze3d.textures.GpuTextureView): void; createFence(): com.mojang.blaze3d.buffers.GpuFence; - timerQueryBegin(): com.mojang.blaze3d.systems.GpuQuery; - timerQueryEnd(query: com.mojang.blaze3d.systems.GpuQuery): void; + writeTimestamp(pool: com.mojang.blaze3d.systems.GpuQueryPool, index: number): void; + } + interface TransientMemory { + allocateCpu(size: number, alignment: number): java.nio.ByteBuffer; + allocateCpu(size: number, alignment: number, minimumAllocation: number, elementSize: number): java.nio.ByteBuffer; + allocateStaging(size: number, alignment: number, usage: number): com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; + allocateStaging(size: number, alignment: number, usage: number, minimumAllocation: number, elementSize: number): com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; + allocateGpu(size: number, alignment: number, usage: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + allocateGpu(size: number, alignment: number, usage: number, minimumAllocation: number, elementSize: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + allocateGpuMapped(size: number, alignment: number, usage: number): com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; + allocateGpuMapped(size: number, alignment: number, usage: number, minimumAllocation: number, elementSize: number): com.mojang.blaze3d.buffers.GpuBufferSlice$MappedView; + uploadStaging(data: java.nio.ByteBuffer, alignment: number, usage: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + uploadStaging(data: java.nio.ByteBuffer, alignment: number, usage: number, minimumAllocation: number, elementSize: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + uploadStaging(data: Array, alignment: number, usage: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + uploadStaging(data: Array, alignment: number, usage: number, minimumAllocation: number, elementSize: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + uploadGpu(data: java.nio.ByteBuffer, alignment: number, usage: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + uploadGpu(data: java.nio.ByteBuffer, alignment: number, usage: number, minimumAllocation: number, elementSize: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + uploadGpu(data: Array, alignment: number, usage: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + uploadGpu(data: Array, alignment: number, usage: number, minimumAllocation: number, elementSize: number): com.mojang.blaze3d.buffers.GpuBufferSlice; + multiUploadStaging(data: Array, alignment: number, usage: number): Array; + multiUploadGpu(data: Array, alignment: number, usage: number): Array; + } + const RenderPassDescriptor: { + Attachment: typeof com.mojang.blaze3d.systems.RenderPassDescriptor$Attachment; + create(label: unknown): com.mojang.blaze3d.systems.RenderPassDescriptor; + } + interface RenderPassDescriptor { + renderArea: com.mojang.blaze3d.systems.RenderPass$RenderArea | null | undefined; + label(): unknown; + colorAttachments(): Array> | null | undefined>; + depthAttachment(): com.mojang.blaze3d.systems.RenderPassDescriptor$Attachment | null | undefined; + withColorAttachment(textureView: com.mojang.blaze3d.textures.GpuTextureView): com.mojang.blaze3d.systems.RenderPassDescriptor; + withColorAttachment(textureView: com.mojang.blaze3d.textures.GpuTextureView, clearValue: java.util.Optional): com.mojang.blaze3d.systems.RenderPassDescriptor; + withUnusedColorAttachment(): com.mojang.blaze3d.systems.RenderPassDescriptor; + withDepthAttachment(textureView: com.mojang.blaze3d.textures.GpuTextureView): com.mojang.blaze3d.systems.RenderPassDescriptor; + withDepthAttachment(textureView: com.mojang.blaze3d.textures.GpuTextureView, clearValue: java.util.OptionalDouble): com.mojang.blaze3d.systems.RenderPassDescriptor; + withRenderArea(renderArea: com.mojang.blaze3d.systems.RenderPass$RenderArea): com.mojang.blaze3d.systems.RenderPassDescriptor; + } + const RenderPassDescriptor$Attachment: { + new(textureView: com.mojang.blaze3d.textures.GpuTextureView, clearValue: T): com.mojang.blaze3d.systems.RenderPassDescriptor$Attachment; + } + interface RenderPassDescriptor$Attachment extends java.lang.Record { + textureView(): com.mojang.blaze3d.textures.GpuTextureView; + clearValue(): T; + } + const RenderPass$RenderArea: { + new(x: number, y: number, width: number, height: number): com.mojang.blaze3d.systems.RenderPass$RenderArea; } - interface GpuQuery extends java.lang.AutoCloseable { - getValue(): java.util.OptionalLong; + interface RenderPass$RenderArea extends java.lang.Record { + fillsTexture(texture: com.mojang.blaze3d.textures.GpuTextureView): boolean; + x(): number; + y(): number; + width(): number; + height(): number; + } + const DeviceInfo: { + new(name: string, vendorName: string, driverInfo: string, isZZeroToOne: boolean, backendName: string, timestampPeriod: number, limits: com.mojang.blaze3d.systems.DeviceLimits, features: com.mojang.blaze3d.systems.DeviceFeatures, underlyingExtensions: Set, hintsAndWorkarounds: com.mojang.blaze3d.systems.HintsAndWorkarounds, type: com.mojang.blaze3d.systems.DeviceType): com.mojang.blaze3d.systems.DeviceInfo; + } + interface DeviceInfo extends java.lang.Record { + name(): string; + vendorName(): string; + driverInfo(): string; + isZZeroToOne(): boolean; + backendName(): string; + timestampPeriod(): number; + limits(): com.mojang.blaze3d.systems.DeviceLimits; + features(): com.mojang.blaze3d.systems.DeviceFeatures; + underlyingExtensions(): Set; + hintsAndWorkarounds(): com.mojang.blaze3d.systems.HintsAndWorkarounds; + type(): com.mojang.blaze3d.systems.DeviceType; + } + const DeviceLimits: { + new(maxAnisotropy: number, minUniformOffsetAlignment: number, maxTextureSize: number, maxMemoryAllocationSize: number, maxMultiDrawDirectInterleavedDrawCount: number, maxColorAttachments: number): com.mojang.blaze3d.systems.DeviceLimits; + } + interface DeviceLimits extends java.lang.Record { + maxTextureSizeForFormat(format: com.mojang.blaze3d.GpuFormat): number; + maxAnisotropy(): number; + minUniformOffsetAlignment(): number; + maxTextureSize(): number; + maxMemoryAllocationSize(): number; + maxMultiDrawDirectInterleavedDrawCount(): number; + maxColorAttachments(): number; + } + const DeviceFeatures: { + new(shaderDrawParameters: boolean, multiDrawDirectInterleaved: boolean, multiDrawDirectSeparate: boolean, multiDrawIndirect: boolean, drawIndirect: boolean, nonZeroFirstInstance: boolean, persistentMapping: boolean): com.mojang.blaze3d.systems.DeviceFeatures; + } + interface DeviceFeatures extends java.lang.Record { + shaderDrawParameters(): boolean; + multiDrawDirectInterleaved(): boolean; + multiDrawDirectSeparate(): boolean; + multiDrawIndirect(): boolean; + drawIndirect(): boolean; + nonZeroFirstInstance(): boolean; + persistentMapping(): boolean; + } + const HintsAndWorkarounds: { + new(writeToBufferIsSlow: boolean, anisotropyHasKnownIssues: boolean): com.mojang.blaze3d.systems.HintsAndWorkarounds; + } + interface HintsAndWorkarounds extends java.lang.Record { + writeToBufferIsSlow(): boolean; + anisotropyHasKnownIssues(): boolean; + } + const DeviceType: { + OTHER: com.mojang.blaze3d.systems.DeviceType; + INTEGRATED: com.mojang.blaze3d.systems.DeviceType; + DISCRETE: com.mojang.blaze3d.systems.DeviceType; + VIRTUAL: com.mojang.blaze3d.systems.DeviceType; + CPU: com.mojang.blaze3d.systems.DeviceType; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.systems.DeviceType; + } + interface DeviceType extends kotlin.Enum { } const RenderPass$Draw: { - new(slot: number, vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType, firstIndex: number, indexCount: number, baseVertex: number): com.mojang.blaze3d.systems.RenderPass$Draw; - new(slot: number, vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer | null | undefined, indexType: com.mojang.blaze3d.vertex.VertexFormat$IndexType | null | undefined, firstIndex: number, indexCount: number, baseVertex: number, uniformUploaderConsumer: unknown): com.mojang.blaze3d.systems.RenderPass$Draw; + new(slot: number, vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexType: com.mojang.blaze3d.IndexType, firstIndex: number, indexCount: number, baseVertex: number): com.mojang.blaze3d.systems.RenderPass$Draw; + new(slot: number, vertexBuffer: com.mojang.blaze3d.buffers.GpuBuffer, indexBuffer: com.mojang.blaze3d.buffers.GpuBuffer | null | undefined, indexType: com.mojang.blaze3d.IndexType | null | undefined, firstIndex: number, indexCount: number, baseVertex: number, uniformUploaderConsumer: unknown): com.mojang.blaze3d.systems.RenderPass$Draw; } interface RenderPass$Draw extends java.lang.Record { slot(): number; vertexBuffer(): com.mojang.blaze3d.buffers.GpuBuffer; indexBuffer(): com.mojang.blaze3d.buffers.GpuBuffer | null | undefined; - indexType(): com.mojang.blaze3d.vertex.VertexFormat$IndexType | null | undefined; + indexType(): com.mojang.blaze3d.IndexType | null | undefined; firstIndex(): number; indexCount(): number; baseVertex(): number; @@ -39705,63 +40144,80 @@ declare global { getName(): string; setWindowHints(): void; handleWindowCreationErrors(error: com.mojang.blaze3d.GLFWErrorCapture$Error): void; - createDevice(window: number, defaultShaderSource: com.mojang.blaze3d.shaders.ShaderSource, debugOptions: com.mojang.blaze3d.shaders.GpuDebugOptions): com.mojang.blaze3d.systems.GpuDevice; + createDevice(window: number, defaultShaderSource: com.mojang.blaze3d.shaders.ShaderSource, debugOptions: com.mojang.blaze3d.shaders.GpuDebugOptions, criticalShaderLoader: java.lang.Runnable): com.mojang.blaze3d.systems.GpuDevice; } const GpuDevice: { - new(backend: com.mojang.blaze3d.systems.GpuDeviceBackend): com.mojang.blaze3d.systems.GpuDevice; + new(backend: com.mojang.blaze3d.systems.GpuDeviceBackend, criticalShaderLoader: java.lang.Runnable): com.mojang.blaze3d.systems.GpuDevice; } interface GpuDevice { + createSurface(windowHandle: number): com.mojang.blaze3d.systems.GpuSurface; createCommandEncoder(): com.mojang.blaze3d.systems.CommandEncoder; createSampler(addressModeU: com.mojang.blaze3d.textures.AddressMode, addressModeV: com.mojang.blaze3d.textures.AddressMode, minFilter: com.mojang.blaze3d.textures.FilterMode, magFilter: com.mojang.blaze3d.textures.FilterMode, maxAnisotropy: number, maxLod: java.util.OptionalDouble): com.mojang.blaze3d.textures.GpuSampler; - createTexture(label: unknown, usage: number, format: com.mojang.blaze3d.textures.TextureFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; - createTexture(label: string | null | undefined, usage: number, format: com.mojang.blaze3d.textures.TextureFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; + createTexture(label: unknown, usage: number, format: com.mojang.blaze3d.GpuFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; + createTexture(label: string | null | undefined, usage: number, format: com.mojang.blaze3d.GpuFormat, width: number, height: number, depthOrLayers: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTexture; createTextureView(texture: com.mojang.blaze3d.textures.GpuTexture): com.mojang.blaze3d.textures.GpuTextureView; createTextureView(texture: com.mojang.blaze3d.textures.GpuTexture, baseMipLevel: number, mipLevels: number): com.mojang.blaze3d.textures.GpuTextureView; createBuffer(label: unknown, usage: number, size: number): com.mojang.blaze3d.buffers.GpuBuffer; createBuffer(label: unknown, usage: number, data: java.nio.ByteBuffer): com.mojang.blaze3d.buffers.GpuBuffer; - getImplementationInformation(): string; getLastDebugMessages(): Array; isDebuggingEnabled(): boolean; - getVendor(): string; - getBackendName(): string; - getVersion(): string; - getRenderer(): string; - getMaxTextureSize(): number; - getUniformOffsetAlignment(): number; precompilePipeline(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline): com.mojang.blaze3d.pipeline.CompiledRenderPipeline; precompilePipeline(pipeline: com.mojang.blaze3d.pipeline.RenderPipeline, shaderSource: com.mojang.blaze3d.shaders.ShaderSource | null | undefined): com.mojang.blaze3d.pipeline.CompiledRenderPipeline; clearPipelineCache(): void; - getEnabledExtensions(): Array; - getMaxSupportedAnisotropy(): number; + loadCriticalShaders(): void; close(): void; - setVsync(enabled: boolean): void; - presentFrame(): void; - isZZeroToOne(): boolean; + createTimestampQueryPool(size: number): com.mojang.blaze3d.systems.GpuQueryPool; + getDeviceInfo(): com.mojang.blaze3d.systems.DeviceInfo; + } + const GpuSurface: { + Configuration: typeof com.mojang.blaze3d.systems.GpuSurface$Configuration; + PresentMode: typeof com.mojang.blaze3d.systems.GpuSurface$PresentMode; + new(backend: com.mojang.blaze3d.systems.GpuSurfaceBackend): com.mojang.blaze3d.systems.GpuSurface; + } + interface GpuSurface extends java.lang.AutoCloseable { + currentConfiguration(): java.util.Optional; + configure(config: com.mojang.blaze3d.systems.GpuSurface$Configuration): void; + supportedPresentModes(): Array; + isSuboptimal(): boolean; + isAcquired(): boolean; + acquireNextTexture(): void; + blitFromTexture(commandEncoder: com.mojang.blaze3d.systems.CommandEncoder, textureView: com.mojang.blaze3d.textures.GpuTextureView): void; + present(): void; } const CommandEncoder: { - new(device: com.mojang.blaze3d.systems.GpuDeviceBackend, backend: com.mojang.blaze3d.systems.CommandEncoderBackend): com.mojang.blaze3d.systems.CommandEncoder; + new(profiler: com.mojang.blaze3d.systems.TracyGpuProfiler | null | undefined, device: com.mojang.blaze3d.systems.GpuDeviceBackend, backend: com.mojang.blaze3d.systems.CommandEncoderBackend): com.mojang.blaze3d.systems.CommandEncoder; } interface CommandEncoder { - createRenderPass(label: unknown, colorTexture: com.mojang.blaze3d.textures.GpuTextureView, clearColor: java.util.OptionalInt): com.mojang.blaze3d.systems.RenderPass; - createRenderPass(label: unknown, colorTexture: com.mojang.blaze3d.textures.GpuTextureView, clearColor: java.util.OptionalInt, depthTexture: com.mojang.blaze3d.textures.GpuTextureView | null | undefined, clearDepth: java.util.OptionalDouble): com.mojang.blaze3d.systems.RenderPass; - clearColorTexture(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: number): void; - clearColorAndDepthTextures(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: number, depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number): void; - clearColorAndDepthTextures(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: number, depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number, regionX: number, regionY: number, regionWidth: number, regionHeight: number): void; + submit(): void; + transientMemory(): com.mojang.blaze3d.systems.TransientMemory; + createRenderPass(label: unknown, colorTexture: com.mojang.blaze3d.textures.GpuTextureView, clearColor: java.util.Optional): com.mojang.blaze3d.systems.RenderPass; + createRenderPass(label: unknown, colorTexture: com.mojang.blaze3d.textures.GpuTextureView, clearColor: java.util.Optional, depthTexture: com.mojang.blaze3d.textures.GpuTextureView | null | undefined, clearDepth: java.util.OptionalDouble): com.mojang.blaze3d.systems.RenderPass; + createRenderPass(label: unknown, colorTexture: com.mojang.blaze3d.textures.GpuTextureView, clearColor: java.util.Optional, depthTexture: com.mojang.blaze3d.textures.GpuTextureView | null | undefined, clearDepth: java.util.OptionalDouble, renderArea: com.mojang.blaze3d.systems.RenderPass$RenderArea): com.mojang.blaze3d.systems.RenderPass; + createRenderPass(descriptor: com.mojang.blaze3d.systems.RenderPassDescriptor): com.mojang.blaze3d.systems.RenderPass; + clearColorTexture(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: org.joml.Vector4fc): void; + clearColorAndDepthTextures(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: org.joml.Vector4fc, depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number): void; + clearColorAndDepthTextures(colorTexture: com.mojang.blaze3d.textures.GpuTexture, clearColor: org.joml.Vector4fc, depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number, regionX: number, regionY: number, regionWidth: number, regionHeight: number): void; clearDepthTexture(depthTexture: com.mojang.blaze3d.textures.GpuTexture, clearDepth: number): void; writeToBuffer(destination: com.mojang.blaze3d.buffers.GpuBufferSlice, data: java.nio.ByteBuffer): void; - mapBuffer(buffer: com.mojang.blaze3d.buffers.GpuBuffer, read: boolean, write: boolean): com.mojang.blaze3d.buffers.GpuBuffer$MappedView; - mapBuffer(slice: com.mojang.blaze3d.buffers.GpuBufferSlice, read: boolean, write: boolean): com.mojang.blaze3d.buffers.GpuBuffer$MappedView; copyToBuffer(source: com.mojang.blaze3d.buffers.GpuBufferSlice, target: com.mojang.blaze3d.buffers.GpuBufferSlice): void; writeToTexture(destination: com.mojang.blaze3d.textures.GpuTexture, source: com.mojang.blaze3d.platform.NativeImage): void; - writeToTexture(destination: com.mojang.blaze3d.textures.GpuTexture, source: com.mojang.blaze3d.platform.NativeImage, mipLevel: number, depthOrLayer: number, destX: number, destY: number, width: number, height: number, sourceX: number, sourceY: number): void; - writeToTexture(destination: com.mojang.blaze3d.textures.GpuTexture, source: java.nio.ByteBuffer, format: com.mojang.blaze3d.platform.NativeImage$Format, mipLevel: number, depthOrLayer: number, destX: number, destY: number, width: number, height: number): void; + writeToTexture(destination: com.mojang.blaze3d.textures.GpuTexture, source: com.mojang.blaze3d.platform.NativeImage, mipLevel: number, depthOrLayer: number, destX: number, destY: number): void; + writeToTexture(destination: com.mojang.blaze3d.textures.GpuTexture, source: java.nio.ByteBuffer, mipLevel: number, depthOrLayer: number, destX: number, destY: number, width: number, height: number): void; + copyBufferToTexture(source: com.mojang.blaze3d.buffers.GpuBufferSlice, sourceX: number, sourceY: number, sourceWidth: number, sourceHeight: number, destination: com.mojang.blaze3d.textures.GpuTexture, destinationX: number, destinationY: number, copyWidth: number, copyHeight: number, mipLevel: number, arrayLayer: number): void; copyTextureToBuffer(source: com.mojang.blaze3d.textures.GpuTexture, destination: com.mojang.blaze3d.buffers.GpuBuffer, offset: number, callback: java.lang.Runnable, mipLevel: number): void; copyTextureToBuffer(source: com.mojang.blaze3d.textures.GpuTexture, destination: com.mojang.blaze3d.buffers.GpuBuffer, offset: number, callback: java.lang.Runnable, mipLevel: number, x: number, y: number, width: number, height: number): void; copyTextureToTexture(source: com.mojang.blaze3d.textures.GpuTexture, destination: com.mojang.blaze3d.textures.GpuTexture, mipLevel: number, destX: number, destY: number, sourceX: number, sourceY: number, width: number, height: number): void; - presentTexture(textureView: com.mojang.blaze3d.textures.GpuTextureView): void; createFence(): com.mojang.blaze3d.buffers.GpuFence; - timerQueryBegin(): com.mojang.blaze3d.systems.GpuQuery; - timerQueryEnd(query: com.mojang.blaze3d.systems.GpuQuery): void; + writeTimestamp(pool: com.mojang.blaze3d.systems.GpuQueryPool, index: number): void; + } + const TracyGpuProfiler: { + new(device: com.mojang.blaze3d.systems.GpuDevice): com.mojang.blaze3d.systems.TracyGpuProfiler; + } + interface TracyGpuProfiler { + close(): void; + pushZone(encoder: com.mojang.blaze3d.systems.CommandEncoder, name: string): void; + popZone(encoder: com.mojang.blaze3d.systems.CommandEncoder): void; + endFrame(): void; } } namespace font { @@ -39838,6 +40294,131 @@ declare global { afterExecutePass(name: string): void; } } + const GpuFormat: { + R8_UNORM: com.mojang.blaze3d.GpuFormat; + R8_SNORM: com.mojang.blaze3d.GpuFormat; + RG8_UNORM: com.mojang.blaze3d.GpuFormat; + RG8_SNORM: com.mojang.blaze3d.GpuFormat; + RGB8_UNORM: com.mojang.blaze3d.GpuFormat; + RGB8_SNORM: com.mojang.blaze3d.GpuFormat; + RGBA8_UNORM: com.mojang.blaze3d.GpuFormat; + RGBA8_SNORM: com.mojang.blaze3d.GpuFormat; + R16_UNORM: com.mojang.blaze3d.GpuFormat; + R16_SNORM: com.mojang.blaze3d.GpuFormat; + RG16_UNORM: com.mojang.blaze3d.GpuFormat; + RG16_SNORM: com.mojang.blaze3d.GpuFormat; + RGB16_UNORM: com.mojang.blaze3d.GpuFormat; + RGB16_SNORM: com.mojang.blaze3d.GpuFormat; + RGBA16_UNORM: com.mojang.blaze3d.GpuFormat; + RGBA16_SNORM: com.mojang.blaze3d.GpuFormat; + R8_UINT: com.mojang.blaze3d.GpuFormat; + R8_SINT: com.mojang.blaze3d.GpuFormat; + RG8_UINT: com.mojang.blaze3d.GpuFormat; + RG8_SINT: com.mojang.blaze3d.GpuFormat; + RGB8_UINT: com.mojang.blaze3d.GpuFormat; + RGB8_SINT: com.mojang.blaze3d.GpuFormat; + RGBA8_UINT: com.mojang.blaze3d.GpuFormat; + RGBA8_SINT: com.mojang.blaze3d.GpuFormat; + R16_UINT: com.mojang.blaze3d.GpuFormat; + R16_SINT: com.mojang.blaze3d.GpuFormat; + RG16_UINT: com.mojang.blaze3d.GpuFormat; + RG16_SINT: com.mojang.blaze3d.GpuFormat; + RGB16_UINT: com.mojang.blaze3d.GpuFormat; + RGB16_SINT: com.mojang.blaze3d.GpuFormat; + RGBA16_UINT: com.mojang.blaze3d.GpuFormat; + RGBA16_SINT: com.mojang.blaze3d.GpuFormat; + R32_UINT: com.mojang.blaze3d.GpuFormat; + R32_SINT: com.mojang.blaze3d.GpuFormat; + RG32_UINT: com.mojang.blaze3d.GpuFormat; + RG32_SINT: com.mojang.blaze3d.GpuFormat; + RGB32_UINT: com.mojang.blaze3d.GpuFormat; + RGB32_SINT: com.mojang.blaze3d.GpuFormat; + RGBA32_UINT: com.mojang.blaze3d.GpuFormat; + RGBA32_SINT: com.mojang.blaze3d.GpuFormat; + R16_FLOAT: com.mojang.blaze3d.GpuFormat; + RG16_FLOAT: com.mojang.blaze3d.GpuFormat; + RGB16_FLOAT: com.mojang.blaze3d.GpuFormat; + RGBA16_FLOAT: com.mojang.blaze3d.GpuFormat; + R32_FLOAT: com.mojang.blaze3d.GpuFormat; + RG32_FLOAT: com.mojang.blaze3d.GpuFormat; + RGB32_FLOAT: com.mojang.blaze3d.GpuFormat; + RGBA32_FLOAT: com.mojang.blaze3d.GpuFormat; + RGB10A2_UNORM: com.mojang.blaze3d.GpuFormat; + RGB10A2_UINT: com.mojang.blaze3d.GpuFormat; + RG11B10_FLOAT: com.mojang.blaze3d.GpuFormat; + D32_FLOAT: com.mojang.blaze3d.GpuFormat; + D32_FLOAT_S8_UINT: com.mojang.blaze3d.GpuFormat; + D24_UNORM_S8_UINT: com.mojang.blaze3d.GpuFormat; + D16_UNORM: com.mojang.blaze3d.GpuFormat; + S8_UINT: com.mojang.blaze3d.GpuFormat; + ComponentType: typeof com.mojang.blaze3d.GpuFormat$ComponentType; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.GpuFormat; + } + interface GpuFormat extends kotlin.Enum { + componentType(): com.mojang.blaze3d.GpuFormat$ComponentType; + componentCount(): number; + blockSize(): number; + byteAlignment(): number; + hasColorAspect(): boolean; + hasDepthAspect(): boolean; + hasStencilAspect(): boolean; + } + const GpuFormat$ComponentType: { + UNORM_8: com.mojang.blaze3d.GpuFormat$ComponentType; + SNORM_8: com.mojang.blaze3d.GpuFormat$ComponentType; + UINT_8: com.mojang.blaze3d.GpuFormat$ComponentType; + SINT_8: com.mojang.blaze3d.GpuFormat$ComponentType; + UNORM_16: com.mojang.blaze3d.GpuFormat$ComponentType; + SNORM_16: com.mojang.blaze3d.GpuFormat$ComponentType; + UINT_16: com.mojang.blaze3d.GpuFormat$ComponentType; + SINT_16: com.mojang.blaze3d.GpuFormat$ComponentType; + FLOAT_16: com.mojang.blaze3d.GpuFormat$ComponentType; + UINT_32: com.mojang.blaze3d.GpuFormat$ComponentType; + SINT_32: com.mojang.blaze3d.GpuFormat$ComponentType; + FLOAT_32: com.mojang.blaze3d.GpuFormat$ComponentType; + OPAQUE_8: com.mojang.blaze3d.GpuFormat$ComponentType; + OPAQUE_16: com.mojang.blaze3d.GpuFormat$ComponentType; + OPAQUE_32: com.mojang.blaze3d.GpuFormat$ComponentType; + OPAQUE_64: com.mojang.blaze3d.GpuFormat$ComponentType; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.GpuFormat$ComponentType; + } + interface GpuFormat$ComponentType extends kotlin.Enum { + byteSize(): number; + } + const PrimitiveTopology: { + LINES: com.mojang.blaze3d.PrimitiveTopology; + DEBUG_LINES: com.mojang.blaze3d.PrimitiveTopology; + DEBUG_LINE_STRIP: com.mojang.blaze3d.PrimitiveTopology; + POINTS: com.mojang.blaze3d.PrimitiveTopology; + TRIANGLES: com.mojang.blaze3d.PrimitiveTopology; + TRIANGLE_STRIP: com.mojang.blaze3d.PrimitiveTopology; + TRIANGLE_FAN: com.mojang.blaze3d.PrimitiveTopology; + QUADS: com.mojang.blaze3d.PrimitiveTopology; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.PrimitiveTopology; + } + interface PrimitiveTopology extends kotlin.Enum { + primitiveLength: number; + primitiveStride: number; + connectedPrimitives: boolean; + indexCount(vertexCount: number): number; + } + const IndexType: { + SHORT: com.mojang.blaze3d.IndexType; + INT: com.mojang.blaze3d.IndexType; + entries: kotlin.enums.EnumEntries; + least(length: number): com.mojang.blaze3d.IndexType; + values(): Array; + valueOf(value: string): com.mojang.blaze3d.IndexType; + } + interface IndexType extends kotlin.Enum { + bytes: number; + } const GLFWErrorCapture$Error: { new(error: number, description: string): com.mojang.blaze3d.GLFWErrorCapture$Error; } @@ -41001,15 +41582,23 @@ declare global { curry(): unknown; curry2(): unknown; } - interface Function8 { - apply(p0: T1, p1: T2, p2: T3, p3: T4, p4: T5, p5: T6, p6: T7, p7: T8): R; + interface Function16 { + apply(p0: T1, p1: T2, p2: T3, p3: T4, p4: T5, p5: T6, p6: T7, p7: T8, p8: T9, p9: T10, p10: T11, p11: T12, p12: T13, p13: T14, p14: T15, p15: T16): R; curry(): unknown; curry2(): unknown; - curry3(): com.mojang.datafixers.util.Function3>; - curry4(): com.mojang.datafixers.util.Function4>; - curry5(): com.mojang.datafixers.util.Function5>; - curry6(): com.mojang.datafixers.util.Function6; - curry7(): com.mojang.datafixers.util.Function7; + curry3(): com.mojang.datafixers.util.Function3>; + curry4(): com.mojang.datafixers.util.Function4>; + curry5(): com.mojang.datafixers.util.Function5>; + curry6(): com.mojang.datafixers.util.Function6>; + curry7(): com.mojang.datafixers.util.Function7>; + curry8(): com.mojang.datafixers.util.Function8>; + curry9(): com.mojang.datafixers.util.Function9>; + curry10(): com.mojang.datafixers.util.Function10>; + curry11(): com.mojang.datafixers.util.Function11>; + curry12(): com.mojang.datafixers.util.Function12>; + curry13(): com.mojang.datafixers.util.Function13>; + curry14(): com.mojang.datafixers.util.Function14; + curry15(): com.mojang.datafixers.util.Function15; } interface Function4 { apply(p0: T1, p1: T2, p2: T3, p3: T4): R; @@ -41041,6 +41630,16 @@ declare global { curry5(): com.mojang.datafixers.util.Function5; curry6(): com.mojang.datafixers.util.Function6; } + interface Function8 { + apply(p0: T1, p1: T2, p2: T3, p3: T4, p4: T5, p5: T6, p6: T7, p7: T8): R; + curry(): unknown; + curry2(): unknown; + curry3(): com.mojang.datafixers.util.Function3>; + curry4(): com.mojang.datafixers.util.Function4>; + curry5(): com.mojang.datafixers.util.Function5>; + curry6(): com.mojang.datafixers.util.Function6; + curry7(): com.mojang.datafixers.util.Function7; + } interface Function9 { apply(p0: T1, p1: T2, p2: T3, p3: T4, p4: T5, p5: T6, p6: T7, p7: T8, p8: T9): R; curry(): unknown; @@ -41139,24 +41738,6 @@ declare global { curry13(): com.mojang.datafixers.util.Function13; curry14(): com.mojang.datafixers.util.Function14; } - interface Function16 { - apply(p0: T1, p1: T2, p2: T3, p3: T4, p4: T5, p5: T6, p6: T7, p7: T8, p8: T9, p9: T10, p10: T11, p11: T12, p12: T13, p13: T14, p14: T15, p15: T16): R; - curry(): unknown; - curry2(): unknown; - curry3(): com.mojang.datafixers.util.Function3>; - curry4(): com.mojang.datafixers.util.Function4>; - curry5(): com.mojang.datafixers.util.Function5>; - curry6(): com.mojang.datafixers.util.Function6>; - curry7(): com.mojang.datafixers.util.Function7>; - curry8(): com.mojang.datafixers.util.Function8>; - curry9(): com.mojang.datafixers.util.Function9>; - curry10(): com.mojang.datafixers.util.Function10>; - curry11(): com.mojang.datafixers.util.Function11>; - curry12(): com.mojang.datafixers.util.Function12>; - curry13(): com.mojang.datafixers.util.Function13>; - curry14(): com.mojang.datafixers.util.Function14; - curry15(): com.mojang.datafixers.util.Function15; - } const Either: { Instance: typeof com.mojang.datafixers.util.Either$Instance; Mu: typeof com.mojang.datafixers.util.Either$Mu; @@ -41555,10 +42136,9 @@ declare global { } } const Products$P1: { - new(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P1; + new(t1: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P1; } - interface Products$P1 { - t1(): com.mojang.datafixers.kinds.App; + interface Products$P1 extends java.lang.Record { and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P2; and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P3; and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P4; @@ -41566,88 +42146,148 @@ declare global { and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P6; and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P7; and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P8; + and(p0: com.mojang.datafixers.Products$P8): com.mojang.datafixers.Products$P9; + and(p0: com.mojang.datafixers.Products$P9): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P10): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P11): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P12): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P13): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P14): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P15): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: unknown): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; } const Products$P2: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P2; + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P2; } - interface Products$P2 { - t1(): com.mojang.datafixers.kinds.App; - t2(): com.mojang.datafixers.kinds.App; + interface Products$P2 extends java.lang.Record { and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P3; and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P4; and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P5; and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P6; and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P7; and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P8; + and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P9; + and(p0: com.mojang.datafixers.Products$P8): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P9): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P10): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P11): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P12): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P13): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P14): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: unknown): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; } const Products$P3: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P3; + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P3; } - interface Products$P3 { - t1(): com.mojang.datafixers.kinds.App; - t2(): com.mojang.datafixers.kinds.App; - t3(): com.mojang.datafixers.kinds.App; + interface Products$P3 extends java.lang.Record { and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P4; and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P5; and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P6; and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P7; and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P8; + and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P9; + and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P8): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P9): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P10): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P11): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P12): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P13): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function3): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; - } - const Products$P4: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P4; - } - interface Products$P4 { t1(): com.mojang.datafixers.kinds.App; t2(): com.mojang.datafixers.kinds.App; t3(): com.mojang.datafixers.kinds.App; - t4(): com.mojang.datafixers.kinds.App; + } + const Products$P4: { + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P4; + } + interface Products$P4 extends java.lang.Record { and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P5; and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P6; and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P7; and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P8; + and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P9; + and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P8): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P9): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P10): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P11): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P12): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function4): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; - } - const Products$P5: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P5; - } - interface Products$P5 { t1(): com.mojang.datafixers.kinds.App; t2(): com.mojang.datafixers.kinds.App; t3(): com.mojang.datafixers.kinds.App; t4(): com.mojang.datafixers.kinds.App; - t5(): com.mojang.datafixers.kinds.App; + } + const Products$P5: { + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P5; + } + interface Products$P5 extends java.lang.Record { and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P6; and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P7; and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P8; + and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P9; + and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P8): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P9): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P10): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P11): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function5): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; - } - const Products$P6: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P6; - } - interface Products$P6 { t1(): com.mojang.datafixers.kinds.App; t2(): com.mojang.datafixers.kinds.App; t3(): com.mojang.datafixers.kinds.App; t4(): com.mojang.datafixers.kinds.App; t5(): com.mojang.datafixers.kinds.App; - t6(): com.mojang.datafixers.kinds.App; + } + const Products$P6: { + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P6; + } + interface Products$P6 extends java.lang.Record { and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P7; and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P8; + and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P9; + and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P8): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P9): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P10): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function6): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; } const Products$P7: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P7; + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P7; } - interface Products$P7 { + interface Products$P7 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P8; + and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P9; + and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P8): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P9): com.mojang.datafixers.Products$P16; + apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function7): com.mojang.datafixers.kinds.App; + apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; t1(): com.mojang.datafixers.kinds.App; t2(): com.mojang.datafixers.kinds.App; t3(): com.mojang.datafixers.kinds.App; @@ -41655,14 +42295,21 @@ declare global { t5(): com.mojang.datafixers.kinds.App; t6(): com.mojang.datafixers.kinds.App; t7(): com.mojang.datafixers.kinds.App; - and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P8; - apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function7): com.mojang.datafixers.kinds.App; - apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; } const Products$P8: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P8; - } - interface Products$P8 { + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P8; + } + interface Products$P8 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P9; + and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P8): com.mojang.datafixers.Products$P16; + apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function8): com.mojang.datafixers.kinds.App; + apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; t1(): com.mojang.datafixers.kinds.App; t2(): com.mojang.datafixers.kinds.App; t3(): com.mojang.datafixers.kinds.App; @@ -41671,64 +42318,190 @@ declare global { t6(): com.mojang.datafixers.kinds.App; t7(): com.mojang.datafixers.kinds.App; t8(): com.mojang.datafixers.kinds.App; - apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function8): com.mojang.datafixers.kinds.App; - apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; } const Products$P9: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App, p8: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P9; - } - interface Products$P9 { + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App, t9: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P9; + } + interface Products$P9 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P10; + and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P7): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function9): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; + t7(): com.mojang.datafixers.kinds.App; + t8(): com.mojang.datafixers.kinds.App; + t9(): com.mojang.datafixers.kinds.App; } const Products$P10: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App, p8: com.mojang.datafixers.kinds.App, p9: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P10; - } - interface Products$P10 { + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App, t9: com.mojang.datafixers.kinds.App, t10: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P10; + } + interface Products$P10 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P11; + and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P6): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function10): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; + t7(): com.mojang.datafixers.kinds.App; + t8(): com.mojang.datafixers.kinds.App; + t9(): com.mojang.datafixers.kinds.App; + t10(): com.mojang.datafixers.kinds.App; } const Products$P11: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App, p8: com.mojang.datafixers.kinds.App, p9: com.mojang.datafixers.kinds.App, p10: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P11; - } - interface Products$P11 { + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App, t9: com.mojang.datafixers.kinds.App, t10: com.mojang.datafixers.kinds.App, t11: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P11; + } + interface Products$P11 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P12; + and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P5): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function11): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; + t7(): com.mojang.datafixers.kinds.App; + t8(): com.mojang.datafixers.kinds.App; + t9(): com.mojang.datafixers.kinds.App; + t10(): com.mojang.datafixers.kinds.App; + t11(): com.mojang.datafixers.kinds.App; } const Products$P12: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App, p8: com.mojang.datafixers.kinds.App, p9: com.mojang.datafixers.kinds.App, p10: com.mojang.datafixers.kinds.App, p11: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P12; + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App, t9: com.mojang.datafixers.kinds.App, t10: com.mojang.datafixers.kinds.App, t11: com.mojang.datafixers.kinds.App, t12: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P12; } - interface Products$P12 { + interface Products$P12 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P13; + and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P4): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function12): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; + t7(): com.mojang.datafixers.kinds.App; + t8(): com.mojang.datafixers.kinds.App; + t9(): com.mojang.datafixers.kinds.App; + t10(): com.mojang.datafixers.kinds.App; + t11(): com.mojang.datafixers.kinds.App; + t12(): com.mojang.datafixers.kinds.App; } const Products$P13: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App, p8: com.mojang.datafixers.kinds.App, p9: com.mojang.datafixers.kinds.App, p10: com.mojang.datafixers.kinds.App, p11: com.mojang.datafixers.kinds.App, p12: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P13; + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App, t9: com.mojang.datafixers.kinds.App, t10: com.mojang.datafixers.kinds.App, t11: com.mojang.datafixers.kinds.App, t12: com.mojang.datafixers.kinds.App, t13: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P13; } - interface Products$P13 { + interface Products$P13 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P14; + and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P3): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function13): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; + t7(): com.mojang.datafixers.kinds.App; + t8(): com.mojang.datafixers.kinds.App; + t9(): com.mojang.datafixers.kinds.App; + t10(): com.mojang.datafixers.kinds.App; + t11(): com.mojang.datafixers.kinds.App; + t12(): com.mojang.datafixers.kinds.App; + t13(): com.mojang.datafixers.kinds.App; } const Products$P14: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App, p8: com.mojang.datafixers.kinds.App, p9: com.mojang.datafixers.kinds.App, p10: com.mojang.datafixers.kinds.App, p11: com.mojang.datafixers.kinds.App, p12: com.mojang.datafixers.kinds.App, p13: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P14; + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App, t9: com.mojang.datafixers.kinds.App, t10: com.mojang.datafixers.kinds.App, t11: com.mojang.datafixers.kinds.App, t12: com.mojang.datafixers.kinds.App, t13: com.mojang.datafixers.kinds.App, t14: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P14; } - interface Products$P14 { + interface Products$P14 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P15; + and(p0: com.mojang.datafixers.Products$P2): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function14): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; + t7(): com.mojang.datafixers.kinds.App; + t8(): com.mojang.datafixers.kinds.App; + t9(): com.mojang.datafixers.kinds.App; + t10(): com.mojang.datafixers.kinds.App; + t11(): com.mojang.datafixers.kinds.App; + t12(): com.mojang.datafixers.kinds.App; + t13(): com.mojang.datafixers.kinds.App; + t14(): com.mojang.datafixers.kinds.App; } const Products$P15: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App, p8: com.mojang.datafixers.kinds.App, p9: com.mojang.datafixers.kinds.App, p10: com.mojang.datafixers.kinds.App, p11: com.mojang.datafixers.kinds.App, p12: com.mojang.datafixers.kinds.App, p13: com.mojang.datafixers.kinds.App, p14: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P15; + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App, t9: com.mojang.datafixers.kinds.App, t10: com.mojang.datafixers.kinds.App, t11: com.mojang.datafixers.kinds.App, t12: com.mojang.datafixers.kinds.App, t13: com.mojang.datafixers.kinds.App, t14: com.mojang.datafixers.kinds.App, t15: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P15; } - interface Products$P15 { + interface Products$P15 extends java.lang.Record { + and(p0: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P16; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function15): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; + t7(): com.mojang.datafixers.kinds.App; + t8(): com.mojang.datafixers.kinds.App; + t9(): com.mojang.datafixers.kinds.App; + t10(): com.mojang.datafixers.kinds.App; + t11(): com.mojang.datafixers.kinds.App; + t12(): com.mojang.datafixers.kinds.App; + t13(): com.mojang.datafixers.kinds.App; + t14(): com.mojang.datafixers.kinds.App; + t15(): com.mojang.datafixers.kinds.App; } const Products$P16: { - new(p0: com.mojang.datafixers.kinds.App, p1: com.mojang.datafixers.kinds.App, p2: com.mojang.datafixers.kinds.App, p3: com.mojang.datafixers.kinds.App, p4: com.mojang.datafixers.kinds.App, p5: com.mojang.datafixers.kinds.App, p6: com.mojang.datafixers.kinds.App, p7: com.mojang.datafixers.kinds.App, p8: com.mojang.datafixers.kinds.App, p9: com.mojang.datafixers.kinds.App, p10: com.mojang.datafixers.kinds.App, p11: com.mojang.datafixers.kinds.App, p12: com.mojang.datafixers.kinds.App, p13: com.mojang.datafixers.kinds.App, p14: com.mojang.datafixers.kinds.App, p15: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P16; + new(t1: com.mojang.datafixers.kinds.App, t2: com.mojang.datafixers.kinds.App, t3: com.mojang.datafixers.kinds.App, t4: com.mojang.datafixers.kinds.App, t5: com.mojang.datafixers.kinds.App, t6: com.mojang.datafixers.kinds.App, t7: com.mojang.datafixers.kinds.App, t8: com.mojang.datafixers.kinds.App, t9: com.mojang.datafixers.kinds.App, t10: com.mojang.datafixers.kinds.App, t11: com.mojang.datafixers.kinds.App, t12: com.mojang.datafixers.kinds.App, t13: com.mojang.datafixers.kinds.App, t14: com.mojang.datafixers.kinds.App, t15: com.mojang.datafixers.kinds.App, t16: com.mojang.datafixers.kinds.App): com.mojang.datafixers.Products$P16; } - interface Products$P16 { + interface Products$P16 extends java.lang.Record { apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.util.Function16): com.mojang.datafixers.kinds.App; apply(p0: com.mojang.datafixers.kinds.Applicative, p1: com.mojang.datafixers.kinds.App>): com.mojang.datafixers.kinds.App; + t1(): com.mojang.datafixers.kinds.App; + t2(): com.mojang.datafixers.kinds.App; + t3(): com.mojang.datafixers.kinds.App; + t4(): com.mojang.datafixers.kinds.App; + t5(): com.mojang.datafixers.kinds.App; + t6(): com.mojang.datafixers.kinds.App; + t7(): com.mojang.datafixers.kinds.App; + t8(): com.mojang.datafixers.kinds.App; + t9(): com.mojang.datafixers.kinds.App; + t10(): com.mojang.datafixers.kinds.App; + t11(): com.mojang.datafixers.kinds.App; + t12(): com.mojang.datafixers.kinds.App; + t13(): com.mojang.datafixers.kinds.App; + t14(): com.mojang.datafixers.kinds.App; + t15(): com.mojang.datafixers.kinds.App; + t16(): com.mojang.datafixers.kinds.App; } interface DataFixer { update(p0: com.mojang.datafixers.DSL$TypeReference, p1: com.mojang.serialization.Dynamic, p2: number, p3: number): com.mojang.serialization.Dynamic; @@ -41971,6 +42744,22 @@ declare global { privateKey(): string; publicKey(): string; } + const PresenceResponse: { + new(presence: Array): com.mojang.authlib.yggdrasil.response.PresenceResponse; + empty(): com.mojang.authlib.yggdrasil.response.PresenceResponse; + } + interface PresenceResponse extends java.lang.Record { + presence(): Array; + } + const FriendData: { + new(friends: Array, incomingRequests: Array, outgoingRequests: Array): com.mojang.authlib.yggdrasil.response.FriendData; + empty(): com.mojang.authlib.yggdrasil.response.FriendData; + } + interface FriendData extends java.lang.Record { + friends(): Array; + incomingRequests(): Array; + outgoingRequests(): Array; + } } namespace request { const AbuseReportRequest: { @@ -42041,8 +42830,51 @@ declare global { } interface YggdrasilAuthenticationService extends com.mojang.authlib.HttpAuthenticationService { createUserApiService(p0: string): com.mojang.authlib.minecraft.UserApiService; + createFriendsService(p0: string): com.mojang.authlib.yggdrasil.FriendsService; getServicesKeySet(): com.mojang.authlib.yggdrasil.ServicesKeySet; } + const FriendsService: { + ResultCode: typeof com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + PlayerData: typeof com.mojang.authlib.yggdrasil.FriendsService$PlayerData; + } + interface FriendsService { + getFriendData(p0: unknown): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + removeFriend(p0: java.util.UUID): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + acceptIncomingFriendRequest(p0: java.util.UUID): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + declineIncomingFriendRequest(p0: java.util.UUID): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + sendFriendRequest(p0: string): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + sendFriendRequest(p0: java.util.UUID): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + revokeOutgoingFriendRequest(p0: java.util.UUID): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + updateFriendSettings(p0: boolean, p1: boolean): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + presence(p0: string): com.mojang.authlib.yggdrasil.response.PresenceResponse; + getFriendsPollInterval(): java.util.Optional; + getPresencePollInterval(): java.util.Optional; + } + const FriendsService$ResultCode: { + SUCCESS: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + ERROR: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + SERVICE_NOT_AVAILABLE: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + TOO_MANY_REQUESTS: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + FORBIDDEN: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + UPGRADE_NEEDED: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + CONNECTION_ISSUE: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + TEMPORARY_UNAVAILABLE: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + UNKNOWN_PROFILE: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + UNAUTHORIZED: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + GENERIC_ERROR: com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.authlib.yggdrasil.FriendsService$ResultCode; + } + interface FriendsService$ResultCode extends kotlin.Enum { + } + const FriendsService$PlayerData: { + new(id: java.util.UUID, name: string): com.mojang.authlib.yggdrasil.FriendsService$PlayerData; + } + interface FriendsService$PlayerData extends java.lang.Record { + id(): java.util.UUID; + name(): string; + } } namespace minecraft { namespace report { @@ -42151,9 +42983,12 @@ declare global { SERVERS_ALLOWED: com.mojang.authlib.minecraft.UserApiService$UserFlag; REALMS_ALLOWED: com.mojang.authlib.minecraft.UserApiService$UserFlag; CHAT_ALLOWED: com.mojang.authlib.minecraft.UserApiService$UserFlag; + CHAT_FRIENDS_ONLY: com.mojang.authlib.minecraft.UserApiService$UserFlag; TELEMETRY_ENABLED: com.mojang.authlib.minecraft.UserApiService$UserFlag; PROFANITY_FILTER_ENABLED: com.mojang.authlib.minecraft.UserApiService$UserFlag; OPTIONAL_TELEMETRY_AVAILABLE: com.mojang.authlib.minecraft.UserApiService$UserFlag; + FRIENDS_ENABLED: com.mojang.authlib.minecraft.UserApiService$UserFlag; + ACCEPT_FRIEND_INVITES: com.mojang.authlib.minecraft.UserApiService$UserFlag; entries: kotlin.enums.EnumEntries; values(): Array; valueOf(value: string): com.mojang.authlib.minecraft.UserApiService$UserFlag; @@ -42357,79 +43192,83 @@ declare global { } } namespace realmsclient { - namespace gui { - namespace task { - const DataFetcher: { - Task: typeof com.mojang.realmsclient.gui.task.DataFetcher$Task; - Subscription: typeof com.mojang.realmsclient.gui.task.DataFetcher$Subscription; - new(executor: java.util.concurrent.Executor, resolution: java.util.concurrent.TimeUnit, timeSource: net.minecraft.util.TimeSource): com.mojang.realmsclient.gui.task.DataFetcher; - } - interface DataFetcher { - createTask(id: string, updater: java.util.concurrent.Callable, period: java.time.Duration, repeatStrategy: com.mojang.realmsclient.gui.task.RepeatedDelayStrategy): com.mojang.realmsclient.gui.task.DataFetcher$Task; - createSubscription(): com.mojang.realmsclient.gui.task.DataFetcher$Subscription; - } - const RepeatedDelayStrategy: { - CONSTANT: com.mojang.realmsclient.gui.task.RepeatedDelayStrategy; - exponentialBackoff(maxBackoff: number): com.mojang.realmsclient.gui.task.RepeatedDelayStrategy; - } - interface RepeatedDelayStrategy { - delayCyclesAfterSuccess(): number; - delayCyclesAfterFailure(): number; - } - interface DataFetcher$Task { - reset(): void; - } - const DataFetcher$Subscription: { - new(): com.mojang.realmsclient.gui.task.DataFetcher$Subscription; - } - interface DataFetcher$Subscription { - subscribe(task: com.mojang.realmsclient.gui.task.DataFetcher$Task, output: unknown): void; - forceUpdate(): void; - tick(): void; - reset(): void; - } - } - const RealmsDataFetcher: { - ServerListData: typeof com.mojang.realmsclient.gui.RealmsDataFetcher$ServerListData; - new(realmsClient: com.mojang.realmsclient.client.RealmsClient): com.mojang.realmsclient.gui.RealmsDataFetcher; + namespace client { + const RealmsClient: { + CompatibleVersionResponse: typeof com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; + Environment: typeof com.mojang.realmsclient.client.RealmsClient$Environment; + ENVIRONMENT: com.mojang.realmsclient.client.RealmsClient$Environment; + getOrCreate(): com.mojang.realmsclient.client.RealmsClient; + getOrCreate(minecraft: net.minecraft.client.Minecraft): com.mojang.realmsclient.client.RealmsClient; } - interface RealmsDataFetcher { - dataFetcher: com.mojang.realmsclient.gui.task.DataFetcher; - notificationsTask: com.mojang.realmsclient.gui.task.DataFetcher$Task>; - serverListUpdateTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; - pendingInvitesTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; - trialAvailabilityTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; - newsTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; - onlinePlayersTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; - newsManager: com.mojang.realmsclient.gui.RealmsNewsManager; - getTasks(): Array>; + interface RealmsClient { + getFeatureFlags(): Set; + listRealms(): com.mojang.realmsclient.dto.RealmsServerList; + listSnapshotEligibleRealms(): Array; + createSnapshotRealm(parentId: number): com.mojang.realmsclient.dto.RealmsServer; + getNotifications(): Array; + notificationsSeen(notificationUuids: Array): void; + notificationsDismiss(notificationUuids: Array): void; + getOwnRealm(realmId: number): com.mojang.realmsclient.dto.RealmsServer; + getPreferredRegionSelections(): com.mojang.realmsclient.dto.PreferredRegionsDto; + getLiveStats(): com.mojang.realmsclient.dto.RealmsServerPlayerLists; + join(realmId: number): com.mojang.realmsclient.dto.RealmsJoinInformation; + initializeRealm(realmId: number, name: string, motd: string): void; + hasParentalConsent(): boolean; + clientCompatible(): com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; + uninvite(realmId: number, profileId: java.util.UUID): void; + uninviteMyselfFrom(realmId: number): void; + invite(realmId: number, profileName: string): Array; + backupsFor(realmId: number): com.mojang.realmsclient.dto.BackupList; + updateConfiguration(realmId: number, name: string, description: string, regionSelectionPreference: com.mojang.realmsclient.dto.RegionSelectionPreferenceDto | null | undefined, slotId: number, options: com.mojang.realmsclient.dto.RealmsWorldOptions, settings: Array): void; + updateSlot(realmId: number, slotId: number, options: com.mojang.realmsclient.dto.RealmsWorldOptions, settings: Array): void; + switchSlot(realmId: number, slot: number): boolean; + restoreWorld(realmId: number, backupId: string): void; + fetchWorldTemplates(page: number, pageSize: number, type: com.mojang.realmsclient.dto.RealmsServer$WorldType): com.mojang.realmsclient.dto.WorldTemplatePaginatedList; + putIntoMinigameMode(realmId: number, minigameId: string): boolean; + op(realmId: number, profileId: java.util.UUID): com.mojang.realmsclient.dto.Ops; + deop(realmId: number, profileId: java.util.UUID): com.mojang.realmsclient.dto.Ops; + open(realmId: number): boolean; + close(realmId: number): boolean; + resetWorldWithTemplate(realmId: number, worldTemplateId: string): boolean; + subscriptionFor(realmId: number): com.mojang.realmsclient.dto.Subscription; + pendingInvitesCount(): number; + pendingInvites(): com.mojang.realmsclient.dto.PendingInvitesList; + acceptInvitation(invitationId: string): void; + requestDownloadInfo(realmId: number, slotId: number): com.mojang.realmsclient.dto.WorldDownload; + requestUploadInfo(realmId: number): com.mojang.realmsclient.dto.UploadInfo | null | undefined; + rejectInvitation(invitationId: string): void; + agreeToTos(): void; + getNews(): com.mojang.realmsclient.dto.RealmsNews; + sendPingResults(pingResult: com.mojang.realmsclient.dto.PingResult): void; + trialAvailable(): boolean; + deleteRealm(realmId: number): void; } - const RealmsNewsManager: { - new(newsLocalStorage: com.mojang.realmsclient.util.RealmsPersistence): com.mojang.realmsclient.gui.RealmsNewsManager; + const RealmsClient$CompatibleVersionResponse: { + COMPATIBLE: com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; + OUTDATED: com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; + OTHER: com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; } - interface RealmsNewsManager { - hasUnreadNews(): boolean; - newsLink(): string; - updateUnreadNews(newsResponse: com.mojang.realmsclient.dto.RealmsNews): void; + interface RealmsClient$CompatibleVersionResponse extends kotlin.Enum { } - const RealmsDataFetcher$ServerListData: { - new(serverList: Array, availableSnapshotServers: Array): com.mojang.realmsclient.gui.RealmsDataFetcher$ServerListData; + const RealmsClient$Environment: { + PRODUCTION: com.mojang.realmsclient.client.RealmsClient$Environment; + STAGE: com.mojang.realmsclient.client.RealmsClient$Environment; + LOCAL: com.mojang.realmsclient.client.RealmsClient$Environment; + entries: kotlin.enums.EnumEntries; + byName(name: string): java.util.Optional; + values(): Array; + valueOf(value: string): com.mojang.realmsclient.client.RealmsClient$Environment; } - interface RealmsDataFetcher$ServerListData extends java.lang.Record { - serverList(): Array; - availableSnapshotServers(): Array; + interface RealmsClient$Environment extends kotlin.Enum { + baseUrl: string; + alternativeUrl: string; + protocol: string; } } namespace dto { - const RealmsNews: { - new(newsLink: string | null | undefined): com.mojang.realmsclient.dto.RealmsNews; - parse(json: string): com.mojang.realmsclient.dto.RealmsNews; - } - interface RealmsNews extends java.lang.Record { - newsLink(): string | null | undefined; - } - interface ReflectionBasedSerialization { - } const RealmsServerList: { new(servers: Array): com.mojang.realmsclient.dto.RealmsServerList; parse(gson: com.mojang.realmsclient.dto.GuardedSerializer, json: string): com.mojang.realmsclient.dto.RealmsServerList; @@ -42437,6 +43276,8 @@ declare global { interface RealmsServerList extends java.lang.Record, com.mojang.realmsclient.dto.ReflectionBasedSerialization { servers(): Array; } + interface ReflectionBasedSerialization { + } const GuardedSerializer: { new(): com.mojang.realmsclient.dto.GuardedSerializer; } @@ -42762,6 +43603,13 @@ declare global { token(): string | null | undefined; uploadEndpoint(): java.net.URI; } + const RealmsNews: { + new(newsLink: string | null | undefined): com.mojang.realmsclient.dto.RealmsNews; + parse(json: string): com.mojang.realmsclient.dto.RealmsNews; + } + interface RealmsNews extends java.lang.Record { + newsLink(): string | null | undefined; + } const PingResult: { new(pingResults: Array, realmIds: Array): com.mojang.realmsclient.dto.PingResult; } @@ -42770,6 +43618,69 @@ declare global { realmIds(): Array; } } + namespace gui { + namespace task { + const DataFetcher: { + Task: typeof com.mojang.realmsclient.gui.task.DataFetcher$Task; + Subscription: typeof com.mojang.realmsclient.gui.task.DataFetcher$Subscription; + new(executor: java.util.concurrent.Executor, resolution: java.util.concurrent.TimeUnit, timeSource: net.minecraft.util.TimeSource): com.mojang.realmsclient.gui.task.DataFetcher; + } + interface DataFetcher { + createTask(id: string, updater: java.util.concurrent.Callable, period: java.time.Duration, repeatStrategy: com.mojang.realmsclient.gui.task.RepeatedDelayStrategy): com.mojang.realmsclient.gui.task.DataFetcher$Task; + createSubscription(): com.mojang.realmsclient.gui.task.DataFetcher$Subscription; + } + const RepeatedDelayStrategy: { + CONSTANT: com.mojang.realmsclient.gui.task.RepeatedDelayStrategy; + exponentialBackoff(maxBackoff: number): com.mojang.realmsclient.gui.task.RepeatedDelayStrategy; + } + interface RepeatedDelayStrategy { + delayCyclesAfterSuccess(): number; + delayCyclesAfterFailure(): number; + } + interface DataFetcher$Task { + reset(): void; + } + const DataFetcher$Subscription: { + new(): com.mojang.realmsclient.gui.task.DataFetcher$Subscription; + } + interface DataFetcher$Subscription { + subscribe(task: com.mojang.realmsclient.gui.task.DataFetcher$Task, output: unknown): void; + forceUpdate(): void; + tick(): void; + reset(): void; + } + } + const RealmsDataFetcher: { + ServerListData: typeof com.mojang.realmsclient.gui.RealmsDataFetcher$ServerListData; + new(realmsClient: com.mojang.realmsclient.client.RealmsClient): com.mojang.realmsclient.gui.RealmsDataFetcher; + } + interface RealmsDataFetcher { + dataFetcher: com.mojang.realmsclient.gui.task.DataFetcher; + notificationsTask: com.mojang.realmsclient.gui.task.DataFetcher$Task>; + serverListUpdateTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; + pendingInvitesTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; + trialAvailabilityTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; + newsTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; + onlinePlayersTask: com.mojang.realmsclient.gui.task.DataFetcher$Task; + newsManager: com.mojang.realmsclient.gui.RealmsNewsManager; + getTasks(): Array>; + } + const RealmsNewsManager: { + new(newsLocalStorage: com.mojang.realmsclient.util.RealmsPersistence): com.mojang.realmsclient.gui.RealmsNewsManager; + } + interface RealmsNewsManager { + hasUnreadNews(): boolean; + newsLink(): string; + updateUnreadNews(newsResponse: com.mojang.realmsclient.dto.RealmsNews): void; + } + const RealmsDataFetcher$ServerListData: { + new(serverList: Array, availableSnapshotServers: Array): com.mojang.realmsclient.gui.RealmsDataFetcher$ServerListData; + } + interface RealmsDataFetcher$ServerListData extends java.lang.Record { + serverList(): Array; + availableSnapshotServers(): Array; + } + } namespace util { const RealmsPersistence: { RealmsPersistenceData: typeof com.mojang.realmsclient.util.RealmsPersistence$RealmsPersistenceData; @@ -42789,82 +43700,6 @@ declare global { hasUnreadNews: boolean; } } - namespace client { - const RealmsClient: { - CompatibleVersionResponse: typeof com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; - Environment: typeof com.mojang.realmsclient.client.RealmsClient$Environment; - ENVIRONMENT: com.mojang.realmsclient.client.RealmsClient$Environment; - getOrCreate(): com.mojang.realmsclient.client.RealmsClient; - getOrCreate(minecraft: net.minecraft.client.Minecraft): com.mojang.realmsclient.client.RealmsClient; - } - interface RealmsClient { - getFeatureFlags(): Set; - listRealms(): com.mojang.realmsclient.dto.RealmsServerList; - listSnapshotEligibleRealms(): Array; - createSnapshotRealm(parentId: number): com.mojang.realmsclient.dto.RealmsServer; - getNotifications(): Array; - notificationsSeen(notificationUuids: Array): void; - notificationsDismiss(notificationUuids: Array): void; - getOwnRealm(realmId: number): com.mojang.realmsclient.dto.RealmsServer; - getPreferredRegionSelections(): com.mojang.realmsclient.dto.PreferredRegionsDto; - getLiveStats(): com.mojang.realmsclient.dto.RealmsServerPlayerLists; - join(realmId: number): com.mojang.realmsclient.dto.RealmsJoinInformation; - initializeRealm(realmId: number, name: string, motd: string): void; - hasParentalConsent(): boolean; - clientCompatible(): com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; - uninvite(realmId: number, profileId: java.util.UUID): void; - uninviteMyselfFrom(realmId: number): void; - invite(realmId: number, profileName: string): Array; - backupsFor(realmId: number): com.mojang.realmsclient.dto.BackupList; - updateConfiguration(realmId: number, name: string, description: string, regionSelectionPreference: com.mojang.realmsclient.dto.RegionSelectionPreferenceDto | null | undefined, slotId: number, options: com.mojang.realmsclient.dto.RealmsWorldOptions, settings: Array): void; - updateSlot(realmId: number, slotId: number, options: com.mojang.realmsclient.dto.RealmsWorldOptions, settings: Array): void; - switchSlot(realmId: number, slot: number): boolean; - restoreWorld(realmId: number, backupId: string): void; - fetchWorldTemplates(page: number, pageSize: number, type: com.mojang.realmsclient.dto.RealmsServer$WorldType): com.mojang.realmsclient.dto.WorldTemplatePaginatedList; - putIntoMinigameMode(realmId: number, minigameId: string): boolean; - op(realmId: number, profileId: java.util.UUID): com.mojang.realmsclient.dto.Ops; - deop(realmId: number, profileId: java.util.UUID): com.mojang.realmsclient.dto.Ops; - open(realmId: number): boolean; - close(realmId: number): boolean; - resetWorldWithTemplate(realmId: number, worldTemplateId: string): boolean; - subscriptionFor(realmId: number): com.mojang.realmsclient.dto.Subscription; - pendingInvitesCount(): number; - pendingInvites(): com.mojang.realmsclient.dto.PendingInvitesList; - acceptInvitation(invitationId: string): void; - requestDownloadInfo(realmId: number, slotId: number): com.mojang.realmsclient.dto.WorldDownload; - requestUploadInfo(realmId: number): com.mojang.realmsclient.dto.UploadInfo | null | undefined; - rejectInvitation(invitationId: string): void; - agreeToTos(): void; - getNews(): com.mojang.realmsclient.dto.RealmsNews; - sendPingResults(pingResult: com.mojang.realmsclient.dto.PingResult): void; - trialAvailable(): boolean; - deleteRealm(realmId: number): void; - } - const RealmsClient$CompatibleVersionResponse: { - COMPATIBLE: com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; - OUTDATED: com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; - OTHER: com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; - entries: kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.mojang.realmsclient.client.RealmsClient$CompatibleVersionResponse; - } - interface RealmsClient$CompatibleVersionResponse extends kotlin.Enum { - } - const RealmsClient$Environment: { - PRODUCTION: com.mojang.realmsclient.client.RealmsClient$Environment; - STAGE: com.mojang.realmsclient.client.RealmsClient$Environment; - LOCAL: com.mojang.realmsclient.client.RealmsClient$Environment; - entries: kotlin.enums.EnumEntries; - byName(name: string): java.util.Optional; - values(): Array; - valueOf(value: string): com.mojang.realmsclient.client.RealmsClient$Environment; - } - interface RealmsClient$Environment extends kotlin.Enum { - baseUrl: string; - alternativeUrl: string; - protocol: string; - } - } } } namespace google { @@ -43274,6 +44109,21 @@ declare global { getAnnotatedReturnType(): java.lang.reflect.AnnotatedType; } } + namespace net { + const HostAndPort: { + fromParts(host: string, port: number): com.google.common.net.HostAndPort; + fromHost(host: string): com.google.common.net.HostAndPort; + fromString(hostPortString: string): com.google.common.net.HostAndPort; + } + interface HostAndPort extends java.io.Serializable { + getHost(): string; + hasPort(): boolean; + getPort(): number; + getPortOrDefault(defaultPort: number): number; + withDefaultPort(defaultPort: number): com.google.common.net.HostAndPort; + requireBracketsForIPv6(): com.google.common.net.HostAndPort; + } + } namespace primitives { const UnsignedLong: { ZERO: com.google.common.primitives.UnsignedLong; @@ -51495,37 +52345,75 @@ declare global { drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawFilledBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawFilledAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawWireFrameBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawWireFrameAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawBoxes(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawBoxes(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawBoxes(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; + drawStyledBoxes(positions: Array, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawStyledBoxes(positions: Array, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; + drawStyledBoxes(positions: Array, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; + drawSizedBoxes(positions: Array, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawSizedBoxes(positions: Array, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; + drawSizedBoxes(positions: Array, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; + drawSizedBoxes(positions: Array, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawHitboxes(entities: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawHitboxes(entities: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawHitboxes(entities: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawLines(points: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawLines(points: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawLines(points: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawLines(points: Array, colors: Array): void; + drawLines(points: Array, colors: Array, thickness: number): void; + drawLines(points: Array, colors: Array, thickness: number, depth: boolean): void; drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawTracers(targetPositions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawTracers(targetPositions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawTracers(targetPositions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; + drawTexts(texts: Array, positions: Array): void; + drawTexts(texts: Array, positions: Array, scale: number): void; + drawTexts(texts: Array, positions: Array, scale: number, backgroundBox: boolean): void; + drawTexts(texts: Array, positions: Array, scale: number, backgroundBox: boolean, increase: boolean): void; + drawTexts(texts: Array, positions: Array, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; + drawTexts(texts: Array, positions: Array, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; new(): com.chattriggers.ctjs.api.render.Render3D; } interface Render3D { @@ -51533,37 +52421,75 @@ declare global { drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawFilledBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; + drawFilledAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawFilledAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, depth: boolean): void; drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawWireFrameBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameBoxes(positions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawWireFrameAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawWireFrameAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawWireFrameAABBs(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawBoxes(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawBoxes(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawBoxes(boxes: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; + drawStyledBoxes(positions: Array, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawStyledBoxes(positions: Array, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number): void; + drawStyledBoxes(positions: Array, color1: com.chattriggers.ctjs.api.render.Render3D$Color, color2: com.chattriggers.ctjs.api.render.Render3D$Color, wireThickness: number, depth: boolean): void; drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; + drawSizedBoxes(positions: Array, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawSizedBoxes(positions: Array, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean): void; + drawSizedBoxes(positions: Array, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number): void; + drawSizedBoxes(positions: Array, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.Render3D$Color, filled: boolean, thickness: number, depth: boolean): void; drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawHitboxes(entities: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawHitboxes(entities: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawHitboxes(entities: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawLines(points: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawLines(points: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawLines(points: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawLines(points: Array, colors: Array): void; + drawLines(points: Array, colors: Array, thickness: number): void; + drawLines(points: Array, colors: Array, thickness: number, depth: boolean): void; drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; + drawTracers(targetPositions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color): void; + drawTracers(targetPositions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number): void; + drawTracers(targetPositions: Array, color: com.chattriggers.ctjs.api.render.Render3D$Color, thickness: number, depth: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; + drawTexts(texts: Array, positions: Array): void; + drawTexts(texts: Array, positions: Array, scale: number): void; + drawTexts(texts: Array, positions: Array, scale: number, backgroundBox: boolean): void; + drawTexts(texts: Array, positions: Array, scale: number, backgroundBox: boolean, increase: boolean): void; + drawTexts(texts: Array, positions: Array, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; + drawTexts(texts: Array, positions: Array, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; new(): com.chattriggers.ctjs.api.render.Render3D; } const Render3D$Color: { @@ -51574,10 +52500,6 @@ declare global { getG(): number; getB(): number; getA(): number; - getRf(): number; - getGf(): number; - getBf(): number; - getAf(): number; getPacked(): number; component1(): number; component2(): number; @@ -52084,6 +53006,11 @@ declare global { namespace javax { namespace security { namespace auth { + namespace callback { + interface CallbackHandler { + handle(p0: Array): void; + } + } const Subject: { new(): javax.security.auth.Subject; new(p0: boolean, p1: Set, p2: Set, p3: Set): javax.security.auth.Subject; @@ -52187,6 +53114,195 @@ declare global { } interface CipherSpi { } + const SecretKey: { + serialVersionUID: number; + } + interface SecretKey extends java.security.Key, javax.security.auth.Destroyable { + } + } + namespace net { + namespace ssl { + interface SSLEngine { + getPeerHost(): string; + getPeerPort(): number; + wrap(p0: java.nio.ByteBuffer, p1: java.nio.ByteBuffer): javax.net.ssl.SSLEngineResult; + wrap(p0: Array, p1: java.nio.ByteBuffer): javax.net.ssl.SSLEngineResult; + wrap(p0: Array, p1: number, p2: number, p3: java.nio.ByteBuffer): javax.net.ssl.SSLEngineResult; + unwrap(p0: java.nio.ByteBuffer, p1: java.nio.ByteBuffer): javax.net.ssl.SSLEngineResult; + unwrap(p0: java.nio.ByteBuffer, p1: Array): javax.net.ssl.SSLEngineResult; + unwrap(p0: java.nio.ByteBuffer, p1: Array, p2: number, p3: number): javax.net.ssl.SSLEngineResult; + getDelegatedTask(): java.lang.Runnable; + closeInbound(): void; + isInboundDone(): boolean; + closeOutbound(): void; + isOutboundDone(): boolean; + getSupportedCipherSuites(): Array; + getEnabledCipherSuites(): Array; + setEnabledCipherSuites(p0: Array): void; + getSupportedProtocols(): Array; + getEnabledProtocols(): Array; + setEnabledProtocols(p0: Array): void; + getSession(): javax.net.ssl.SSLSession; + getHandshakeSession(): javax.net.ssl.SSLSession; + beginHandshake(): void; + getHandshakeStatus(): javax.net.ssl.SSLEngineResult$HandshakeStatus; + setUseClientMode(p0: boolean): void; + getUseClientMode(): boolean; + setNeedClientAuth(p0: boolean): void; + getNeedClientAuth(): boolean; + setWantClientAuth(p0: boolean): void; + getWantClientAuth(): boolean; + setEnableSessionCreation(p0: boolean): void; + getEnableSessionCreation(): boolean; + getSSLParameters(): javax.net.ssl.SSLParameters; + setSSLParameters(p0: javax.net.ssl.SSLParameters): void; + getApplicationProtocol(): string; + getHandshakeApplicationProtocol(): string; + setHandshakeApplicationProtocolSelector(p0: unknown): void; + getHandshakeApplicationProtocolSelector(): unknown; + } + const SSLEngineResult: { + Status: typeof javax.net.ssl.SSLEngineResult$Status; + HandshakeStatus: typeof javax.net.ssl.SSLEngineResult$HandshakeStatus; + new(p0: javax.net.ssl.SSLEngineResult$Status, p1: javax.net.ssl.SSLEngineResult$HandshakeStatus, p2: number, p3: number): javax.net.ssl.SSLEngineResult; + new(p0: javax.net.ssl.SSLEngineResult$Status, p1: javax.net.ssl.SSLEngineResult$HandshakeStatus, p2: number, p3: number, p4: number): javax.net.ssl.SSLEngineResult; + } + interface SSLEngineResult { + bytesConsumed(): number; + bytesProduced(): number; + sequenceNumber(): number; + getStatus(): javax.net.ssl.SSLEngineResult$Status; + getHandshakeStatus(): javax.net.ssl.SSLEngineResult$HandshakeStatus; + } + const SSLEngineResult$Status: { + BUFFER_UNDERFLOW: javax.net.ssl.SSLEngineResult$Status; + BUFFER_OVERFLOW: javax.net.ssl.SSLEngineResult$Status; + OK: javax.net.ssl.SSLEngineResult$Status; + CLOSED: javax.net.ssl.SSLEngineResult$Status; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): javax.net.ssl.SSLEngineResult$Status; + } + interface SSLEngineResult$Status extends kotlin.Enum { + } + const SSLEngineResult$HandshakeStatus: { + NOT_HANDSHAKING: javax.net.ssl.SSLEngineResult$HandshakeStatus; + FINISHED: javax.net.ssl.SSLEngineResult$HandshakeStatus; + NEED_TASK: javax.net.ssl.SSLEngineResult$HandshakeStatus; + NEED_WRAP: javax.net.ssl.SSLEngineResult$HandshakeStatus; + NEED_UNWRAP: javax.net.ssl.SSLEngineResult$HandshakeStatus; + NEED_UNWRAP_AGAIN: javax.net.ssl.SSLEngineResult$HandshakeStatus; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): javax.net.ssl.SSLEngineResult$HandshakeStatus; + } + interface SSLEngineResult$HandshakeStatus extends kotlin.Enum { + } + interface SSLSession { + getId(): Array; + getSessionContext(): javax.net.ssl.SSLSessionContext; + getCreationTime(): number; + getLastAccessedTime(): number; + invalidate(): void; + isValid(): boolean; + putValue(p0: string, p1: any): void; + getValue(p0: string): any; + removeValue(p0: string): void; + getValueNames(): Array; + getPeerCertificates(): Array; + getLocalCertificates(): Array; + getPeerCertificateChain(): Array; + getPeerPrincipal(): java.security.Principal; + getLocalPrincipal(): java.security.Principal; + getCipherSuite(): string; + getProtocol(): string; + getPeerHost(): string; + getPeerPort(): number; + getPacketBufferSize(): number; + getApplicationBufferSize(): number; + } + interface SSLSessionContext { + getSession(p0: Array): javax.net.ssl.SSLSession; + getIds(): java.util.Enumeration>; + setSessionTimeout(p0: number): void; + getSessionTimeout(): number; + setSessionCacheSize(p0: number): void; + getSessionCacheSize(): number; + } + const SSLParameters: { + new(): javax.net.ssl.SSLParameters; + new(p0: Array): javax.net.ssl.SSLParameters; + new(p0: Array, p1: Array): javax.net.ssl.SSLParameters; + } + interface SSLParameters { + getCipherSuites(): Array; + setCipherSuites(p0: Array): void; + getProtocols(): Array; + setProtocols(p0: Array): void; + getWantClientAuth(): boolean; + setWantClientAuth(p0: boolean): void; + getNeedClientAuth(): boolean; + setNeedClientAuth(p0: boolean): void; + getAlgorithmConstraints(): java.security.AlgorithmConstraints; + setAlgorithmConstraints(p0: java.security.AlgorithmConstraints): void; + getEndpointIdentificationAlgorithm(): string; + setEndpointIdentificationAlgorithm(p0: string): void; + setServerNames(p0: Array): void; + getServerNames(): Array; + setSNIMatchers(p0: Array): void; + getSNIMatchers(): Array; + setUseCipherSuitesOrder(p0: boolean): void; + getUseCipherSuitesOrder(): boolean; + setEnableRetransmissions(p0: boolean): void; + getEnableRetransmissions(): boolean; + setMaximumPacketSize(p0: number): void; + getMaximumPacketSize(): number; + getApplicationProtocols(): Array; + setApplicationProtocols(p0: Array): void; + getSignatureSchemes(): Array; + setSignatureSchemes(p0: Array): void; + getNamedGroups(): Array; + setNamedGroups(p0: Array): void; + } + const TrustManagerFactory: { + getDefaultAlgorithm(): string; + getInstance(p0: string): javax.net.ssl.TrustManagerFactory; + getInstance(p0: string, p1: string): javax.net.ssl.TrustManagerFactory; + getInstance(p0: string, p1: java.security.Provider): javax.net.ssl.TrustManagerFactory; + } + interface TrustManagerFactory { + getAlgorithm(): string; + getProvider(): java.security.Provider; + init(p0: java.security.KeyStore): void; + init(p0: javax.net.ssl.ManagerFactoryParameters): void; + getTrustManagers(): Array; + } + interface ManagerFactoryParameters { + } + const TrustManagerFactorySpi: { + new(): javax.net.ssl.TrustManagerFactorySpi; + } + interface TrustManagerFactorySpi { + } + const KeyManagerFactory: { + getDefaultAlgorithm(): string; + getInstance(p0: string): javax.net.ssl.KeyManagerFactory; + getInstance(p0: string, p1: string): javax.net.ssl.KeyManagerFactory; + getInstance(p0: string, p1: java.security.Provider): javax.net.ssl.KeyManagerFactory; + } + interface KeyManagerFactory { + getAlgorithm(): string; + getProvider(): java.security.Provider; + init(p0: java.security.KeyStore, p1: Array): void; + init(p0: javax.net.ssl.ManagerFactoryParameters): void; + getKeyManagers(): Array; + } + const KeyManagerFactorySpi: { + new(): javax.net.ssl.KeyManagerFactorySpi; + } + interface KeyManagerFactorySpi { + } + } } namespace sound { namespace sampled { @@ -61276,6 +62392,190 @@ declare global { } interface IoEvent { } + interface ChannelOutboundHandler extends io.netty.channel.ChannelHandler { + bind(p0: io.netty.channel.ChannelHandlerContext, p1: java.net.SocketAddress, p2: io.netty.channel.ChannelPromise): void; + connect(p0: io.netty.channel.ChannelHandlerContext, p1: java.net.SocketAddress, p2: java.net.SocketAddress, p3: io.netty.channel.ChannelPromise): void; + disconnect(p0: io.netty.channel.ChannelHandlerContext, p1: io.netty.channel.ChannelPromise): void; + close(p0: io.netty.channel.ChannelHandlerContext, p1: io.netty.channel.ChannelPromise): void; + deregister(p0: io.netty.channel.ChannelHandlerContext, p1: io.netty.channel.ChannelPromise): void; + read(p0: io.netty.channel.ChannelHandlerContext): void; + write(p0: io.netty.channel.ChannelHandlerContext, p1: any, p2: io.netty.channel.ChannelPromise): void; + flush(p0: io.netty.channel.ChannelHandlerContext): void; + } + const ChannelDuplexHandler: { + new(): io.netty.channel.ChannelDuplexHandler; + } + interface ChannelDuplexHandler extends io.netty.channel.ChannelInboundHandlerAdapter, io.netty.channel.ChannelOutboundHandler { + } + } + namespace handler { + namespace ssl { + const SslContext: { + defaultServerProvider(): io.netty.handler.ssl.SslProvider; + defaultClientProvider(): io.netty.handler.ssl.SslProvider; + newServerContext(p0: java.io.File, p1: java.io.File): io.netty.handler.ssl.SslContext; + newServerContext(p0: java.io.File, p1: java.io.File, p2: string): io.netty.handler.ssl.SslContext; + newServerContext(p0: java.io.File, p1: java.io.File, p2: string, p3: kotlin.collections.MutableIterable, p4: kotlin.collections.MutableIterable, p5: number, p6: number): io.netty.handler.ssl.SslContext; + newServerContext(p0: java.io.File, p1: java.io.File, p2: string, p3: kotlin.collections.MutableIterable, p4: io.netty.handler.ssl.CipherSuiteFilter, p5: io.netty.handler.ssl.ApplicationProtocolConfig, p6: number, p7: number): io.netty.handler.ssl.SslContext; + newServerContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: java.io.File): io.netty.handler.ssl.SslContext; + newServerContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: java.io.File, p3: string): io.netty.handler.ssl.SslContext; + newServerContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: java.io.File, p3: string, p4: kotlin.collections.MutableIterable, p5: kotlin.collections.MutableIterable, p6: number, p7: number): io.netty.handler.ssl.SslContext; + newServerContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: java.io.File, p3: string, p4: javax.net.ssl.TrustManagerFactory, p5: kotlin.collections.MutableIterable, p6: kotlin.collections.MutableIterable, p7: number, p8: number): io.netty.handler.ssl.SslContext; + newServerContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: java.io.File, p3: string, p4: kotlin.collections.MutableIterable, p5: io.netty.handler.ssl.CipherSuiteFilter, p6: io.netty.handler.ssl.ApplicationProtocolConfig, p7: number, p8: number): io.netty.handler.ssl.SslContext; + newServerContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: javax.net.ssl.TrustManagerFactory, p3: java.io.File, p4: java.io.File, p5: string, p6: javax.net.ssl.KeyManagerFactory, p7: kotlin.collections.MutableIterable, p8: io.netty.handler.ssl.CipherSuiteFilter, p9: io.netty.handler.ssl.ApplicationProtocolConfig, p10: number, p11: number): io.netty.handler.ssl.SslContext; + newClientContext(): io.netty.handler.ssl.SslContext; + newClientContext(p0: java.io.File): io.netty.handler.ssl.SslContext; + newClientContext(p0: javax.net.ssl.TrustManagerFactory): io.netty.handler.ssl.SslContext; + newClientContext(p0: java.io.File, p1: javax.net.ssl.TrustManagerFactory): io.netty.handler.ssl.SslContext; + newClientContext(p0: java.io.File, p1: javax.net.ssl.TrustManagerFactory, p2: kotlin.collections.MutableIterable, p3: kotlin.collections.MutableIterable, p4: number, p5: number): io.netty.handler.ssl.SslContext; + newClientContext(p0: java.io.File, p1: javax.net.ssl.TrustManagerFactory, p2: kotlin.collections.MutableIterable, p3: io.netty.handler.ssl.CipherSuiteFilter, p4: io.netty.handler.ssl.ApplicationProtocolConfig, p5: number, p6: number): io.netty.handler.ssl.SslContext; + newClientContext(p0: io.netty.handler.ssl.SslProvider): io.netty.handler.ssl.SslContext; + newClientContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File): io.netty.handler.ssl.SslContext; + newClientContext(p0: io.netty.handler.ssl.SslProvider, p1: javax.net.ssl.TrustManagerFactory): io.netty.handler.ssl.SslContext; + newClientContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: javax.net.ssl.TrustManagerFactory): io.netty.handler.ssl.SslContext; + newClientContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: javax.net.ssl.TrustManagerFactory, p3: kotlin.collections.MutableIterable, p4: kotlin.collections.MutableIterable, p5: number, p6: number): io.netty.handler.ssl.SslContext; + newClientContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: javax.net.ssl.TrustManagerFactory, p3: kotlin.collections.MutableIterable, p4: io.netty.handler.ssl.CipherSuiteFilter, p5: io.netty.handler.ssl.ApplicationProtocolConfig, p6: number, p7: number): io.netty.handler.ssl.SslContext; + newClientContext(p0: io.netty.handler.ssl.SslProvider, p1: java.io.File, p2: javax.net.ssl.TrustManagerFactory, p3: java.io.File, p4: java.io.File, p5: string, p6: javax.net.ssl.KeyManagerFactory, p7: kotlin.collections.MutableIterable, p8: io.netty.handler.ssl.CipherSuiteFilter, p9: io.netty.handler.ssl.ApplicationProtocolConfig, p10: number, p11: number): io.netty.handler.ssl.SslContext; + } + interface SslContext { + attributes(): io.netty.util.AttributeMap; + isServer(): boolean; + isClient(): boolean; + cipherSuites(): Array; + sessionCacheSize(): number; + sessionTimeout(): number; + nextProtocols(): Array; + applicationProtocolNegotiator(): io.netty.handler.ssl.ApplicationProtocolNegotiator; + newEngine(p0: io.netty.buffer.ByteBufAllocator): javax.net.ssl.SSLEngine; + newEngine(p0: io.netty.buffer.ByteBufAllocator, p1: string, p2: number): javax.net.ssl.SSLEngine; + sessionContext(): javax.net.ssl.SSLSessionContext; + newHandler(p0: io.netty.buffer.ByteBufAllocator): io.netty.handler.ssl.SslHandler; + newHandler(p0: io.netty.buffer.ByteBufAllocator, p1: java.util.concurrent.Executor): io.netty.handler.ssl.SslHandler; + newHandler(p0: io.netty.buffer.ByteBufAllocator, p1: string, p2: number): io.netty.handler.ssl.SslHandler; + newHandler(p0: io.netty.buffer.ByteBufAllocator, p1: string, p2: number, p3: java.util.concurrent.Executor): io.netty.handler.ssl.SslHandler; + } + interface ApplicationProtocolNegotiator { + protocols(): Array; + } + const SslHandler: { + new(p0: javax.net.ssl.SSLEngine): io.netty.handler.ssl.SslHandler; + new(p0: javax.net.ssl.SSLEngine, p1: boolean): io.netty.handler.ssl.SslHandler; + new(p0: javax.net.ssl.SSLEngine, p1: java.util.concurrent.Executor): io.netty.handler.ssl.SslHandler; + new(p0: javax.net.ssl.SSLEngine, p1: boolean, p2: java.util.concurrent.Executor): io.netty.handler.ssl.SslHandler; + isEncrypted(p0: io.netty.buffer.ByteBuf): boolean; + isEncrypted(p0: io.netty.buffer.ByteBuf, p1: boolean): boolean; + } + interface SslHandler extends io.netty.handler.codec.ByteToMessageDecoder, io.netty.channel.ChannelOutboundHandler { + engine(): javax.net.ssl.SSLEngine; + getHandshakeTimeoutMillis(): number; + setHandshakeTimeout(p0: number, p1: java.util.concurrent.TimeUnit): void; + setHandshakeTimeoutMillis(p0: number): void; + setWrapDataSize(p0: number): void; + getCloseNotifyTimeoutMillis(): number; + setCloseNotifyTimeout(p0: number, p1: java.util.concurrent.TimeUnit): void; + setCloseNotifyTimeoutMillis(p0: number): void; + getCloseNotifyFlushTimeoutMillis(): number; + setCloseNotifyFlushTimeout(p0: number, p1: java.util.concurrent.TimeUnit): void; + setCloseNotifyFlushTimeoutMillis(p0: number): void; + getCloseNotifyReadTimeoutMillis(): number; + setCloseNotifyReadTimeout(p0: number, p1: java.util.concurrent.TimeUnit): void; + setCloseNotifyReadTimeoutMillis(p0: number): void; + applicationProtocol(): string; + handshakeFuture(): io.netty.util.concurrent.Future; + close(): io.netty.channel.ChannelFuture; + close(p0: io.netty.channel.ChannelPromise): io.netty.channel.ChannelFuture; + closeOutbound(): io.netty.channel.ChannelFuture; + closeOutbound(p0: io.netty.channel.ChannelPromise): io.netty.channel.ChannelFuture; + sslCloseFuture(): io.netty.util.concurrent.Future; + renegotiate(): io.netty.util.concurrent.Future; + renegotiate(p0: io.netty.util.concurrent.Promise): io.netty.util.concurrent.Future; + } + const SslProvider: { + JDK: io.netty.handler.ssl.SslProvider; + OPENSSL: io.netty.handler.ssl.SslProvider; + OPENSSL_REFCNT: io.netty.handler.ssl.SslProvider; + entries: kotlin.enums.EnumEntries; + isAlpnSupported(p0: io.netty.handler.ssl.SslProvider): boolean; + isTlsv13Supported(p0: io.netty.handler.ssl.SslProvider): boolean; + isTlsv13Supported(p0: io.netty.handler.ssl.SslProvider, p1: java.security.Provider): boolean; + isOptionSupported(p0: io.netty.handler.ssl.SslProvider, p1: io.netty.handler.ssl.SslContextOption): boolean; + values(): Array; + valueOf(value: string): io.netty.handler.ssl.SslProvider; + } + interface SslProvider extends kotlin.Enum { + } + const SslContextOption: { + valueOf(p0: string): io.netty.handler.ssl.SslContextOption; + valueOf(p0: java.lang.Class, p1: string): io.netty.handler.ssl.SslContextOption; + exists(p0: string): boolean; + } + interface SslContextOption extends io.netty.util.AbstractConstant> { + validate(p0: T): void; + } + interface CipherSuiteFilter { + filterCipherSuites(p0: kotlin.collections.MutableIterable, p1: Array, p2: Set): Array; + } + const ApplicationProtocolConfig: { + SelectedListenerFailureBehavior: typeof io.netty.handler.ssl.ApplicationProtocolConfig$SelectedListenerFailureBehavior; + SelectorFailureBehavior: typeof io.netty.handler.ssl.ApplicationProtocolConfig$SelectorFailureBehavior; + Protocol: typeof io.netty.handler.ssl.ApplicationProtocolConfig$Protocol; + DISABLED: io.netty.handler.ssl.ApplicationProtocolConfig; + new(p0: io.netty.handler.ssl.ApplicationProtocolConfig$Protocol, p1: io.netty.handler.ssl.ApplicationProtocolConfig$SelectorFailureBehavior, p2: io.netty.handler.ssl.ApplicationProtocolConfig$SelectedListenerFailureBehavior, p3: kotlin.collections.MutableIterable): io.netty.handler.ssl.ApplicationProtocolConfig; + new(p0: io.netty.handler.ssl.ApplicationProtocolConfig$Protocol, p1: io.netty.handler.ssl.ApplicationProtocolConfig$SelectorFailureBehavior, p2: io.netty.handler.ssl.ApplicationProtocolConfig$SelectedListenerFailureBehavior, p3: string): io.netty.handler.ssl.ApplicationProtocolConfig; + } + interface ApplicationProtocolConfig { + supportedProtocols(): Array; + protocol(): io.netty.handler.ssl.ApplicationProtocolConfig$Protocol; + selectorFailureBehavior(): io.netty.handler.ssl.ApplicationProtocolConfig$SelectorFailureBehavior; + selectedListenerFailureBehavior(): io.netty.handler.ssl.ApplicationProtocolConfig$SelectedListenerFailureBehavior; + } + const ApplicationProtocolConfig$Protocol: { + NONE: io.netty.handler.ssl.ApplicationProtocolConfig$Protocol; + NPN: io.netty.handler.ssl.ApplicationProtocolConfig$Protocol; + ALPN: io.netty.handler.ssl.ApplicationProtocolConfig$Protocol; + NPN_AND_ALPN: io.netty.handler.ssl.ApplicationProtocolConfig$Protocol; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.netty.handler.ssl.ApplicationProtocolConfig$Protocol; + } + interface ApplicationProtocolConfig$Protocol extends kotlin.Enum { + } + const ApplicationProtocolConfig$SelectorFailureBehavior: { + FATAL_ALERT: io.netty.handler.ssl.ApplicationProtocolConfig$SelectorFailureBehavior; + NO_ADVERTISE: io.netty.handler.ssl.ApplicationProtocolConfig$SelectorFailureBehavior; + CHOOSE_MY_LAST_PROTOCOL: io.netty.handler.ssl.ApplicationProtocolConfig$SelectorFailureBehavior; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.netty.handler.ssl.ApplicationProtocolConfig$SelectorFailureBehavior; + } + interface ApplicationProtocolConfig$SelectorFailureBehavior extends kotlin.Enum { + } + const ApplicationProtocolConfig$SelectedListenerFailureBehavior: { + ACCEPT: io.netty.handler.ssl.ApplicationProtocolConfig$SelectedListenerFailureBehavior; + FATAL_ALERT: io.netty.handler.ssl.ApplicationProtocolConfig$SelectedListenerFailureBehavior; + CHOOSE_MY_LAST_PROTOCOL: io.netty.handler.ssl.ApplicationProtocolConfig$SelectedListenerFailureBehavior; + entries: kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): io.netty.handler.ssl.ApplicationProtocolConfig$SelectedListenerFailureBehavior; + } + interface ApplicationProtocolConfig$SelectedListenerFailureBehavior extends kotlin.Enum { + } + } + namespace codec { + const ByteToMessageDecoder: { + MERGE_CUMULATOR: io.netty.handler.codec.ByteToMessageDecoder$Cumulator; + COMPOSITE_CUMULATOR: io.netty.handler.codec.ByteToMessageDecoder$Cumulator; + } + interface ByteToMessageDecoder extends io.netty.channel.ChannelInboundHandlerAdapter { + setSingleDecode(p0: boolean): void; + isSingleDecode(): boolean; + setCumulator(p0: io.netty.handler.codec.ByteToMessageDecoder$Cumulator): void; + setDiscardAfterReads(p0: number): void; + } + interface ByteToMessageDecoder$Cumulator { + cumulate(p0: io.netty.buffer.ByteBufAllocator, p1: io.netty.buffer.ByteBuf, p2: io.netty.buffer.ByteBuf): io.netty.buffer.ByteBuf; + } + } } } namespace github { From e6abc33d298a70d71490728c7e1aeaa13926d07c Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:48:08 +0100 Subject: [PATCH 26/61] ConcurrentHashMap image cache --- .../com/chattriggers/ctjs/api/render/GuiRendererBackend.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt index db2fa91b..030fb187 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt @@ -29,7 +29,7 @@ import kotlin.math.roundToInt open class GuiRendererBackend { private val callbacks = CopyOnWriteArrayList() private val preCallbacks = CopyOnWriteArrayList() - private val images = HashMap() + private val images = ConcurrentHashMap() private val gifs = HashMap() private val urlImages = HashMap() private val pendingUrls = ConcurrentHashMap.newKeySet() @@ -265,12 +265,12 @@ open class GuiRendererBackend { images[path]?.let { if (--it.refs <= 0) { it.image.close(); images.remove(path) } } } - fun isImageLoaded(path: String) = synchronized(images) { path in images } + fun isImageLoaded(path: String) = images.containsKey(path) @JvmOverloads fun drawImage(path: String, x: Float, y: Float, width: Float, height: Float, radius: Float = 0f, imageAlpha: Float = 1f) { if (path.isUrl()) return drawImageFromUrl(path, x, y, width, height, radius, imageAlpha) - val image = synchronized(images) { images[path] } ?: runCatching { loadImage(path) }.getOrNull()?.let { synchronized(images) { images[it] } } ?: return + val image = images[path] ?: runCatching { loadImage(path) }.getOrNull()?.let(images::get) ?: return drawImage(image.image, x, y, width, height, radius, imageAlpha) } From ad435787a28f7272f197df05ee465b78ecb7c1f2 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:59:13 +0100 Subject: [PATCH 27/61] optimise text rendering (like 10% gui optimisation) --- .../ctjs/api/render/GuiRendererBackend.kt | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt index 030fb187..05f9e3f7 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt @@ -231,26 +231,30 @@ open class GuiRendererBackend { @JvmOverloads fun text(text: String, x: Float, y: Float, size: Float, color: Int, font: Font? = defaultFont, align: Int) { val skijaFont = skijaFont(font ?: defaultFont, size) + val metrics = skijaFont.metrics + val baseline = when { + align and 32 != 0 -> y - metrics.descent + align and 16 != 0 -> y - (metrics.ascent + metrics.descent) / 2f + align and 8 != 0 -> y - metrics.ascent + else -> y + } + if (align and 6 == 0) { + paint(color).use { canvas?.drawString(text, x, baseline, skijaFont, it) } + return + } TextLine.make(text, skijaFont).use { line -> val drawX = when { align and 4 != 0 -> x - line.width align and 2 != 0 -> x - line.width / 2f else -> x } - val metrics = skijaFont.metrics - val baseline = when { - align and 32 != 0 -> y - metrics.descent - align and 16 != 0 -> y - (metrics.ascent + metrics.descent) / 2f - align and 8 != 0 -> y - metrics.ascent - else -> y - } paint(color).use { canvas?.drawTextLine(line, drawX, baseline, it) } } } @JvmOverloads fun textWidth(text: String, size: Float, font: Font? = defaultFont) = - TextLine.make(text, skijaFont(font ?: defaultFont, size)).use { it.width } + skijaFont(font ?: defaultFont, size).measureTextWidth(text) fun loadImage(path: String): String { if (path.isUrl()) return path From 55a79189ae2cf902a4f459aa9ca6727b2e74e3d2 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 20:56:14 +0100 Subject: [PATCH 28/61] codex: add vulkan support --- build.gradle.kts | 6 +- .../accessors/CommandEncoderAccessor.java | 10 ++ .../internal/accessors/GpuDeviceAccessor.java | 10 ++ .../VulkanCommandEncoderAccessor.java | 10 ++ .../accessors/VulkanDeviceAccessor.java | 10 ++ .../internal/mixins/CommandEncoderMixin.java | 16 ++ ...ccessor.java => GameRendererAccessor.java} | 2 +- .../ctjs/internal/mixins/GpuDeviceMixin.java | 16 ++ .../mixins/LevelRenderer262Mixin.java | 75 --------- .../internal/mixins/LevelRendererMixin.java | 76 ++++++++- .../mixins/VulkanCommandEncoderMixin.java | 16 ++ .../internal/mixins/VulkanDeviceMixin.java | 41 +++++ .../ctjs/api/client/MinecraftCompat.kt | 4 +- .../ctjs/api/render/skia/SkijaSurface.kt | 9 ++ .../api/render/skia/SkijaVulkanSurface.kt | 145 ++++++++++++++++++ 15 files changed, 366 insertions(+), 80 deletions(-) create mode 100644 src/main/java/com/chattriggers/ctjs/internal/accessors/CommandEncoderAccessor.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/accessors/GpuDeviceAccessor.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/accessors/VulkanCommandEncoderAccessor.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/accessors/VulkanDeviceAccessor.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/CommandEncoderMixin.java rename src/main/java/com/chattriggers/ctjs/internal/mixins/{GameRenderer262Accessor.java => GameRendererAccessor.java} (89%) create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/GpuDeviceMixin.java delete mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRenderer262Mixin.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/VulkanCommandEncoderMixin.java create mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/VulkanDeviceMixin.java create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaVulkanSurface.kt diff --git a/build.gradle.kts b/build.gradle.kts index 646e33c6..4fdaa096 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -114,12 +114,16 @@ tasks { val versionMixins = if (minecraftVersion == "26.1.2") { listOf("GuiMixin", "MinecraftScreenMixin", "LevelRendererMixin") } else { - listOf("GuiHudMixin", "GameRenderer262Accessor", "GuiScreenMixin", "LevelRenderer262Mixin") + listOf( + "CommandEncoderMixin", "GpuDeviceMixin", "GuiHudMixin", "GameRendererAccessor", + "GuiScreenMixin", "LevelRendererMixin", "VulkanCommandEncoderMixin", "VulkanDeviceMixin", + ) } filter("tokens" to mapOf( "version_mixins" to versionMixins.joinToString("\",\n \"") )) } + } withType().configureEach { diff --git a/src/main/java/com/chattriggers/ctjs/internal/accessors/CommandEncoderAccessor.java b/src/main/java/com/chattriggers/ctjs/internal/accessors/CommandEncoderAccessor.java new file mode 100644 index 00000000..5337e69e --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/accessors/CommandEncoderAccessor.java @@ -0,0 +1,10 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.accessors; + +import com.mojang.blaze3d.systems.CommandEncoder; +import com.mojang.blaze3d.systems.CommandEncoderBackend; + +public interface CommandEncoderAccessor { + CommandEncoderBackend ctjs$getBackend(); +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/accessors/GpuDeviceAccessor.java b/src/main/java/com/chattriggers/ctjs/internal/accessors/GpuDeviceAccessor.java new file mode 100644 index 00000000..0615b83f --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/accessors/GpuDeviceAccessor.java @@ -0,0 +1,10 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.accessors; + +import com.mojang.blaze3d.systems.GpuDevice; +import com.mojang.blaze3d.systems.GpuDeviceBackend; + +public interface GpuDeviceAccessor { + GpuDeviceBackend ctjs$getBackend(); +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/accessors/VulkanCommandEncoderAccessor.java b/src/main/java/com/chattriggers/ctjs/internal/accessors/VulkanCommandEncoderAccessor.java new file mode 100644 index 00000000..7973de7b --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/accessors/VulkanCommandEncoderAccessor.java @@ -0,0 +1,10 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.accessors; + +import com.mojang.blaze3d.vulkan.VulkanCommandEncoder; +import org.lwjgl.vulkan.VkCommandBuffer; + +public interface VulkanCommandEncoderAccessor { + VkCommandBuffer ctjs$getCommandBuffer(); +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/accessors/VulkanDeviceAccessor.java b/src/main/java/com/chattriggers/ctjs/internal/accessors/VulkanDeviceAccessor.java new file mode 100644 index 00000000..0a16b1f6 --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/accessors/VulkanDeviceAccessor.java @@ -0,0 +1,10 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.accessors; + +import com.mojang.blaze3d.vulkan.VulkanPhysicalDevice; +import com.mojang.blaze3d.vulkan.VulkanDevice; + +public interface VulkanDeviceAccessor { + VulkanPhysicalDevice ctjs$getPhysicalDevice(); +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/CommandEncoderMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/CommandEncoderMixin.java new file mode 100644 index 00000000..11a3e6cf --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/CommandEncoderMixin.java @@ -0,0 +1,16 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.internal.accessors.CommandEncoderAccessor; +import com.mojang.blaze3d.systems.CommandEncoder; +import com.mojang.blaze3d.systems.CommandEncoderBackend; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(CommandEncoder.class) +public interface CommandEncoderMixin extends CommandEncoderAccessor { + @Override + @Accessor("backend") + CommandEncoderBackend ctjs$getBackend(); +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GameRenderer262Accessor.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GameRendererAccessor.java similarity index 89% rename from src/main/java/com/chattriggers/ctjs/internal/mixins/GameRenderer262Accessor.java rename to src/main/java/com/chattriggers/ctjs/internal/mixins/GameRendererAccessor.java index 855434bc..baa9da16 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/GameRenderer262Accessor.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GameRendererAccessor.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(GameRenderer.class) -public interface GameRenderer262Accessor { +public interface GameRendererAccessor { @Accessor SubmitNodeStorage getHandAndScreenSubmitNodeStorage(); } diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GpuDeviceMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GpuDeviceMixin.java new file mode 100644 index 00000000..a69927e4 --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/GpuDeviceMixin.java @@ -0,0 +1,16 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.internal.accessors.GpuDeviceAccessor; +import com.mojang.blaze3d.systems.GpuDevice; +import com.mojang.blaze3d.systems.GpuDeviceBackend; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GpuDevice.class) +public interface GpuDeviceMixin extends GpuDeviceAccessor { + @Override + @Accessor("backend") + GpuDeviceBackend ctjs$getBackend(); +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRenderer262Mixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRenderer262Mixin.java deleted file mode 100644 index 65cea586..00000000 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRenderer262Mixin.java +++ /dev/null @@ -1,75 +0,0 @@ -//? if >=26.2 { -package com.chattriggers.ctjs.internal.mixins; - -import com.chattriggers.ctjs.api.client.Client; -import com.chattriggers.ctjs.internal.listeners.WorldListener; -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import com.mojang.blaze3d.resource.GraphicsResourceAllocator; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.DeltaTracker; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.SubmitNodeCollector; -import net.minecraft.client.renderer.rendertype.RenderType; -import net.minecraft.client.renderer.state.level.BlockOutlineRenderState; -import net.minecraft.client.renderer.state.level.CameraRenderState; -import org.joml.Matrix4fc; -import org.joml.Vector4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(LevelRenderer.class) -public abstract class LevelRenderer262Mixin { - private float ctjs$tickDelta = 1.0F; - - @Inject(method = "addMainPass", at = @At("HEAD"), cancellable = true) - private void v5$renderMain(CallbackInfo ci) { - if (Client.isMacroEnabled() && Client.getRenderLimiter() == Client.RenderLimiter.NO_RENDER) { - ci.cancel(); - } - } - - @Inject(method = "submitHitOutline", at = @At("HEAD"), cancellable = true) - private void onDrawBlockOutline( - PoseStack matrices, - SubmitNodeCollector collector, - RenderType renderType, - BlockOutlineRenderState outline, - int color, - float lineWidth, - boolean translucent, - CallbackInfo ci - ) { - if (WorldListener.INSTANCE.triggerBlockOutline(outline.pos())) { - ci.cancel(); - } - } - - @Inject(method = "render", at = @At("HEAD")) - private void beforeRender( - GraphicsResourceAllocator allocator, - DeltaTracker tickCounter, - boolean renderBlockOutline, - CameraRenderState camera, - Matrix4fc positionMatrix, - GpuBufferSlice fogBuffer, - Vector4f fogColor, - boolean renderSky, - CallbackInfo ci - ) { - ctjs$tickDelta = tickCounter.getGameTimeDeltaTicks(); - } - - @Inject(method = "submitEntities", at = @At("HEAD")) - private void beforeEntities(PoseStack matrices, net.minecraft.client.renderer.state.level.LevelRenderState state, SubmitNodeCollector collector, CallbackInfo ci) { - WorldListener.INSTANCE.setMatrixStack(matrices); - WorldListener.INSTANCE.triggerRenderStart(ctjs$tickDelta); - } - - @Inject(method = "lambda$addMainPass$0", at = @At("RETURN")) - private void afterMainPass(CallbackInfo ci) { - WorldListener.INSTANCE.triggerRenderLast(); - } -} -//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java index 9724381b..b4f889c9 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java @@ -78,4 +78,78 @@ private void beforeGizmos(GpuBufferSlice gpuBufferSlice, LevelRenderState worldR WorldListener.INSTANCE.triggerRenderLast(); } } -*///?} +*///?} else { +package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.api.client.Client; +import com.chattriggers.ctjs.internal.listeners.WorldListener; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.state.level.BlockOutlineRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import org.joml.Matrix4fc; +import org.joml.Vector4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LevelRenderer.class) +public abstract class LevelRendererMixin { + private float ctjs$tickDelta = 1.0F; + + @Inject(method = "addMainPass", at = @At("HEAD"), cancellable = true) + private void v5$renderMain(CallbackInfo ci) { + if (Client.isMacroEnabled() && Client.getRenderLimiter() == Client.RenderLimiter.NO_RENDER) { + ci.cancel(); + } + } + + @Inject(method = "submitHitOutline", at = @At("HEAD"), cancellable = true) + private void onDrawBlockOutline( + PoseStack matrices, + SubmitNodeCollector collector, + RenderType renderType, + BlockOutlineRenderState outline, + int color, + float lineWidth, + boolean translucent, + CallbackInfo ci + ) { + if (WorldListener.INSTANCE.triggerBlockOutline(outline.pos())) { + ci.cancel(); + } + } + + @Inject(method = "render", at = @At("HEAD")) + private void beforeRender( + GraphicsResourceAllocator allocator, + DeltaTracker tickCounter, + boolean renderBlockOutline, + CameraRenderState camera, + Matrix4fc positionMatrix, + GpuBufferSlice fogBuffer, + Vector4f fogColor, + boolean renderSky, + CallbackInfo ci + ) { + ctjs$tickDelta = tickCounter.getGameTimeDeltaTicks(); + } + + @Inject(method = "submitEntities", at = @At("HEAD")) + private void beforeEntities(PoseStack matrices, net.minecraft.client.renderer.state.level.LevelRenderState state, SubmitNodeCollector collector, CallbackInfo ci) { + WorldListener.INSTANCE.setMatrixStack(matrices); + WorldListener.INSTANCE.triggerRenderStart(ctjs$tickDelta); + } + + @Inject(method = "lambda$addMainPass$0", at = @At("RETURN")) + private void afterMainPass(CallbackInfo ci) { + WorldListener.INSTANCE.triggerRenderLast(); + } +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/VulkanCommandEncoderMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/VulkanCommandEncoderMixin.java new file mode 100644 index 00000000..3b26ab7a --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/VulkanCommandEncoderMixin.java @@ -0,0 +1,16 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.mixins; + +import com.chattriggers.ctjs.internal.accessors.VulkanCommandEncoderAccessor; +import com.mojang.blaze3d.vulkan.VulkanCommandEncoder; +import org.lwjgl.vulkan.VkCommandBuffer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(VulkanCommandEncoder.class) +public interface VulkanCommandEncoderMixin extends VulkanCommandEncoderAccessor { + @Override + @Invoker("commandBuffer") + VkCommandBuffer ctjs$getCommandBuffer(); +} +//?} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/VulkanDeviceMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/VulkanDeviceMixin.java new file mode 100644 index 00000000..36a17039 --- /dev/null +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/VulkanDeviceMixin.java @@ -0,0 +1,41 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.internal.mixins; + +import com.mojang.blaze3d.shaders.ShaderSource; +import com.mojang.blaze3d.vulkan.VulkanDevice; +import com.mojang.blaze3d.vulkan.VulkanInstance; +import com.mojang.blaze3d.vulkan.VulkanPhysicalDevice; +import com.mojang.blaze3d.vulkan.checkpoints.CheckpointExtension; +import com.chattriggers.ctjs.internal.accessors.VulkanDeviceAccessor; +import org.lwjgl.vulkan.VkDevice; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(VulkanDevice.class) +public class VulkanDeviceMixin implements VulkanDeviceAccessor { + @Unique + private VulkanPhysicalDevice ctjs$physicalDevice; + + @Inject(method = "", at = @At("RETURN")) + private void ctjs$capturePhysicalDevice( + ShaderSource shaderSource, + VulkanInstance instance, + VulkanPhysicalDevice physicalDevice, + java.util.Set enabledExtensions, + VkDevice device, + long vma, + CheckpointExtension checkpointExtension, + CallbackInfo ci + ) { + ctjs$physicalDevice = physicalDevice; + } + + @Override + public VulkanPhysicalDevice ctjs$getPhysicalDevice() { + return ctjs$physicalDevice; + } +} +//?} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/client/MinecraftCompat.kt b/src/main/kotlin/com/chattriggers/ctjs/api/client/MinecraftCompat.kt index 3734b00e..a526116d 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/client/MinecraftCompat.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/client/MinecraftCompat.kt @@ -1,7 +1,7 @@ package com.chattriggers.ctjs.api.client //? if >=26.2 { -import com.chattriggers.ctjs.internal.mixins.GameRenderer262Accessor +import com.chattriggers.ctjs.internal.mixins.GameRendererAccessor import com.chattriggers.ctjs.internal.utils.asMixin //?} import com.mojang.blaze3d.pipeline.RenderTarget @@ -53,7 +53,7 @@ internal object MinecraftCompat { minecraft.levelRenderer.invalidateCompiledGeometry(level, minecraft.options, mainCamera(minecraft.gameRenderer), minecraft.blockColors) } fun submitNodeStorage(renderer: GameRenderer): SubmitNodeStorage = - renderer.asMixin().handAndScreenSubmitNodeStorage + renderer.asMixin().handAndScreenSubmitNodeStorage fun gameRenderState(renderer: GameRenderer): GameRenderState = renderer.gameRenderState() fun isSingleplayer(minecraft: Minecraft): Boolean = minecraft.hasSingleplayerServer() } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt index 576325f0..5a2e1b19 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt @@ -21,6 +21,9 @@ import org.lwjgl.opengl.GL31C import org.lwjgl.opengl.GL33C internal class SkijaSurface : AutoCloseable { + //? if >=26.2 { + private val vulkan = SkijaVulkanSurface() + //?} private var context: DirectContext? = null private var renderTarget: BackendRenderTarget? = null private var surface: Surface? = null @@ -31,6 +34,9 @@ internal class SkijaSurface : AutoCloseable { private var textureId = 0 fun render(width: Int, height: Int, texture: GpuTexture, draw: (io.github.humbleui.skija.Canvas) -> Unit) { + //? if >=26.2 { + if (vulkan.render(width, height, texture, draw)) return + //?} val colorTexture = texture as? GlTexture ?: return val state = GlState.capture() try { @@ -79,6 +85,9 @@ internal class SkijaSurface : AutoCloseable { } override fun close() { + //? if >=26.2 { + vulkan.close() + //?} surface?.close() renderTarget?.close() if (depthStencil != 0) GL30C.glDeleteRenderbuffers(depthStencil) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaVulkanSurface.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaVulkanSurface.kt new file mode 100644 index 00000000..31dc8cd5 --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaVulkanSurface.kt @@ -0,0 +1,145 @@ +//? if >=26.2 { +package com.chattriggers.ctjs.api.render.skia + +import com.chattriggers.ctjs.internal.accessors.GpuDeviceAccessor +import com.chattriggers.ctjs.internal.accessors.CommandEncoderAccessor +import com.chattriggers.ctjs.internal.accessors.VulkanCommandEncoderAccessor +import com.chattriggers.ctjs.internal.accessors.VulkanDeviceAccessor +import com.mojang.blaze3d.GpuFormat +import com.mojang.blaze3d.systems.CommandEncoder +import com.mojang.blaze3d.systems.GpuDevice +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.textures.GpuTexture +import com.mojang.blaze3d.vulkan.VulkanCommandEncoder +import com.mojang.blaze3d.vulkan.VulkanConst +import com.mojang.blaze3d.vulkan.VulkanDevice +import com.mojang.blaze3d.vulkan.VulkanGpuTexture +import io.github.humbleui.skija.BackendRenderTarget +import io.github.humbleui.skija.ColorSpace +import io.github.humbleui.skija.ColorType +import io.github.humbleui.skija.DirectContext +import io.github.humbleui.skija.Surface +import io.github.humbleui.skija.SurfaceOrigin +import org.lwjgl.system.MemoryStack +import org.lwjgl.vulkan.VK10 +import org.lwjgl.vulkan.VK12 +import org.lwjgl.vulkan.VkImageMemoryBarrier +import org.slf4j.LoggerFactory + +internal class SkijaVulkanSurface : AutoCloseable { + private val logger = LoggerFactory.getLogger(SkijaVulkanSurface::class.java) + private var device: VulkanDevice? = null + private var context: DirectContext? = null + private var target: BackendRenderTarget? = null + private var surface: Surface? = null + private var image = 0L + private var width = 0 + private var height = 0 + private var format: GpuFormat? = null + + fun render(width: Int, height: Int, texture: GpuTexture, draw: (io.github.humbleui.skija.Canvas) -> Unit): Boolean { + val vulkanTexture = texture as? VulkanGpuTexture ?: return false + if (vulkanTexture.isClosed || vulkanTexture.getFormat() != GpuFormat.RGBA8_UNORM || + vulkanTexture.usage() and GpuTexture.USAGE_RENDER_ATTACHMENT == 0 || + vulkanTexture.usage() and GpuTexture.USAGE_TEXTURE_BINDING == 0 + ) { + logger.warn("Skipping Skija Vulkan target with unsupported format or usage: {}", texture.getLabel()) + return true + } + + val gpuDevice = RenderSystem.tryGetDevice() ?: return true + val backend = (gpuDevice as GpuDeviceAccessor).`ctjs$getBackend`() + val vulkanDevice = backend as? VulkanDevice ?: run { + logger.warn("GpuTexture is Vulkan but RenderSystem device backend is {}", backend.javaClass.name) + return true + } + val physical = (vulkanDevice as VulkanDeviceAccessor).`ctjs$getPhysicalDevice`() + if (physical == null) { + logger.error("Vulkan physical device accessor returned null") + return true + } + + try { + ensureResources(vulkanDevice, physical, vulkanTexture, width, height) + transition(gpuDevice, vulkanTexture.vkImage(), VK12.VK_IMAGE_LAYOUT_GENERAL, VK12.VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK10.VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK10.VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK10.VK_ACCESS_MEMORY_READ_BIT or VK10.VK_ACCESS_MEMORY_WRITE_BIT, VK10.VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) + draw(surface!!.canvas) + context!!.flushAndSubmit(false) + transition(gpuDevice, vulkanTexture.vkImage(), VK12.VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK12.VK_IMAGE_LAYOUT_GENERAL, + VK10.VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK10.VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK10.VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK10.VK_ACCESS_MEMORY_READ_BIT or VK10.VK_ACCESS_MEMORY_WRITE_BIT) + } catch (exception: Throwable) { + logger.error("Skija Vulkan rendering failed", exception) + closeResources() + } + return true + } + + private fun ensureResources(vk: VulkanDevice, physical: com.mojang.blaze3d.vulkan.VulkanPhysicalDevice, + texture: VulkanGpuTexture, width: Int, height: Int) { + if (device !== vk) { + closeResources() + val instance = vk.instance() + val instanceProc = org.lwjgl.vulkan.VK.getFunctionProvider().getFunctionAddress("vkGetInstanceProcAddr") + val deviceProc = vk.vkDevice().capabilities.vkGetDeviceProcAddr + context = DirectContext.makeVulkan( + instance.vkInstance().address(), physical.vkPhysicalDevice().address(), vk.vkDevice().address(), + vk.graphicsQueue().vkQueue().address(), vk.graphicsQueue().queueFamilyIndex(), instanceProc, deviceProc, VK12.VK_API_VERSION_1_2 + ) + device = vk + } + if (image == texture.vkImage() && this.width == width && this.height == height && format == texture.getFormat()) return + closeTarget() + val imageUsage = VulkanConst.textureUsageToVk(texture.usage(), texture.getFormat()) or + VK10.VK_IMAGE_USAGE_TRANSFER_SRC_BIT or VK10.VK_IMAGE_USAGE_TRANSFER_DST_BIT + target = BackendRenderTarget.makeVulkan(width, height, texture.vkImage(), VK10.VK_IMAGE_TILING_OPTIMAL, + VK12.VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VulkanConst.toVk(texture.getFormat()), + imageUsage, 1, 1) + surface = Surface.wrapBackendRenderTarget(context!!, target!!, SurfaceOrigin.BOTTOM_LEFT, ColorType.RGBA_8888, ColorSpace.getSRGB()) + image = texture.vkImage() + this.width = width + this.height = height + format = texture.getFormat() + } + + private fun transition(gpu: GpuDevice, image: Long, oldLayout: Int, newLayout: Int, srcStage: Int, dstStage: Int, srcAccess: Int, dstAccess: Int) { + val encoder = gpu.createCommandEncoder() + val vkEncoder = ((encoder as CommandEncoderAccessor).`ctjs$getBackend`() as? VulkanCommandEncoder) + ?: error("Minecraft did not provide a Vulkan command encoder") + val commandBuffer = (vkEncoder as VulkanCommandEncoderAccessor).`ctjs$getCommandBuffer`() + MemoryStack.stackPush().use { stack -> + val barrier = VkImageMemoryBarrier.calloc(1, stack) + .sType(VK10.VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER) + .oldLayout(oldLayout) + .newLayout(newLayout) + .srcAccessMask(srcAccess) + .dstAccessMask(dstAccess) + .srcQueueFamilyIndex(VK10.VK_QUEUE_FAMILY_IGNORED) + .dstQueueFamilyIndex(VK10.VK_QUEUE_FAMILY_IGNORED) + .image(image) + barrier.subresourceRange() + .aspectMask(VK10.VK_IMAGE_ASPECT_COLOR_BIT) + .baseMipLevel(0) + .levelCount(1) + .baseArrayLayer(0) + .layerCount(1) + VK12.vkCmdPipelineBarrier(commandBuffer, srcStage, dstStage, 0, null, null, barrier) + } + vkEncoder.submit() + } + + private fun closeTarget() { + surface?.close(); target?.close() + surface = null; target = null; image = 0L + } + + private fun closeResources() { + closeTarget() + context?.close() + context = null; device = null + } + + override fun close() = closeResources() +} +//?} From 8372986dd3aba9da48d64e8d8971e5e0f9622a3a Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:18:14 +0100 Subject: [PATCH 29/61] fix background process getting left --- src/main/kotlin/com/chattriggers/ctjs/CTJS.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt index c2b94e95..d8774109 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt @@ -49,14 +49,13 @@ class CTJS : ClientModInitializer { autoOpenTriggered = true WelcomeScreen.open() } - ClientLifecycleEvents.CLIENT_STOPPING.register { _ -> Render2D.destroy() } - - SecureLoader.onInitialize() - - Runtime.getRuntime().addShutdownHook(Thread { + ClientLifecycleEvents.CLIENT_STOPPING.register { _ -> + Render2D.destroy() TriggerType.GAME_UNLOAD.triggerAll() Console.close() - }) + } + + SecureLoader.onInitialize() } companion object { From d62bc7062fc215b701203e784c0e45e004d8b644 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:50:05 +0100 Subject: [PATCH 30/61] fix --- build.gradle.kts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4fdaa096..61737596 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -89,6 +89,14 @@ tasks { val flkVersion = libs.versions.fabric.kotlin.get() val fapiVersion = fabricApiVersion val loaderVersion = libs.versions.loader.get() + val versionMixins = if (minecraftVersion == "26.1.2") { + listOf("GuiMixin", "MinecraftScreenMixin", "LevelRendererMixin") + } else { + listOf( + "CommandEncoderMixin", "GpuDeviceMixin", "GuiHudMixin", "GameRendererAccessor", + "GuiScreenMixin", "LevelRendererMixin", "VulkanCommandEncoderMixin", "VulkanDeviceMixin", + ) + } from(rootProject.file("typing-generator/src/main/resources")) { include("provided-types.properties") @@ -99,6 +107,7 @@ tasks { inputs.property("fabric_kotlin_version", flkVersion) inputs.property("fabric_api_version", fapiVersion) inputs.property("loader_version", loaderVersion) + inputs.property("version_mixins", versionMixins.joinToString(",")) filesMatching("fabric.mod.json") { expand( @@ -111,14 +120,6 @@ tasks { } filesMatching("ctjs.mixins.json") { - val versionMixins = if (minecraftVersion == "26.1.2") { - listOf("GuiMixin", "MinecraftScreenMixin", "LevelRendererMixin") - } else { - listOf( - "CommandEncoderMixin", "GpuDeviceMixin", "GuiHudMixin", "GameRendererAccessor", - "GuiScreenMixin", "LevelRendererMixin", "VulkanCommandEncoderMixin", "VulkanDeviceMixin", - ) - } filter("tokens" to mapOf( "version_mixins" to versionMixins.joinToString("\",\n \"") )) From c7e8c6349afc4eda1c4fc554b9c9c55ea75895a4 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Sun, 30 Aug 2026 14:36:57 +0100 Subject: [PATCH 31/61] Pathfinder unloaded chunk warning --- .../chattriggers/ctjs/api/world/pathfinding/PathManager.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/PathManager.kt b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/PathManager.kt index 6fdab855..d85a57a4 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/PathManager.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/PathManager.kt @@ -251,6 +251,7 @@ object PathManager { try { currentTask = searchExecutor.submit { try { + val hasLoadedEndGoal = endPoints.any { CachedWorld.getChunk(it[0] shr 4, it[2] shr 4) != null } val result = NativePathfinderBridge.findPath( NativePathfinderBridge.NativePathSearchRequest( startFlat, @@ -292,7 +293,11 @@ object PathManager { } else { currentPath = null currentAnnotations = null - lastError = NativePathfinderBridge.getLastError() ?: "No path found to destination" + lastError = if (hasLoadedEndGoal) { + NativePathfinderBridge.getLastError() ?: "No path found to destination" + } else { + "End goal is in an unloaded chunk" + } } } catch (e: InterruptedException) { if (searchId.get() == currentId) { From 0a999bbb84f1a8de06acfa8a910614de22ffaec8 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Sun, 30 Aug 2026 20:32:38 +0100 Subject: [PATCH 32/61] optimise chunk caching --- NativeSrc/src/jni_bridge.cpp | 117 ++++++++++++++++-- NativeSrc/src/world_state.cpp | 65 ++++------ NativeSrc/src/world_state.hpp | 16 ++- .../ctjs/api/world/pathfinding/CachedWorld.kt | 60 +++++---- .../pathfinding/NativePathfinderBridge.kt | 9 ++ .../world/pathfinding/NativePathfinderJNI.kt | 6 + 6 files changed, 192 insertions(+), 81 deletions(-) diff --git a/NativeSrc/src/jni_bridge.cpp b/NativeSrc/src/jni_bridge.cpp index 2c95d168..5b63f594 100644 --- a/NativeSrc/src/jni_bridge.cpp +++ b/NativeSrc/src/jni_bridge.cpp @@ -36,14 +36,25 @@ std::vector toDoubleVector(JNIEnv* env, jdoubleArray array) { return out; } -std::vector toShortVector(JNIEnv* env, jshortArray array) { +std::vector toLongVector(JNIEnv* env, jlongArray array) { if (array == nullptr) return {}; const jsize len = env->GetArrayLength(array); if (len <= 0) return {}; - std::vector out(static_cast(len)); - env->GetShortArrayRegion(array, 0, len, out.data()); + std::vector out(static_cast(len)); + env->GetLongArrayRegion(array, 0, len, out.data()); + return out; +} + +std::vector toShortVector(JNIEnv* env, jshortArray array) { + if (array == nullptr) return {}; + + const jsize len = env->GetArrayLength(array); + if (len <= 0) return {}; + + std::vector out(static_cast(len)); + env->GetShortArrayRegion(array, 0, len, reinterpret_cast(out.data())); return out; } @@ -172,6 +183,34 @@ std::vector toJFloatVector(const std::vector& values) { return out; } +v5pf::ChunkUpdate makeChunkUpdate( + const int chunkX, + const int chunkZ, + const int minY, + const int maxY, + const uint64_t sectionMask, + const std::vector& sectionFlags +) { + v5pf::ChunkUpdate update; + update.chunkX = chunkX; + update.chunkZ = chunkZ; + update.chunk.minY = minY; + update.chunk.maxY = maxY; + update.chunk.ensureLayout(); + + size_t readOffset = 0; + const int maskedSectionCount = std::min(update.chunk.sectionCount(), 64); + for (int i = 0; i < maskedSectionCount; i++) { + if ((sectionMask & (1ULL << i)) == 0ULL) continue; + if (readOffset + 4096 > sectionFlags.size()) break; + + update.chunk.assignSection(i, sectionFlags.data() + readOffset); + readOffset += 4096; + } + + return update; +} + } // namespace extern "C" { @@ -247,16 +286,16 @@ JNIEXPORT void JNICALL Java_com_chattriggers_ctjs_api_world_pathfinding_NativePa return; } - const auto* sectionData = flags.empty() ? nullptr : reinterpret_cast(flags.data()); - g_worldState.upsertChunk( + std::vector updates; + updates.push_back(makeChunkUpdate( static_cast(chunkX), static_cast(chunkZ), static_cast(minY), static_cast(maxY), static_cast(sectionMask), - sectionData, - flags.size() - ); + flags + )); + g_worldState.upsertChunks(std::move(updates)); } catch (const std::exception& ex) { throwRuntimeFromException(env, "upsertChunk", ex); } catch (...) { @@ -264,6 +303,68 @@ JNIEXPORT void JNICALL Java_com_chattriggers_ctjs_api_world_pathfinding_NativePa } } +JNIEXPORT void JNICALL Java_com_chattriggers_ctjs_api_world_pathfinding_NativePathfinderJNI_upsertChunks( + JNIEnv* env, + jclass, + jintArray metadata, + jlongArray sectionMasks, + jobjectArray sectionFlags +) { + try { + const auto flatMetadata = toIntVector(env, metadata); + const auto masks = toLongVector(env, sectionMasks); + if (hasPendingJavaException(env)) { + return; + } + + const size_t chunkCount = masks.size(); + if (sectionFlags == nullptr || flatMetadata.size() != chunkCount * 4 || + static_cast(env->GetArrayLength(sectionFlags)) != chunkCount) { + throwJavaException(env, "java/lang/IllegalArgumentException", "Invalid chunk batch arrays"); + return; + } + + std::vector updates; + updates.reserve(chunkCount); + for (size_t i = 0; i < chunkCount; i++) { + const size_t offset = i * 4; + const jint minY = flatMetadata[offset + 2]; + const jint maxY = flatMetadata[offset + 3]; + if (!isValidHeightRange(minY, maxY)) { + throwJavaException(env, "java/lang/IllegalArgumentException", buildInvalidHeightMessage(minY, maxY)); + return; + } + + auto flagsArray = static_cast(env->GetObjectArrayElement(sectionFlags, static_cast(i))); + if (hasPendingJavaException(env)) { + return; + } + const auto flags = toShortVector(env, flagsArray); + if (flagsArray != nullptr) { + env->DeleteLocalRef(flagsArray); + } + if (hasPendingJavaException(env)) { + return; + } + + updates.push_back(makeChunkUpdate( + flatMetadata[offset], + flatMetadata[offset + 1], + minY, + maxY, + static_cast(masks[i]), + flags + )); + } + + g_worldState.upsertChunks(std::move(updates)); + } catch (const std::exception& ex) { + throwRuntimeFromException(env, "upsertChunks", ex); + } catch (...) { + throwRuntimeUnknown(env, "upsertChunks"); + } +} + JNIEXPORT void JNICALL Java_com_chattriggers_ctjs_api_world_pathfinding_NativePathfinderJNI_applyBlockUpdates( JNIEnv* env, jclass, diff --git a/NativeSrc/src/world_state.cpp b/NativeSrc/src/world_state.cpp index b2a101e1..bb55243c 100644 --- a/NativeSrc/src/world_state.cpp +++ b/NativeSrc/src/world_state.cpp @@ -197,55 +197,44 @@ void WorldState::clear() { data_ = std::move(next); } -void WorldState::upsertChunk( - const int chunkX, - const int chunkZ, - const int minY, - const int maxY, - const uint64_t sectionMask, - const uint16_t* sectionFlags, - const size_t sectionFlagCount -) { - if (!isValidWorldBounds(minY, maxY)) { +void WorldState::upsertChunks(std::vector updates) { + if (updates.empty()) { return; } - ChunkData chunk; - chunk.minY = minY; - chunk.maxY = maxY; - chunk.ensureLayout(); - - const int sectionCount = chunk.sectionCount(); - size_t readOffset = 0; + std::lock_guard lock(mutex_); + auto next = std::make_shared(*data_); + std::unordered_set changedChunks; + changedChunks.reserve(updates.size()); - const int maskedSectionCount = std::min(sectionCount, 64); - for (int i = 0; i < maskedSectionCount; i++) { - const bool hasSection = (sectionMask & (1ULL << i)) != 0ULL; - if (!hasSection) continue; + for (auto& update : updates) { + ChunkData& chunk = update.chunk; + if (!isValidWorldBounds(chunk.minY, chunk.maxY)) { + continue; + } - if (sectionFlags == nullptr || readOffset + 4096 > sectionFlagCount) { - break; + const auto key = chunkKey(update.chunkX, update.chunkZ); + const auto existing = next->chunks.find(key); + if (next->minY == chunk.minY && next->maxY == chunk.maxY && + existing != next->chunks.end() && existing->second != nullptr && + chunksEqual(*existing->second, chunk)) { + continue; } - chunk.assignSection(i, sectionFlags + readOffset); - readOffset += 4096; + next->minY = chunk.minY; + next->maxY = chunk.maxY; + next->chunks[key] = std::make_shared(std::move(chunk)); + changedChunks.insert(key); } - std::lock_guard lock(mutex_); - const auto key = chunkKey(chunkX, chunkZ); - const auto existing = data_->chunks.find(key); - if (data_->minY == minY && data_->maxY == maxY && - existing != data_->chunks.end() && existing->second != nullptr && - chunksEqual(*existing->second, chunk)) { - return; - } + if (changedChunks.empty()) return; - auto next = std::make_shared(*data_); - next->minY = minY; - next->maxY = maxY; - next->chunks[key] = std::make_shared(std::move(chunk)); const uint32_t generation = nextCacheGeneration(*next); - invalidateChunkNeighborhood(*next, chunkX, chunkZ, generation); + for (const uint64_t key : changedChunks) { + const int chunkX = static_cast(static_cast(key >> 32)); + const int chunkZ = static_cast(static_cast(key)); + invalidateChunkNeighborhood(*next, chunkX, chunkZ, generation); + } data_ = std::move(next); } diff --git a/NativeSrc/src/world_state.hpp b/NativeSrc/src/world_state.hpp index 694e044a..00872763 100644 --- a/NativeSrc/src/world_state.hpp +++ b/NativeSrc/src/world_state.hpp @@ -46,6 +46,12 @@ struct ChunkData { void setFlags(int localX, int y, int localZ, uint16_t flags); }; +struct ChunkUpdate { + int chunkX; + int chunkZ; + ChunkData chunk; +}; + using SharedChunkData = std::shared_ptr; using ChunkMap = std::unordered_map; @@ -77,15 +83,7 @@ class WorldState { void setWorld(std::string worldKey, int minY, int maxY); void clear(); - void upsertChunk( - int chunkX, - int chunkZ, - int minY, - int maxY, - uint64_t sectionMask, - const uint16_t* sectionFlags, - size_t sectionFlagCount - ); + void upsertChunks(std::vector updates); void applyUpdates(const std::vector& updates); diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt index de0f5087..7943ad66 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/CachedWorld.kt @@ -284,18 +284,45 @@ object CachedWorld { private fun syncAllCachedChunksToNative() { if (!NativePathfinderBridge.isAvailable()) return - for ((key, chunk) in chunks) { - if (!chunk.ready) continue - val chunkX = (key shr 32).toInt() - val chunkZ = key.toInt() - syncChunkToNative(chunkX, chunkZ, chunk) + val readyChunks = chunks.mapNotNull { (key, chunk) -> + if (chunk.ready) key to chunk else null } + if (readyChunks.isEmpty()) return + + val metadata = IntArray(readyChunks.size * 4) + val sectionMasks = LongArray(readyChunks.size) + val sectionFlags = Array(readyChunks.size) { index -> + val (key, chunk) = readyChunks[index] + val offset = index * 4 + metadata[offset] = (key shr 32).toInt() + metadata[offset + 1] = key.toInt() + metadata[offset + 2] = chunk.minY + metadata[offset + 3] = chunk.maxY + + val encoded = encodeChunk(chunk) + sectionMasks[index] = encoded.first + encoded.second + } + + NativePathfinderBridge.upsertChunks(metadata, sectionMasks, sectionFlags) } private fun syncChunkToNative(chunkX: Int, chunkZ: Int, chunk: CachedChunk) { if (!NativePathfinderBridge.isAvailable() || !chunk.ready) return - val sectionCount = (chunk.maxY - chunk.minY + 15) shr 4 + val (sectionMask, sectionFlags) = encodeChunk(chunk) + NativePathfinderBridge.upsertChunk( + chunkX, + chunkZ, + chunk.minY, + chunk.maxY, + sectionMask, + sectionFlags + ) + } + + private fun encodeChunk(chunk: CachedChunk): Pair { + val sectionCount = minOf((chunk.maxY - chunk.minY + 15) shr 4, Long.SIZE_BITS) var sectionMask = 0L var totalValues = 0 for (i in 0 until sectionCount) { @@ -305,18 +332,6 @@ object CachedWorld { } } - if (totalValues == 0) { - NativePathfinderBridge.upsertChunk( - chunkX, - chunkZ, - chunk.minY, - chunk.maxY, - 0L, - ShortArray(0) - ) - return - } - val sectionFlags = ShortArray(totalValues) var offset = 0 for (i in 0 until sectionCount) { @@ -325,14 +340,7 @@ object CachedWorld { offset += 4096 } - NativePathfinderBridge.upsertChunk( - chunkX, - chunkZ, - chunk.minY, - chunk.maxY, - sectionMask, - sectionFlags - ) + return sectionMask to sectionFlags } private fun flushPendingNativeUpdates() { diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/NativePathfinderBridge.kt b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/NativePathfinderBridge.kt index 992a3d58..4d7e6e2a 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/NativePathfinderBridge.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/NativePathfinderBridge.kt @@ -99,6 +99,15 @@ object NativePathfinderBridge { NativePathfinderJNI.upsertChunk(chunkX, chunkZ, minY, maxY, sectionMask, sectionFlags) } + @JvmStatic + fun upsertChunks( + metadata: IntArray, + sectionMasks: LongArray, + sectionFlags: Array + ) = runNative { + NativePathfinderJNI.upsertChunks(metadata, sectionMasks, sectionFlags) + } + @JvmStatic fun applyBlockUpdates(updates: IntArray) { if (updates.isEmpty()) return diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/NativePathfinderJNI.kt b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/NativePathfinderJNI.kt index 05379bc0..9a9082a5 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/NativePathfinderJNI.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/world/pathfinding/NativePathfinderJNI.kt @@ -134,6 +134,12 @@ internal object NativePathfinderJNI { sectionFlags: ShortArray ) + @JvmStatic external fun upsertChunks( + metadata: IntArray, + sectionMasks: LongArray, + sectionFlags: Array + ) + @JvmStatic external fun applyBlockUpdates(updates: IntArray) @JvmStatic external fun findPath( From 52904d4947ac4647844b6af4616f7c55c958287e Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Sun, 30 Aug 2026 20:07:29 +0000 Subject: [PATCH 33/61] optimise chunk caching [skip-native-auto] --- .../v5/natives/linux/x86_64/V5PathJNI.so | Bin 219904 -> 230240 bytes .../v5/natives/macos/arm64/V5PathJNI.dylib | Bin 191504 -> 209056 bytes .../v5/natives/macos/x86_64/V5PathJNI.dylib | Bin 182696 -> 187824 bytes .../v5/natives/windows/x86_64/V5PathJNI.dll | Bin 189440 -> 196096 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so b/src/main/resources/assets/v5/natives/linux/x86_64/V5PathJNI.so index 07238203dc8f9eb29e33127c38815a9ac5c009b4..91f4e33d2b106737db950e9c6cbcc769739bdf95 100644 GIT binary patch delta 59353 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 diff --git a/src/main/resources/assets/v5/natives/macos/arm64/V5PathJNI.dylib b/src/main/resources/assets/v5/natives/macos/arm64/V5PathJNI.dylib index e63f90b5b9a70d746181b7bf7988160f3371f3a8..a706450be80f2abfbb65e3ee803aff12c32e6d17 100755 GIT binary patch delta 26904 zcmbt+2UJwY7x&ED1(qsG5fCZ%-U}$m0`^|8qhLoxMa5ort-%`BM_iMbh$RtLV~AkT z#6&Dnqb9+`SP~PlB*BtMVq*=s-|xORt1J1R@0{;^bI$Y5?@qrnbLY;T#muYj**85h zW95!gbuO8PL`!`QrY+rTL~ZAc!gWa@ENZ*yUY8mHJ6`7o?2tS0E`E=9s_YC8H8WvJ zzNo7u8#Ogdi@p4e2hX~U?+n;LDR)o{a1n2iVkbTtBb^BQBO&%d`}z0RI2vDLDP`vlYikIFx3Hsie=PdeY- zH8}77zd?tq=NCI)XV<_^1^Mweb-yYOG-;&iNO0p}z8;!7U}vWI3dE zP>sh)EUQH0YpGlkoBMdci5w|e?p=Gm_Bvx(vUkIV+T!rM=5kE4W}4#gFu6@gob+>& zJU^tdPq8k#h3SUG{`Tiv-zm}fTWTiD2a)_`lKeCzr1wKq8#=vXM2UM*bcx0oU0O?T zEp=yB##tE)^E2JlFw-rKpXD~1{;~$kDorYi%wXjmABF0zKQMO4lQG{Cjo!L5Ngf;8 zt3mPQE-g&d$`#bBHV8$OoS63fD3_I2d#=PZlL zp0(L(K0^NKh+}2?QanYe)5r4HSe6xnvQLM90a5bY$|X{6_E{AH_?49UD<&roQip_mG{A5m%Ch2mDggk+ID|P551Vwp`a`lj~n6S1= zFBL|mtpJj=WQ;9}T!#XooXxKDN!B}5SQDuhcC0v=gQoY+DRb$E;D^Ct@ApJa6 z-i*{WW90)%YF0Z__DSjD!m;vYq#he9zd-6#R8fb@7Evm{m^fDMUZ;Wd;aGWQoe-%X zs;Kk6!2s#y%)K7bsKVAETQjZlx zQ@wRG;TtC+ORc~|^w!}@ffJEAgyZ$rA%tzmBU1=>)LRFPmH(={-f(gZHk6Cr+62io zo*aya)+0^4FW4irT-+xGqOC0s>gU~Joa>D{M0>+zlKsC;|I2<=ghroh@k#v zYlfG*DH$$DP=8-#fPj?rq2&@aKmsa%l}I^mpWssR5%x*|Ye zd;O(J2`3{L17l`sTa`UDsP{Rxu`Kxdm-<9_crxwTn=8Zv_@> zU1n-EMtJjz;nb?3D6;egTE)B#0haR`21p-!$j=)#iMX1G zUO?V4B43J4&DR;2dRL6}$|c8gD>cj%2VNU|wpG$a*}H|mw`6$=6+}~C0y=Muys}Z8 z6g);g-6+JrH)WjGUhQaBd!?fvC!(Wmq+N+}i^j3q*ZR7v@w9qp(3Y|WsITbLNy6xR zis<_>V7aVufKrCzJ%t2_KIgF z>NqrZF==dfZyKk1NRWae-TE%_|3`~%SG8z@%@%8ZsYV6!yB9XIy^=Q*)lIPpmDpA3 zdeISYP`%A&ma}h!wSKB`vOLph6)_%TVYB;cS%OUpYwfO3|LNy6Ea8d9*;202Sgg>q zXXN*q)(vW^V+l)_gbpdu1Y1U-y2lvHO~jWc%0D#?4)j$t>bp|#hPK$8C94>Yq?(pn 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 diff --git a/src/main/resources/assets/v5/natives/macos/x86_64/V5PathJNI.dylib b/src/main/resources/assets/v5/natives/macos/x86_64/V5PathJNI.dylib index c71a6a33d673749bf8c6a87bdc633800e5b8147a..f20b5b8b4e75510973fb5e46022697cdbf760165 100644 GIT binary patch delta 29694 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 i>>$bsK7bopXqL$hPiKWDZB&{(W!lBnz zjoQ0tG?-K^V-HmZt*R=ai%V3~QqorC|GxK}A@Y6x|Nry+p67R-=bra|-uFH4+4nnB z_+`yqtY&^3>qPxm4d_mn9$dA$S8aNcNa!YUBGHSh?su;}&BftqstToPF4l!~59n}( zvmeytY{2rW0NRLUYih50t5%TV7MC~EaXDfSHrBfVt00Degoj)jDvSbVt!Qk(_;SuK z^x&ZYbE__m2iru0{3Q`U&*hTDj?*4)?j$!;Vzo6dxZZ+0Nn&qkdISm!ks8iU2dq)k z<7M_ z1hKcYz3Ul7+6#q>z`J&{>)QUq0CfgIXQ08Jl9bXMFa%f@PNhhQu{e@S1%S~;Fg(r< zRQe1G%lSH$lzEbb)sO-Yx?aG?2McKkTjCk2E$mOF9JY!C1UCR4hEJ?rGUsw$x0)ND z-0rt~;vZLwT%Pku(6IJY8U`UFKm$V;LM(d6mH^t+mt_aGXma}?k<2ztqV>7idaE); z55BS+cuCf$BjZM=-aB@Xoei|nYm^NM3Ztj4v8zxGa-%3uLBt0<|kR;ou=@2Bz zmYJPV!)(hcRDLUFztjnj81fzHpD|@aawWIj9$x@2r{bw@>D}j*m1b+IOEE{Yj&(!p zEi6XK$w?#QM#ZJZjgA|WdctfyqvY3MGwRl>mk81_U(_#?60KJgt!K>ktYT%c7b~b6 zHl-#=ldP3WW1w+4&uM0m*&e;_Dj2k7xy;t%O7j|$RHg@Jj$kU|y(CF_>LAj+fslB! z^@MUCK$$nbmBJeq;GF|V&nVZRnsuSMm=AU|xJkg9D7Oc7`c92C>WSh!z#a#O)d~fM z*?t&HLs@cwwW!yIK0d&P)N4xHA7BgXh1Yr?W49lUM1`mO+1`4u(Mbo`9Z=Z0pLx{} zuhot#ltbAlQ}?sj`mfO&``L{8O=*MujDf=5Z&eG0sBmi^I|~X!_OpLLVdXv++TbW% zx{sAM2x>5OACaEq<%1g0<@UoI+71_BpaJ`szG2-FF(@|`gRrA2%qmfut3g~mNE;rc z6odGw0!$OAH|7Efi1N4yjT8Vkh#M(XZWpm74eO?spd=6T2}0C`=#3cUGd0LE;64U> zP(ACEO{#7R*DX`Ihtp6uM-^acg8D74o~=wTVt+L(u6cVe6of6SRQc$0R@^9pT0Un# z0U7i;s}*9P?LKFbAraK;b2bvljlJw`U>@Adb^%(smt6^o2pSIto|rHt^W7}AH#x;`~9UT7Py6|%9RAJJb5nV%t{Q&1s+W_i+VHMtTiPbFEW zJE23BBw6n!S)V6a|5V0;JpQyt2dMq%=P;T><8>;A&)C8yU1-mX%+Vy2HonNNHEGjY zbfMlbggh}hi3(jxXMoT-I#=l&imMgt-q_G2a*tXNh05RXq6WDK<>FHABOel~-@~#S z2YKBCs5tkqO^ut-cAqh4<34oM9_HI5EO-k@;!h{ULMOFHkGmieH|A58*d&s+`BY6~ z|F6|Fw*4B?XzXbIR87q*T^0L%B=Db@vPs4jNI|~RScOiKd9Lh|;*4PZnnp$GJ`t(C z1~01aPpa-&6+(WmtBF5|YLNKSk6B^UM&q9T0f~RBqa@*2b^`i8_R3A5qjvT{NO!}p z)BxDmKm4zdDg+_t;r=g7$w=J2b*ms7;a4k$$7u&a?jyd zhl7sIE6Mt>GJlv>lB_54oVpb!Kw|IKz-)z@FZ@_EmosKtrc>Do5CaY5p`tEZzfZQ7 zR_3R`bdzNL$*f6r-dm1_?OD4Ltj`mmL7jR8y(jMn=oe~)8YryFd;^SW-Jn5#C3yDe z&(GpOZ#i{NEuG4gNHZiQcNNH=n0Aqjg=X8};<5!%Kg1mZ7EgFyWoFH?I#EBEqJ9<` zaU0HvigG4J`~=g)N%N(D&DK%PV6^mTX12$M!Ro-4dEPd-1SSTPwLHm|T%dS&lBDFk zpEIJ9EY`cwc+D>x@4ZzYL4xdqcbjcBA?0T4>B`sB)fC|bQmo8I@hc&)(qYgq^K%dX zXt_0Xu(BpqCxxU-oM(LQYXT3T#qqDcOX`Mz;{dQK;sWE-Djg@sO2rzBK zsMXm5i$JS%*v2+@-k{&S6^j*mCKT%v<-M)U9J5sKt1@BSRhb@Ji>}A~NNDI5_C?nO zYTCjoyN1%w3z(r>GX3l`HnUqi{ih+@*R46d+>qVqHkf|!0c#)II{Fug(jI;BXC#O9 zFn%ZvdSG|+^Hn8>hXKoM-;WZreXTl=)_3H&E{2Fw|OSZ#+Rk^9F+cH7v74%x``adj*oZB(;Z%rjuNr8;@~ z04poF42#5_?p?^AtMap|wBqr|$@?J##*ACaPyjDFKp$=+7~7IsgfX0?bbB11IN2^R<&nCn#ZvWdlFqM<#P~6RX*hK8l+OKQy5iG$P=B~*VnKjHyPP(AMq@GZAtzfhJHKE;B zu=o0PqOzS`>=)kZdpqhb48|r1DD*meHn3S}p$c#DvWN8%76)XjH#G7y_t-MlV^Do^fsGi{ zC}51Lc|teTsq;5_o9)`i#ccVYxAd3aA<_$`-@#%QI5@5EC}3juc=$G_Nq}({oDF!e z+4{@Cl%sf>p!8Dp)Sc)!RJBEqRy$yj+7H1%|99BY!S%W!)9RIaZ#gJco$k0TSWZHE zvbmBnk;f^T(~-AX;E*PC!`rO$kO(^SZ8mO5XL>e|y+0(B2ENUX45{Bu-G-v^y#IIO zF0Q0Z1Rcnj+jt%e916zsSm&Xwn@L@{u^449?WII!x~vOf}Sok8?9hgdtkwEFK1D!Bet>chqV~%QbR#5MTefG9N`?Zo0Fn^!Z|RV z@J`=Z*}yqfhJj@&=YNKQSvhR%@H(9iZpD2S^dk}ZUc`kj@dm^=Jqr19#QD!z+thya zo26`V>R38&DZ8E8gdSbWw4+;fT(=ZUew=r5#KVkQFyg{C0!Q2>z)mKQldR*s%Niv| zJkRh?v_2EN%Lz+~JmUaqVEGCrZ>$R8Fv@}EoCm??Gups2MB4fBNA1*}psfu^=dW$R zNi!gz5&;CA*`8GjOVOu_FD!v|;igj1tcNQ0=*y>(#0H$kK`rRrz0jrSEWuhi89Xxe zL=aZDJ$4T$DgR{y8>)3`HVYbafaYbhug9d3h@!S>TL_*0Ptm2ZLy5mHjIc-WJPY!I zecpq`jC+la$SRsLZWf`#ZS2SK4QN7R_RshQEsr^gl

-1MYhjl<9op817hQkMnRki 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≻2xI!+rbqUGP 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 nC#abHhc7)!66ZovZi)87s*8FBD`E+?{Y literal 0 HcmV?d00001 diff --git a/src/main/resources/ctjs.mixins.json b/src/main/resources/ctjs.mixins.json index e4275cff..fda31254 100644 --- a/src/main/resources/ctjs.mixins.json +++ b/src/main/resources/ctjs.mixins.json @@ -35,6 +35,7 @@ "AbstractContainerScreenAccessor", "AbstractContainerScreenMixin", "GuiMixin", + "GuiGraphicsExtractorAccessor", "GuiRendererMixin", "ItemInHandRendererMixin", "JoinMultiplayerScreenMixin", diff --git a/typing-generator/src/main/kotlin/com/chattriggers/ctjs/typing/prologue.kt b/typing-generator/src/main/kotlin/com/chattriggers/ctjs/typing/prologue.kt index 14996d9d..79a69e4b 100644 --- a/typing-generator/src/main/kotlin/com/chattriggers/ctjs/typing/prologue.kt +++ b/typing-generator/src/main/kotlin/com/chattriggers/ctjs/typing/prologue.kt @@ -6,23 +6,6 @@ val manualRoots = setOf( "java.util.HashMap", "gg.essential.universal.UKeyboard", "net.minecraft.util.Hand", - "org.lwjgl.opengl.GL11", - "org.lwjgl.opengl.GL12", - "org.lwjgl.opengl.GL13", - "org.lwjgl.opengl.GL14", - "org.lwjgl.opengl.GL15", - "org.lwjgl.opengl.GL20", - "org.lwjgl.opengl.GL21", - "org.lwjgl.opengl.GL30", - "org.lwjgl.opengl.GL31", - "org.lwjgl.opengl.GL32", - "org.lwjgl.opengl.GL33", - "org.lwjgl.opengl.GL40", - "org.lwjgl.opengl.GL41", - "org.lwjgl.opengl.GL42", - "org.lwjgl.opengl.GL43", - "org.lwjgl.opengl.GL44", - "org.lwjgl.opengl.GL45", "org.spongepowered.asm.mixin.injection.callback.CallbackInfo", ) diff --git a/typing-generator/src/main/resources/provided-types.properties b/typing-generator/src/main/resources/provided-types.properties index 6ab6aa16..60be1fcb 100644 --- a/typing-generator/src/main/resources/provided-types.properties +++ b/typing-generator/src/main/resources/provided-types.properties @@ -37,8 +37,6 @@ Gui=com.chattriggers.ctjs.api.render.Gui Image=com.chattriggers.ctjs.api.render.Image Rectangle=com.chattriggers.ctjs.api.render.Rectangle Renderer=com.chattriggers.ctjs.api.render.Renderer -Renderer3d=com.chattriggers.ctjs.api.render.Renderer3d -Shape=com.chattriggers.ctjs.api.render.Shape Text=com.chattriggers.ctjs.api.render.Text Toast=com.chattriggers.ctjs.api.render.Toast RenderUtils=com.chattriggers.ctjs.api.render.RenderUtils @@ -63,7 +61,6 @@ Config=com.chattriggers.ctjs.api.Config V5Auth=com.chattriggers.ctjs.api.V5Auth DiscordRPC=com.chattriggers.ctjs.api.client.DiscordRPC GradientChat=com.chattriggers.ctjs.api.message.Chat -NVG=com.chattriggers.ctjs.api.render.NVGRenderer StructureFinder=com.chattriggers.ctjs.api.world.StructureFinder PathManager=com.chattriggers.ctjs.api.world.pathfinding.PathManager TriggerRegister=com.chattriggers.ctjs.engine.Register @@ -71,20 +68,3 @@ Thread=com.chattriggers.ctjs.engine.WrappedThread Priority=com.chattriggers.ctjs.api.triggers.Trigger$Priority ChatTriggers=com.chattriggers.ctjs.CTJS Console=com.chattriggers.ctjs.engine.Console -GL11=org.lwjgl.opengl.GL11 -GL12=org.lwjgl.opengl.GL12 -GL13=org.lwjgl.opengl.GL13 -GL14=org.lwjgl.opengl.GL14 -GL15=org.lwjgl.opengl.GL15 -GL20=org.lwjgl.opengl.GL20 -GL21=org.lwjgl.opengl.GL21 -GL30=org.lwjgl.opengl.GL30 -GL31=org.lwjgl.opengl.GL31 -GL32=org.lwjgl.opengl.GL32 -GL33=org.lwjgl.opengl.GL33 -GL40=org.lwjgl.opengl.GL40 -GL41=org.lwjgl.opengl.GL41 -GL42=org.lwjgl.opengl.GL42 -GL43=org.lwjgl.opengl.GL43 -GL44=org.lwjgl.opengl.GL44 -GL45=org.lwjgl.opengl.GL45 diff --git a/typing-generator/src/main/resources/typings.d.ts b/typing-generator/src/main/resources/typings.d.ts index 06fac4d6..2b62956d 100644 --- a/typing-generator/src/main/resources/typings.d.ts +++ b/typing-generator/src/main/resources/typings.d.ts @@ -162,10 +162,6 @@ declare global { interface Rectangle extends com.chattriggers.ctjs.api.render.Rectangle {} const Renderer: typeof com.chattriggers.ctjs.api.render.Renderer; interface Renderer extends com.chattriggers.ctjs.api.render.Renderer {} - const Renderer3d: typeof com.chattriggers.ctjs.api.render.Renderer3d; - interface Renderer3d extends com.chattriggers.ctjs.api.render.Renderer3d {} - const Shape: typeof com.chattriggers.ctjs.api.render.Shape; - interface Shape extends com.chattriggers.ctjs.api.render.Shape {} const Text: typeof com.chattriggers.ctjs.api.render.Text; interface Text extends com.chattriggers.ctjs.api.render.Text {} const Toast: typeof com.chattriggers.ctjs.api.render.Toast; @@ -214,8 +210,6 @@ declare global { interface DiscordRPC extends com.chattriggers.ctjs.api.client.DiscordRPC {} const GradientChat: typeof com.chattriggers.ctjs.api.message.Chat; interface GradientChat extends com.chattriggers.ctjs.api.message.Chat {} - const NVG: typeof com.chattriggers.ctjs.api.render.NVGRenderer; - interface NVG extends com.chattriggers.ctjs.api.render.NVGRenderer {} const StructureFinder: typeof com.chattriggers.ctjs.api.world.StructureFinder; interface StructureFinder extends com.chattriggers.ctjs.api.world.StructureFinder {} const PathManager: typeof com.chattriggers.ctjs.api.world.pathfinding.PathManager; @@ -230,40 +224,6 @@ declare global { interface ChatTriggers extends com.chattriggers.ctjs.CTJS {} const Console: typeof com.chattriggers.ctjs.engine.Console; interface Console extends com.chattriggers.ctjs.engine.Console {} - const GL11: typeof org.lwjgl.opengl.GL11; - interface GL11 extends org.lwjgl.opengl.GL11 {} - const GL12: typeof org.lwjgl.opengl.GL12; - interface GL12 extends org.lwjgl.opengl.GL12 {} - const GL13: typeof org.lwjgl.opengl.GL13; - interface GL13 extends org.lwjgl.opengl.GL13 {} - const GL14: typeof org.lwjgl.opengl.GL14; - interface GL14 extends org.lwjgl.opengl.GL14 {} - const GL15: typeof org.lwjgl.opengl.GL15; - interface GL15 extends org.lwjgl.opengl.GL15 {} - const GL20: typeof org.lwjgl.opengl.GL20; - interface GL20 extends org.lwjgl.opengl.GL20 {} - const GL21: typeof org.lwjgl.opengl.GL21; - interface GL21 extends org.lwjgl.opengl.GL21 {} - const GL30: typeof org.lwjgl.opengl.GL30; - interface GL30 extends org.lwjgl.opengl.GL30 {} - const GL31: typeof org.lwjgl.opengl.GL31; - interface GL31 extends org.lwjgl.opengl.GL31 {} - const GL32: typeof org.lwjgl.opengl.GL32; - interface GL32 extends org.lwjgl.opengl.GL32 {} - const GL33: typeof org.lwjgl.opengl.GL33; - interface GL33 extends org.lwjgl.opengl.GL33 {} - const GL40: typeof org.lwjgl.opengl.GL40; - interface GL40 extends org.lwjgl.opengl.GL40 {} - const GL41: typeof org.lwjgl.opengl.GL41; - interface GL41 extends org.lwjgl.opengl.GL41 {} - const GL42: typeof org.lwjgl.opengl.GL42; - interface GL42 extends org.lwjgl.opengl.GL42 {} - const GL43: typeof org.lwjgl.opengl.GL43; - interface GL43 extends org.lwjgl.opengl.GL43 {} - const GL44: typeof org.lwjgl.opengl.GL44; - interface GL44 extends org.lwjgl.opengl.GL44 {} - const GL45: typeof org.lwjgl.opengl.GL45; - interface GL45 extends org.lwjgl.opengl.GL45 {} /** @@ -4232,19 +4192,6 @@ declare global { interface Delayed extends kotlin.Comparable { getDelay(p0: java.util.concurrent.TimeUnit): number; } - const CopyOnWriteArrayList: { - new(): java.util.concurrent.CopyOnWriteArrayList; - new(p0: Array): java.util.concurrent.CopyOnWriteArrayList; - new(p0: Array): java.util.concurrent.CopyOnWriteArrayList; - } - interface CopyOnWriteArrayList extends Array, java.util.RandomAccess, kotlin.Cloneable, java.io.Serializable { - indexOf(p0: E, p1: number): number; - lastIndexOf(p0: E, p1: number): number; - toArray(): Array; - toArray(p0: Array): Array; - addIfAbsent(p0: E): boolean; - addAllAbsent(p0: Array): number; - } const ConcurrentHashMap: { KeySetView: typeof java.util.concurrent.ConcurrentHashMap$KeySetView; new(): java.util.concurrent.ConcurrentHashMap; @@ -4298,6 +4245,19 @@ declare global { interface ConcurrentHashMap$KeySetView extends Set, java.io.Serializable { getMappedValue(): V; } + const CopyOnWriteArrayList: { + new(): java.util.concurrent.CopyOnWriteArrayList; + new(p0: Array): java.util.concurrent.CopyOnWriteArrayList; + new(p0: Array): java.util.concurrent.CopyOnWriteArrayList; + } + interface CopyOnWriteArrayList extends Array, java.util.RandomAccess, kotlin.Cloneable, java.io.Serializable { + indexOf(p0: E, p1: number): number; + lastIndexOf(p0: E, p1: number): number; + toArray(): Array; + toArray(p0: Array): Array; + addIfAbsent(p0: E): boolean; + addAllAbsent(p0: Array): number; + } } namespace random { const RandomGenerator: { @@ -9110,6 +9070,46 @@ declare global { } } namespace reflect { + interface KClass extends kotlin.reflect.KDeclarationContainer, kotlin.reflect.KAnnotatedElement, kotlin.reflect.KClassifier { + getSimpleName(): string | null | undefined; + getQualifiedName(): string | null | undefined; + getConstructors(): Array>; + getNestedClasses(): Array>; + getObjectInstance(): T; + getTypeParameters(): Array; + getSupertypes(): Array; + getSealedSubclasses(): Array>; + getVisibility(): kotlin.reflect.KVisibility | null | undefined; + isFinal(): boolean; + isOpen(): boolean; + isAbstract(): boolean; + isSealed(): boolean; + isData(): boolean; + isInner(): boolean; + isCompanion(): boolean; + isFun(): boolean; + isValue(): boolean; + isInstance(value: any | null | undefined): boolean; + } + interface KDeclarationContainer { + getMembers(): Array>; + } + interface KAnnotatedElement { + getAnnotations(): Array; + } + interface KClassifier { + } + const KVisibility: { + PUBLIC: kotlin.reflect.KVisibility; + PROTECTED: kotlin.reflect.KVisibility; + INTERNAL: kotlin.reflect.KVisibility; + PRIVATE: kotlin.reflect.KVisibility; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): kotlin.reflect.KVisibility; + } + interface KVisibility extends kotlin.Enum { + } interface KProperty extends kotlin.reflect.KCallable { isLateinit(): boolean; isConst(): boolean; @@ -9128,27 +9128,11 @@ declare global { call(args: any | null | undefined): R; callBy(args: Map): R; } - interface KAnnotatedElement { - getAnnotations(): Array; - } interface KType extends kotlin.reflect.KAnnotatedElement { getClassifier(): kotlin.reflect.KClassifier | null | undefined; getArguments(): Array; isMarkedNullable(): boolean; } - interface KClassifier { - } - const KVisibility: { - PUBLIC: kotlin.reflect.KVisibility; - PROTECTED: kotlin.reflect.KVisibility; - INTERNAL: kotlin.reflect.KVisibility; - PRIVATE: kotlin.reflect.KVisibility; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): kotlin.reflect.KVisibility; - } - interface KVisibility extends kotlin.Enum { - } interface KProperty$Getter extends kotlin.reflect.KProperty$Accessor, kotlin.reflect.KFunction { } interface KProperty$Accessor { @@ -9160,30 +9144,6 @@ declare global { isOperator(): boolean; isInfix(): boolean; } - interface KClass extends kotlin.reflect.KDeclarationContainer, kotlin.reflect.KAnnotatedElement, kotlin.reflect.KClassifier { - getSimpleName(): string | null | undefined; - getQualifiedName(): string | null | undefined; - getConstructors(): Array>; - getNestedClasses(): Array>; - getObjectInstance(): T; - getTypeParameters(): Array; - getSupertypes(): Array; - getSealedSubclasses(): Array>; - getVisibility(): kotlin.reflect.KVisibility | null | undefined; - isFinal(): boolean; - isOpen(): boolean; - isAbstract(): boolean; - isSealed(): boolean; - isData(): boolean; - isInner(): boolean; - isCompanion(): boolean; - isFun(): boolean; - isValue(): boolean; - isInstance(value: any | null | undefined): boolean; - } - interface KDeclarationContainer { - getMembers(): Array>; - } interface KMutableProperty0 extends kotlin.reflect.KProperty0, kotlin.reflect.KMutableProperty { set(value: V): void; } @@ -10104,23 +10064,6 @@ declare global { getCurrentScreen(): net.minecraft.client.gui.screens.Screen | null | undefined; displayScreen(screen: net.minecraft.client.gui.screens.Screen | null | undefined): void; } - const UGraphics$DrawMode: { - LINES: gg.essential.universal.UGraphics$DrawMode; - LINE_STRIP: gg.essential.universal.UGraphics$DrawMode; - TRIANGLES: gg.essential.universal.UGraphics$DrawMode; - TRIANGLE_STRIP: gg.essential.universal.UGraphics$DrawMode; - TRIANGLE_FAN: gg.essential.universal.UGraphics$DrawMode; - QUADS: gg.essential.universal.UGraphics$DrawMode; - entries: kotlin.enums.EnumEntries; - fromGl(p0: number): gg.essential.universal.UGraphics$DrawMode; - fromRenderLayer(p0: net.minecraft.client.renderer.rendertype.RenderType): gg.essential.universal.UGraphics$DrawMode; - values(): Array; - valueOf(value: string): gg.essential.universal.UGraphics$DrawMode; - } - interface UGraphics$DrawMode extends kotlin.Enum { - glMode: number; - mcMode: com.mojang.blaze3d.vertex.VertexFormat$Mode; - } } namespace vigilance { namespace data { @@ -38676,12 +38619,6 @@ declare global { } } } - namespace api { - interface ClientModInitializer { - onInitializeClient(): void; - (): void; - } - } namespace loader { namespace api { namespace entrypoint { @@ -38692,6 +38629,12 @@ declare global { } } } + namespace api { + interface ClientModInitializer { + onInitializeClient(): void; + (): void; + } + } } } namespace com { @@ -43495,8321 +43438,39 @@ declare global { } } } + namespace v5 { + namespace loader { + const V5PreLaunch: { + new(): com.v5.loader.V5PreLaunch; + } + interface V5PreLaunch extends net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint { + } + } + } namespace chattriggers { namespace ctjs { - namespace api { - namespace vec { - const Vec3i: { - new(): com.chattriggers.ctjs.api.vec.Vec3i; - new(x: number): com.chattriggers.ctjs.api.vec.Vec3i; - new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec3i; - new(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3i; - } - interface Vec3i { - getX(): number; - getY(): number; - getZ(): number; - magnitudeSquared(): number; - magnitude(): number; - translated(dx: number, dy: number, dz: number): com.chattriggers.ctjs.api.vec.Vec3i; - scaled(scale: number): com.chattriggers.ctjs.api.vec.Vec3i; - scaled(xScale: number, yScale: number, zScale: number): com.chattriggers.ctjs.api.vec.Vec3i; - crossProduct(other: com.chattriggers.ctjs.api.vec.Vec3i): com.chattriggers.ctjs.api.vec.Vec3i; - dotProduct(other: com.chattriggers.ctjs.api.vec.Vec3i): number; - angleTo(other: com.chattriggers.ctjs.api.vec.Vec3i): number; - normalized(): com.chattriggers.ctjs.api.vec.Vec3f; - unaryMinus(): com.chattriggers.ctjs.api.vec.Vec3i; - plus(other: com.chattriggers.ctjs.api.vec.Vec3i): com.chattriggers.ctjs.api.vec.Vec3i; - minus(other: com.chattriggers.ctjs.api.vec.Vec3i): com.chattriggers.ctjs.api.vec.Vec3i; - } - const Vec3f: { - new(): com.chattriggers.ctjs.api.vec.Vec3f; - new(x: number): com.chattriggers.ctjs.api.vec.Vec3f; - new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec3f; - new(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; - } - interface Vec3f { - getX(): number; - getY(): number; - getZ(): number; - magnitudeSquared(): number; - magnitude(): number; - translated(dx: number, dy: number, dz: number): com.chattriggers.ctjs.api.vec.Vec3f; - scaled(scale: number): com.chattriggers.ctjs.api.vec.Vec3f; - scaled(xScale: number, yScale: number, zScale: number): com.chattriggers.ctjs.api.vec.Vec3f; - crossProduct(other: com.chattriggers.ctjs.api.vec.Vec3f): com.chattriggers.ctjs.api.vec.Vec3f; - dotProduct(other: com.chattriggers.ctjs.api.vec.Vec3f): number; - angleTo(other: com.chattriggers.ctjs.api.vec.Vec3f): number; - normalized(): com.chattriggers.ctjs.api.vec.Vec3f; - unaryMinus(): com.chattriggers.ctjs.api.vec.Vec3f; - plus(other: com.chattriggers.ctjs.api.vec.Vec3f): com.chattriggers.ctjs.api.vec.Vec3f; - minus(other: com.chattriggers.ctjs.api.vec.Vec3f): com.chattriggers.ctjs.api.vec.Vec3f; - component1(): number; - component2(): number; - component3(): number; - copy(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; - } - const Vec2f: { - new(): com.chattriggers.ctjs.api.vec.Vec2f; - new(x: number): com.chattriggers.ctjs.api.vec.Vec2f; - new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec2f; - } - interface Vec2f { - getX(): number; - getY(): number; - magnitudeSquared(): number; - magnitude(): number; - translated(dx: number, dy: number): com.chattriggers.ctjs.api.vec.Vec2f; - scaled(scale: number): com.chattriggers.ctjs.api.vec.Vec2f; - scaled(xScale: number, yScale: number): com.chattriggers.ctjs.api.vec.Vec2f; - dotProduct(other: com.chattriggers.ctjs.api.vec.Vec2f): number; - angleTo(other: com.chattriggers.ctjs.api.vec.Vec2f): number; - normalized(): com.chattriggers.ctjs.api.vec.Vec2f; - unaryMinus(): com.chattriggers.ctjs.api.vec.Vec2f; - plus(other: com.chattriggers.ctjs.api.vec.Vec2f): com.chattriggers.ctjs.api.vec.Vec2f; - minus(other: com.chattriggers.ctjs.api.vec.Vec2f): com.chattriggers.ctjs.api.vec.Vec2f; - component1(): number; - component2(): number; - copy(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec2f; - } + namespace engine { + const WrappedThread: { + new(task: java.lang.Runnable): com.chattriggers.ctjs.engine.WrappedThread; } - namespace inventory { - namespace nbt { - const NBTBase: { - new(mcValue: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; - } - interface NBTBase extends com.chattriggers.ctjs.api.CTWrapper { - /** - * Gets the type byte for the tag. - */ - getId(): number; - /** - * Creates a clone of the tag. - */ - copy(): net.minecraft.nbt.Tag; - /** - * Return whether this compound has no tags. - */ - hasNoTags(): boolean; - hasTags(): boolean; - } - const NBTBase$Companion: { - fromMC(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; - new(): com.chattriggers.ctjs.api.inventory.nbt.NBTBase$Companion; - } - interface NBTBase$Companion { - fromMC(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; - new(): com.chattriggers.ctjs.api.inventory.nbt.NBTBase$Companion; - toObject(): any | null | undefined; - toObject(): org.mozilla.javascript.NativeObject; - toObject(): org.mozilla.javascript.NativeArray; - } - const NBTTagList: { - new(mcValue: net.minecraft.nbt.ListTag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - } - interface NBTTagList extends com.chattriggers.ctjs.api.inventory.nbt.NBTBase { - getTagCount(): number; - appendTag(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - appendTag(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - set(id: number, nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - set(id: number, nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - insertTag(index: number, nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - insertTag(index: number, nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - removeTag(index: number): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; - getShortAt(index: number): java.util.Optional; - getIntAt(index: number): java.util.Optional; - getFloatAt(index: number): java.util.Optional; - getDoubleAt(index: number): java.util.Optional; - getStringTagAt(index: number): string; - getListAt(index: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - getCompoundTagAt(index: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - getIntArrayAt(index: number): Array; - getLongArrayAt(index: number): Array; - get(index: number): net.minecraft.nbt.Tag; - get(index: number, type: number): any; - toArray(): org.mozilla.javascript.NativeArray; - } - const NBTTagCompound: { - NBTDataType: typeof com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - new(mcValue: net.minecraft.nbt.CompoundTag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - } - interface NBTTagCompound extends com.chattriggers.ctjs.api.inventory.nbt.NBTBase { - getTagMap(): Map; - getKeySet(): Set; - getTag(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTBase | null | undefined; - getTagId(key: string): number | null | undefined; - getByte(key: string): java.util.Optional; - getShort(key: string): java.util.Optional; - getInteger(key: string): java.util.Optional; - getLong(key: string): java.util.Optional; - getFloat(key: string): java.util.Optional; - getDouble(key: string): java.util.Optional; - getString(key: string): java.util.Optional; - getByteArray(key: string): java.util.Optional>; - getIntArray(key: string): java.util.Optional>; - getBoolean(key: string): java.util.Optional; - getCompoundTag(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - getTagList(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; - get(key: string, type: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType, tagType: number | null | undefined): any | null | undefined; - get(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTBase | null | undefined; - setNBTBase(key: string, value: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setNBTBase(key: string, value: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setBoolean(key: string, value: boolean): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setByte(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setShort(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setInteger(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setLong(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setFloat(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setDouble(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setString(key: string, value: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setByteArray(key: string, value: Array): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - setIntArray(key: string, value: Array): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - putLongArray(key: string, value: Array): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - set(key: string, value: any): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - removeTag(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; - toObject(): org.mozilla.javascript.NativeObject; - } - const NBTTagCompound$NBTDataType: { - BYTE: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - SHORT: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - INTEGER: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - LONG: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - FLOAT: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - DOUBLE: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - STRING: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - BYTE_ARRAY: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - INT_ARRAY: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - LONG_ARRAY: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - BOOLEAN: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - COMPOUND_TAG: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - TAG_LIST: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; - } - interface NBTTagCompound$NBTDataType extends kotlin.Enum { - } - const NBT: { - /** - * Creates a new [NBTBase] from the given [nbt] - * - * @param nbt the value to convert to NBT - * @param options optional argument to allow refinement of the NBT data. - * Possible options include: - * - coerceNumericStrings: Boolean, default false. - * E.g. "10b" as a byte, "20s" as a short, "30f" as a float, "40d" as a double, - * "50l" as a long - * - preferArraysOverLists: Boolean, default false - * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or - * NBTTagIntArray accordingly - * - * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] - * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. - */ - parse(nbt: any): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; - /** - * Creates a new [NBTBase] from the given [nbt] - * - * @param nbt the value to convert to NBT - * @param options optional argument to allow refinement of the NBT data. - * Possible options include: - * - coerceNumericStrings: Boolean, default false. - * E.g. "10b" as a byte, "20s" as a short, "30f" as a float, "40d" as a double, - * "50l" as a long - * - preferArraysOverLists: Boolean, default false - * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or - * NBTTagIntArray accordingly - * - * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] - * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. - */ - parse(nbt: any, options: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; - toObject(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound): org.mozilla.javascript.NativeObject; - toArray(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagList): org.mozilla.javascript.NativeArray; - new(): com.chattriggers.ctjs.api.inventory.nbt.NBT; - } - interface NBT { - /** - * Creates a new [NBTBase] from the given [nbt] - * - * @param nbt the value to convert to NBT - * @param options optional argument to allow refinement of the NBT data. - * Possible options include: - * - coerceNumericStrings: Boolean, default false. - * E.g. "10b" as a byte, "20s" as a short, "30f" as a float, "40d" as a double, - * "50l" as a long - * - preferArraysOverLists: Boolean, default false - * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or - * NBTTagIntArray accordingly - * - * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] - * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. - */ - parse(nbt: any): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; - /** - * Creates a new [NBTBase] from the given [nbt] - * - * @param nbt the value to convert to NBT - * @param options optional argument to allow refinement of the NBT data. - * Possible options include: - * - coerceNumericStrings: Boolean, default false. - * E.g. "10b" as a byte, "20s" as a short, "30f" as a float, "40d" as a double, - * "50l" as a long - * - preferArraysOverLists: Boolean, default false - * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or - * NBTTagIntArray accordingly - * - * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] - * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. - */ - parse(nbt: any, options: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; - toObject(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound): org.mozilla.javascript.NativeObject; - toArray(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagList): org.mozilla.javascript.NativeArray; - new(): com.chattriggers.ctjs.api.inventory.nbt.NBT; - } - } - namespace action { - const DropAction: { - new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.DropAction; - } - interface DropAction extends com.chattriggers.ctjs.api.inventory.action.Action { - getHoldingCtrl(): boolean; - /** - * Whether the click should act as if control is being held (defaults to false) - * - * @param holdingCtrl to hold ctrl or not - */ - setHoldingCtrl(holdingCtrl: boolean): com.chattriggers.ctjs.api.inventory.action.DropAction; - } - const Action: { - Type: typeof com.chattriggers.ctjs.api.inventory.action.Action$Type; - new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.Action; - } - interface Action { - getSlot(): number; - setSlot(value: number): void; - getWindowId(): number; - setWindowId(value: number): void; - setSlot(slot: number): com.chattriggers.ctjs.api.inventory.action.Action; - setWindowId(windowId: number): com.chattriggers.ctjs.api.inventory.action.Action; - } - const Action$Companion: { - /** - * Creates a new action. - * The Inventory must be a container, see [Inventory.isContainer]. - * The slot can be -999 for outside of the gui - * - * @param inventory the inventory to complete the action on - * @param slot the slot to complete the action on - * @param typeString the type of action to do (CLICK, DRAG, DROP, KEY) - * @return the new action - */ - of(inventory: com.chattriggers.ctjs.api.inventory.Inventory, slot: number, typeString: string): com.chattriggers.ctjs.api.inventory.action.Action; - new(): com.chattriggers.ctjs.api.inventory.action.Action$Companion; - } - interface Action$Companion { - /** - * Creates a new action. - * The Inventory must be a container, see [Inventory.isContainer]. - * The slot can be -999 for outside of the gui - * - * @param inventory the inventory to complete the action on - * @param slot the slot to complete the action on - * @param typeString the type of action to do (CLICK, DRAG, DROP, KEY) - * @return the new action - */ - of(inventory: com.chattriggers.ctjs.api.inventory.Inventory, slot: number, typeString: string): com.chattriggers.ctjs.api.inventory.action.Action; - new(): com.chattriggers.ctjs.api.inventory.action.Action$Companion; - } - const Action$Type: { - CLICK: com.chattriggers.ctjs.api.inventory.action.Action$Type; - DRAG: com.chattriggers.ctjs.api.inventory.action.Action$Type; - KEY: com.chattriggers.ctjs.api.inventory.action.Action$Type; - DROP: com.chattriggers.ctjs.api.inventory.action.Action$Type; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.Action$Type; - } - interface Action$Type extends kotlin.Enum { - } - const KeyAction: { - new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.KeyAction; - } - interface KeyAction extends com.chattriggers.ctjs.api.inventory.action.Action { - getKey(): number; - /** - * Which key to act as if has been clicked (REQUIRED). - * Options currently are 0-8, representing the hotbar keys - * - * @param key which key to "click" - */ - setKey(key: number): com.chattriggers.ctjs.api.inventory.action.KeyAction; - } - const ClickAction: { - ClickType: typeof com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; - new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.ClickAction; - } - interface ClickAction extends com.chattriggers.ctjs.api.inventory.action.Action { - getClickType(): com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; - /** - * The type of click (REQUIRED) - * - * @param clickType the new click type - */ - setClickType(clickType: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType): com.chattriggers.ctjs.api.inventory.action.ClickAction; - getHoldingShift(): boolean; - /** - * Whether the click should act as if shift is being held (defaults to false) - * - * @param holdingShift to hold shift or not - */ - setHoldingShift(holdingShift: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; - getItemInHand(): boolean; - /** - * Whether the click should act as if an item is being held - * (defaults to whether there actually is an item in the hand) - * - * @param itemInHand to be holding an item or not - */ - setItemInHand(itemInHand: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; - getPickupAll(): boolean; - /** - * Whether the click should try to pick up all items of said type in the inventory (essentially double clicking) - * (defaults to whether there actually is an item in the hand) - * - * @param pickupAll to pick up all items of the same type - */ - setPickupAll(pickupAll: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; - /** - * Sets the type of click. - * Possible values are: LEFT, RIGHT, MIDDLE - * - * @param clickType the click type - * @return the current Action for method chaining - */ - setClickString(clickType: string): com.chattriggers.ctjs.api.inventory.action.ClickAction; - } - const ClickAction$ClickType: { - LEFT: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; - RIGHT: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; - MIDDLE: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; - } - interface ClickAction$ClickType extends kotlin.Enum { - getButton(): number; - } - const DragAction: { - ClickType: typeof com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; - Stage: typeof com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; - new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.DragAction; - } - interface DragAction extends com.chattriggers.ctjs.api.inventory.action.Action { - getClickType(): com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; - /** - * The type of click (REQUIRED) - * - * @param clickType the new click type - */ - setClickType(clickType: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType): com.chattriggers.ctjs.api.inventory.action.DragAction; - getStage(): com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; - /** - * The stage of this drag (REQUIRED) - * BEGIN is when beginning the drag - * SLOT is for each slot being dragged into - * END is for ending the drag - * - * @param stage the stage - */ - setStage(stage: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage): com.chattriggers.ctjs.api.inventory.action.DragAction; - /** - * Sets the type of click. - * Possible values are: LEFT, RIGHT, MIDDLE - * - * @param clickType the click type - * @return the current Action for method chaining - */ - setClickString(clickType: string): com.chattriggers.ctjs.api.inventory.action.DragAction; - /** - * Sets the stage of this drag. - * Possible values are: BEGIN, SLOT, END [stage] - * - * @param stage the stage - * @return the current Action for method chaining - */ - setStageString(stage: string): com.chattriggers.ctjs.api.inventory.action.DragAction; - } - const DragAction$ClickType: { - LEFT: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; - RIGHT: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; - MIDDLE: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; - } - interface DragAction$ClickType extends kotlin.Enum { - getButton(): number; - } - const DragAction$Stage: { - BEGIN: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; - SLOT: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; - END: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; - } - interface DragAction$Stage extends kotlin.Enum { - getStage(): number; - } - } - const Inventory: { - new(inventory: net.minecraft.world.Container): com.chattriggers.ctjs.api.inventory.Inventory; - new(container: net.minecraft.client.gui.screens.inventory.AbstractContainerScreen): com.chattriggers.ctjs.api.inventory.Inventory; - } - interface Inventory { - getInventory(): net.minecraft.world.Container; - getScreen(): net.minecraft.client.gui.screens.inventory.AbstractContainerScreen | null | undefined; - /** - * Gets the total size of the Inventory. - * The player's inventory size is 36, 27 for the main inventory, plus 9 for the hotbar. - * A single chest's size would be 63, because it also counts the player's inventory. - * - * @return the size of the Inventory - */ - getSize(): number; - /** - * Gets the item in any slot, starting from 0. - * - * @param slot the slot index - * @return the [Item] in that slot, or null if there is no item - */ - getStackInSlot(slot: number): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - /** - * Returns the window identifier number of this Inventory. - * This Inventory must be backed by a HandledScreen [isScreen] - * - * @return the window id - */ - getWindowId(): number; - /** - * Checks if an item can be shift clicked into a certain slot, i.e. coal into the bottom of a furnace. - * - * @param slot the slot index - * @param item the item for checking - * @return whether it can be shift clicked in - */ - isItemValidForSlot(slot: number, item: com.chattriggers.ctjs.api.inventory.Item): boolean; - /** - * @return a list of the [Item]s in an inventory - */ - getItems(): Array; - /** - * Checks whether the inventory contains the given item. - * - * @param item the item to check for - * @return whether the inventory contains the item - */ - contains(item: com.chattriggers.ctjs.api.inventory.Item): boolean; - /** - * Checks whether the inventory contains an item with ID. - * - * @param id the ID of the item to match - * @return whether the inventory contains an item with ID - */ - contains(id: number): boolean; - /** - * Gets the index of any item in the inventory, and returns the slot number. - * Returns -1 if the inventory does not contain the item. - * - * @param item the item to check for - * @return the index of the given item - */ - indexOf(item: com.chattriggers.ctjs.api.inventory.Item): number; - /** - * Gets the index of any item in the inventory with matching ID, and returns the slot number. - * Returns -1 if the inventory does not contain the item. - * - * @param id the item ID to check for - * @return the index of the given item with ID - */ - indexOf(id: number): number; - /** - * Returns true if this Inventory wraps a [HandledScreen] object - * rather than an [MCInventory] object - * - * @return if this is a container - */ - isScreen(): boolean; - /** - * Shorthand for [ClickAction] - * - * @param slot the slot to click on - * @param button the mouse button to use. "LEFT" by default. - * @param shift whether shift is being held. False by default - * @return this inventory for method chaining - */ - click(slot: number): com.chattriggers.ctjs.api.inventory.Inventory; - /** - * Shorthand for [ClickAction] - * - * @param slot the slot to click on - * @param button the mouse button to use. "LEFT" by default. - * @param shift whether shift is being held. False by default - * @return this inventory for method chaining - */ - click(slot: number, shift: boolean): com.chattriggers.ctjs.api.inventory.Inventory; - /** - * Shorthand for [ClickAction] - * - * @param slot the slot to click on - * @param button the mouse button to use. "LEFT" by default. - * @param shift whether shift is being held. False by default - * @return this inventory for method chaining - */ - click(slot: number, shift: boolean, button: string): com.chattriggers.ctjs.api.inventory.Inventory; - /** - * Shorthand for [DropAction] - * - * @param slot the slot to drop - * @param ctrl whether control should be held (drops whole stack) - * @return this inventory for method chaining - */ - drop(slot: number, ctrl: boolean): com.chattriggers.ctjs.api.inventory.Inventory; - /** - * Shorthand for [DragAction] - * - * @param type what click type this should be: LEFT, MIDDLE, RIGHT - * @param slots all of the slots to drag onto - * @return this inventory for method chaining - */ - drag(type: string, slots: number): com.chattriggers.ctjs.api.inventory.Inventory; - /** - * Gets the name of the inventory, simply "container" for most chest-like blocks. - * - * @return the name of the inventory - */ - getName(): com.chattriggers.ctjs.api.message.TextComponent; - getClassName(): string; - } - const Item: { - new(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item; - new(type: com.chattriggers.ctjs.api.inventory.ItemType): com.chattriggers.ctjs.api.inventory.Item; - } - interface Item extends com.chattriggers.ctjs.api.CTWrapper { - getType(): com.chattriggers.ctjs.api.inventory.ItemType; - getStackSize(): number; - setStackSize(size: number): com.chattriggers.ctjs.api.inventory.Item; - getEnchantments(): Map | null | undefined, number>; - isEnchantable(): boolean; - isEnchanted(): boolean; - canPlaceOn(pos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; - canPlaceOn(block: com.chattriggers.ctjs.api.world.block.Block): boolean; - canHarvest(pos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; - canHarvest(block: com.chattriggers.ctjs.api.world.block.Block): boolean; - getDurability(): number; - getMaxDamage(): number; - getDamage(): number; - isDamageable(): boolean; - getName(): string; - setName(name: com.chattriggers.ctjs.api.message.TextComponent | null | undefined): com.chattriggers.ctjs.api.inventory.Item; - resetName(): void; - getLore(): Array; - getLore(advanced: boolean): Array; - setLore(lore: Array): void; - resetLore(): void; - getNBT(): net.minecraft.core.component.DataComponentMap; - draw(): void; - draw(x: number): void; - draw(x: number, y: number): void; - draw(x: number, y: number, scale: number): void; - } - const ItemType: { - new(mcValue: net.minecraft.world.item.Item): com.chattriggers.ctjs.api.inventory.ItemType; - new(itemName: string): com.chattriggers.ctjs.api.inventory.ItemType; - new(id: number): com.chattriggers.ctjs.api.inventory.ItemType; - new(blockType: com.chattriggers.ctjs.api.world.block.BlockType): com.chattriggers.ctjs.api.inventory.ItemType; - } - interface ItemType extends com.chattriggers.ctjs.api.CTWrapper { - getName(): string; - getNameComponent(): com.chattriggers.ctjs.api.message.TextComponent; - getId(): number; - getTranslationKey(): string; - getRegistryName(): string; - asItem(): com.chattriggers.ctjs.api.inventory.Item; - } - const ItemType$Companion: { - fromMC(mcValue: net.minecraft.world.item.Item): com.chattriggers.ctjs.api.inventory.ItemType | null | undefined; - new(): com.chattriggers.ctjs.api.inventory.ItemType$Companion; - } - interface ItemType$Companion { - fromMC(mcValue: net.minecraft.world.item.Item): com.chattriggers.ctjs.api.inventory.ItemType | null | undefined; - new(): com.chattriggers.ctjs.api.inventory.ItemType$Companion; - } - const Item$Companion: { - fromMC(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - new(): com.chattriggers.ctjs.api.inventory.Item$Companion; - } - interface Item$Companion { - fromMC(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - new(): com.chattriggers.ctjs.api.inventory.Item$Companion; - } - const Slot: { - new(mcValue: net.minecraft.world.inventory.Slot): com.chattriggers.ctjs.api.inventory.Slot; - } - interface Slot extends com.chattriggers.ctjs.api.CTWrapper { - getIndex(): number; - getDisplayX(): number; - getDisplayY(): number; - getInventory(): com.chattriggers.ctjs.api.inventory.Inventory; - getItem(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - isEnabled(): boolean; - } + interface WrappedThread { + start(): void; + run(): void; + stop(): void; + interrupt(): void; + isInterrupted(): boolean; + destroy(): void; + isAlive(): boolean; + suspend(): void; + resume(): void; + setDaemon(on: boolean): void; + getId(): number; } - namespace message { - const TextComponent: { - /** - * Creates an empty [TextComponent] with a single, unstyled, empty part. - */ - new(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Creates a [TextComponent] from a variable number of objects. These - * objects can be: - * - A plain string possibly containing formatting codes. If the string has - * formatting codes, it will be split into different parts accordingly - * - A [TextComponent], whose parts will be appended in sequence to this - * [TextComponent]'s list of parts - * - A [Text] object, which acts as a single part - * - A JS object, which must contain a "text" key, and can optionally contain - * any of the [Style] keys: - * - color: a [TextColor] or string format of a [TextColor], [Formatting], or a hex value - * - bold: boolean - * - italic: boolean - * - underline: boolean - * - strikethrough: boolean - * - obfuscated: boolean - * - clickEvent: object with { action: [ClickEvent.Action] or string format of a [ClickEvent.Action], value: string or null } - * - hoverEvent: object with { action: [HoverEvent.Action], string format of a [HoverEvent.Action], or null, value: string or null } - * - insertion: string or null - * - font: string format of an [net.minecraft.util.Identifier] - * - * @see Style - */ - new(parts: any): com.chattriggers.ctjs.api.message.TextComponent; - } - interface TextComponent extends net.minecraft.network.chat.Component, kotlin.collections.Iterable { - /** - * Returns the text of all parts concatenated without formatting codes. - */ - getUnformattedText(): string; - /** - * Returns the text of all parts concatenated with formatting codes. - */ - getFormattedText(): string; - getSize(): number; - /** - * If this [TextComponent] is recursive, sending this instance (via [chat] or - * [actionBar]) may trigger other `chat` triggers as if it had been received by - * the server. [TextComponent]s are non-recursive by default. - * - * @return true if the message can trigger other triggers. - */ - isRecursive(): boolean; - /** - * Get the chat line ID of this message, if it exists. The chat line can be used - * to easily edit or delete a message later via [ChatLib.editChat] and - * [ChatLib.deleteChat]. - * - * @return the chat line ID of the message, or -1 if this [TextComponent] does - * not have an associated chat line ID. - */ - getChatLineId(): number; - /** - * @return a new [TextComponent] with the given chat line id - */ - withChatLineId(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * @return a new [TextComponent] with the given chat line id - */ - withChatLineId(id: number): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sets whether the message can trigger other triggers. - * - * @param recursive true if message can trigger other triggers. - */ - withRecursive(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sets whether the message can trigger other triggers. - * - * @param recursive true if message can trigger other triggers. - */ - withRecursive(recursive: boolean): com.chattriggers.ctjs.api.message.TextComponent; - /** - * @return a new [TextComponent] with the specified [value] appended to the end. - * This accepts all types of objects that the vararg constructor does. - */ - withText(value: any): com.chattriggers.ctjs.api.message.TextComponent; - /** - * @return a new [TextComponent] with the specified [value] inserted at [index]. - * This accepts all types of objects that the vararg constructor does. - */ - withTextAt(index: number, value: any): com.chattriggers.ctjs.api.message.TextComponent; - /** - * @return a new [TextComponent] without the part at [index] - */ - withoutTextAt(index: number): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Edits this text component, replacing it with the given [newText]. Note that - * this compares [TextComponent]s based on [formattedText]; if an exact match - * is needed, use [ChatLib.editChat] in conjunction with a chat line ID. - */ - edit(newText: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Edits this text component, replacing it with a new [TextComponent] from the - * given [parts]. Note that this compares [TextComponent]s based on - * [formattedText]; if an exact match is needed, use [ChatLib.editChat] in - * conjunction with a chat line ID. - */ - edit(parts: any): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sends this [TextComponent] to the players chat. - * - * Note that this is purely client-side, and will not be sent to the server. If [isRecursive], - * will trigger any matching `chat` triggers - * - * @see ChatLib.chat - * @see ChatLib.say - */ - chat(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sends this [TextComponent] to the players action bar. - * - * If [isRecursive], will trigger any matching `actionBar` triggers - * - * @see ChatLib.actionBar - */ - actionBar(): com.chattriggers.ctjs.api.message.TextComponent; - contains(element: org.mozilla.javascript.NativeObject): boolean; - containsAll(elements: Array): boolean; - get(index: number): org.mozilla.javascript.NativeObject; - indexOf(element: org.mozilla.javascript.NativeObject): number; - isEmpty(): boolean; - } - const Chat: { - sendGradientMsg(prefix: string, startRgb: number, endRgb: number, messages: any): void; - new(): com.chattriggers.ctjs.api.message.Chat; - } - interface Chat { - sendGradientMsg(prefix: string, startRgb: number, endRgb: number, messages: any): void; - new(): com.chattriggers.ctjs.api.message.Chat; - } - const ChatLib: { - /** - * Prints text in the chat. - * The text can be a String or a [TextComponent] - * - * @param text the text to be printed - */ - chat(text: any | null | undefined): void; - /** - * Shows text in the action bar. - * The text can be a String or a [TextComponent] - * - * @param text the text to show - */ - actionBar(text: any | null | undefined): void; - /** - * Simulates a chat message to be caught by other triggers for testing. - * The text can be a String or a [TextComponent] - * - * @param text The message to simulate - */ - simulateChat(text: any | null | undefined): void; - /** - * Replaces the easier to type '&' color codes with proper color codes in a string. - * - * @param message The string to add color codes to - * @return the formatted message - */ - addColor(message: string | null | undefined): string; - /** - * Says chat message. - * This message is actually sent to the server. - * - * @param text the message to be sent - */ - say(text: string): void; - /** - * Runs a command. - * - * @param text the command to run, without the leading slash (Ex. "help") - * @param clientSide should the command be run as a client side command - */ - command(text: string): void; - /** - * Runs a command. - * - * @param text the command to run, without the leading slash (Ex. "help") - * @param clientSide should the command be run as a client side command - */ - command(text: string, clientSide: boolean): void; - /** - * Clear all chat messages - */ - clearChat(): void; - /** - * Get a message that will be perfectly one line of chat, - * the separator repeated as many times as necessary. - * The separator defaults to "-" - * - * @param separator the message to split chat with - * @return the message that would split chat - */ - getChatBreak(): string; - /** - * Get a message that will be perfectly one line of chat, - * the separator repeated as many times as necessary. - * The separator defaults to "-" - * - * @param separator the message to split chat with - * @return the message that would split chat - */ - getChatBreak(separator: string): string; - /** - * Gets the width of Minecraft's chat - * - * @return the width of chat - */ - getChatWidth(): number; - /** - * Remove all formatting - * - * @param text the string to un-format - * @return the unformatted string - */ - removeFormatting(text: string): string; - /** - * Replaces Minecraft formatted text with normal formatted text - * - * @param text the formatted string - * @return the unformatted string - */ - replaceFormatting(text: string): string; - /** - * Get a message that will be perfectly centered in chat. - * - * @param text the text to be centered - * @return the centered message - */ - getCenteredText(text: string): string; - /** - * Copies the given String to the user's clipboard - * - * @param text the text to copy - */ - copyToClipboard(text: string): void; - /** - * Edits an already sent chat message matched by [regexp]. - * - * @param regexp the regex object to match to the message - * @param replacements the new message(s) to be put in replace of the old one - */ - editChat(regexp: org.mozilla.javascript.regexp.NativeRegExp, replacements: any): void; - /** - * Edits an already sent chat message by the text of the chat - * - * @param toReplace the unformatted text of the message to be replaced - * @param replacements the new message(s) to be put in place of the old one - */ - editChat(toReplace: string, replacements: any): void; - /** - * Edits an already sent chat message by the [TextComponent] - * - * @param toReplace the message to be replaced - * @param replacements the new message(s) to be put in place of the old one - */ - editChat(toReplace: com.chattriggers.ctjs.api.message.TextComponent, replacements: any): void; - /** - * Edits an already sent chat message by its chat line id - * - * @param chatLineId the chat line id of the message to be replaced - * @param replacements the new message(s) to be put in place of the old one - */ - editChat(chatLineId: number, replacements: any): void; - /** - * Edits an already sent chat message by given a callback that receives - * [TextComponent] instances - * - * @param matcher a function that accepts a [TextComponent] and returns a boolean - * @param replacements the new message(s) to be put in place of the old one - */ - editChat(matcher: kotlin.Function1, replacements: any): void; - /** - * Deletes an already sent chat message matching [regexp]. - * - * @param regexp the regex object to match to the message - */ - deleteChat(regexp: org.mozilla.javascript.regexp.NativeRegExp): void; - /** - * Deletes an already sent chat message by the text of the chat - * - * @param toDelete the unformatted text of the message to be deleted - */ - deleteChat(toDelete: string): void; - /** - * Deletes an already sent chat message by the [TextComponent] - * - * @param toDelete the message to be deleted - */ - deleteChat(toDelete: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Deletes an already sent chat message by its chat line id - * - * @param chatLineId the chat line id of the message to be deleted - */ - deleteChat(chatLineId: number): void; - /** - * Deletes an already sent chat message given a callback that receives - * [TextComponent] instances - * - * @param matcher a function that accepts a [TextComponent] and returns a boolean - */ - deleteChat(matcher: kotlin.Function1): void; - /** - * Gets the previous 1000 lines of chat - * - * @return A list of the last 1000 chat lines - */ - getChatLines(): Array; - /** - * Adds a message to the player's chat history. This allows the message to - * show up for the player when pressing the up/down keys while in the chat gui - * - * @param index the index to insert the message - * @param message the message to add to chat history - */ - addToSentMessageHistory(message: string): void; - /** - * Adds a message to the player's chat history. This allows the message to - * show up for the player when pressing the up/down keys while in the chat gui - * - * @param index the index to insert the message - * @param message the message to add to chat history - */ - addToSentMessageHistory(index: number, message: string): void; - new(): com.chattriggers.ctjs.api.message.ChatLib; - } - interface ChatLib { - /** - * Prints text in the chat. - * The text can be a String or a [TextComponent] - * - * @param text the text to be printed - */ - chat(text: any | null | undefined): void; - /** - * Shows text in the action bar. - * The text can be a String or a [TextComponent] - * - * @param text the text to show - */ - actionBar(text: any | null | undefined): void; - /** - * Simulates a chat message to be caught by other triggers for testing. - * The text can be a String or a [TextComponent] - * - * @param text The message to simulate - */ - simulateChat(text: any | null | undefined): void; - /** - * Replaces the easier to type '&' color codes with proper color codes in a string. - * - * @param message The string to add color codes to - * @return the formatted message - */ - addColor(message: string | null | undefined): string; - /** - * Says chat message. - * This message is actually sent to the server. - * - * @param text the message to be sent - */ - say(text: string): void; - /** - * Runs a command. - * - * @param text the command to run, without the leading slash (Ex. "help") - * @param clientSide should the command be run as a client side command - */ - command(text: string): void; - /** - * Runs a command. - * - * @param text the command to run, without the leading slash (Ex. "help") - * @param clientSide should the command be run as a client side command - */ - command(text: string, clientSide: boolean): void; - /** - * Clear all chat messages - */ - clearChat(): void; - /** - * Get a message that will be perfectly one line of chat, - * the separator repeated as many times as necessary. - * The separator defaults to "-" - * - * @param separator the message to split chat with - * @return the message that would split chat - */ - getChatBreak(): string; - /** - * Get a message that will be perfectly one line of chat, - * the separator repeated as many times as necessary. - * The separator defaults to "-" - * - * @param separator the message to split chat with - * @return the message that would split chat - */ - getChatBreak(separator: string): string; - /** - * Gets the width of Minecraft's chat - * - * @return the width of chat - */ - getChatWidth(): number; - /** - * Remove all formatting - * - * @param text the string to un-format - * @return the unformatted string - */ - removeFormatting(text: string): string; - /** - * Replaces Minecraft formatted text with normal formatted text - * - * @param text the formatted string - * @return the unformatted string - */ - replaceFormatting(text: string): string; - /** - * Get a message that will be perfectly centered in chat. - * - * @param text the text to be centered - * @return the centered message - */ - getCenteredText(text: string): string; - /** - * Copies the given String to the user's clipboard - * - * @param text the text to copy - */ - copyToClipboard(text: string): void; - /** - * Edits an already sent chat message matched by [regexp]. - * - * @param regexp the regex object to match to the message - * @param replacements the new message(s) to be put in replace of the old one - */ - editChat(regexp: org.mozilla.javascript.regexp.NativeRegExp, replacements: any): void; - /** - * Edits an already sent chat message by the text of the chat - * - * @param toReplace the unformatted text of the message to be replaced - * @param replacements the new message(s) to be put in place of the old one - */ - editChat(toReplace: string, replacements: any): void; - /** - * Edits an already sent chat message by the [TextComponent] - * - * @param toReplace the message to be replaced - * @param replacements the new message(s) to be put in place of the old one - */ - editChat(toReplace: com.chattriggers.ctjs.api.message.TextComponent, replacements: any): void; - /** - * Edits an already sent chat message by its chat line id - * - * @param chatLineId the chat line id of the message to be replaced - * @param replacements the new message(s) to be put in place of the old one - */ - editChat(chatLineId: number, replacements: any): void; - /** - * Edits an already sent chat message by given a callback that receives - * [TextComponent] instances - * - * @param matcher a function that accepts a [TextComponent] and returns a boolean - * @param replacements the new message(s) to be put in place of the old one - */ - editChat(matcher: kotlin.Function1, replacements: any): void; - /** - * Deletes an already sent chat message matching [regexp]. - * - * @param regexp the regex object to match to the message - */ - deleteChat(regexp: org.mozilla.javascript.regexp.NativeRegExp): void; - /** - * Deletes an already sent chat message by the text of the chat - * - * @param toDelete the unformatted text of the message to be deleted - */ - deleteChat(toDelete: string): void; - /** - * Deletes an already sent chat message by the [TextComponent] - * - * @param toDelete the message to be deleted - */ - deleteChat(toDelete: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Deletes an already sent chat message by its chat line id - * - * @param chatLineId the chat line id of the message to be deleted - */ - deleteChat(chatLineId: number): void; - /** - * Deletes an already sent chat message given a callback that receives - * [TextComponent] instances - * - * @param matcher a function that accepts a [TextComponent] and returns a boolean - */ - deleteChat(matcher: kotlin.Function1): void; - /** - * Gets the previous 1000 lines of chat - * - * @return A list of the last 1000 chat lines - */ - getChatLines(): Array; - /** - * Adds a message to the player's chat history. This allows the message to - * show up for the player when pressing the up/down keys while in the chat gui - * - * @param index the index to insert the message - * @param message the message to add to chat history - */ - addToSentMessageHistory(message: string): void; - /** - * Adds a message to the player's chat history. This allows the message to - * show up for the player when pressing the up/down keys while in the chat gui - * - * @param index the index to insert the message - * @param message the message to add to chat history - */ - addToSentMessageHistory(index: number, message: string): void; - new(): com.chattriggers.ctjs.api.message.ChatLib; - } - } - namespace world { - namespace block { - const BlockType: { - new(mcValue: net.minecraft.world.level.block.Block): com.chattriggers.ctjs.api.world.block.BlockType; - new(block: com.chattriggers.ctjs.api.world.block.BlockType): com.chattriggers.ctjs.api.world.block.BlockType; - new(blockName: string): com.chattriggers.ctjs.api.world.block.BlockType; - new(blockID: number): com.chattriggers.ctjs.api.world.block.BlockType; - new(item: com.chattriggers.ctjs.api.inventory.Item): com.chattriggers.ctjs.api.world.block.BlockType; - } - interface BlockType extends com.chattriggers.ctjs.api.CTWrapper { - /** - * Returns a [Block] based on this block and the - * provided BlockPos - * - * @param blockPos the block position - * @return a [Block] object - */ - withBlockPos(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): com.chattriggers.ctjs.api.world.block.Block; - getID(): number; - /** - * Gets the block's registry name. - * Example: minecraft:oak_planks - * - * @return the block's registry name - */ - getRegistryName(): string; - /** - * Gets the block's translation key. - * Example: block.minecraft.oak_planks - * - * @return the block's translation key - */ - getTranslationKey(): string; - /** - * Gets the block's localized name. - * Example: Wooden Planks - * - * @return the block's localized name - */ - getName(): string; - getLightValue(): number; - getDefaultState(): net.minecraft.world.level.block.state.BlockState; - canProvidePower(): boolean; - isTranslucent(): boolean; - } - const BlockPos: { - new(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.BlockPos; - new(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.BlockPos; - new(pos: com.chattriggers.ctjs.api.vec.Vec3i): com.chattriggers.ctjs.api.world.block.BlockPos; - new(pos: net.minecraft.core.BlockPos): com.chattriggers.ctjs.api.world.block.BlockPos; - new(source: com.chattriggers.ctjs.api.entity.Entity): com.chattriggers.ctjs.api.world.block.BlockPos; - } - interface BlockPos extends com.chattriggers.ctjs.api.vec.Vec3i, com.chattriggers.ctjs.api.CTWrapper { - up(): com.chattriggers.ctjs.api.world.block.BlockPos; - up(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; - down(): com.chattriggers.ctjs.api.world.block.BlockPos; - down(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; - north(): com.chattriggers.ctjs.api.world.block.BlockPos; - north(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; - south(): com.chattriggers.ctjs.api.world.block.BlockPos; - south(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; - east(): com.chattriggers.ctjs.api.world.block.BlockPos; - east(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; - west(): com.chattriggers.ctjs.api.world.block.BlockPos; - west(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; - offset(facing: com.chattriggers.ctjs.api.world.block.BlockFace): com.chattriggers.ctjs.api.world.block.BlockPos; - offset(facing: com.chattriggers.ctjs.api.world.block.BlockFace, n: number): com.chattriggers.ctjs.api.world.block.BlockPos; - distanceTo(other: com.chattriggers.ctjs.api.world.block.BlockPos): number; - toVec3d(): net.minecraft.world.phys.Vec3; - } - const BlockFace: { - DOWN: com.chattriggers.ctjs.api.world.block.BlockFace; - UP: com.chattriggers.ctjs.api.world.block.BlockFace; - NORTH: com.chattriggers.ctjs.api.world.block.BlockFace; - SOUTH: com.chattriggers.ctjs.api.world.block.BlockFace; - WEST: com.chattriggers.ctjs.api.world.block.BlockFace; - EAST: com.chattriggers.ctjs.api.world.block.BlockFace; - Plane: typeof com.chattriggers.ctjs.api.world.block.BlockFace$Plane; - AxisDirection: typeof com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; - Axis: typeof com.chattriggers.ctjs.api.world.block.BlockFace$Axis; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace; - } - interface BlockFace extends kotlin.Enum, net.minecraft.util.StringRepresentable, com.chattriggers.ctjs.api.CTWrapper { - getAxisDirection(): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; - getAxis(): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; - getDirectionVec(): com.chattriggers.ctjs.api.vec.Vec3i; - getOpposite(): com.chattriggers.ctjs.api.world.block.BlockFace; - getOffsetX(): number; - getOffsetY(): number; - getOffsetZ(): number; - rotateAround(axis: com.chattriggers.ctjs.api.world.block.BlockFace$Axis): com.chattriggers.ctjs.api.world.block.BlockFace; - rotateX(): com.chattriggers.ctjs.api.world.block.BlockFace; - rotateY(): com.chattriggers.ctjs.api.world.block.BlockFace; - rotateZ(): com.chattriggers.ctjs.api.world.block.BlockFace; - } - const BlockFace$AxisDirection: { - POSITIVE: com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; - NEGATIVE: com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; - } - interface BlockFace$AxisDirection extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { - getOffset(): number; - } - const BlockFace$AxisDirection$Companion: { - fromMC(axisDirection: net.minecraft.core.Direction$AxisDirection): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; - new(): unknown; - } - interface BlockFace$AxisDirection$Companion { - fromMC(axisDirection: net.minecraft.core.Direction$AxisDirection): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; - new(): unknown; - } - const BlockFace$Axis: { - X: com.chattriggers.ctjs.api.world.block.BlockFace$Axis; - Y: com.chattriggers.ctjs.api.world.block.BlockFace$Axis; - Z: com.chattriggers.ctjs.api.world.block.BlockFace$Axis; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; - } - interface BlockFace$Axis extends kotlin.Enum, net.minecraft.util.StringRepresentable, com.chattriggers.ctjs.api.CTWrapper { - getPlane(): com.chattriggers.ctjs.api.world.block.BlockFace$Plane; - isHorizontal(): boolean; - isVertical(): boolean; - } - const BlockFace$Plane: { - HORIZONTAL: com.chattriggers.ctjs.api.world.block.BlockFace$Plane; - VERTICAL: com.chattriggers.ctjs.api.world.block.BlockFace$Plane; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$Plane; - } - interface BlockFace$Plane extends kotlin.Enum, kotlin.collections.Iterable { - facings(): Array; - } - const BlockFace$Axis$Companion: { - fromMC(axis: net.minecraft.core.Direction$Axis): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; - new(): unknown; - } - interface BlockFace$Axis$Companion { - fromMC(axis: net.minecraft.core.Direction$Axis): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; - new(): unknown; - } - const BlockFace$Companion: { - fromMC(facing: net.minecraft.core.Direction): com.chattriggers.ctjs.api.world.block.BlockFace; - new(): com.chattriggers.ctjs.api.world.block.BlockFace$Companion; - } - interface BlockFace$Companion { - fromMC(facing: net.minecraft.core.Direction): com.chattriggers.ctjs.api.world.block.BlockFace; - new(): com.chattriggers.ctjs.api.world.block.BlockFace$Companion; - } - const Block: { - new(type: com.chattriggers.ctjs.api.world.block.BlockType, pos: com.chattriggers.ctjs.api.world.block.BlockPos, face: com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined): com.chattriggers.ctjs.api.world.block.Block; - } - interface Block { - getType(): com.chattriggers.ctjs.api.world.block.BlockType; - getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; - getFace(): com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined; - getX(): number; - getY(): number; - getZ(): number; - withType(type: com.chattriggers.ctjs.api.world.block.BlockType): com.chattriggers.ctjs.api.world.block.Block; - withPos(pos: com.chattriggers.ctjs.api.world.block.BlockPos): com.chattriggers.ctjs.api.world.block.Block; - /** - * Narrows this block to reference a certain face. Used by - * [Player.lookingAt] to specify the block face - * being looked at. - */ - withFace(face: com.chattriggers.ctjs.api.world.block.BlockFace): com.chattriggers.ctjs.api.world.block.Block; - getState(): net.minecraft.world.level.block.state.BlockState | null | undefined; - isEmittingPower(): boolean; - isEmittingPower(face: com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined): boolean; - getEmittingPower(): number; - getEmittingPower(face: com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined): number; - isReceivingPower(): boolean; - getReceivingPower(): number; - /** - * Checks whether the block can be mined with the tool in the player's hand - * - * @return whether the block can be mined - */ - canBeHarvested(): boolean; - canBeHarvestedWith(item: com.chattriggers.ctjs.api.inventory.Item): boolean; - } - } - namespace pathfinding { - const Swift: { - new(): com.chattriggers.ctjs.api.world.pathfinding.Swift; - } - interface Swift extends net.fabricmc.api.ClientModInitializer { - } - const Swift$Companion: { - executor: java.util.concurrent.ExecutorService; - new(): com.chattriggers.ctjs.api.world.pathfinding.Swift$Companion; - } - interface Swift$Companion { - executor: java.util.concurrent.ExecutorService; - new(): com.chattriggers.ctjs.api.world.pathfinding.Swift$Companion; - getCHUNKS_PER_TICK(): number; - getMAXIMUM_CACHED_CHUNKS(): number; - } - const NativeVoxelFlags: { - new(): com.chattriggers.ctjs.api.world.pathfinding.NativeVoxelFlags; - } - interface NativeVoxelFlags { - new(): com.chattriggers.ctjs.api.world.pathfinding.NativeVoxelFlags; - getPASSABLE(): number; - getSOLID(): number; - getPASSABLE_FLY(): number; - getBLOCKING_WALL(): number; - getFLUID(): number; - getSLAB_BOTTOM(): number; - getSLAB_TOP(): number; - getFENCE_LIKE(): number; - getSTAIRS_BOTTOM(): number; - getCARPET_LIKE(): number; - getETHER_PASSABLE(): number; - getETHER_TELEPORT_CLEAR(): number; - getETHER_FEET_BLOCKER(): number; - } - const NativeStateEncoder: { - flagsForStateId(stateId: number): number; - flagsForState(state: net.minecraft.world.level.block.state.BlockState): number; - flagsShortForState(state: net.minecraft.world.level.block.state.BlockState): number; - flagsShortForStateId(stateId: number): number; - new(): com.chattriggers.ctjs.api.world.pathfinding.NativeStateEncoder; - } - interface NativeStateEncoder { - flagsForStateId(stateId: number): number; - flagsForState(state: net.minecraft.world.level.block.state.BlockState): number; - flagsShortForState(state: net.minecraft.world.level.block.state.BlockState): number; - flagsShortForStateId(stateId: number): number; - new(): com.chattriggers.ctjs.api.world.pathfinding.NativeStateEncoder; - } - const NativeEtherwarpResult: { - path: Array; - angles: kotlin.FloatArray; - timeMs: number; - nodesExplored: number; - nanosecondsPerNode: number; - new(path: Array, angles: kotlin.FloatArray, timeMs: number, nodesExplored: number, nanosecondsPerNode: number): com.chattriggers.ctjs.api.world.pathfinding.NativeEtherwarpResult; - } - interface NativeEtherwarpResult { - } - const NativePathfinderBridge: { - NativePathSearchRequest: typeof com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest; - NativeEtherwarpSearchRequest: typeof com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest; - isAvailable(): boolean; - getLastError(): string | null | undefined; - setWorld(worldKey: string, minY: number, maxY: number): void; - clearWorld(): void; - upsertChunk(chunkX: number, chunkZ: number, minY: number, maxY: number, sectionMask: number, sectionFlags: Array): void; - applyBlockUpdates(updates: Array): void; - findPath(request: com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest): com.chattriggers.ctjs.api.world.pathfinding.NativePathResult | null | undefined; - findEtherwarpPath(request: com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest): com.chattriggers.ctjs.api.world.pathfinding.NativeEtherwarpResult | null | undefined; - cancelSearch(): void; - new(): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge; - } - interface NativePathfinderBridge { - isAvailable(): boolean; - getLastError(): string | null | undefined; - setWorld(worldKey: string, minY: number, maxY: number): void; - clearWorld(): void; - upsertChunk(chunkX: number, chunkZ: number, minY: number, maxY: number, sectionMask: number, sectionFlags: Array): void; - applyBlockUpdates(updates: Array): void; - findPath(request: com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest): com.chattriggers.ctjs.api.world.pathfinding.NativePathResult | null | undefined; - findEtherwarpPath(request: com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest): com.chattriggers.ctjs.api.world.pathfinding.NativeEtherwarpResult | null | undefined; - cancelSearch(): void; - new(): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge; - } - const NativePathfinderBridge$NativePathSearchRequest: { - new(startPoints: Array, endPoints: Array, isFly: boolean, maxIterations: number, heuristicWeight: number, nonPrimaryStartPenalty: number, moveOrderOffset: number, avoidMeta: Array, avoidPenalty: kotlin.DoubleArray): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest; - } - interface NativePathfinderBridge$NativePathSearchRequest { - getStartPoints(): Array; - getEndPoints(): Array; - isFly(): boolean; - getMaxIterations(): number; - getHeuristicWeight(): number; - getNonPrimaryStartPenalty(): number; - getMoveOrderOffset(): number; - getAvoidMeta(): Array; - getAvoidPenalty(): kotlin.DoubleArray; - component1(): Array; - component2(): Array; - component3(): boolean; - component4(): number; - component5(): number; - component6(): number; - component7(): number; - component8(): Array; - component9(): kotlin.DoubleArray; - copy(startPoints: Array, endPoints: Array, isFly: boolean, maxIterations: number, heuristicWeight: number, nonPrimaryStartPenalty: number, moveOrderOffset: number, avoidMeta: Array, avoidPenalty: kotlin.DoubleArray): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest; - } - const NativePathResult: { - path: Array; - keyPath: Array; - timeMs: number; - nodesExplored: number; - nanosecondsPerNode: number; - selectedStartIndex: number; - pathFlags: Array; - keyNodeFlags: Array; - keyNodeMetrics: Array; - pathSignature: string; - new(path: Array, keyPath: Array, timeMs: number, nodesExplored: number, nanosecondsPerNode: number, selectedStartIndex: number, pathFlags: Array, keyNodeFlags: Array, keyNodeMetrics: Array, pathSignature: string): com.chattriggers.ctjs.api.world.pathfinding.NativePathResult; - } - interface NativePathResult { - } - const NativePathfinderBridge$NativeEtherwarpSearchRequest: { - new(goalX: number, goalY: number, goalZ: number, startEyeX: number, startEyeY: number, startEyeZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest; - } - interface NativePathfinderBridge$NativeEtherwarpSearchRequest { - getGoalX(): number; - getGoalY(): number; - getGoalZ(): number; - getStartEyeX(): number; - getStartEyeY(): number; - getStartEyeZ(): number; - getMaxIterations(): number; - getThreadCount(): number; - getYawStep(): number; - getPitchStep(): number; - getNewNodeCost(): number; - getHeuristicWeight(): number; - getRayLength(): number; - getRewireEpsilon(): number; - getEyeHeight(): number; - component1(): number; - component2(): number; - component3(): number; - component4(): number; - component5(): number; - component6(): number; - component7(): number; - component8(): number; - component9(): number; - component10(): number; - component11(): number; - component12(): number; - component13(): number; - component14(): number; - component15(): number; - copy(goalX: number, goalY: number, goalZ: number, startEyeX: number, startEyeY: number, startEyeZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest; - } - const CachedWorld: { - getBlockFlags(x: number, y: number, z: number): number | null | undefined; - getChunk(x: number, z: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk | null | undefined; - new(): com.chattriggers.ctjs.api.world.pathfinding.CachedWorld; - } - interface CachedWorld { - getBlockFlags(x: number, y: number, z: number): number | null | undefined; - getChunk(x: number, z: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk | null | undefined; - new(): com.chattriggers.ctjs.api.world.pathfinding.CachedWorld; - onPacketReceive(packet: net.minecraft.network.protocol.Packet): void; - processPendingChunks(): void; - saveAndClear(lobbyName: string): void; - load(lobbyName: string): void; - waitForLoad(): void; - clear(): void; - getCacheStats(): string; - setUnlimitedChunkCache(enabled: boolean): void; - setWorldKey(newWorldKey: string | null | undefined): void; - } - const CachedChunk: { - minY: number; - maxY: number; - ready: boolean; - new(minY: number, maxY: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk; - } - interface CachedChunk { - getFlags(localX: number, y: number, localZ: number): number; - setFlags(localX: number, y: number, localZ: number, flags: number): void; - hasSection(index: number): boolean; - copySectionFlags(index: number, dest: Array, destOffset: number): void; - setSection(sectionIndex: number, data: Array): void; - } - const CachedChunk$Companion: { - AIR_FLAGS: number; - new(): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk$Companion; - } - interface CachedChunk$Companion { - AIR_FLAGS: number; - new(): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk$Companion; - } - const PathManager: { - isSearching(): boolean; - findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number): boolean; - findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number): boolean; - findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number, isFly: boolean): boolean; - findPath(startPoints: Array>, endPoints: Array>): boolean; - findPath(startPoints: Array>, endPoints: Array>, maxIterations: number): boolean; - findPath(startPoints: Array>, endPoints: Array>, maxIterations: number, isFly: boolean): boolean; - findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array): boolean; - findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array, maxIterations: number): boolean; - findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array, maxIterations: number, isFly: boolean): boolean; - findFlyPath(startPoints: Array>, endPoints: Array>): boolean; - findFlyPath(startPoints: Array>, endPoints: Array>, maxIterations: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): boolean; - isFlyPositionClear(x: number, y: number, z: number): boolean; - isValidEtherwarpLanding(x: number, y: number, z: number): boolean; - getEtherwarpLandingCenter(x: number, y: number, z: number): kotlin.DoubleArray | null | undefined; - getEtherwarpLandingCandidates(anchorX: number, anchorY: number, anchorZ: number, radius: number, maxDistance: number, sortOriginX: number, sortOriginY: number, sortOriginZ: number): com.chattriggers.ctjs.api.world.pathfinding.EtherwarpLandingCandidatesResult | null | undefined; - getCurrentEtherwarpEyeHeight(): number; - getCurrentEtherwarpSneakOffset(): number; - cancelSearch(): void; - getPathArray(): Array; - getKeyNodesArray(): Array; - getEtherwarpPathArray(): Array; - getEtherwarpAnglesArray(): kotlin.FloatArray; - getPathFlagsArray(): Array; - getKeyNodeFlagsArray(): Array; - getKeyNodeMetricsArray(): Array; - getPathSignature(): string; - getPathFlagBits(): Array; - getEtherwarpVoxelFlagsAt(x: number, y: number, z: number): number; - isEtherwarpSupportSolid(flags: number): boolean; - getEtherwarpStandOffsetForFlags(flags: number): number; - isEtherwarpTeleportSpaceClearFlags(flags: number): boolean; - addTransientAvoidPoint(x: number, y: number, z: number): void; - addTransientAvoidPoint(x: number, y: number, z: number, radius: number): void; - addTransientAvoidPoint(x: number, y: number, z: number, radius: number, penalty: number): void; - addTransientAvoidPoint(x: number, y: number, z: number, radius: number, penalty: number, ttlSearches: number): void; - addTransientAvoidPoints(points: Array): void; - addTransientAvoidPoints(points: Array, radius: number): void; - addTransientAvoidPoints(points: Array, radius: number, penalty: number): void; - addTransientAvoidPoints(points: Array, radius: number, penalty: number, ttlSearches: number): void; - clearTransientAvoidPoints(): void; - getPathSize(): number; - getEtherwarpPathSize(): number; - getKeyNodeCount(): number; - getLastTimeMs(): number; - getEtherwarpLastTimeMs(): number; - getNodesExplored(): number; - getEtherwarpNodesExplored(): number; - getNanosecondsPerNode(): number; - getEtherwarpNanosecondsPerNode(): number; - getSelectedStartIndex(): number; - setSearchVariantSeed(seed: number): void; - getLastError(): string | null | undefined; - hasPath(): boolean; - hasEtherwarpPath(): boolean; - clear(): void; - new(): com.chattriggers.ctjs.api.world.pathfinding.PathManager; - } - interface PathManager { - isSearching(): boolean; - findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number): boolean; - findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number): boolean; - findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number, isFly: boolean): boolean; - findPath(startPoints: Array>, endPoints: Array>): boolean; - findPath(startPoints: Array>, endPoints: Array>, maxIterations: number): boolean; - findPath(startPoints: Array>, endPoints: Array>, maxIterations: number, isFly: boolean): boolean; - findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array): boolean; - findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array, maxIterations: number): boolean; - findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array, maxIterations: number, isFly: boolean): boolean; - findFlyPath(startPoints: Array>, endPoints: Array>): boolean; - findFlyPath(startPoints: Array>, endPoints: Array>, maxIterations: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number): boolean; - findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): boolean; - isFlyPositionClear(x: number, y: number, z: number): boolean; - isValidEtherwarpLanding(x: number, y: number, z: number): boolean; - getEtherwarpLandingCenter(x: number, y: number, z: number): kotlin.DoubleArray | null | undefined; - getEtherwarpLandingCandidates(anchorX: number, anchorY: number, anchorZ: number, radius: number, maxDistance: number, sortOriginX: number, sortOriginY: number, sortOriginZ: number): com.chattriggers.ctjs.api.world.pathfinding.EtherwarpLandingCandidatesResult | null | undefined; - getCurrentEtherwarpEyeHeight(): number; - getCurrentEtherwarpSneakOffset(): number; - cancelSearch(): void; - getPathArray(): Array; - getKeyNodesArray(): Array; - getEtherwarpPathArray(): Array; - getEtherwarpAnglesArray(): kotlin.FloatArray; - getPathFlagsArray(): Array; - getKeyNodeFlagsArray(): Array; - getKeyNodeMetricsArray(): Array; - getPathSignature(): string; - getPathFlagBits(): Array; - getEtherwarpVoxelFlagsAt(x: number, y: number, z: number): number; - isEtherwarpSupportSolid(flags: number): boolean; - getEtherwarpStandOffsetForFlags(flags: number): number; - isEtherwarpTeleportSpaceClearFlags(flags: number): boolean; - addTransientAvoidPoint(x: number, y: number, z: number): void; - addTransientAvoidPoint(x: number, y: number, z: number, radius: number): void; - addTransientAvoidPoint(x: number, y: number, z: number, radius: number, penalty: number): void; - addTransientAvoidPoint(x: number, y: number, z: number, radius: number, penalty: number, ttlSearches: number): void; - addTransientAvoidPoints(points: Array): void; - addTransientAvoidPoints(points: Array, radius: number): void; - addTransientAvoidPoints(points: Array, radius: number, penalty: number): void; - addTransientAvoidPoints(points: Array, radius: number, penalty: number, ttlSearches: number): void; - clearTransientAvoidPoints(): void; - getPathSize(): number; - getEtherwarpPathSize(): number; - getKeyNodeCount(): number; - getLastTimeMs(): number; - getEtherwarpLastTimeMs(): number; - getNodesExplored(): number; - getEtherwarpNodesExplored(): number; - getNanosecondsPerNode(): number; - getEtherwarpNanosecondsPerNode(): number; - getSelectedStartIndex(): number; - setSearchVariantSeed(seed: number): void; - getLastError(): string | null | undefined; - hasPath(): boolean; - hasEtherwarpPath(): boolean; - clear(): void; - new(): com.chattriggers.ctjs.api.world.pathfinding.PathManager; - getFLAG_FLUID_FEET(): number; - getFLAG_FLUID_HEAD(): number; - getFLAG_LOW_HEADROOM(): number; - getFLAG_NEAR_EDGE(): number; - getFLAG_NEAR_WALL(): number; - getFLAG_STEP_UP_NEXT(): number; - getFLAG_DROP_NEXT(): number; - getFLAG_TIGHT_CORRIDOR(): number; - getETHERWARP_VOXEL_SOLID(): number; - getETHERWARP_VOXEL_FENCE_LIKE(): number; - getETHERWARP_VOXEL_TELEPORT_CLEAR(): number; - getETHERWARP_VOXEL_FEET_BLOCKER(): number; - } - const EtherwarpLandingCandidatesResult: { - goals: Array; - centers: kotlin.DoubleArray; - new(goals: Array, centers: kotlin.DoubleArray): com.chattriggers.ctjs.api.world.pathfinding.EtherwarpLandingCandidatesResult; - } - interface EtherwarpLandingCandidatesResult { - } - const HypixelManager: { - new(): com.chattriggers.ctjs.api.world.pathfinding.HypixelManager; - } - interface HypixelManager { - new(): com.chattriggers.ctjs.api.world.pathfinding.HypixelManager; - init(): void; - onDisconnect(): void; - } - const WynncraftManager: { - new(): com.chattriggers.ctjs.api.world.pathfinding.WynncraftManager; - } - interface WynncraftManager { - new(): com.chattriggers.ctjs.api.world.pathfinding.WynncraftManager; - init(): void; - onDisconnect(): void; - } - const WorldSerializer: { - new(): com.chattriggers.ctjs.api.world.pathfinding.WorldSerializer; - } - interface WorldSerializer { - new(): com.chattriggers.ctjs.api.world.pathfinding.WorldSerializer; - save(name: string, chunks: Map): void; - load(name: string): java.util.concurrent.ConcurrentHashMap | null | undefined; - } - } - const Chunk: { - new(mcValue: net.minecraft.world.level.chunk.ChunkAccess): com.chattriggers.ctjs.api.world.Chunk; - } - interface Chunk extends com.chattriggers.ctjs.api.CTWrapper { - /** - * Gets the x position of the chunk - */ - getX(): number; - /** - * Gets the z position of the chunk - */ - getZ(): number; - /** - * Gets the minimum x coordinate of a block in the chunk - * - * @return the minimum x coordinate - */ - getMinBlockX(): number; - /** - * Gets the minimum z coordinate of a block in the chunk - * - * @return the minimum z coordinate - */ - getMinBlockZ(): number; - /** - * Gets every entity in this chunk - * - * @return the entity list - */ - getAllEntities(): Array; - /** - * Gets every entity in this chunk of a certain class - * - * @param clazz the class to filter for (Use `Java.type().class` to get this) - * @return the entity list - */ - getAllEntitiesOfType(clazz: java.lang.Class): Array; - /** - * Gets every block entity in this chunk - * - * @return the block entity list - */ - getAllBlockEntities(): Array; - /** - * Gets every block entity in this chunk of a certain class - * - * @param clazz the class to filter for (Use `Java.type().class` to get this) - * @return the block entity list - */ - getAllBlockEntitiesOfType(clazz: java.lang.Class): Array; - } - const PotionEffectType: { - new(type: net.minecraft.world.effect.MobEffect): com.chattriggers.ctjs.api.world.PotionEffectType; - } - interface PotionEffectType { - getType(): net.minecraft.world.effect.MobEffect; - /** - * The Int associated with this type - */ - getRawId(): number; - /** - * Whether this effect is instant (e.g. instant health) - */ - isInstant(): boolean; - /** - * The raw key used for this effect type - */ - getTranslationKey(): string; - /** - * The user-friendly name of this type as a [TextComponent] - */ - getName(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * The [net.minecraft.entity.effect.StatusEffectCategory] of this type - */ - getCategory(): net.minecraft.world.effect.MobEffectCategory; - /** - * The color of this type - */ - getColor(): java.awt.Color; - } - const PotionEffect: { - new(effect: net.minecraft.world.effect.MobEffectInstance): com.chattriggers.ctjs.api.world.PotionEffect; - } - interface PotionEffect { - getEffect(): net.minecraft.world.effect.MobEffectInstance; - /** - * The type of this potion - */ - getType(): com.chattriggers.ctjs.api.world.PotionEffectType; - /** - * Returns the translation key of the potion. - * Ex: "potion.poison" - */ - getName(): string; - /** - * Returns the localized name of the potion that - * is displayed in the player's inventory. - * Ex: "Poison" - */ - getLocalizedName(): string; - getAmplifier(): number; - getDuration(): number; - getId(): number; - getAmbient(): boolean; - isInfinite(): boolean; - getShowsParticles(): boolean; - } - const World: { - BorderWrapper: typeof com.chattriggers.ctjs.api.world.World$BorderWrapper; - SpawnWrapper: typeof com.chattriggers.ctjs.api.world.World$SpawnWrapper; - ParticleWrapper: typeof com.chattriggers.ctjs.api.world.World$ParticleWrapper; - spawn: com.chattriggers.ctjs.api.world.World$SpawnWrapper; - particle: com.chattriggers.ctjs.api.world.World$ParticleWrapper; - border: com.chattriggers.ctjs.api.world.World$BorderWrapper; - toMC(): net.minecraft.client.multiplayer.ClientLevel | null | undefined; - getWorld(): net.minecraft.client.multiplayer.ClientLevel | null | undefined; - isLoaded(): boolean; - isRaining(): boolean; - getTime(): number; - /** - * Gets the [Block] at a location in the world. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return the [Block] at the location - */ - getBlockAt(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.Block; - /** - * Gets the [Block] at a location in the world. - * - * @param pos The block position - * @return the [Block] at the location - */ - getBlockAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): com.chattriggers.ctjs.api.world.block.Block; - getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): Array; - getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number, types: Array): Array; - /** - * Gets the [BlockState] at a location in the world. - * - * @param pos The block position - * @return the [BlockState] at the location - */ - getBlockStateAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): net.minecraft.world.level.block.state.BlockState; - /** - * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu - * - * @param x the x coordinate - * @param y the y coordinate - * @param z the z coordinate - * @return the skylight level at the location - */ - getSkyLightLevel(x: number, y: number, z: number): number; - /** - * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu - * - * @param pos The block position - * @return the skylight level at the location - */ - getSkyLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; - /** - * Gets the block light level at the given position. This is the value seen in the debug (F3) menu - * - * @param x the x coordinate - * @param y the y coordinate - * @param z the z coordinate - * @return the block light level at the location - */ - getBlockLightLevel(x: number, y: number, z: number): number; - /** - * Gets the block light level at the given position. This is the value seen in the debug (F3) menu - * - * @param pos The block position - * @return the block light level at the location - */ - getBlockLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; - /** - * Gets all of the players in the world, and returns their wrapped versions. - * - * @return the players - */ - getAllPlayers(): Array; - /** - * Gets a player by their username, must be in the currently loaded chunks! - * - * @param name the username - * @return the player with said username, or null if they don't exist. - */ - getPlayerByName(name: string): com.chattriggers.ctjs.api.entity.PlayerMP | null | undefined; - getChunk(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.Chunk; - getAllEntities(): Array; - /** - * Gets every entity loaded in the world of a certain class - * - * @param clazz the class to filter for (Use `Java.type().class` to get this) - * @return the entity list - */ - getAllEntitiesOfType(clazz: java.lang.Class): Array; - getAllBlockEntities(): Array; - getAllBlockEntitiesOfType(clazz: java.lang.Class): Array; - /** - * Returns the TPS of the current world. - * - * On modern version (1.20.3+), this is variable. On earlier versions, - * it is always 20. - */ - getTicksPerSecond(): number; - new(): com.chattriggers.ctjs.api.world.World; - } - interface World { - spawn: com.chattriggers.ctjs.api.world.World$SpawnWrapper; - particle: com.chattriggers.ctjs.api.world.World$ParticleWrapper; - border: com.chattriggers.ctjs.api.world.World$BorderWrapper; - toMC(): net.minecraft.client.multiplayer.ClientLevel | null | undefined; - getWorld(): net.minecraft.client.multiplayer.ClientLevel | null | undefined; - isLoaded(): boolean; - isRaining(): boolean; - getTime(): number; - /** - * Gets the [Block] at a location in the world. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return the [Block] at the location - */ - getBlockAt(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.Block; - /** - * Gets the [Block] at a location in the world. - * - * @param pos The block position - * @return the [Block] at the location - */ - getBlockAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): com.chattriggers.ctjs.api.world.block.Block; - getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): Array; - getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number, types: Array): Array; - /** - * Gets the [BlockState] at a location in the world. - * - * @param pos The block position - * @return the [BlockState] at the location - */ - getBlockStateAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): net.minecraft.world.level.block.state.BlockState; - /** - * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu - * - * @param x the x coordinate - * @param y the y coordinate - * @param z the z coordinate - * @return the skylight level at the location - */ - getSkyLightLevel(x: number, y: number, z: number): number; - /** - * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu - * - * @param pos The block position - * @return the skylight level at the location - */ - getSkyLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; - /** - * Gets the block light level at the given position. This is the value seen in the debug (F3) menu - * - * @param x the x coordinate - * @param y the y coordinate - * @param z the z coordinate - * @return the block light level at the location - */ - getBlockLightLevel(x: number, y: number, z: number): number; - /** - * Gets the block light level at the given position. This is the value seen in the debug (F3) menu - * - * @param pos The block position - * @return the block light level at the location - */ - getBlockLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; - /** - * Gets all of the players in the world, and returns their wrapped versions. - * - * @return the players - */ - getAllPlayers(): Array; - /** - * Gets a player by their username, must be in the currently loaded chunks! - * - * @param name the username - * @return the player with said username, or null if they don't exist. - */ - getPlayerByName(name: string): com.chattriggers.ctjs.api.entity.PlayerMP | null | undefined; - getChunk(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.Chunk; - getAllEntities(): Array; - /** - * Gets every entity loaded in the world of a certain class - * - * @param clazz the class to filter for (Use `Java.type().class` to get this) - * @return the entity list - */ - getAllEntitiesOfType(clazz: java.lang.Class): Array; - getAllBlockEntities(): Array; - getAllBlockEntitiesOfType(clazz: java.lang.Class): Array; - /** - * Returns the TPS of the current world. - * - * On modern version (1.20.3+), this is variable. On earlier versions, - * it is always 20. - */ - getTicksPerSecond(): number; - new(): com.chattriggers.ctjs.api.world.World; - } - const World$SpawnWrapper: { - /** - * World spawn object for getting spawn location. - */ - new(): com.chattriggers.ctjs.api.world.World$SpawnWrapper; - } - interface World$SpawnWrapper { - /** - * Gets the spawn x location. - * - * @return the spawn x location. - */ - getX(): number; - /** - * Gets the spawn y location. - * - * @return the spawn y location. - */ - getY(): number; - /** - * Gets the spawn z location. - * - * @return the spawn z location. - */ - getZ(): number; - } - const World$ParticleWrapper: { - new(): com.chattriggers.ctjs.api.world.World$ParticleWrapper; - } - interface World$ParticleWrapper { - /** - * Gets an array of all the different particle names you can pass - * to [spawnParticle] - * - * @return the array of name strings - */ - getParticleNames(): Array; - /** - * Spawns a particle into the world with the given attributes, - * which can be configured further with the returned [com.chattriggers.ctjs.api.entity.Particle] - * - * @param particle the name of the particle to spawn, see [getParticleNames] - * @param x the x coordinate to spawn the particle at - * @param y the y coordinate to spawn the particle at - * @param z the z coordinate to spawn the particle at - * @param xSpeed the motion the particle should have in the x direction - * @param ySpeed the motion the particle should have in the y direction - * @param zSpeed the motion the particle should have in the z direction - * @return the newly spawned particle for further configuration - */ - spawnParticle(particle: string, x: number, y: number, z: number, xSpeed: number, ySpeed: number, zSpeed: number): com.chattriggers.ctjs.api.entity.Particle | null | undefined; - spawnParticle(particle: net.minecraft.client.particle.Particle): com.chattriggers.ctjs.api.entity.Particle; - } - const World$BorderWrapper: { - /** - * World border object to get border parameters - */ - new(): com.chattriggers.ctjs.api.world.World$BorderWrapper; - } - interface World$BorderWrapper { - /** - * Gets the border center x location. - * - * @return the border center x location - */ - getCenterX(): number; - /** - * Gets the border center z location. - * - * @return the border center z location - */ - getCenterZ(): number; - /** - * Gets the border size. - * - * @return the border size - */ - getSize(): number; - } - const TabList: { - Name: typeof com.chattriggers.ctjs.api.world.TabList$Name; - toMC(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; - /** - * Gets the scoreboard objective corresponding to the tab list, or null if it doesn't exist - */ - getObjective(): net.minecraft.world.scores.Objective | null | undefined; - /** - * Gets the tab list header as a [TextComponent] - * - * @return the header - */ - getHeaderComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; - /** - * Gets the tab list header as a formatted string. - * - * @return the header - */ - getHeader(): string | null | undefined; - /** - * Sets the header text for the TabList. - * If [header] is null, it will remove the header entirely - * - * @param header the header to set, or null to clear - */ - setHeader(header: any | null | undefined): void; - clearHeader(): void; - /** - * Gets the tab list footer as a [TextComponent] - * - * @return the footer - */ - getFooterComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; - /** - * Gets the tab list footer as a string. - * Be aware that this can contain color codes. - * - * @return the footer - */ - getFooter(): string | null | undefined; - /** - * Sets the footer text for the TabList. - * If [footer] is null, it will remove the footer entirely - * - * @param footer the footer to set, or null to clear - */ - setFooter(footer: any | null | undefined): void; - clearFooter(): void; - /** - * Gets names set in scoreboard objectives - * - * @return The formatted names - */ - getNamesByObjectives(): Array; - /** - * Get all names on the tab list - * - * @return the list of names - */ - getNames(): Array; - /** - * Gets all names in tabs without formatting - * - * @return the unformatted names - */ - getUnformattedNames(): Array; - /** - * Adds a new name to the tab list - * - * @param name the formatted name to add - * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. - * If false, will use a random default skin (Steve, Alex, etc) - */ - addName(name: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Adds a new name to the tab list - * - * @param name the formatted name to add - * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. - * If false, will use a random default skin (Steve, Alex, etc) - */ - addName(name: com.chattriggers.ctjs.api.message.TextComponent, useExistingSkin: boolean): void; - addName(name: string): void; - addName(name: string, useExistingSkin: boolean): void; - /** - * Removes all names from the tab list with a certain name - * - * @param name the name of the entry to remove - */ - removeNames(name: com.chattriggers.ctjs.api.message.TextComponent): void; - removeNames(name: string): void; - new(): com.chattriggers.ctjs.api.world.TabList; - } - interface TabList { - toMC(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; - /** - * Gets the scoreboard objective corresponding to the tab list, or null if it doesn't exist - */ - getObjective(): net.minecraft.world.scores.Objective | null | undefined; - /** - * Gets the tab list header as a [TextComponent] - * - * @return the header - */ - getHeaderComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; - /** - * Gets the tab list header as a formatted string. - * - * @return the header - */ - getHeader(): string | null | undefined; - /** - * Sets the header text for the TabList. - * If [header] is null, it will remove the header entirely - * - * @param header the header to set, or null to clear - */ - setHeader(header: any | null | undefined): void; - clearHeader(): void; - /** - * Gets the tab list footer as a [TextComponent] - * - * @return the footer - */ - getFooterComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; - /** - * Gets the tab list footer as a string. - * Be aware that this can contain color codes. - * - * @return the footer - */ - getFooter(): string | null | undefined; - /** - * Sets the footer text for the TabList. - * If [footer] is null, it will remove the footer entirely - * - * @param footer the footer to set, or null to clear - */ - setFooter(footer: any | null | undefined): void; - clearFooter(): void; - /** - * Gets names set in scoreboard objectives - * - * @return The formatted names - */ - getNamesByObjectives(): Array; - /** - * Get all names on the tab list - * - * @return the list of names - */ - getNames(): Array; - /** - * Gets all names in tabs without formatting - * - * @return the unformatted names - */ - getUnformattedNames(): Array; - /** - * Adds a new name to the tab list - * - * @param name the formatted name to add - * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. - * If false, will use a random default skin (Steve, Alex, etc) - */ - addName(name: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Adds a new name to the tab list - * - * @param name the formatted name to add - * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. - * If false, will use a random default skin (Steve, Alex, etc) - */ - addName(name: com.chattriggers.ctjs.api.message.TextComponent, useExistingSkin: boolean): void; - addName(name: string): void; - addName(name: string, useExistingSkin: boolean): void; - /** - * Removes all names from the tab list with a certain name - * - * @param name the name of the entry to remove - */ - removeNames(name: com.chattriggers.ctjs.api.message.TextComponent): void; - removeNames(name: string): void; - new(): com.chattriggers.ctjs.api.world.TabList; - } - const TabList$Name: { - new(mcValue: net.minecraft.client.multiplayer.PlayerInfo): com.chattriggers.ctjs.api.world.TabList$Name; - } - interface TabList$Name extends com.chattriggers.ctjs.api.CTWrapper { - /** - * Gets the latency associated with this name - * - * @return the latency - */ - getLatency(): number; - /** - * Sets the latency associated with this name. - * - latency between 0 and 149 represents all 5 bars - * - latency between 150 and 299 represents 4 bars - * - latency between 300 and 599 represents 3 bars - * - latency between 600 and 999 represents 2 bars - * - latency between 1000 and more represents 1 bar - * - * @param latency the latency to set - * @return the name to allow for method chaining - */ - setLatency(latency: number): com.chattriggers.ctjs.api.world.TabList$Name; - /** - * Gets the team associated with this name, if it exists - * - * @return the team, or null if it does not exist - */ - getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; - /** - * Sets the team associated with this name - * - * @param team the new team to set for this name. Custom teams can be created - * using [Scoreboard.createTeam] - * @return the score to allow for method chaining - */ - setTeam(team: com.chattriggers.ctjs.api.entity.Team | null | undefined): com.chattriggers.ctjs.api.world.TabList$Name; - /** - * Gets the display text of this name - * - * @return the display name - */ - getName(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sets the display name of this name - * - * @param name the new name - * @return the name to allow for method chaining - */ - setName(name: com.chattriggers.ctjs.api.message.TextComponent | null | undefined): com.chattriggers.ctjs.api.world.TabList$Name; - /** - * Removes this name from the tab list - */ - remove(): void; - } - const StructureFinder: { - submitChunkScan(chunkX: number, chunkZ: number): void; - submitBlockUpdate(blockX: number, blockY: number, blockZ: number): void; - getRenderBlocksArray(): Array; - getRenderLabelsArray(): Array; - clear(): void; - shutdown(): void; - new(): com.chattriggers.ctjs.api.world.StructureFinder; - } - interface StructureFinder { - submitChunkScan(chunkX: number, chunkZ: number): void; - submitBlockUpdate(blockX: number, blockY: number, blockZ: number): void; - getRenderBlocksArray(): Array; - getRenderLabelsArray(): Array; - clear(): void; - shutdown(): void; - new(): com.chattriggers.ctjs.api.world.StructureFinder; - } - const BossBars: { - BossBar: typeof com.chattriggers.ctjs.api.world.BossBars$BossBar; - Color: typeof com.chattriggers.ctjs.api.world.BossBars$Color; - Style: typeof com.chattriggers.ctjs.api.world.BossBars$Style; - toMC(): net.minecraft.client.gui.components.BossHealthOverlay; - /** - * Gets the list of currently shown [BossBar]s - * - * @return the currently displayed [BossBar]s - */ - getBossBars(): Array; - /** - * Gets all [BossBar]s with a given name - * - * @param name the name to match - * @return the [BossBar]s - */ - getBossBarsByName(name: string): Array; - /** - * Adds a new [BossBar] to be displayed - * - * Takes a parameter with the following options: - * - name: The name to appear above the BossBar. Defaults to an empty string - * - percent: The percent full the BossBar is. Defaults to 1 (full health) - * - color: The color of the BossBar. Can be any [Color], but defaults to white - * - sections: The number of notches/sections to appear on the BossBar. Can be any [Style], but - * defaults to 1 entire section - * - darkenSky: Whether the BossBar should darken the screen of the player. Defaults to false - * - dragonMusic: Whether the BossBar should play dragon music while in the End. Defaults to false - * - thickenFog: Whether the BossBar should thicken the fog around the player. Defaults to false - * - * @param obj An options bag - * - * @return the [BossBar] for further modification - */ - addBossBar(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.world.BossBars$BossBar; - /** - * Clears all [BossBar]s on screen - */ - clearBossBars(): void; - /** - * Removes all [BossBar]s with the given name - * - * @param name the name to match - */ - removeBossBarsByName(name: string): void; - /** - * Removes the given [BossBar] - * - * @param bossBar the BossBar to remove - */ - removeBossBar(bossBar: com.chattriggers.ctjs.api.world.BossBars$BossBar): void; - new(): com.chattriggers.ctjs.api.world.BossBars; - } - interface BossBars { - toMC(): net.minecraft.client.gui.components.BossHealthOverlay; - /** - * Gets the list of currently shown [BossBar]s - * - * @return the currently displayed [BossBar]s - */ - getBossBars(): Array; - /** - * Gets all [BossBar]s with a given name - * - * @param name the name to match - * @return the [BossBar]s - */ - getBossBarsByName(name: string): Array; - /** - * Adds a new [BossBar] to be displayed - * - * Takes a parameter with the following options: - * - name: The name to appear above the BossBar. Defaults to an empty string - * - percent: The percent full the BossBar is. Defaults to 1 (full health) - * - color: The color of the BossBar. Can be any [Color], but defaults to white - * - sections: The number of notches/sections to appear on the BossBar. Can be any [Style], but - * defaults to 1 entire section - * - darkenSky: Whether the BossBar should darken the screen of the player. Defaults to false - * - dragonMusic: Whether the BossBar should play dragon music while in the End. Defaults to false - * - thickenFog: Whether the BossBar should thicken the fog around the player. Defaults to false - * - * @param obj An options bag - * - * @return the [BossBar] for further modification - */ - addBossBar(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.world.BossBars$BossBar; - /** - * Clears all [BossBar]s on screen - */ - clearBossBars(): void; - /** - * Removes all [BossBar]s with the given name - * - * @param name the name to match - */ - removeBossBarsByName(name: string): void; - /** - * Removes the given [BossBar] - * - * @param bossBar the BossBar to remove - */ - removeBossBar(bossBar: com.chattriggers.ctjs.api.world.BossBars$BossBar): void; - new(): com.chattriggers.ctjs.api.world.BossBars; - } - const BossBars$BossBar: { - new(mcValue: net.minecraft.client.gui.components.LerpingBossEvent): com.chattriggers.ctjs.api.world.BossBars$BossBar; - } - interface BossBars$BossBar extends com.chattriggers.ctjs.api.CTWrapper { - /** - * Gets the UUID of this BossBar - * - * @return the uuid - */ - getUUID(): java.util.UUID; - /** - * Gets the name of this BossBar - * - * @return the name - */ - getName(): string; - /** - * Sets the name of this BossBar - * - * @param name the name to set - */ - setName(name: string): com.chattriggers.ctjs.api.world.BossBars$BossBar; - /** - * Gets how full this BossBar is - * - * @return how full the BossBar is - */ - getPercent(): number; - /** - * Sets how full this BossBar is - * - * @param percent how full to set this BossBar. Must be between 0 and 1 - */ - setPercent(percent: number): com.chattriggers.ctjs.api.world.BossBars$BossBar; - /** - * Gets the [Color] of this BossBar - */ - getColor(): com.chattriggers.ctjs.api.world.BossBars$Color; - /** - * Sets the [Color] of this BossBar - * - * @param color the color to set. Can be [Color], [MCBossBarColor], or a string - */ - setColor(color: any): com.chattriggers.ctjs.api.world.BossBars$BossBar; - /** - * Gets the style of this BossBar. e.g. how many notches are displayed - */ - getStyle(): com.chattriggers.ctjs.api.world.BossBars$Style; - /** - * Sets the style of this BossBar - * - * @param style the style to set. Can be [Style], [MCBossBarStyle], a string, - * or a number of how many notches to put - */ - setStyle(style: any): com.chattriggers.ctjs.api.world.BossBars$BossBar; - /** - * Gets whether this BossBar darkens the sky - */ - shouldDarkenSky(): boolean; - /** - * Sets whether this BossBar should darken the sky - * - * @param darken whether to darken the sky - */ - setShouldDarkenSky(darken: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; - /** - * Gets whether this BossBar will play dragon music. - * This will do nothing when the player is not in the end dimension - */ - hasDragonMusic(): boolean; - /** - * Sets whether this BossBar will play dragon music - * - * @param music whether to play dragon music - */ - setHasDragonMusic(music: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; - /** - * Gets whether this BossBar should thicken the fog around the player - */ - shouldThickenFog(): boolean; - /** - * Sets whether this BossBar should thicken the fog around the player - * - * @param fog whether to thicken the fog - */ - setShouldThickenFog(fog: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; - } - const BossBars$Color: { - PINK: com.chattriggers.ctjs.api.world.BossBars$Color; - BLUE: com.chattriggers.ctjs.api.world.BossBars$Color; - RED: com.chattriggers.ctjs.api.world.BossBars$Color; - GREEN: com.chattriggers.ctjs.api.world.BossBars$Color; - YELLOW: com.chattriggers.ctjs.api.world.BossBars$Color; - PURPLE: com.chattriggers.ctjs.api.world.BossBars$Color; - WHITE: com.chattriggers.ctjs.api.world.BossBars$Color; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.world.BossBars$Color; - } - interface BossBars$Color extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { - } - const BossBars$Color$Companion: { - fromMC(mcValue: net.minecraft.world.BossEvent$BossBarColor): com.chattriggers.ctjs.api.world.BossBars$Color; - from(value: any): com.chattriggers.ctjs.api.world.BossBars$Color; - new(): unknown; - } - interface BossBars$Color$Companion { - fromMC(mcValue: net.minecraft.world.BossEvent$BossBarColor): com.chattriggers.ctjs.api.world.BossBars$Color; - from(value: any): com.chattriggers.ctjs.api.world.BossBars$Color; - new(): unknown; - } - const BossBars$Style: { - ONE: com.chattriggers.ctjs.api.world.BossBars$Style; - SIX: com.chattriggers.ctjs.api.world.BossBars$Style; - TEN: com.chattriggers.ctjs.api.world.BossBars$Style; - TWELVE: com.chattriggers.ctjs.api.world.BossBars$Style; - TWENTY: com.chattriggers.ctjs.api.world.BossBars$Style; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.world.BossBars$Style; - } - interface BossBars$Style extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { - getSections(): number; - } - const BossBars$Style$Companion: { - fromMC(mcValue: net.minecraft.world.BossEvent$BossBarOverlay): com.chattriggers.ctjs.api.world.BossBars$Style; - from(value: any): com.chattriggers.ctjs.api.world.BossBars$Style; - new(): unknown; - } - interface BossBars$Style$Companion { - fromMC(mcValue: net.minecraft.world.BossEvent$BossBarOverlay): com.chattriggers.ctjs.api.world.BossBars$Style; - from(value: any): com.chattriggers.ctjs.api.world.BossBars$Style; - new(): unknown; - } - const Scoreboard: { - Score: typeof com.chattriggers.ctjs.api.world.Scoreboard$Score; - toMC(): net.minecraft.world.scores.Scoreboard | null | undefined; - getSidebar(): net.minecraft.world.scores.Objective | null | undefined; - /** - * Gets the top-most string which is displayed on the scoreboard. (doesn't have a score on the side). - * Be aware that this can contain color codes. - * - * @return the scoreboard title - */ - getTitle(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sets the scoreboard title. - * - * @param title the new title - * @return the scoreboard title - */ - setTitle(title: com.chattriggers.ctjs.api.message.TextComponent): void; - setTitle(title: string): void; - /** - * Get all currently visible strings on the scoreboard. (excluding title) - * Be aware that this can contain color codes. - * - * @return the list of lines - */ - getLines(): Array; - /** - * Get all currently visible strings on the scoreboard. (excluding title) - * Be aware that this can contain color codes. - * - * @return the list of lines - */ - getLines(descending: boolean): Array; - /** - * Gets the line at the specified index (0 based) - * Equivalent to Scoreboard.getLines().get(index) - * - * @param index the line index - * @return the score object at the index - */ - getLineByIndex(index: number): com.chattriggers.ctjs.api.world.Scoreboard$Score; - /** - * Gets a list of lines that have a certain score, - * i.e. the numbers shown on the right - * - * @param score the score to look for - * @return a list of actual score objects - */ - getLinesByScore(score: number): Array; - /** - * Sets a line in the scoreboard to the specified name and score. - * - * @param score the score value for this item - * @param line the [TextComponent] to display on said line - * @param override whether to remove old lines with the same score - */ - setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Sets a line in the scoreboard to the specified name and score. - * - * @param score the score value for this item - * @param line the [TextComponent] to display on said line - * @param override whether to remove old lines with the same score - */ - setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent, override: boolean): void; - setLine(score: number, line: string): void; - setLine(score: number, line: string, override: boolean): void; - /** - * Adds a line to the scoreboard - * - * @param score the score value for this item - * @param line the [TextComponent] to display on said line - */ - addLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; - addLine(score: number, line: string): void; - /** - * Removes all lines from the scoreboard matching with a certain score - * - * @param score the score of the lines to remove - */ - removeScores(score: number): void; - /** - * Removes the line at a certain index - * - * @param index the index of the line to remove - */ - removeIndex(index: number): void; - /** - * Removes the line at a certain index - * - * @param index the index of the line to remove - */ - removeIndex(index: number, descending: boolean): void; - setShouldRender(shouldRender: boolean): void; - getShouldRender(): boolean; - /** - * Creates or gets a [Team] with a given name - * - * @param name the name of the team - */ - createTeam(name: string): com.chattriggers.ctjs.api.entity.Team; - new(): com.chattriggers.ctjs.api.world.Scoreboard; - } - interface Scoreboard { - toMC(): net.minecraft.world.scores.Scoreboard | null | undefined; - getSidebar(): net.minecraft.world.scores.Objective | null | undefined; - /** - * Gets the top-most string which is displayed on the scoreboard. (doesn't have a score on the side). - * Be aware that this can contain color codes. - * - * @return the scoreboard title - */ - getTitle(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sets the scoreboard title. - * - * @param title the new title - * @return the scoreboard title - */ - setTitle(title: com.chattriggers.ctjs.api.message.TextComponent): void; - setTitle(title: string): void; - /** - * Get all currently visible strings on the scoreboard. (excluding title) - * Be aware that this can contain color codes. - * - * @return the list of lines - */ - getLines(): Array; - /** - * Get all currently visible strings on the scoreboard. (excluding title) - * Be aware that this can contain color codes. - * - * @return the list of lines - */ - getLines(descending: boolean): Array; - /** - * Gets the line at the specified index (0 based) - * Equivalent to Scoreboard.getLines().get(index) - * - * @param index the line index - * @return the score object at the index - */ - getLineByIndex(index: number): com.chattriggers.ctjs.api.world.Scoreboard$Score; - /** - * Gets a list of lines that have a certain score, - * i.e. the numbers shown on the right - * - * @param score the score to look for - * @return a list of actual score objects - */ - getLinesByScore(score: number): Array; - /** - * Sets a line in the scoreboard to the specified name and score. - * - * @param score the score value for this item - * @param line the [TextComponent] to display on said line - * @param override whether to remove old lines with the same score - */ - setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Sets a line in the scoreboard to the specified name and score. - * - * @param score the score value for this item - * @param line the [TextComponent] to display on said line - * @param override whether to remove old lines with the same score - */ - setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent, override: boolean): void; - setLine(score: number, line: string): void; - setLine(score: number, line: string, override: boolean): void; - /** - * Adds a line to the scoreboard - * - * @param score the score value for this item - * @param line the [TextComponent] to display on said line - */ - addLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; - addLine(score: number, line: string): void; - /** - * Removes all lines from the scoreboard matching with a certain score - * - * @param score the score of the lines to remove - */ - removeScores(score: number): void; - /** - * Removes the line at a certain index - * - * @param index the index of the line to remove - */ - removeIndex(index: number): void; - /** - * Removes the line at a certain index - * - * @param index the index of the line to remove - */ - removeIndex(index: number, descending: boolean): void; - setShouldRender(shouldRender: boolean): void; - getShouldRender(): boolean; - /** - * Creates or gets a [Team] with a given name - * - * @param name the name of the team - */ - createTeam(name: string): com.chattriggers.ctjs.api.entity.Team; - new(): com.chattriggers.ctjs.api.world.Scoreboard; - } - const Scoreboard$Score: { - new(mcValue: net.minecraft.world.scores.ScoreAccess): com.chattriggers.ctjs.api.world.Scoreboard$Score; - } - interface Scoreboard$Score extends com.chattriggers.ctjs.api.CTWrapper { - /** - * Gets the team associated with this score, if it exists - * - * @return the team, or null if it does not exist - */ - getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; - /** - * Sets the team associated with this score - * - * @param team the new team to set for this line. Custom teams can be created using [createTeam] - * @return the score to allow for method chaining - */ - setTeam(team: com.chattriggers.ctjs.api.entity.Team | null | undefined): com.chattriggers.ctjs.api.world.Scoreboard$Score; - /** - * Gets the score value for this score, - * i.e. the number on the right of the board - * - * @return the actual point value - */ - getScore(): number; - /** - * Sets the score value for this score - * - * @param score the new point value - * @return the score to allow for method chaining - */ - setScore(score: number): com.chattriggers.ctjs.api.world.Scoreboard$Score; - /** - * Gets the display text of this score - * - * @return the display name - */ - getName(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sets the name of this score - * - * @param name the new name - * @return the score to allow for method chaining - */ - setName(name: com.chattriggers.ctjs.api.message.TextComponent | null | undefined): com.chattriggers.ctjs.api.world.Scoreboard$Score; - /** - * Gets the number format of this score - * - * @return the number format - */ - getNumberFormat(): net.minecraft.network.chat.numbers.NumberFormat | null | undefined; - /** - * Sets the number format of this score - * - * @param format either a formatting string, i.e. "&6", style in the form of an object, see [TextComponent], a - * [NumberFormat], or hex value - * @return the score to allow for method chaining - * - * @see [TextComponent] - */ - setNumberFormat(format: any | null | undefined): com.chattriggers.ctjs.api.world.Scoreboard$Score; - /** - * Removes this score from the scoreboard - */ - remove(): void; - } - const Server: { - toMC(): net.minecraft.client.multiplayer.ServerData | null | undefined; - isSingleplayer(): boolean; - /** - * Gets the current server's IP, or "localhost" if the player - * is in a single-player world. - * - * @return The IP of the current server - */ - getIP(): string; - /** - * Gets the current server's name, or "SinglePlayer" if the player - * is in a single-player world. - * - * @return The name of the current server - */ - getName(): string; - /** - * Gets the current server's MOTD, or "SinglePlayer" if the player - * is in a single-player world. - * - * @return The MOTD of the current server - */ - getMOTD(): string; - /** - * Gets the ping to the current server, or 5 if the player - * is in a single-player world. Returns -1 if not in a world - * - * @return The ping to the current server - */ - getPing(): number; - new(): com.chattriggers.ctjs.api.world.Server; - } - interface Server { - toMC(): net.minecraft.client.multiplayer.ServerData | null | undefined; - isSingleplayer(): boolean; - /** - * Gets the current server's IP, or "localhost" if the player - * is in a single-player world. - * - * @return The IP of the current server - */ - getIP(): string; - /** - * Gets the current server's name, or "SinglePlayer" if the player - * is in a single-player world. - * - * @return The name of the current server - */ - getName(): string; - /** - * Gets the current server's MOTD, or "SinglePlayer" if the player - * is in a single-player world. - * - * @return The MOTD of the current server - */ - getMOTD(): string; - /** - * Gets the ping to the current server, or 5 if the player - * is in a single-player world. Returns -1 if not in a world - * - * @return The ping to the current server - */ - getPing(): number; - new(): com.chattriggers.ctjs.api.world.Server; - } - } - namespace entity { - const Entity: { - DimensionType: typeof com.chattriggers.ctjs.api.entity.Entity$DimensionType; - new(mcValue: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; - } - interface Entity extends com.chattriggers.ctjs.api.CTWrapper { - getX(): number; - getY(): number; - getZ(): number; - getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; - getRotation(): net.minecraft.world.phys.Vec2; - getLastX(): number; - getLastY(): number; - getLastZ(): number; - getRenderX(): number; - getRenderY(): number; - getRenderZ(): number; - /** - * Gets the pitch, the horizontal direction the entity is facing towards. - * This has a range of -180 to 180. - * - * @return the entity's pitch - */ - getPitch(): number; - /** - * Gets the yaw, the vertical direction the entity is facing towards. - * This has a range of -180 to 180. - * - * @return the entity's yaw - */ - getYaw(): number; - /** - * Gets the entity's x motion. - * This is the amount the entity will move in the x direction next tick. - * - * @return the entity's x motion - */ - getMotionX(): number; - /** - * Gets the entity's y motion. - * This is the amount the entity will move in the y direction next tick. - * - * @return the entity's y motion - */ - getMotionY(): number; - /** - * Gets the entity's z motion. - * This is the amount the entity will move in the z direction next tick. - * - * @return the entity's z motion - */ - getMotionZ(): number; - /** - * Returns the entity this entity is riding, if one exists - * - * @return an Entity or null - */ - getRiding(): com.chattriggers.ctjs.api.entity.Entity | null | undefined; - /** - * Returns a list of all entity riding this entity - * - * @return List of entities, empty if there are no riders - */ - getRiders(): Array; - /** - * Checks whether the entity is dead. - * This is a fairly loose term, dead for a particle could mean it has faded, - * while dead for an entity means it has no health. - * - * @return whether an entity is dead - */ - isDead(): boolean; - /** - * Gets the entire width of the entity's hitbox - * - * @return the entity's width - */ - getWidth(): number; - /** - * Gets the entire height of the entity's hitbox - * - * @return the entity's height - */ - getHeight(): number; - /** - * Gets the height of the eyes on the entity, - * can be added to its Y coordinate to get the actual Y location of the eyes. - * This value defaults to 85% of an entity's height, however is different for some entities. - * - * @return the height of the entity's eyes - */ - getEyeHeight(): number; - /** - * Gets the name of the entity, could be "Villager", - * or, if the entity has a custom name, it returns that. - * - * @return the (custom) name of the entity as a String - */ - getName(): string; - /** - * Gets the name of the entity, could be "Villager", - * or, if the entity has a custom name, it returns that. - * - * @return the (custom) name of the entity as a [TextComponent] - */ - getNameComponent(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Gets the Java class name of the entity, for example "EntityVillager" - * - * @return the entity's class name - */ - getClassName(): string; - /** - * Gets the Java UUID object of this entity. - * Use of [UUID.toString] in conjunction is recommended. - * - * @return the entity's uuid - */ - getUUID(): java.util.UUID; - /** - * Gets the entity's air level. - * - * The returned value will be an integer. If the player is not taking damage, it - * will be between 300 (not in water) and 0. If the player is taking damage, it - * will be between -20 and 0, getting reset to 0 every time the player takes damage. - * - * @return the entity's air level - */ - getAir(): number; - distanceTo(other: com.chattriggers.ctjs.api.entity.Entity): number; - distanceTo(other: net.minecraft.world.entity.Entity): number; - distanceTo(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): number; - distanceTo(x: number, y: number, z: number): number; - isOnGround(): boolean; - isCollided(): boolean; - getDistanceWalked(): number; - getStepHeight(): number; - hasNoClip(): boolean; - getTicksExisted(): number; - getFireResistance(): number; - isImmuneToFire(): boolean; - isInWater(): boolean; - isWet(): boolean; - getDimension(): com.chattriggers.ctjs.api.entity.Entity$DimensionType; - getMaxInPortalTime(): number; - isSilent(): boolean; - isInLava(): boolean; - getLookVector(): net.minecraft.world.phys.Vec3; - getLookVector(partialTicks: number): net.minecraft.world.phys.Vec3; - getEyePosition(): net.minecraft.world.phys.Vec3; - getEyePosition(partialTicks: number): net.minecraft.world.phys.Vec3; - canBeCollidedWith(): boolean; - canBePushed(): boolean; - isSneaking(): boolean; - isSprinting(): boolean; - isInvisible(): boolean; - isOutsideBorder(): boolean; - isBurning(): boolean; - getWorld(): net.minecraft.world.level.Level; - getChunk(): com.chattriggers.ctjs.api.world.Chunk; - } - const Entity$DimensionType: { - OVERWORLD: com.chattriggers.ctjs.api.entity.Entity$DimensionType; - NETHER: com.chattriggers.ctjs.api.entity.Entity$DimensionType; - END: com.chattriggers.ctjs.api.entity.Entity$DimensionType; - OVERWORLD_CAVES: com.chattriggers.ctjs.api.entity.Entity$DimensionType; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.entity.Entity$DimensionType; - } - interface Entity$DimensionType extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper> { - } - const Entity$Companion: { - fromMC(entity: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; - new(): com.chattriggers.ctjs.api.entity.Entity$Companion; - } - interface Entity$Companion { - fromMC(entity: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; - new(): com.chattriggers.ctjs.api.entity.Entity$Companion; - } - const Team: { - Visibility: typeof com.chattriggers.ctjs.api.entity.Team$Visibility; - new(mcValue: net.minecraft.world.scores.PlayerTeam): com.chattriggers.ctjs.api.entity.Team; - } - interface Team extends com.chattriggers.ctjs.api.CTWrapper { - /** - * Gets the registered name of the team - */ - getRegisteredName(): string; - /** - * Gets the display name of the team - */ - getName(): string; - /** - * Sets the display name of the team - * @param name the new display name - * @return the team for method chaining - */ - setName(name: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.entity.Team; - /** - * Sets the display name of the team - * @param name the new display name - * @return the team for method chaining - */ - setName(name: string): com.chattriggers.ctjs.api.entity.Team; - /** - * Gets the list of names on the team - */ - getMembers(): Array; - /** - * Gets the team prefix - */ - getPrefix(): string; - /** - * Sets the team prefix - * @param prefix the prefix to set - * @return the team for method chaining - */ - setPrefix(prefix: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.entity.Team; - /** - * Sets the team prefix - * @param prefix the prefix to set - * @return the team for method chaining - */ - setPrefix(prefix: string): com.chattriggers.ctjs.api.entity.Team; - /** - * Gets the team suffix - */ - getSuffix(): string; - /** - * Sets the team suffix - * @param suffix the suffix to set - * @return the team for method chaining - */ - setSuffix(suffix: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.entity.Team; - /** - * Sets the team suffix - * @param suffix the suffix to set - * @return the team for method chaining - */ - setSuffix(suffix: string): com.chattriggers.ctjs.api.entity.Team; - getColor(): string; - /** - * Sets the team color - * @param color a string format of a [Formatting], or a hex value - * @return the team for method chaining - */ - setColor(color: any | null | undefined): com.chattriggers.ctjs.api.entity.Team; - /** - * Gets the team's friendly fire setting - */ - getFriendlyFire(): boolean; - /** - * Gets whether the team can see invisible players on the same team - */ - canSeeInvisibleTeammates(): boolean; - /** - * Gets the team's name tag visibility - */ - getNameTagVisibility(): com.chattriggers.ctjs.api.entity.Team$Visibility; - /** - * Gets the team's death message visibility - */ - getDeathMessageVisibility(): com.chattriggers.ctjs.api.entity.Team$Visibility; - } - const Team$Visibility: { - ALWAYS: com.chattriggers.ctjs.api.entity.Team$Visibility; - NEVER: com.chattriggers.ctjs.api.entity.Team$Visibility; - HIDE_FOR_OTHERS_TEAMS: com.chattriggers.ctjs.api.entity.Team$Visibility; - HIDE_FOR_OWN_TEAM: com.chattriggers.ctjs.api.entity.Team$Visibility; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.entity.Team$Visibility; - } - interface Team$Visibility extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { - } - const Team$Visibility$Companion: { - fromMC(mcValue: net.minecraft.world.scores.Team$Visibility): com.chattriggers.ctjs.api.entity.Team$Visibility; - new(): unknown; - } - interface Team$Visibility$Companion { - fromMC(mcValue: net.minecraft.world.scores.Team$Visibility): com.chattriggers.ctjs.api.entity.Team$Visibility; - new(): unknown; - } - const PlayerMP: { - new(mcValue: net.minecraft.world.entity.player.Player): com.chattriggers.ctjs.api.entity.PlayerMP; - } - interface PlayerMP extends com.chattriggers.ctjs.api.entity.LivingEntity { - isSpectator(): boolean; - getPing(): number; - getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; - /** - * Gets the display name for this player, - * i.e. the name shown in tab list and in the player's nametag. - * @return the display name - */ - getDisplayName(): com.chattriggers.ctjs.api.message.TextComponent; - setTabDisplayName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Sets the name for this player shown above their head, - * in their name tag - * - * @param textComponent the new name to display - */ - setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] - * minus `player`. - * - * @see Renderer.drawPlayer - */ - draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.entity.PlayerMP; - } - const LivingEntity: { - new(mcValue: net.minecraft.world.entity.LivingEntity): com.chattriggers.ctjs.api.entity.LivingEntity; - } - interface LivingEntity extends com.chattriggers.ctjs.api.entity.Entity { - getActivePotionEffects(): Array; - canSeeEntity(other: net.minecraft.world.entity.Entity): boolean; - canSeeEntity(other: com.chattriggers.ctjs.api.entity.Entity): boolean; - /** - * Gets the item currently in the entity's specified inventory slot. - * 0 for main hand, 1 for offhand, 2-5 for armor - * - * @param slot the slot to access - * @return the item in said slot - */ - getStackInSlot(slot: number): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - getHP(): number; - getMaxHP(): number; - getAbsorption(): number; - getAge(): number; - getArmorValue(): number; - isPotionActive(id: number): boolean; - isPotionActive(type: com.chattriggers.ctjs.api.world.PotionEffectType): boolean; - isPotionActive(effect: com.chattriggers.ctjs.api.world.PotionEffect): boolean; - } - const PlayerInteraction: { - UseBlock: typeof com.chattriggers.ctjs.api.entity.PlayerInteraction$UseBlock; - UseEntity: typeof com.chattriggers.ctjs.api.entity.PlayerInteraction$UseEntity; - UseItem: typeof com.chattriggers.ctjs.api.entity.PlayerInteraction$UseItem; - new(name: string, mainHand: boolean): com.chattriggers.ctjs.api.entity.PlayerInteraction; - } - interface PlayerInteraction { - getName(): string; - getMainHand(): boolean; - } - const PlayerInteraction$AttackBlock: { - new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackBlock; - } - interface PlayerInteraction$AttackBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { - new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackBlock; - } - const PlayerInteraction$AttackEntity: { - new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackEntity; - } - interface PlayerInteraction$AttackEntity extends com.chattriggers.ctjs.api.entity.PlayerInteraction { - new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackEntity; - } - const PlayerInteraction$BreakBlock: { - new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$BreakBlock; - } - interface PlayerInteraction$BreakBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { - new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$BreakBlock; - } - const PlayerInteraction$UseBlock: { - new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseBlock; - } - interface PlayerInteraction$UseBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { - } - const PlayerInteraction$UseEntity: { - new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseEntity; - } - interface PlayerInteraction$UseEntity extends com.chattriggers.ctjs.api.entity.PlayerInteraction { - } - const PlayerInteraction$UseItem: { - new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseItem; - } - interface PlayerInteraction$UseItem extends com.chattriggers.ctjs.api.entity.PlayerInteraction { - } - const BlockEntity: { - new(mcValue: net.minecraft.world.level.block.entity.BlockEntity): com.chattriggers.ctjs.api.entity.BlockEntity; - } - interface BlockEntity extends com.chattriggers.ctjs.api.CTWrapper { - getX(): number; - getY(): number; - getZ(): number; - getBlockType(): com.chattriggers.ctjs.api.world.block.BlockType; - getBlockPos(): com.chattriggers.ctjs.api.world.block.BlockPos; - getBlock(): com.chattriggers.ctjs.api.world.block.Block; - } - const Particle: { - new(mcValue: net.minecraft.client.particle.Particle): com.chattriggers.ctjs.api.entity.Particle; - } - interface Particle extends com.chattriggers.ctjs.api.CTWrapper { - getX(): number; - setX(value: number): void; - getY(): number; - setY(value: number): void; - getZ(): number; - setZ(value: number): void; - getLastX(): number; - setLastX(value: number): void; - getLastY(): number; - setLastY(value: number): void; - getLastZ(): number; - setLastZ(value: number): void; - getRenderX(): number; - getRenderY(): number; - getRenderZ(): number; - getMotionX(): number; - setMotionX(value: number): void; - getMotionY(): number; - setMotionY(value: number): void; - getMotionZ(): number; - setMotionZ(value: number): void; - getAge(): number; - setAge(value: number): void; - getDead(): boolean; - setDead(value: boolean): void; - scale(scale: number): com.chattriggers.ctjs.api.entity.Particle; - /** - * Sets the amount of ticks this particle will live for - * - * @param maxAge the particle's max age (in ticks) - */ - setMaxAge(maxAge: number): com.chattriggers.ctjs.api.entity.Particle; - remove(): com.chattriggers.ctjs.api.entity.Particle; - } - } - namespace commands { - interface RootCommand { - register(): void; - } - const DynamicCommands: { - AngleArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$AngleArgumentWrapper; - PosArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$PosArgumentWrapper; - BlockPredicateWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$BlockPredicateWrapper; - BlockStateArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$BlockStateArgumentWrapper; - EntitySelectorWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$EntitySelectorWrapper; - ItemStackArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$ItemStackArgumentWrapper; - MessageFormatArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$MessageFormatArgumentWrapper; - NbtPathWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$NbtPathWrapper; - registerCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; - registerCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; - buildCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; - buildCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; - argument(name: string, type: com.mojang.brigadier.arguments.ArgumentType, builder: org.mozilla.javascript.Function): void; - literal(name: string, builder: org.mozilla.javascript.Function): void; - redirect(node: com.chattriggers.ctjs.api.commands.RootCommand): void; - redirect(node: com.mojang.brigadier.tree.CommandNode): void; - exec(method: org.mozilla.javascript.Function): void; - /** - * A helper method for getting Fabric's client CommandDispatcher root node. This allows user - * commands to be redirected to the root node in the same way that "/execute run ..." does. - * - * As the result is a CommandNode, `.getChild(name)` can be used to access sub-command nodes - * to, for example, redirect to just `/advancement` instead of `/`. - */ - getDispatcherRoot(): com.mojang.brigadier.tree.RootCommandNode | null | undefined; - /** - * @see Argument Types: bool - */ - bool(): com.mojang.brigadier.arguments.BoolArgumentType; - /** - * @see brigadier:double - */ - double(): com.mojang.brigadier.arguments.DoubleArgumentType; - /** - * @see brigadier:double - */ - double(min: number): com.mojang.brigadier.arguments.DoubleArgumentType; - /** - * @see brigadier:double - */ - double(min: number, max: number): com.mojang.brigadier.arguments.DoubleArgumentType; - /** - * @see brigadier:float - */ - float(): com.mojang.brigadier.arguments.FloatArgumentType; - /** - * @see brigadier:float - */ - float(min: number): com.mojang.brigadier.arguments.FloatArgumentType; - /** - * @see brigadier:float - */ - float(min: number, max: number): com.mojang.brigadier.arguments.FloatArgumentType; - /** - * @see brigadier:integer - */ - integer(): com.mojang.brigadier.arguments.IntegerArgumentType; - /** - * @see brigadier:integer - */ - integer(min: number): com.mojang.brigadier.arguments.IntegerArgumentType; - /** - * @see brigadier:integer - */ - integer(min: number, max: number): com.mojang.brigadier.arguments.IntegerArgumentType; - /** - * @see brigadier:long - */ - long(): com.mojang.brigadier.arguments.LongArgumentType; - /** - * @see brigadier:long - */ - long(min: number): com.mojang.brigadier.arguments.LongArgumentType; - /** - * @see brigadier:long - */ - long(min: number, max: number): com.mojang.brigadier.arguments.LongArgumentType; - /** - * @see brigadier:string - */ - string(): com.mojang.brigadier.arguments.StringArgumentType; - /** - * @see brigadier:string - */ - greedyString(): com.mojang.brigadier.arguments.StringArgumentType; - /** - * @see brigadier:string - */ - word(): com.mojang.brigadier.arguments.StringArgumentType; - /** - * @see minecraft:angle - */ - angle(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:block_pos - */ - blockPos(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:block_predicate - */ - blockPredicate(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:block_state - */ - blockState(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:color - */ - color(): net.minecraft.commands.arguments.ColorArgument; - /** - * @see minecraft:column_pos - */ - columnPos(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:dimension - */ - dimension(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:entity - */ - entity(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:entity - */ - entities(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:float_range - */ - floatRange(): net.minecraft.commands.arguments.RangeArgument$Floats; - /** - * @see minecraft:game_profile - */ - gameProfile(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:game_profile - */ - player(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:game_profile - */ - players(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:gamemode - */ - gameMode(): net.minecraft.commands.arguments.GameModeArgument; - /** - * @see minecraft:int_range - */ - intRange(): net.minecraft.commands.arguments.RangeArgument$Ints; - /** - * @see minecraft:item_predicate - */ - itemPredicate(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:item_slot - */ - itemSlot(): net.minecraft.commands.arguments.SlotArgument; - /** - * @see minecraft:item_stack - */ - itemStack(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:message - */ - message(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:nbt_compound_tag - */ - nbtCompoundTag(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:nbt_path - */ - nbtPath(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:nbt_tag - */ - nbtTag(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:resource - */ - resource(): net.minecraft.commands.arguments.IdentifierArgument; - /** - * @see minecraft:rotation - */ - rotation(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:swizzle - */ - swizzle(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:time - */ - time(): net.minecraft.commands.arguments.TimeArgument; - /** - * @see minecraft:time - */ - time(minimum: number): net.minecraft.commands.arguments.TimeArgument; - /** - * @see minecraft:uuid - */ - uuid(): net.minecraft.commands.arguments.UuidArgument; - /** - * @see minecraft:vec2 - */ - vec2(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:vec2 - */ - vec2(centerIntegers: boolean): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:vec3 - */ - vec3(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:vec3 - */ - vec3(centerIntegers: boolean): com.mojang.brigadier.arguments.ArgumentType; - /** - * Allows choosing from a set list of strings. When suggested to the user, this - * will look as though this argument is multiple "literal()" nodes. - */ - choices(options: string): com.mojang.brigadier.arguments.ArgumentType; - /** - * Allows easy creation of a custom ArgumentType without needing to use - * JavaAdapter. Example: - * - * ```js - * const HEADS = 0; - * const TAILS = 1; - * - * const coinFlipArgType = Commands.custom({ - * parse(reader) { - * // `reader` is a com.mojang.brigadier.StringReader - * - * const savedCursor = reader.getCursor(); - * const str = reader.readString(); - * if (str === 'heads') - * return HEADS; - * if (str === 'tails') - * return TAILS; - * Commands.error(reader, `Expected one of: 'heads', 'tails'`); - * }, - * suggest(ctx, builder) { - * // ctx is a com.mojang.brigadier.context.CommandContext - * // builder is a com.mojang.brigadier.suggestion.SuggestionsBuilder - * builder.suggest('heads'); - * builder.suggest('tails'); - * return builder.buildFuture(); - * }, - * getExamples() { - * return ['heads', 'tails']; - * } - * }); - * ``` - * - * @see StringReader - * @see CommandContext - * @see SuggestionsBuilder - */ - custom(obj: org.mozilla.javascript.NativeObject): com.mojang.brigadier.arguments.ArgumentType; - /** - * Throw a detailed error given the reader, meant to be used with [custom] - */ - error(reader: com.mojang.brigadier.ImmutableStringReader, message: string): never; - /** - * Throw a detailed error given the reader, meant to be used with [custom] - */ - error(reader: com.mojang.brigadier.ImmutableStringReader, message: com.chattriggers.ctjs.api.message.TextComponent): never; - /** - * An alternative to the command register that allows full use of the - * functionality provided by Brigadier. - * - * For more information about Brigadier, see - * their GitHub page. - * Also see [CTCommand] for an example Brigadier command. - * - * ## General - * - * This API works similarly to Brigadier, however much of the annoyance - * of using the Brigadier API has been eliminated, mainly the excessive - * use of nested function calls. It works via a global context, so function - * calls are free. However, this means that multiples commands cannot be - * built at once. This means that commands should only ever be built on the - * main thread. If two commands are built at the same time, an error will be - * thrown. - * - * ## Argument Types - * - * The [ArgumentType] interface is a fundamental part of Brigadier, and - * most of the MC argument types have been exposed via helper function - * in this class. It is also possible to build new instances of - * [ArgumentType] via [custom]. - * - * When possible, the argument types returned from the helper function on - * this class resolve in a way that their Minecraft variants do. For example, - * the [message] type will replace selectors with their target entity, if - * possible. - * - * ## Basic Example - * - * Here is an example command that recreates the `/advancement` command - * (without any of the actual functionality, of course): - * - * ```js - * // The `Commands` object supports destructuring, which makes assembling long - * // commands much nicer - * const { argument, choices, exec, greedyString, literal, registerCommand, resource, players } = Commands; - * - * registerCommand('ctadvancement', () => { - * // Note the use of choices to avoid having to copy-paste two separate literal() trees - * argument('kind', choices('grant', 'revoke'), () => { - * argument('targets', players(), () => { - * literal('everything', () => { - * // exec() receives a single object with all of the arguments, which means we can - * // destructure it to pull out the ones we want. Only values from argument() calls - * // are included here; the literal nodes are ignored and have no impact on this object. - * exec(({ kind, targets }) => { - * ChatLib.chat(`${kind} everything from ${targets}`); - * }); - * }); - * - * literal('only', () => { - * argument('advancement', resource(), () => { - * argument('criterion', greedyString(), () => { - * exec(({ kind, targets, advancement, criterion }) => { - * ChatLib.chat(`${kind} only ${advancement} applied to ${targets} (criterion = ${criterion})`); - * }); - * }); - * }); - * }); - * - * argument('subkind', choices('from', 'through', 'until'), () => { - * argument('advancement', resource(), () => { - * exec(({ kind, subkind, targets, advancement }) => { - * ChatLib.chat(`kind = ${kind}, subkind = ${subkind}, advancement = ${advancement}, targets = ${targets}`); - * }); - * }); - * }); - * }); - * }); - * }); - * ``` - * - * ## Redirect - * - * Like Brigadier, this API supports assembling partial command nodes for use - * in redirection. To do this, use [buildCommand], which returns the command node - * (well, an internal representation of it). This object can then be passed to - * further calls to [redirect] inside of a [literal] or [argument] block. - * - * Examples: - * - * ```js - * // destructuring omitted - * - * const testCmdNode = buildCommand('testcmd', () => { - * exec(({ arg }) => { - * if (arg) { - * ChatLib.chat(`arg supplied, value = ${arg}`); - * } else { - * ChatLib.chat('no arg supplied'); - * } - * }); - * }); - * - * // Manually register it since we used buildCommand() instead of registerCommand() - * testCmdNode.register() - * - * registerCommand('testcmd', () => { - * argument('arg', greedyString(), () => { - * redirect(testCmdNode); - * }); - * }); - * ``` - */ - new(): com.chattriggers.ctjs.api.commands.DynamicCommands; - } - interface DynamicCommands extends com.chattriggers.ctjs.internal.commands.CommandCollection { - registerCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; - registerCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; - buildCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; - buildCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; - argument(name: string, type: com.mojang.brigadier.arguments.ArgumentType, builder: org.mozilla.javascript.Function): void; - literal(name: string, builder: org.mozilla.javascript.Function): void; - redirect(node: com.chattriggers.ctjs.api.commands.RootCommand): void; - redirect(node: com.mojang.brigadier.tree.CommandNode): void; - exec(method: org.mozilla.javascript.Function): void; - /** - * A helper method for getting Fabric's client CommandDispatcher root node. This allows user - * commands to be redirected to the root node in the same way that "/execute run ..." does. - * - * As the result is a CommandNode, `.getChild(name)` can be used to access sub-command nodes - * to, for example, redirect to just `/advancement` instead of `/`. - */ - getDispatcherRoot(): com.mojang.brigadier.tree.RootCommandNode | null | undefined; - /** - * @see Argument Types: bool - */ - bool(): com.mojang.brigadier.arguments.BoolArgumentType; - /** - * @see brigadier:double - */ - double(): com.mojang.brigadier.arguments.DoubleArgumentType; - /** - * @see brigadier:double - */ - double(min: number): com.mojang.brigadier.arguments.DoubleArgumentType; - /** - * @see brigadier:double - */ - double(min: number, max: number): com.mojang.brigadier.arguments.DoubleArgumentType; - /** - * @see brigadier:float - */ - float(): com.mojang.brigadier.arguments.FloatArgumentType; - /** - * @see brigadier:float - */ - float(min: number): com.mojang.brigadier.arguments.FloatArgumentType; - /** - * @see brigadier:float - */ - float(min: number, max: number): com.mojang.brigadier.arguments.FloatArgumentType; - /** - * @see brigadier:integer - */ - integer(): com.mojang.brigadier.arguments.IntegerArgumentType; - /** - * @see brigadier:integer - */ - integer(min: number): com.mojang.brigadier.arguments.IntegerArgumentType; - /** - * @see brigadier:integer - */ - integer(min: number, max: number): com.mojang.brigadier.arguments.IntegerArgumentType; - /** - * @see brigadier:long - */ - long(): com.mojang.brigadier.arguments.LongArgumentType; - /** - * @see brigadier:long - */ - long(min: number): com.mojang.brigadier.arguments.LongArgumentType; - /** - * @see brigadier:long - */ - long(min: number, max: number): com.mojang.brigadier.arguments.LongArgumentType; - /** - * @see brigadier:string - */ - string(): com.mojang.brigadier.arguments.StringArgumentType; - /** - * @see brigadier:string - */ - greedyString(): com.mojang.brigadier.arguments.StringArgumentType; - /** - * @see brigadier:string - */ - word(): com.mojang.brigadier.arguments.StringArgumentType; - /** - * @see minecraft:angle - */ - angle(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:block_pos - */ - blockPos(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:block_predicate - */ - blockPredicate(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:block_state - */ - blockState(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:color - */ - color(): net.minecraft.commands.arguments.ColorArgument; - /** - * @see minecraft:column_pos - */ - columnPos(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:dimension - */ - dimension(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:entity - */ - entity(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:entity - */ - entities(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:float_range - */ - floatRange(): net.minecraft.commands.arguments.RangeArgument$Floats; - /** - * @see minecraft:game_profile - */ - gameProfile(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:game_profile - */ - player(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:game_profile - */ - players(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:gamemode - */ - gameMode(): net.minecraft.commands.arguments.GameModeArgument; - /** - * @see minecraft:int_range - */ - intRange(): net.minecraft.commands.arguments.RangeArgument$Ints; - /** - * @see minecraft:item_predicate - */ - itemPredicate(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:item_slot - */ - itemSlot(): net.minecraft.commands.arguments.SlotArgument; - /** - * @see minecraft:item_stack - */ - itemStack(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:message - */ - message(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:nbt_compound_tag - */ - nbtCompoundTag(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:nbt_path - */ - nbtPath(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:nbt_tag - */ - nbtTag(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:resource - */ - resource(): net.minecraft.commands.arguments.IdentifierArgument; - /** - * @see minecraft:rotation - */ - rotation(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:swizzle - */ - swizzle(): com.mojang.brigadier.arguments.ArgumentType>; - /** - * @see minecraft:time - */ - time(): net.minecraft.commands.arguments.TimeArgument; - /** - * @see minecraft:time - */ - time(minimum: number): net.minecraft.commands.arguments.TimeArgument; - /** - * @see minecraft:uuid - */ - uuid(): net.minecraft.commands.arguments.UuidArgument; - /** - * @see minecraft:vec2 - */ - vec2(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:vec2 - */ - vec2(centerIntegers: boolean): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:vec3 - */ - vec3(): com.mojang.brigadier.arguments.ArgumentType; - /** - * @see minecraft:vec3 - */ - vec3(centerIntegers: boolean): com.mojang.brigadier.arguments.ArgumentType; - /** - * Allows choosing from a set list of strings. When suggested to the user, this - * will look as though this argument is multiple "literal()" nodes. - */ - choices(options: string): com.mojang.brigadier.arguments.ArgumentType; - /** - * Allows easy creation of a custom ArgumentType without needing to use - * JavaAdapter. Example: - * - * ```js - * const HEADS = 0; - * const TAILS = 1; - * - * const coinFlipArgType = Commands.custom({ - * parse(reader) { - * // `reader` is a com.mojang.brigadier.StringReader - * - * const savedCursor = reader.getCursor(); - * const str = reader.readString(); - * if (str === 'heads') - * return HEADS; - * if (str === 'tails') - * return TAILS; - * Commands.error(reader, `Expected one of: 'heads', 'tails'`); - * }, - * suggest(ctx, builder) { - * // ctx is a com.mojang.brigadier.context.CommandContext - * // builder is a com.mojang.brigadier.suggestion.SuggestionsBuilder - * builder.suggest('heads'); - * builder.suggest('tails'); - * return builder.buildFuture(); - * }, - * getExamples() { - * return ['heads', 'tails']; - * } - * }); - * ``` - * - * @see StringReader - * @see CommandContext - * @see SuggestionsBuilder - */ - custom(obj: org.mozilla.javascript.NativeObject): com.mojang.brigadier.arguments.ArgumentType; - /** - * Throw a detailed error given the reader, meant to be used with [custom] - */ - error(reader: com.mojang.brigadier.ImmutableStringReader, message: string): never; - /** - * Throw a detailed error given the reader, meant to be used with [custom] - */ - error(reader: com.mojang.brigadier.ImmutableStringReader, message: com.chattriggers.ctjs.api.message.TextComponent): never; - /** - * An alternative to the command register that allows full use of the - * functionality provided by Brigadier. - * - * For more information about Brigadier, see - * their GitHub page. - * Also see [CTCommand] for an example Brigadier command. - * - * ## General - * - * This API works similarly to Brigadier, however much of the annoyance - * of using the Brigadier API has been eliminated, mainly the excessive - * use of nested function calls. It works via a global context, so function - * calls are free. However, this means that multiples commands cannot be - * built at once. This means that commands should only ever be built on the - * main thread. If two commands are built at the same time, an error will be - * thrown. - * - * ## Argument Types - * - * The [ArgumentType] interface is a fundamental part of Brigadier, and - * most of the MC argument types have been exposed via helper function - * in this class. It is also possible to build new instances of - * [ArgumentType] via [custom]. - * - * When possible, the argument types returned from the helper function on - * this class resolve in a way that their Minecraft variants do. For example, - * the [message] type will replace selectors with their target entity, if - * possible. - * - * ## Basic Example - * - * Here is an example command that recreates the `/advancement` command - * (without any of the actual functionality, of course): - * - * ```js - * // The `Commands` object supports destructuring, which makes assembling long - * // commands much nicer - * const { argument, choices, exec, greedyString, literal, registerCommand, resource, players } = Commands; - * - * registerCommand('ctadvancement', () => { - * // Note the use of choices to avoid having to copy-paste two separate literal() trees - * argument('kind', choices('grant', 'revoke'), () => { - * argument('targets', players(), () => { - * literal('everything', () => { - * // exec() receives a single object with all of the arguments, which means we can - * // destructure it to pull out the ones we want. Only values from argument() calls - * // are included here; the literal nodes are ignored and have no impact on this object. - * exec(({ kind, targets }) => { - * ChatLib.chat(`${kind} everything from ${targets}`); - * }); - * }); - * - * literal('only', () => { - * argument('advancement', resource(), () => { - * argument('criterion', greedyString(), () => { - * exec(({ kind, targets, advancement, criterion }) => { - * ChatLib.chat(`${kind} only ${advancement} applied to ${targets} (criterion = ${criterion})`); - * }); - * }); - * }); - * }); - * - * argument('subkind', choices('from', 'through', 'until'), () => { - * argument('advancement', resource(), () => { - * exec(({ kind, subkind, targets, advancement }) => { - * ChatLib.chat(`kind = ${kind}, subkind = ${subkind}, advancement = ${advancement}, targets = ${targets}`); - * }); - * }); - * }); - * }); - * }); - * }); - * ``` - * - * ## Redirect - * - * Like Brigadier, this API supports assembling partial command nodes for use - * in redirection. To do this, use [buildCommand], which returns the command node - * (well, an internal representation of it). This object can then be passed to - * further calls to [redirect] inside of a [literal] or [argument] block. - * - * Examples: - * - * ```js - * // destructuring omitted - * - * const testCmdNode = buildCommand('testcmd', () => { - * exec(({ arg }) => { - * if (arg) { - * ChatLib.chat(`arg supplied, value = ${arg}`); - * } else { - * ChatLib.chat('no arg supplied'); - * } - * }); - * }); - * - * // Manually register it since we used buildCommand() instead of registerCommand() - * testCmdNode.register() - * - * registerCommand('testcmd', () => { - * argument('arg', greedyString(), () => { - * redirect(testCmdNode); - * }); - * }); - * ``` - */ - new(): com.chattriggers.ctjs.api.commands.DynamicCommands; - } - const DynamicCommands$AngleArgumentWrapper: { - new(angle: net.minecraft.commands.arguments.AngleArgument$SingleAngle): com.chattriggers.ctjs.api.commands.DynamicCommands$AngleArgumentWrapper; - } - interface DynamicCommands$AngleArgumentWrapper { - getAngle(): net.minecraft.commands.arguments.AngleArgument$SingleAngle; - getAngle(): number; - getAngle(entity: com.chattriggers.ctjs.api.entity.Entity): number; - component1(): net.minecraft.commands.arguments.AngleArgument$SingleAngle; - copy(angle: net.minecraft.commands.arguments.AngleArgument$SingleAngle): com.chattriggers.ctjs.api.commands.DynamicCommands$AngleArgumentWrapper; - } - const DynamicCommands$PosArgumentWrapper: { - new(impl: net.minecraft.commands.arguments.coordinates.Coordinates): com.chattriggers.ctjs.api.commands.DynamicCommands$PosArgumentWrapper; - } - interface DynamicCommands$PosArgumentWrapper extends net.minecraft.commands.arguments.coordinates.Coordinates { - getImpl(): net.minecraft.commands.arguments.coordinates.Coordinates; - toAbsolutePos(): net.minecraft.world.phys.Vec3; - toAbsoluteBlockPos(): com.chattriggers.ctjs.api.world.block.BlockPos; - toAbsoluteRotation(): net.minecraft.world.phys.Vec2; - component1(): net.minecraft.commands.arguments.coordinates.Coordinates; - copy(impl: net.minecraft.commands.arguments.coordinates.Coordinates): com.chattriggers.ctjs.api.commands.DynamicCommands$PosArgumentWrapper; - } - const DynamicCommands$BlockPredicateWrapper: { - new(impl: net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockPredicateWrapper; - } - interface DynamicCommands$BlockPredicateWrapper { - getImpl(): net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result; - test(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; - component1(): net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result; - copy(impl: net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockPredicateWrapper; - } - const DynamicCommands$BlockStateArgumentWrapper: { - new(impl: net.minecraft.commands.arguments.blocks.BlockInput): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockStateArgumentWrapper; - } - interface DynamicCommands$BlockStateArgumentWrapper { - getImpl(): net.minecraft.commands.arguments.blocks.BlockInput; - test(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; - component1(): net.minecraft.commands.arguments.blocks.BlockInput; - copy(impl: net.minecraft.commands.arguments.blocks.BlockInput): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockStateArgumentWrapper; - } - const DynamicCommands$EntitySelectorWrapper: { - new(impl: net.minecraft.commands.arguments.selector.EntitySelector): com.chattriggers.ctjs.api.commands.DynamicCommands$EntitySelectorWrapper; - } - interface DynamicCommands$EntitySelectorWrapper { - getEntity(): com.chattriggers.ctjs.api.entity.Entity; - getEntities(): Array; - getPlayers(): Array; - } - const DynamicCommands$ItemStackArgumentWrapper: { - new(impl: net.minecraft.commands.arguments.item.ItemInput): com.chattriggers.ctjs.api.commands.DynamicCommands$ItemStackArgumentWrapper; - } - interface DynamicCommands$ItemStackArgumentWrapper { - getItemType(): com.chattriggers.ctjs.api.inventory.ItemType; - test(type: com.chattriggers.ctjs.api.inventory.ItemType): boolean; - component1(): net.minecraft.commands.arguments.item.ItemInput; - copy(impl: net.minecraft.commands.arguments.item.ItemInput): com.chattriggers.ctjs.api.commands.DynamicCommands$ItemStackArgumentWrapper; - } - const DynamicCommands$MessageFormatArgumentWrapper: { - new(impl: net.minecraft.commands.arguments.MessageArgument$Message): com.chattriggers.ctjs.api.commands.DynamicCommands$MessageFormatArgumentWrapper; - } - interface DynamicCommands$MessageFormatArgumentWrapper { - getText(): string; - setText(value: string): void; - format(): com.chattriggers.ctjs.api.message.TextComponent; - component1(): net.minecraft.commands.arguments.MessageArgument$Message; - copy(impl: net.minecraft.commands.arguments.MessageArgument$Message): com.chattriggers.ctjs.api.commands.DynamicCommands$MessageFormatArgumentWrapper; - } - const DynamicCommands$NbtPathWrapper: { - new(impl: net.minecraft.commands.arguments.NbtPathArgument$NbtPath): com.chattriggers.ctjs.api.commands.DynamicCommands$NbtPathWrapper; - } - interface DynamicCommands$NbtPathWrapper { - get(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): Array; - count(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): number; - getOrInit(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase, supplier: kotlin.Function0): Array; - put(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase, source: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): number; - insert(index: number, compound: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound, elements: Array): number; - remove(element: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): number; - component1(): net.minecraft.commands.arguments.NbtPathArgument$NbtPath; - copy(impl: net.minecraft.commands.arguments.NbtPathArgument$NbtPath): com.chattriggers.ctjs.api.commands.DynamicCommands$NbtPathWrapper; - } - } - namespace client { - const Proxy: { - new(ip: string, port: number, name: string, username: string, password: string, isEnabled: boolean): com.chattriggers.ctjs.api.client.Proxy; - } - interface Proxy { - getIp(): string; - setIp(value: string): void; - getPort(): number; - setPort(value: number): void; - getName(): string; - setName(value: string): void; - getUsername(): string; - setUsername(value: string): void; - getPassword(): string; - setPassword(value: string): void; - isEnabled(): boolean; - setEnabled(value: boolean): void; - component1(): string; - component2(): number; - component3(): string; - component4(): string; - component5(): string; - component6(): boolean; - copy(ip: string, port: number, name: string, username: string, password: string, isEnabled: boolean): com.chattriggers.ctjs.api.client.Proxy; - } - const DiscordRPC: { - stayOn(): void; - turnOff(): void; - updatePresence(details: string, state: string): void; - resetTimestamp(): void; - revertToIdle(): void; - new(): com.chattriggers.ctjs.api.client.DiscordRPC; - } - interface DiscordRPC { - stayOn(): void; - turnOff(): void; - updatePresence(details: string, state: string): void; - resetTimestamp(): void; - revertToIdle(): void; - new(): com.chattriggers.ctjs.api.client.DiscordRPC; - } - const Sound: { - Category: typeof com.chattriggers.ctjs.api.client.Sound$Category; - AttenuationType: typeof com.chattriggers.ctjs.api.client.Sound$AttenuationType; - new(config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Sound; - } - interface Sound { - destroy(): void; - /** - * Gets the category of this sound, making it respect the Player's sound volume sliders. - * - * @return the category - */ - getCategory(): com.chattriggers.ctjs.api.client.Sound$Category; - /** - * Sets the category of this sound, making it respect the Player's sound volume sliders. - * - * @param category the category - */ - setCategory(category: com.chattriggers.ctjs.api.client.Sound$Category): com.chattriggers.ctjs.api.client.Sound; - /** - * Gets this sound's volume. - * - * @return A float value (0.0f - 1.0f). - */ - getVolume(): number; - /** - * Sets this sound's volume. - * - * @param volume A float value (0.0f - 1.0f). - */ - setVolume(volume: number): com.chattriggers.ctjs.api.client.Sound; - getX(): number; - getY(): number; - getZ(): number; - setX(x: number): com.chattriggers.ctjs.api.client.Sound; - setY(y: number): com.chattriggers.ctjs.api.client.Sound; - setZ(z: number): com.chattriggers.ctjs.api.client.Sound; - getPosition(): net.minecraft.world.phys.Vec3; - setPosition(x: number, y: number, z: number): com.chattriggers.ctjs.api.client.Sound; - /** - * Gets this sound's pitch. - * - * @return A float value (0.5f - 2.0f). - */ - getPitch(): number; - /** - * Sets this sound's pitch. - * - * @param pitch A float value (0.5f - 2.0f). - */ - setPitch(pitch: number): com.chattriggers.ctjs.api.client.Sound; - /** - * Gets the attenuation type (fade out over space) of the sound - * - * @return The type of Attenuation - */ - getAttenuationType(): com.chattriggers.ctjs.api.client.Sound$AttenuationType; - /** - * Sets the attenuation type (fade out over space) of the sound - * - * @param attenuationType The type of Attenuation - */ - setAttenuationType(attenuationType: com.chattriggers.ctjs.api.client.Sound$AttenuationType): com.chattriggers.ctjs.api.client.Sound; - /** - * Gets the attenuation distance of the sound - */ - getAttenuation(): number; - /** - * Sets the attenuation distance of the sound - */ - setAttenuation(attenuation: number): com.chattriggers.ctjs.api.client.Sound; - /** - * Gets whether the sound should repeat after finishing - */ - getLoop(): boolean; - /** - * Sets whether the sound should repeat after finishing - */ - setLoop(loop: boolean): com.chattriggers.ctjs.api.client.Sound; - /** - * Gets the tick delay after finishing before looping again (if getLoop() is true) - */ - getLoopDelay(): number; - /** - * Sets the tick delay after finishing before looping again (if getLoop() is true) - */ - setLoopDelay(loopDelay: number): com.chattriggers.ctjs.api.client.Sound; - /** - * Plays/resumes the sound. This requires the world to be loaded - */ - play(): void; - /** - * Plays/resumes the sound. This requires the world to be loaded - */ - play(delay: number): void; - /** - * Pauses the sound, to be resumed later. This requires the world to be loaded - */ - pause(): void; - /** - * Completely stops the sound. This requires the world to be loaded - */ - stop(): void; - /** - * Immediately restarts the sound. This requires the world to be loaded - */ - rewind(): void; - } - const Sound$Category: { - MASTER: com.chattriggers.ctjs.api.client.Sound$Category; - MUSIC: com.chattriggers.ctjs.api.client.Sound$Category; - RECORDS: com.chattriggers.ctjs.api.client.Sound$Category; - WEATHER: com.chattriggers.ctjs.api.client.Sound$Category; - BLOCKS: com.chattriggers.ctjs.api.client.Sound$Category; - HOSTILE: com.chattriggers.ctjs.api.client.Sound$Category; - NEUTRAL: com.chattriggers.ctjs.api.client.Sound$Category; - PLAYERS: com.chattriggers.ctjs.api.client.Sound$Category; - AMBIENT: com.chattriggers.ctjs.api.client.Sound$Category; - VOICE: com.chattriggers.ctjs.api.client.Sound$Category; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.client.Sound$Category; - } - interface Sound$Category extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { - } - const Sound$Category$Companion: { - fromMC(mcValue: net.minecraft.sounds.SoundSource): com.chattriggers.ctjs.api.client.Sound$Category; - from(value: any): com.chattriggers.ctjs.api.client.Sound$Category; - new(): unknown; - } - interface Sound$Category$Companion { - fromMC(mcValue: net.minecraft.sounds.SoundSource): com.chattriggers.ctjs.api.client.Sound$Category; - from(value: any): com.chattriggers.ctjs.api.client.Sound$Category; - new(): unknown; - } - const Sound$AttenuationType: { - NONE: com.chattriggers.ctjs.api.client.Sound$AttenuationType; - LINEAR: com.chattriggers.ctjs.api.client.Sound$AttenuationType; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.client.Sound$AttenuationType; - } - interface Sound$AttenuationType extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { - } - const Sound$AttenuationType$Companion: { - fromMC(mcValue: net.minecraft.client.resources.sounds.SoundInstance$Attenuation): com.chattriggers.ctjs.api.client.Sound$AttenuationType; - from(value: any): com.chattriggers.ctjs.api.client.Sound$AttenuationType; - new(): unknown; - } - interface Sound$AttenuationType$Companion { - fromMC(mcValue: net.minecraft.client.resources.sounds.SoundInstance$Attenuation): com.chattriggers.ctjs.api.client.Sound$AttenuationType; - from(value: any): com.chattriggers.ctjs.api.client.Sound$AttenuationType; - new(): unknown; - } - const Player: { - ArmorWrapper: typeof com.chattriggers.ctjs.api.client.Player$ArmorWrapper; - armor: com.chattriggers.ctjs.api.client.Player$ArmorWrapper; - toMC(): net.minecraft.client.player.LocalPlayer | null | undefined; - /** - * Gets Minecraft's EntityPlayerSP object representing the user - * - * @return The Minecraft EntityPlayerSP object representing the user - */ - getPlayer(): net.minecraft.client.player.LocalPlayer | null | undefined; - getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; - asPlayerMP(): com.chattriggers.ctjs.api.entity.PlayerMP | null | undefined; - getX(): number; - getY(): number; - getZ(): number; - getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; - getRotation(): net.minecraft.world.phys.Vec2; - getLastX(): number; - getLastY(): number; - getLastZ(): number; - getRenderX(): number; - getRenderY(): number; - getRenderZ(): number; - /** - * Gets the player's x motion. - * This is the amount the player will move in the x direction next tick. - * - * @return the player's x motion - */ - getMotionX(): number; - /** - * Gets the player's y motion. - * This is the amount the player will move in the y direction next tick. - * - * @return the player's y motion - */ - getMotionY(): number; - /** - * Gets the player's z motion. - * This is the amount the player will move in the z direction next tick. - * - * @return the player's z motion - */ - getMotionZ(): number; - /** - * Gets the player's camera pitch. - * - * @return the player's camera pitch - */ - getPitch(): number; - /** - * Gets the player's camera yaw. - * - * @return the player's camera yaw - */ - getYaw(): number; - /** - * Gets the player's username. - * - * @return the player's username - */ - getName(): string; - /** - * Gets the Java UUID object of the player. - * Use of [UUID.toString] in conjunction is recommended. - * - * @return the player's uuid - */ - getUUID(): java.util.UUID; - getHP(): number; - /** - * Gets the player's air level. - * - * The returned value will be an integer. If the player is not taking damage, it - * will be between 300 (not in water) and 0. If the player is taking damage, it - * will be between -20 and 0, getting reset to 0 every time the player takes damage. - * - * @return the player's air level - */ - getAirLevel(): number; - getXPLevel(): number; - isMoving(): boolean; - isSneaking(): boolean; - isSprinting(): boolean; - /** - * Checks if player can be pushed by water. - * - * @return true if the player is flying, false otherwise - */ - isFlying(): boolean; - isSleeping(): boolean; - /** - * Gets the direction the player is facing. - * Example: "South West" - * - * @return The direction the player is facing, one of the four cardinal directions - */ - facing(): string; - /** - * Gets the current active potion effects. Returns an empty list - * if the player has no active potion effects. - * - * @return a list of the active [PotionEffect]s - */ - getActivePotionEffects(): Array; - /** - * Gets the current object that the player is looking at, - * whether that be a block or an entity. Returns null when not looking - * at anything. - * - * @return the [Block] or [Entity] being looked at, or null if air - */ - lookingAt(): any | null | undefined; - /** - * Gets the current item in the player's hand. - * - * @param hand the hand of the item - * @return the current held [Item] - */ - getHeldItem(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - /** - * Gets the current item in the player's hand. - * - * @param hand the hand of the item - * @return the current held [Item] - */ - getHeldItem(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - /** - * Sets the current held item based on the provided index. - * - * @param index the new held item index - */ - setHeldItemIndex(index: number): void; - /** - * Gets the current index of the held item. - * - * @return the current index - */ - getHeldItemIndex(): number; - /** - * Gets the inventory of the player, i.e. the inventory accessed by 'e'. - * - * @return the player's inventory - */ - getInventory(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; - /** - * Gets the display name for the player, - * i.e. the name shown in tab list and in the player's nametag. - * @return the display name - */ - getDisplayName(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sets the name for this player shown in tab list - * - * @param textComponent the new name to display - */ - setTabDisplayName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Sets the name for this player shown above their head, - * in their name tag - * - * @param textComponent the new name to display - */ - setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Gets the container the user currently has open, i.e. a chest. - * - * @return the currently opened container - */ - getContainer(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; - /** - * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] - * minus `player`. - * - * @see Renderer.drawPlayer - */ - draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Player; - new(): com.chattriggers.ctjs.api.client.Player; - } - interface Player { - armor: com.chattriggers.ctjs.api.client.Player$ArmorWrapper; - toMC(): net.minecraft.client.player.LocalPlayer | null | undefined; - /** - * Gets Minecraft's EntityPlayerSP object representing the user - * - * @return The Minecraft EntityPlayerSP object representing the user - */ - getPlayer(): net.minecraft.client.player.LocalPlayer | null | undefined; - getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; - asPlayerMP(): com.chattriggers.ctjs.api.entity.PlayerMP | null | undefined; - getX(): number; - getY(): number; - getZ(): number; - getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; - getRotation(): net.minecraft.world.phys.Vec2; - getLastX(): number; - getLastY(): number; - getLastZ(): number; - getRenderX(): number; - getRenderY(): number; - getRenderZ(): number; - /** - * Gets the player's x motion. - * This is the amount the player will move in the x direction next tick. - * - * @return the player's x motion - */ - getMotionX(): number; - /** - * Gets the player's y motion. - * This is the amount the player will move in the y direction next tick. - * - * @return the player's y motion - */ - getMotionY(): number; - /** - * Gets the player's z motion. - * This is the amount the player will move in the z direction next tick. - * - * @return the player's z motion - */ - getMotionZ(): number; - /** - * Gets the player's camera pitch. - * - * @return the player's camera pitch - */ - getPitch(): number; - /** - * Gets the player's camera yaw. - * - * @return the player's camera yaw - */ - getYaw(): number; - /** - * Gets the player's username. - * - * @return the player's username - */ - getName(): string; - /** - * Gets the Java UUID object of the player. - * Use of [UUID.toString] in conjunction is recommended. - * - * @return the player's uuid - */ - getUUID(): java.util.UUID; - getHP(): number; - /** - * Gets the player's air level. - * - * The returned value will be an integer. If the player is not taking damage, it - * will be between 300 (not in water) and 0. If the player is taking damage, it - * will be between -20 and 0, getting reset to 0 every time the player takes damage. - * - * @return the player's air level - */ - getAirLevel(): number; - getXPLevel(): number; - isMoving(): boolean; - isSneaking(): boolean; - isSprinting(): boolean; - /** - * Checks if player can be pushed by water. - * - * @return true if the player is flying, false otherwise - */ - isFlying(): boolean; - isSleeping(): boolean; - /** - * Gets the direction the player is facing. - * Example: "South West" - * - * @return The direction the player is facing, one of the four cardinal directions - */ - facing(): string; - /** - * Gets the current active potion effects. Returns an empty list - * if the player has no active potion effects. - * - * @return a list of the active [PotionEffect]s - */ - getActivePotionEffects(): Array; - /** - * Gets the current object that the player is looking at, - * whether that be a block or an entity. Returns null when not looking - * at anything. - * - * @return the [Block] or [Entity] being looked at, or null if air - */ - lookingAt(): any | null | undefined; - /** - * Gets the current item in the player's hand. - * - * @param hand the hand of the item - * @return the current held [Item] - */ - getHeldItem(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - /** - * Gets the current item in the player's hand. - * - * @param hand the hand of the item - * @return the current held [Item] - */ - getHeldItem(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - /** - * Sets the current held item based on the provided index. - * - * @param index the new held item index - */ - setHeldItemIndex(index: number): void; - /** - * Gets the current index of the held item. - * - * @return the current index - */ - getHeldItemIndex(): number; - /** - * Gets the inventory of the player, i.e. the inventory accessed by 'e'. - * - * @return the player's inventory - */ - getInventory(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; - /** - * Gets the display name for the player, - * i.e. the name shown in tab list and in the player's nametag. - * @return the display name - */ - getDisplayName(): com.chattriggers.ctjs.api.message.TextComponent; - /** - * Sets the name for this player shown in tab list - * - * @param textComponent the new name to display - */ - setTabDisplayName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Sets the name for this player shown above their head, - * in their name tag - * - * @param textComponent the new name to display - */ - setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; - /** - * Gets the container the user currently has open, i.e. a chest. - * - * @return the currently opened container - */ - getContainer(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; - /** - * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] - * minus `player`. - * - * @see Renderer.drawPlayer - */ - draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Player; - new(): com.chattriggers.ctjs.api.client.Player; - } - const Player$ArmorWrapper: { - new(): com.chattriggers.ctjs.api.client.Player$ArmorWrapper; - } - interface Player$ArmorWrapper { - /** - * @return the [Item] in the player's helmet slot or null if the slot is empty - */ - getHelmet(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - /** - * @return the [Item] in the player's chestplate slot or null if the slot is empty - */ - getChestplate(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - /** - * @return the [Item] in the player's leggings slot or null if the slot is empty - */ - getLeggings(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - /** - * @return the [Item] in the player's boots slot or null if the slot is empty - */ - getBoots(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; - } - const ScreenHelper: { - MenuButton: typeof com.chattriggers.ctjs.api.client.ScreenHelper$MenuButton; - titleFont: com.chattriggers.ctjs.api.render.Font; - smallerFont: com.chattriggers.ctjs.api.render.Font; - drawMenuButton(label: string, x: number, y: number, width: number, height: number, hovered: boolean, textColorOverride: number | null | undefined): void; - argb(a: number, r: number, g: number, b: number): number; - new(): com.chattriggers.ctjs.api.client.ScreenHelper; - } - interface ScreenHelper { - titleFont: com.chattriggers.ctjs.api.render.Font; - smallerFont: com.chattriggers.ctjs.api.render.Font; - drawMenuButton(label: string, x: number, y: number, width: number, height: number, hovered: boolean, textColorOverride: number | null | undefined): void; - argb(a: number, r: number, g: number, b: number): number; - new(): com.chattriggers.ctjs.api.client.ScreenHelper; - } - const ScreenHelper$MenuButton: { - new(label: string, x: number, y: number, width: number, height: number, onClick: kotlin.Function0): com.chattriggers.ctjs.api.client.ScreenHelper$MenuButton; - } - interface ScreenHelper$MenuButton { - getLabel(): string; - getX(): number; - getY(): number; - getWidth(): number; - getHeight(): number; - getOnClick(): kotlin.Function0; - isHovered(mouseX: number, mouseY: number): boolean; - component1(): string; - component2(): number; - component3(): number; - component4(): number; - component5(): number; - component6(): kotlin.Function0; - copy(label: string, x: number, y: number, width: number, height: number, onClick: kotlin.Function0): com.chattriggers.ctjs.api.client.ScreenHelper$MenuButton; - } - const KeyBind: { - /** - * Creates a new keybind, editable in the user's controls. - * - * @param description what the keybind does - * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A - * @param category the keybind category the keybind will be in - * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) - */ - new(description: string, keyCode: number): com.chattriggers.ctjs.api.client.KeyBind; - /** - * Creates a new keybind, editable in the user's controls. - * - * @param description what the keybind does - * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A - * @param category the keybind category the keybind will be in - * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) - */ - new(description: string, keyCode: number, category: string): com.chattriggers.ctjs.api.client.KeyBind; - new(keyBinding: net.minecraft.client.KeyMapping): com.chattriggers.ctjs.api.client.KeyBind; - } - interface KeyBind { - registerKeyPress(method: any): com.chattriggers.ctjs.api.client.KeyBind; - registerKeyRelease(method: any): com.chattriggers.ctjs.api.client.KeyBind; - registerKeyDown(method: any): com.chattriggers.ctjs.api.client.KeyBind; - unregisterKeyPress(): com.chattriggers.ctjs.api.client.KeyBind; - unregisterKeyRelease(): com.chattriggers.ctjs.api.client.KeyBind; - unregisterKeyDown(): com.chattriggers.ctjs.api.client.KeyBind; - /** - * Returns true if the key is pressed (used for continuous querying). - * - * @return whether the key is pressed - */ - isKeyDown(): boolean; - /** - * Returns true on the initial key press. For continuous querying use [isKeyDown]. - * - * @return whether the key has just been pressed - */ - isPressed(): boolean; - /** - * Gets the description of the key. - * - * @return the description - */ - getDescription(): string; - /** - * Gets the key code of the key. - * - * @return the integer key code - */ - getKeyCode(): number; - /** - * Gets the category of the key. - * - * @return the category - */ - getCategory(): string; - /** - * Sets the state of the key. - * - * @param pressed True to press, False to release - */ - setState(pressed: boolean): void; - } - const KeyBind$Companion: { - new(): com.chattriggers.ctjs.api.client.KeyBind$Companion; - } - interface KeyBind$Companion { - new(): com.chattriggers.ctjs.api.client.KeyBind$Companion; - } - const ProxyInfo: { - getProxies(): Array; - addProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; - removeProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; - updateProxy(original: com.chattriggers.ctjs.api.client.Proxy, newProxy: com.chattriggers.ctjs.api.client.Proxy): void; - setProxyEnabled(proxy: com.chattriggers.ctjs.api.client.Proxy, enabled: boolean): void; - getEnabledProxies(): Array; - new(): com.chattriggers.ctjs.api.client.ProxyInfo; - } - interface ProxyInfo { - getProxies(): Array; - addProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; - removeProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; - updateProxy(original: com.chattriggers.ctjs.api.client.Proxy, newProxy: com.chattriggers.ctjs.api.client.Proxy): void; - setProxyEnabled(proxy: com.chattriggers.ctjs.api.client.Proxy, enabled: boolean): void; - getEnabledProxies(): Array; - new(): com.chattriggers.ctjs.api.client.ProxyInfo; - } - const ProxyManagerScreen: { - new(parent: net.minecraft.client.gui.screens.Screen): com.chattriggers.ctjs.api.client.ProxyManagerScreen; - } - interface ProxyManagerScreen extends net.minecraft.client.gui.screens.Screen { - refreshList(): void; - } - const ProxyEditScreen: { - new(parent: com.chattriggers.ctjs.api.client.ProxyManagerScreen, existingProxy: com.chattriggers.ctjs.api.client.Proxy | null | undefined): com.chattriggers.ctjs.api.client.ProxyEditScreen; - } - interface ProxyEditScreen extends net.minecraft.client.gui.screens.Screen { - } - const MathLib: { - /** - * Maps a number from one range to another. - * - * @param number the number to map - * @param in_min the original range min - * @param in_max the original range max - * @param out_min the final range min - * @param out_max the final range max - * @return the re-mapped number - */ - map(number: number, in_min: number, in_max: number, out_min: number, out_max: number): number; - /** - * Clamps a floating number between two values. - * - * @param number the number to clamp - * @param min the minimum - * @param max the maximum - * @return the clamped number - */ - clampFloat(number: number, min: number, max: number): number; - /** - * Clamps an integer number between two values. - * - * @param number the number to clamp - * @param min the minimum - * @param max the maximum - * @return the clamped number - */ - clamp(number: number, min: number, max: number): number; - new(): com.chattriggers.ctjs.api.client.MathLib; - } - interface MathLib { - /** - * Maps a number from one range to another. - * - * @param number the number to map - * @param in_min the original range min - * @param in_max the original range max - * @param out_min the final range min - * @param out_max the final range max - * @return the re-mapped number - */ - map(number: number, in_min: number, in_max: number, out_min: number, out_max: number): number; - /** - * Clamps a floating number between two values. - * - * @param number the number to clamp - * @param min the minimum - * @param max the maximum - * @return the clamped number - */ - clampFloat(number: number, min: number, max: number): number; - /** - * Clamps an integer number between two values. - * - * @param number the number to clamp - * @param min the minimum - * @param max the maximum - * @return the clamped number - */ - clamp(number: number, min: number, max: number): number; - new(): com.chattriggers.ctjs.api.client.MathLib; - } - const FileLib: { - /** - * Writes a file to folder in modules. - * - * @param importName name of the import - * @param fileName name of the file - * @param toWrite string to write in file - * @param recursive whether to create folders to the file location if they don't exist - */ - write(importName: string, fileName: string, toWrite: string): void; - /** - * Writes a file to folder in modules. - * - * @param importName name of the import - * @param fileName name of the file - * @param toWrite string to write in file - * @param recursive whether to create folders to the file location if they don't exist - */ - write(importName: string, fileName: string, toWrite: string, recursive: boolean): void; - /** - * Writes a file to anywhere on the system. - * Use "./" for the ".minecraft" folder. - * - * @param fileLocation the location and file name - * @param toWrite string to write in file - * @param recursive whether to create folders to the file location if they don't exist - */ - write(fileLocation: string, toWrite: string): void; - /** - * Writes a file to anywhere on the system. - * Use "./" for the ".minecraft" folder. - * - * @param fileLocation the location and file name - * @param toWrite string to write in file - * @param recursive whether to create folders to the file location if they don't exist - */ - write(fileLocation: string, toWrite: string, recursive: boolean): void; - /** - * Writes a file to folder in modules. - * - * @param importName name of the import - * @param fileName name of the file - * @param toAppend string to append in file - */ - append(importName: string, fileName: string, toAppend: string): void; - /** - * Writes a file to anywhere on the system. - * Use "./" for the ".minecraft" folder. - * - * @param fileLocation the location and file name - * @param toAppend string to append in file - */ - append(fileLocation: string, toAppend: string): void; - /** - * Reads a file from folder in modules. - * Returns null if file is not found. - * - * @param importName name of the import - * @param fileName name of the file - * @return the string in the file, or null if not found - */ - read(importName: string, fileName: string): string | null | undefined; - /** - * Reads a file from anywhere on the system. - * Use "./" for the ".minecraft" folder. - * Returns null if file is not found. - * - * @param fileLocation the location and file name - * @return the string in the file, or null if not found - */ - read(fileLocation: string): string | null | undefined; - /** - * Reads a file from anywhere on the system using java.io.File. - * - * @param file the java.io.File to read - * @return the string in the file, or null if not found - */ - read(file: java.io.File): string | null | undefined; - /** - * Determines if a file or directory exists at the specified location - * - * @param importName name of the import - * @param fileName name of the file - * @return if the file exists - */ - exists(importName: string, fileName: string): boolean; - /** - * Determines if a file or directory exists at the specified location - * - * @param fileLocation the path of the file - * @return if the file exists - */ - exists(fileLocation: string): boolean; - /** - * Determines if a file or directory exists at the specified location - * - * @param importName name of the import - * @param fileName name of the file - * @return if the location is a directory - */ - isDirectory(importName: string, fileName: string): boolean; - /** - * Determines if a file or directory exists at the specified location - * - * @param fileLocation the path of the file - * @return if the location is a directory - */ - isDirectory(fileLocation: string): boolean; - /** - * Gets the contents of a url as a string. - * - * @param theUrl the url to get the data from - * @param userAgent the user agent to use in the connection - * @return the string stored in the url content - */ - getUrlContent(theUrl: string): string; - /** - * Gets the contents of a url as a string. - * - * @param theUrl the url to get the data from - * @param userAgent the user agent to use in the connection - * @return the string stored in the url content - */ - getUrlContent(theUrl: string, userAgent: string | null | undefined): string; - /** - * Deletes a directory at the specified location - * - * @param dir the directory to delete - * @return if the directory was deleted - */ - deleteDirectory(dir: string): boolean; - /** - * Deletes a directory at the specified location - * - * @param dir the directory to delete - * @return if the directory was deleted - */ - deleteDirectory(dir: java.io.File): boolean; - /** - * Extracts a zip file specified by the zipFilePath to a directory specified by - * destDirectory (will be created if does not exist). - * @param zipFilePath the zip file path - * @param destDirectory the destination directory - * @throws IOException IOException - */ - unzip(zipFilePath: string, destDirectory: string): void; - /** - * Encodes a string to a base64 string - * - * @param toEncode string to encode - * @return base64 encoded string - */ - encodeBase64(toEncode: string): string; - /** - * Decodes a base64 string to a string - * - * @param toDecode base64 encoded string to decode - * @return decoded string - */ - decodeBase64(toDecode: string): string; - /** - * Opens a url in the default browser - * - * @param url the url to open - */ - open(url: string): void; - /** - * Opens a path in the file explorer - * - * @param path the path to open - */ - open(path: java.io.File): void; - new(): com.chattriggers.ctjs.api.client.FileLib; - } - interface FileLib { - /** - * Writes a file to folder in modules. - * - * @param importName name of the import - * @param fileName name of the file - * @param toWrite string to write in file - * @param recursive whether to create folders to the file location if they don't exist - */ - write(importName: string, fileName: string, toWrite: string): void; - /** - * Writes a file to folder in modules. - * - * @param importName name of the import - * @param fileName name of the file - * @param toWrite string to write in file - * @param recursive whether to create folders to the file location if they don't exist - */ - write(importName: string, fileName: string, toWrite: string, recursive: boolean): void; - /** - * Writes a file to anywhere on the system. - * Use "./" for the ".minecraft" folder. - * - * @param fileLocation the location and file name - * @param toWrite string to write in file - * @param recursive whether to create folders to the file location if they don't exist - */ - write(fileLocation: string, toWrite: string): void; - /** - * Writes a file to anywhere on the system. - * Use "./" for the ".minecraft" folder. - * - * @param fileLocation the location and file name - * @param toWrite string to write in file - * @param recursive whether to create folders to the file location if they don't exist - */ - write(fileLocation: string, toWrite: string, recursive: boolean): void; - /** - * Writes a file to folder in modules. - * - * @param importName name of the import - * @param fileName name of the file - * @param toAppend string to append in file - */ - append(importName: string, fileName: string, toAppend: string): void; - /** - * Writes a file to anywhere on the system. - * Use "./" for the ".minecraft" folder. - * - * @param fileLocation the location and file name - * @param toAppend string to append in file - */ - append(fileLocation: string, toAppend: string): void; - /** - * Reads a file from folder in modules. - * Returns null if file is not found. - * - * @param importName name of the import - * @param fileName name of the file - * @return the string in the file, or null if not found - */ - read(importName: string, fileName: string): string | null | undefined; - /** - * Reads a file from anywhere on the system. - * Use "./" for the ".minecraft" folder. - * Returns null if file is not found. - * - * @param fileLocation the location and file name - * @return the string in the file, or null if not found - */ - read(fileLocation: string): string | null | undefined; - /** - * Reads a file from anywhere on the system using java.io.File. - * - * @param file the java.io.File to read - * @return the string in the file, or null if not found - */ - read(file: java.io.File): string | null | undefined; - /** - * Determines if a file or directory exists at the specified location - * - * @param importName name of the import - * @param fileName name of the file - * @return if the file exists - */ - exists(importName: string, fileName: string): boolean; - /** - * Determines if a file or directory exists at the specified location - * - * @param fileLocation the path of the file - * @return if the file exists - */ - exists(fileLocation: string): boolean; - /** - * Determines if a file or directory exists at the specified location - * - * @param importName name of the import - * @param fileName name of the file - * @return if the location is a directory - */ - isDirectory(importName: string, fileName: string): boolean; - /** - * Determines if a file or directory exists at the specified location - * - * @param fileLocation the path of the file - * @return if the location is a directory - */ - isDirectory(fileLocation: string): boolean; - /** - * Gets the contents of a url as a string. - * - * @param theUrl the url to get the data from - * @param userAgent the user agent to use in the connection - * @return the string stored in the url content - */ - getUrlContent(theUrl: string): string; - /** - * Gets the contents of a url as a string. - * - * @param theUrl the url to get the data from - * @param userAgent the user agent to use in the connection - * @return the string stored in the url content - */ - getUrlContent(theUrl: string, userAgent: string | null | undefined): string; - /** - * Deletes a directory at the specified location - * - * @param dir the directory to delete - * @return if the directory was deleted - */ - deleteDirectory(dir: string): boolean; - /** - * Deletes a directory at the specified location - * - * @param dir the directory to delete - * @return if the directory was deleted - */ - deleteDirectory(dir: java.io.File): boolean; - /** - * Extracts a zip file specified by the zipFilePath to a directory specified by - * destDirectory (will be created if does not exist). - * @param zipFilePath the zip file path - * @param destDirectory the destination directory - * @throws IOException IOException - */ - unzip(zipFilePath: string, destDirectory: string): void; - /** - * Encodes a string to a base64 string - * - * @param toEncode string to encode - * @return base64 encoded string - */ - encodeBase64(toEncode: string): string; - /** - * Decodes a base64 string to a string - * - * @param toDecode base64 encoded string to decode - * @return decoded string - */ - decodeBase64(toDecode: string): string; - /** - * Opens a url in the default browser - * - * @param url the url to open - */ - open(url: string): void; - /** - * Opens a path in the file explorer - * - * @param path the path to open - */ - open(path: java.io.File): void; - new(): com.chattriggers.ctjs.api.client.FileLib; - } - const Client: { - CurrentGuiWrapper: typeof com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; - CameraWrapper: typeof com.chattriggers.ctjs.api.client.Client$CameraWrapper; - currentGui: com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; - camera: com.chattriggers.ctjs.api.client.Client$CameraWrapper; - /** - * Gets Minecraft's Minecraft object - * - * @return The Minecraft object - */ - getMinecraft(): net.minecraft.client.Minecraft; - /** - * Gets Minecraft's NetHandlerPlayClient object - * - * @return The NetHandlerPlayClient object - */ - getConnection(): net.minecraft.client.multiplayer.ClientPacketListener | null | undefined; - /** - * Schedule's a task to run on Minecraft's main thread in [delay] ticks. - * Defaults to the next tick. - * @param delay The delay in ticks - * @param callback The task to run on the main thread - */ - scheduleTask(callback: kotlin.Function0): void; - /** - * Schedule's a task to run on Minecraft's main thread in [delay] ticks. - * Defaults to the next tick. - * @param delay The delay in ticks - * @param callback The task to run on the main thread - */ - scheduleTask(delay: number, callback: kotlin.Function0): void; - /** - * Quits the client back to the main menu. - * This acts just like clicking the "Disconnect" or "Save and quit to title" button. - */ - disconnect(): void; - /** - * Connects to the server with the given ip. - * @param ip The ip to connect to - */ - connect(ip: string): void; - /** - * Connects to the server with the given ip. - * @param ip The ip to connect to - */ - connect(ip: string, port: number): void; - /** - * Gets the Minecraft ChatHud object for the chat gui - * - * @return The GuiNewChat object for the chat gui - */ - getChatGui(): net.minecraft.client.gui.components.ChatComponent | null | undefined; - isInChat(): boolean; - getTabGui(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; - isInTab(): boolean; - /** - * Gets whether the Minecraft window is active - * and in the foreground of the user's screen. - * - * @return true if the game is active, false otherwise - */ - isTabbedIn(): boolean; - isControlDown(): boolean; - isShiftDown(): boolean; - isAltDown(): boolean; - getFPS(): number; - getVersion(): string; - getSystemTime(): number; - getMouseX(): number; - getMouseY(): number; - isInGui(): boolean; - /** - * Gets the chat message currently typed into the chat gui. - * - * @return A blank string if the gui isn't open, otherwise, the message - */ - getCurrentChatMessage(): string; - /** - * Sets the current chat message, if the chat gui is not open, one will be opened. - * - * @param message the message to put in the chat text box. - */ - setCurrentChatMessage(message: string): void; - setSignLine(line: number, text: string): void; - resumeHeldKeys(): void; - releaseHeldKey(input: com.mojang.blaze3d.platform.InputConstants$Key): void; - leftClick(): void; - rightClick(): void; - setKey(key: string): boolean; - setKey(key: string, pressed: boolean): boolean; - isKeyDown(key: string): boolean; - stopMovement(): void; - unpressKeys(): void; - sendPacket(packet: net.minecraft.network.protocol.Packet): void; - sendSequencedPacket(packetFactory: kotlin.Function1>): void; - /** - * Display a title. - * - * @param title title text - * @param subtitle subtitle text - * @param fadeIn time to fade in - * @param time time to stay on screen - * @param fadeOut time to fade out - */ - showTitle(title: string | null | undefined, subtitle: string | null | undefined, fadeIn: number, time: number, fadeOut: number): void; - /** - * Copies a string to the clipboard - * - * @param text The text to copy - */ - copy(): void; - /** - * Copies a string to the clipboard - * - * @param text The text to copy - */ - copy(text: string): void; - /** - * Get the string currently on the clipboard - */ - paste(): string; - /** - * Get the [KeyBinding] from an already existing Minecraft KeyBinding, otherwise, returns null. - * - * @param keyCode the keycode to search for, see Keyboard below. Ex. Keyboard.KEY_A - * @return the [KeyBinding] from a Minecraft KeyBinding, or null if one doesn't exist - * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) - */ - getKeyBindFromKey(keyCode: number): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; - /** - * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. - * - * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A - * @param description the description of the keybind - * @param category the keybind category the keybind will be in - * @return the [KeyBinding] from a Minecraft KeyBinding, or a new one if one doesn't exist - * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) - */ - getKeyBindFromKey(keyCode: number, description: string): com.chattriggers.ctjs.api.client.KeyBind; - /** - * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. - * - * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A - * @param description the description of the keybind - * @param category the keybind category the keybind will be in - * @return the [KeyBinding] from a Minecraft KeyBinding, or a new one if one doesn't exist - * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) - */ - getKeyBindFromKey(keyCode: number, description: string, category: string): com.chattriggers.ctjs.api.client.KeyBind; - /** - * Get the [KeyBinding] from an already existing - * Minecraft KeyBinding, otherwise, returns null. - * - * @param description the description of the keybind - * @return the [KeyBinding], or null if one doesn't exist - */ - getKeyBindFromDescription(description: string): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; - new(): com.chattriggers.ctjs.api.client.Client; - } - interface Client { - currentGui: com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; - camera: com.chattriggers.ctjs.api.client.Client$CameraWrapper; - /** - * Gets Minecraft's Minecraft object - * - * @return The Minecraft object - */ - getMinecraft(): net.minecraft.client.Minecraft; - /** - * Gets Minecraft's NetHandlerPlayClient object - * - * @return The NetHandlerPlayClient object - */ - getConnection(): net.minecraft.client.multiplayer.ClientPacketListener | null | undefined; - /** - * Schedule's a task to run on Minecraft's main thread in [delay] ticks. - * Defaults to the next tick. - * @param delay The delay in ticks - * @param callback The task to run on the main thread - */ - scheduleTask(callback: kotlin.Function0): void; - /** - * Schedule's a task to run on Minecraft's main thread in [delay] ticks. - * Defaults to the next tick. - * @param delay The delay in ticks - * @param callback The task to run on the main thread - */ - scheduleTask(delay: number, callback: kotlin.Function0): void; - /** - * Quits the client back to the main menu. - * This acts just like clicking the "Disconnect" or "Save and quit to title" button. - */ - disconnect(): void; - /** - * Connects to the server with the given ip. - * @param ip The ip to connect to - */ - connect(ip: string): void; - /** - * Connects to the server with the given ip. - * @param ip The ip to connect to - */ - connect(ip: string, port: number): void; - /** - * Gets the Minecraft ChatHud object for the chat gui - * - * @return The GuiNewChat object for the chat gui - */ - getChatGui(): net.minecraft.client.gui.components.ChatComponent | null | undefined; - isInChat(): boolean; - getTabGui(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; - isInTab(): boolean; - /** - * Gets whether the Minecraft window is active - * and in the foreground of the user's screen. - * - * @return true if the game is active, false otherwise - */ - isTabbedIn(): boolean; - isControlDown(): boolean; - isShiftDown(): boolean; - isAltDown(): boolean; - getFPS(): number; - getVersion(): string; - getSystemTime(): number; - getMouseX(): number; - getMouseY(): number; - isInGui(): boolean; - /** - * Gets the chat message currently typed into the chat gui. - * - * @return A blank string if the gui isn't open, otherwise, the message - */ - getCurrentChatMessage(): string; - /** - * Sets the current chat message, if the chat gui is not open, one will be opened. - * - * @param message the message to put in the chat text box. - */ - setCurrentChatMessage(message: string): void; - setSignLine(line: number, text: string): void; - resumeHeldKeys(): void; - releaseHeldKey(input: com.mojang.blaze3d.platform.InputConstants$Key): void; - leftClick(): void; - rightClick(): void; - setKey(key: string): boolean; - setKey(key: string, pressed: boolean): boolean; - isKeyDown(key: string): boolean; - stopMovement(): void; - unpressKeys(): void; - sendPacket(packet: net.minecraft.network.protocol.Packet): void; - sendSequencedPacket(packetFactory: kotlin.Function1>): void; - /** - * Display a title. - * - * @param title title text - * @param subtitle subtitle text - * @param fadeIn time to fade in - * @param time time to stay on screen - * @param fadeOut time to fade out - */ - showTitle(title: string | null | undefined, subtitle: string | null | undefined, fadeIn: number, time: number, fadeOut: number): void; - /** - * Copies a string to the clipboard - * - * @param text The text to copy - */ - copy(): void; - /** - * Copies a string to the clipboard - * - * @param text The text to copy - */ - copy(text: string): void; - /** - * Get the string currently on the clipboard - */ - paste(): string; - /** - * Get the [KeyBinding] from an already existing Minecraft KeyBinding, otherwise, returns null. - * - * @param keyCode the keycode to search for, see Keyboard below. Ex. Keyboard.KEY_A - * @return the [KeyBinding] from a Minecraft KeyBinding, or null if one doesn't exist - * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) - */ - getKeyBindFromKey(keyCode: number): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; - /** - * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. - * - * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A - * @param description the description of the keybind - * @param category the keybind category the keybind will be in - * @return the [KeyBinding] from a Minecraft KeyBinding, or a new one if one doesn't exist - * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) - */ - getKeyBindFromKey(keyCode: number, description: string): com.chattriggers.ctjs.api.client.KeyBind; - /** - * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. - * - * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A - * @param description the description of the keybind - * @param category the keybind category the keybind will be in - * @return the [KeyBinding] from a Minecraft KeyBinding, or a new one if one doesn't exist - * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) - */ - getKeyBindFromKey(keyCode: number, description: string, category: string): com.chattriggers.ctjs.api.client.KeyBind; - /** - * Get the [KeyBinding] from an already existing - * Minecraft KeyBinding, otherwise, returns null. - * - * @param description the description of the keybind - * @return the [KeyBinding], or null if one doesn't exist - */ - getKeyBindFromDescription(description: string): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; - new(): com.chattriggers.ctjs.api.client.Client; - } - const Client$CurrentGuiWrapper: { - new(): com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; - } - interface Client$CurrentGuiWrapper { - /** - * Gets the Java class name of the currently open gui, for example, "GuiChest" - * - * @return the class name of the current gui - */ - getClassName(): string; - /** - * Gets the Minecraft gui class that is currently open - * - * @return the Minecraft gui - */ - get(): net.minecraft.client.gui.screens.Screen | null | undefined; - set(screen: net.minecraft.client.gui.screens.Screen | null | undefined): void; - /** - * Gets the slot under the mouse in the current gui, if one exists. - * - * @return the [Slot] under the mouse - */ - getSlotUnderMouse(): com.chattriggers.ctjs.api.inventory.Slot | null | undefined; - /** - * Closes the currently open gui - */ - close(): void; - } - const Client$CameraWrapper: { - new(): com.chattriggers.ctjs.api.client.Client$CameraWrapper; - } - interface Client$CameraWrapper { - getX(): number; - getY(): number; - getZ(): number; - } - const WelcomeScreen: { - new(): com.chattriggers.ctjs.api.client.WelcomeScreen; - } - interface WelcomeScreen extends net.minecraft.client.gui.screens.Screen { - } - const WelcomeScreen$Companion: { - open(): void; - new(): com.chattriggers.ctjs.api.client.WelcomeScreen$Companion; - } - interface WelcomeScreen$Companion { - open(): void; - new(): com.chattriggers.ctjs.api.client.WelcomeScreen$Companion; - } - } - namespace render { - const Font: { - new(name: string, resourcePath: string): com.chattriggers.ctjs.api.render.Font; - new(name: string, inputStream: java.io.InputStream): com.chattriggers.ctjs.api.render.Font; - } - interface Font { - getName(): string; - buffer(): java.nio.ByteBuffer; - } - const LegacyPipelineBuilder: { - new(): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - } - interface LegacyPipelineBuilder { - new(): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat, snippet: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - enableBlend(): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - disableBlend(): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - enableCull(): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - disableCull(): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - enableDepth(): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - disableDepth(): com.chattriggers.ctjs.api.render.LegacyPipelineBuilder; - build(): com.mojang.blaze3d.pipeline.RenderPipeline; - layer(): net.minecraft.client.renderer.rendertype.RenderType; - state(): string; - } - const Renderer$DrawMode: { - LINES: com.chattriggers.ctjs.api.render.Renderer$DrawMode; - LINE_STRIP: com.chattriggers.ctjs.api.render.Renderer$DrawMode; - TRIANGLES: com.chattriggers.ctjs.api.render.Renderer$DrawMode; - TRIANGLE_STRIP: com.chattriggers.ctjs.api.render.Renderer$DrawMode; - TRIANGLE_FAN: com.chattriggers.ctjs.api.render.Renderer$DrawMode; - QUADS: com.chattriggers.ctjs.api.render.Renderer$DrawMode; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Renderer$DrawMode; - } - interface Renderer$DrawMode extends kotlin.Enum { - toUC(): gg.essential.universal.UGraphics$DrawMode; - } - const Renderer$DrawMode$Companion: { - fromUC(ucValue: gg.essential.universal.UGraphics$DrawMode): com.chattriggers.ctjs.api.render.Renderer$DrawMode; - new(): unknown; - } - interface Renderer$DrawMode$Companion { - fromUC(ucValue: gg.essential.universal.UGraphics$DrawMode): com.chattriggers.ctjs.api.render.Renderer$DrawMode; - new(): unknown; - } - const Renderer$VertexFormat: { - LINES: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - POSITION: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - POSITION_COLOR: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - POSITION_TEXTURE: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - POSITION_TEXTURE_COLOR: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - POSITION_COLOR_TEXTURE_LIGHT: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - POSITION_TEXTURE_LIGHT_COLOR: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - POSITION_TEXTURE_COLOR_LIGHT: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - POSITION_TEXTURE_COLOR_NORMAL: com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - } - interface Renderer$VertexFormat extends kotlin.Enum { - toMC(): com.mojang.blaze3d.vertex.VertexFormat; - } - const Renderer$VertexFormat$Companion: { - fromMC(ucValue: com.mojang.blaze3d.vertex.VertexFormat): com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - new(): unknown; - } - interface Renderer$VertexFormat$Companion { - fromMC(ucValue: com.mojang.blaze3d.vertex.VertexFormat): com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - new(): unknown; - } - const Renderer$RenderSnippet: { - TERRAIN_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - ENTITY_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - RENDERTYPE_BEACON_BEAM_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - TEXT_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - RENDERTYPE_END_PORTAL_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - RENDERTYPE_CLOUDS_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - RENDERTYPE_LINES_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - POSITION_COLOR_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - PARTICLE_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - WEATHER_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - GUI_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - POSITION_TEX_COLOR_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - RENDERTYPE_OUTLINE_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - POST_EFFECT_PROCESSOR_SNIPPET: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - } - interface Renderer$RenderSnippet extends kotlin.Enum { - getMcSnippet(): com.mojang.blaze3d.pipeline.RenderPipeline$Snippet; - } - const RenderPipelines: { - LINE_LIST: com.mojang.blaze3d.pipeline.RenderPipeline; - LINE_LIST_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; - TRIANGLE_STRIP: com.mojang.blaze3d.pipeline.RenderPipeline; - TRIANGLE_STRIP_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; - new(): com.chattriggers.ctjs.api.render.RenderPipelines; - } - interface RenderPipelines { - LINE_LIST: com.mojang.blaze3d.pipeline.RenderPipeline; - LINE_LIST_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; - TRIANGLE_STRIP: com.mojang.blaze3d.pipeline.RenderPipeline; - TRIANGLE_STRIP_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; - new(): com.chattriggers.ctjs.api.render.RenderPipelines; - } - const RenderLayers: { - LINE_LIST: net.minecraft.client.renderer.rendertype.RenderType; - LINE_LIST_ESP: net.minecraft.client.renderer.rendertype.RenderType; - TRIANGLE_STRIP: net.minecraft.client.renderer.rendertype.RenderType; - TRIANGLE_STRIP_ESP: net.minecraft.client.renderer.rendertype.RenderType; - new(): com.chattriggers.ctjs.api.render.RenderLayers; - } - interface RenderLayers { - LINE_LIST: net.minecraft.client.renderer.rendertype.RenderType; - LINE_LIST_ESP: net.minecraft.client.renderer.rendertype.RenderType; - TRIANGLE_STRIP: net.minecraft.client.renderer.rendertype.RenderType; - TRIANGLE_STRIP_ESP: net.minecraft.client.renderer.rendertype.RenderType; - new(): com.chattriggers.ctjs.api.render.RenderLayers; - } - const Toast: { - new(config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.render.Toast; - } - interface Toast extends net.minecraft.client.gui.components.toasts.Toast { - getTitle(): any | null | undefined; - setTitle(value: any | null | undefined): void; - getDescription(): any | null | undefined; - setDescription(value: any | null | undefined): void; - getBackground(): any | null | undefined; - setBackground(value: any | null | undefined): void; - getIcon(): any | null | undefined; - setIcon(value: any | null | undefined): void; - getDisplayTime(): number; - setDisplayTime(value: number): void; - show(): com.chattriggers.ctjs.api.render.Toast; - } - const Display: { - Background: typeof com.chattriggers.ctjs.api.render.Display$Background; - Order: typeof com.chattriggers.ctjs.api.render.Display$Order; - new(): com.chattriggers.ctjs.api.render.Display; - new(config: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.render.Display; - } - interface Display { - getTextColor(): number; - /** - * Sets the color of the texts - * - * Overrides the color of the individual texts - */ - setTextColor(textColor: number): com.chattriggers.ctjs.api.render.Display; - getAlign(): com.chattriggers.ctjs.api.render.Text$Align; - /** - * Set the alignment of the texts in the display - * - * Overrides alignment of the individual texts - */ - setAlign(align: any): com.chattriggers.ctjs.api.render.Display; - getOrder(): com.chattriggers.ctjs.api.render.Display$Order; - setOrder(order: any): com.chattriggers.ctjs.api.render.Display; - getBackground(): com.chattriggers.ctjs.api.render.Display$Background; - setBackground(background: any): com.chattriggers.ctjs.api.render.Display; - getBackgroundColor(): number; - setBackgroundColor(backgroundColor: number): com.chattriggers.ctjs.api.render.Display; - setLine(index: number, line: any): com.chattriggers.ctjs.api.render.Display; - getLine(index: number): com.chattriggers.ctjs.api.render.Text; - getLines(): Array; - setLines(lines: Array): com.chattriggers.ctjs.api.render.Display; - addLine(line: any): com.chattriggers.ctjs.api.render.Display; - addLines(lines: any): com.chattriggers.ctjs.api.render.Display; - removeLine(index: number): com.chattriggers.ctjs.api.render.Display; - clearLines(): com.chattriggers.ctjs.api.render.Display; - getX(): number; - setX(x: number): com.chattriggers.ctjs.api.render.Display; - getY(): number; - setY(y: number): com.chattriggers.ctjs.api.render.Display; - getWidth(): number; - getHeight(): number; - getMinWidth(): number; - setMinWidth(minWidth: number): com.chattriggers.ctjs.api.render.Display; - draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor): void; - } - const Text$Align: { - LEFT: com.chattriggers.ctjs.api.render.Text$Align; - CENTER: com.chattriggers.ctjs.api.render.Text$Align; - RIGHT: com.chattriggers.ctjs.api.render.Text$Align; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Text$Align; - } - interface Text$Align extends kotlin.Enum { - } - const Display$Order: { - REVERSED: com.chattriggers.ctjs.api.render.Display$Order; - NORMAL: com.chattriggers.ctjs.api.render.Display$Order; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Order; - } - interface Display$Order extends kotlin.Enum { - } - const Display$Background: { - NONE: com.chattriggers.ctjs.api.render.Display$Background; - FULL: com.chattriggers.ctjs.api.render.Display$Background; - PER_LINE: com.chattriggers.ctjs.api.render.Display$Background; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Background; - } - interface Display$Background extends kotlin.Enum { - } - const Text: { - Align: typeof com.chattriggers.ctjs.api.render.Text$Align; - new(string: string): com.chattriggers.ctjs.api.render.Text; - new(string: string, x: number): com.chattriggers.ctjs.api.render.Text; - new(string: string, x: number, y: number): com.chattriggers.ctjs.api.render.Text; - new(string: string, config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.render.Text; - } - interface Text { - getString(): string; - setString(string: string): com.chattriggers.ctjs.api.render.Text; - getColor(): number; - setColor(color: number): com.chattriggers.ctjs.api.render.Text; - getFormatted(): boolean; - setFormatted(formatted: boolean): com.chattriggers.ctjs.api.render.Text; - getShadow(): boolean; - setShadow(shadow: boolean): com.chattriggers.ctjs.api.render.Text; - getAlign(): com.chattriggers.ctjs.api.render.Text$Align; - setAlign(align: any): com.chattriggers.ctjs.api.render.Text; - getBackground(): boolean; - /** - * Set the background - * - * true: Background is enabled - * false: Background is disabled - */ - setBackground(background: boolean): com.chattriggers.ctjs.api.render.Text; - getBackgroundColor(): number; - setBackgroundColor(backgroundColor: number): com.chattriggers.ctjs.api.render.Text; - getX(): number; - setX(x: number): com.chattriggers.ctjs.api.render.Text; - getY(): number; - setY(y: number): com.chattriggers.ctjs.api.render.Text; - /** - * Gets the width of the text - * This is automatically updated when the text is drawn. - * - * @return the width of the text - */ - getWidth(): number; - getLines(): Array; - getMaxLines(): number; - setMaxLines(maxLines: number): com.chattriggers.ctjs.api.render.Text; - getScale(): number; - setScale(scale: number): com.chattriggers.ctjs.api.render.Text; - /** - * Sets the maximum width of the text, splitting it into multiple lines if necessary. - * - * @param maxWidth the maximum width of the text - * @return the Text object for method chaining - */ - setMaxWidth(maxWidth: number): com.chattriggers.ctjs.api.render.Text; - getMaxWidth(): number; - getHeight(): number; - exceedsMaxLines(): boolean; - draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor): com.chattriggers.ctjs.api.render.Text; - draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor, x: number | null | undefined): com.chattriggers.ctjs.api.render.Text; - draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor, x: number | null | undefined, y: number | null | undefined): com.chattriggers.ctjs.api.render.Text; - } - const Renderer: { - DrawMode: typeof com.chattriggers.ctjs.api.render.Renderer$DrawMode; - VertexFormat: typeof com.chattriggers.ctjs.api.render.Renderer$VertexFormat; - RenderSnippet: typeof com.chattriggers.ctjs.api.render.Renderer$RenderSnippet; - ScreenWrapper: typeof com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; - screen: com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; - getPartialTicks(): number; - BLACK: number; - DARK_BLUE: number; - DARK_GREEN: number; - DARK_AQUA: number; - DARK_RED: number; - DARK_PURPLE: number; - GOLD: number; - GRAY: number; - DARK_GRAY: number; - BLUE: number; - GREEN: number; - AQUA: number; - RED: number; - LIGHT_PURPLE: number; - YELLOW: number; - WHITE: number; - color(color: number): number; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer] to allow for method chaining - */ - color(r: number, g: number, b: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer] to allow for method chaining - */ - color(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer] to allow for method chaining - */ - color(r: number, g: number, b: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer] to allow for method chaining - */ - color(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the color for the last defined vertex. - * - * @param color the color value, can use [getColor] to get this - * @return [Renderer] to allow for method chaining - */ - color(color: number): com.chattriggers.ctjs.api.render.Renderer; - getFontRenderer(): net.minecraft.client.gui.Font; - getRenderManager(): net.minecraft.client.renderer.LevelRenderer; - getStringWidth(text: string): number; - getColor(red: number, green: number, blue: number): number; - getColor(red: number, green: number, blue: number, alpha: number): number; - getRainbow(step: number): number; - getRainbow(step: number, speed: number): number; - getRainbowColors(step: number): Array; - getRainbowColors(step: number, speed: number): Array; - disableCull(): com.chattriggers.ctjs.api.render.Renderer; - enableCull(): com.chattriggers.ctjs.api.render.Renderer; - disableLighting(): com.chattriggers.ctjs.api.render.Renderer; - enableLighting(): com.chattriggers.ctjs.api.render.Renderer; - disableDepth(): com.chattriggers.ctjs.api.render.Renderer; - enableDepth(): com.chattriggers.ctjs.api.render.Renderer; - disableBlend(): com.chattriggers.ctjs.api.render.Renderer; - enableBlend(): com.chattriggers.ctjs.api.render.Renderer; - bindTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Renderer; - bindTexture(texture: com.chattriggers.ctjs.api.render.Image, textureIndex: number): com.chattriggers.ctjs.api.render.Renderer; - deleteTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Renderer; - pushMatrix(): com.chattriggers.ctjs.api.render.Renderer; - pushMatrix(stack: gg.essential.universal.UMatrixStack): com.chattriggers.ctjs.api.render.Renderer; - popMatrix(): com.chattriggers.ctjs.api.render.Renderer; - translate(x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - translate(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number, scaleY: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number, scaleY: number, scaleZ: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - multiply(quaternion: org.joml.Quaternionf): com.chattriggers.ctjs.api.render.Renderer; - fixAlpha(color: number): number; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - begin(): com.chattriggers.ctjs.api.render.Renderer; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode): com.chattriggers.ctjs.api.render.Renderer; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat): com.chattriggers.ctjs.api.render.Renderer; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat, snippet: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets a new vertex in the world renderer. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return [Renderer] to allow for method chaining - */ - pos(x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets a new vertex in the world renderer. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return [Renderer] to allow for method chaining - */ - pos(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the texture location on the last defined vertex. - * - * @param u the u position in the texture - * @param v the v position in the texture - * @return [Renderer] to allow for method chaining - */ - tex(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the normal of the vertex. This is mostly used with [VertexFormat.LINES] - * - * @param x the x position of the normal vector - * @param y the y position of the normal vector - * @param z the z position of the normal vector - * @return [Renderer] to allow for method chaining - */ - normal(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the overlay location on the last defined vertex. - * - * @param u the u position in the overlay - * @param v the v position in the overlay - * @return [Renderer] to allow for method chaining - */ - overlay(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the light location on the last defined vertex. - * - * @param u the u position in the light - * @param v the v position in the light - * @return [Renderer] to allow for method chaining - */ - light(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Finalizes vertices and draws the world renderer. - */ - draw(): void; - /** - * Gets a fixed render position from x, y, and z inputs adjusted with partial ticks - * @param x the X coordinate - * @param y the Y coordinate - * @param z the Z coordinate - * @return the Vec3f position to render at - */ - getRenderPos(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; - drawRect(color: number, x: number, y: number, width: number, height: number): com.chattriggers.ctjs.api.render.Renderer; - drawLine(color: number, x1: number, y1: number, x2: number, y2: number, thickness: number): void; - drawCircle(color: number, x: number, y: number, radius: number, steps: number): void; - drawString(text: string, x: number, y: number): void; - drawString(text: string, x: number, y: number, color: number): void; - drawString(text: string, x: number, y: number, color: number, shadow: boolean): void; - drawStringWithShadow(text: string, x: number, y: number): void; - drawStringWithShadow(text: string, x: number, y: number, color: number): void; - drawImage(image: com.chattriggers.ctjs.api.render.Image, x: number, y: number, width: number, height: number): void; - /** - * Draws a player entity to the screen, similar to the one displayed in the inventory screen. - * - * Takes a parameter with the following options: - * - player: The player entity to draw. Can be a [PlayerMP] or [AbstractClientPlayerEntity]. - * Defaults to Player.toMC() - * - x: The x position on the screen to render the player - * - y: The y position on the screen to render the player - * - size: The size of the rendered player - * - rotate: Whether the player should look at the mouse cursor, similar to the inventory screen - * - pitch: THe pitch the rendered player will face, if rotate is false - * - yaw: The yaw the rendered player will face, if rotate is false - * - showNametag: Whether the nametag of the player should be rendered - * - showArmor: Whether the armor of the player should be rendered - * - showCape: Whether the cape of the player should be rendered - * - showHeldItem: Whether the held item of the player should be rendered - * - showArrows: Whether any arrows stuck in the player's model should be rendered - * - showElytra: Whether the player's Elytra should be rendered - * - showParrot: Whether a perched parrot should be rendered - * - showBeeStinger: Whether any stuck bee stingers should be rendered - * - * @param obj An options bag - */ - drawPlayer(obj: org.mozilla.javascript.NativeObject): void; - new(): com.chattriggers.ctjs.api.render.Renderer; - } - interface Renderer { - screen: com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; - getPartialTicks(): number; - BLACK: number; - DARK_BLUE: number; - DARK_GREEN: number; - DARK_AQUA: number; - DARK_RED: number; - DARK_PURPLE: number; - GOLD: number; - GRAY: number; - DARK_GRAY: number; - BLUE: number; - GREEN: number; - AQUA: number; - RED: number; - LIGHT_PURPLE: number; - YELLOW: number; - WHITE: number; - color(color: number): number; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer] to allow for method chaining - */ - color(r: number, g: number, b: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer] to allow for method chaining - */ - color(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer] to allow for method chaining - */ - color(r: number, g: number, b: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer] to allow for method chaining - */ - color(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the color for the last defined vertex. - * - * @param color the color value, can use [getColor] to get this - * @return [Renderer] to allow for method chaining - */ - color(color: number): com.chattriggers.ctjs.api.render.Renderer; - getFontRenderer(): net.minecraft.client.gui.Font; - getRenderManager(): net.minecraft.client.renderer.LevelRenderer; - getStringWidth(text: string): number; - getColor(red: number, green: number, blue: number): number; - getColor(red: number, green: number, blue: number, alpha: number): number; - getRainbow(step: number): number; - getRainbow(step: number, speed: number): number; - getRainbowColors(step: number): Array; - getRainbowColors(step: number, speed: number): Array; - disableCull(): com.chattriggers.ctjs.api.render.Renderer; - enableCull(): com.chattriggers.ctjs.api.render.Renderer; - disableLighting(): com.chattriggers.ctjs.api.render.Renderer; - enableLighting(): com.chattriggers.ctjs.api.render.Renderer; - disableDepth(): com.chattriggers.ctjs.api.render.Renderer; - enableDepth(): com.chattriggers.ctjs.api.render.Renderer; - disableBlend(): com.chattriggers.ctjs.api.render.Renderer; - enableBlend(): com.chattriggers.ctjs.api.render.Renderer; - bindTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Renderer; - bindTexture(texture: com.chattriggers.ctjs.api.render.Image, textureIndex: number): com.chattriggers.ctjs.api.render.Renderer; - deleteTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Renderer; - pushMatrix(): com.chattriggers.ctjs.api.render.Renderer; - pushMatrix(stack: gg.essential.universal.UMatrixStack): com.chattriggers.ctjs.api.render.Renderer; - popMatrix(): com.chattriggers.ctjs.api.render.Renderer; - translate(x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - translate(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number, scaleY: number): com.chattriggers.ctjs.api.render.Renderer; - scale(scaleX: number, scaleY: number, scaleZ: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - rotate(angle: number, x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - multiply(quaternion: org.joml.Quaternionf): com.chattriggers.ctjs.api.render.Renderer; - fixAlpha(color: number): number; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - begin(): com.chattriggers.ctjs.api.render.Renderer; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode): com.chattriggers.ctjs.api.render.Renderer; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat): com.chattriggers.ctjs.api.render.Renderer; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer] to allow for method chaining - * @see DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat, snippet: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets a new vertex in the world renderer. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return [Renderer] to allow for method chaining - */ - pos(x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets a new vertex in the world renderer. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return [Renderer] to allow for method chaining - */ - pos(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the texture location on the last defined vertex. - * - * @param u the u position in the texture - * @param v the v position in the texture - * @return [Renderer] to allow for method chaining - */ - tex(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the normal of the vertex. This is mostly used with [VertexFormat.LINES] - * - * @param x the x position of the normal vector - * @param y the y position of the normal vector - * @param z the z position of the normal vector - * @return [Renderer] to allow for method chaining - */ - normal(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the overlay location on the last defined vertex. - * - * @param u the u position in the overlay - * @param v the v position in the overlay - * @return [Renderer] to allow for method chaining - */ - overlay(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Sets the light location on the last defined vertex. - * - * @param u the u position in the light - * @param v the v position in the light - * @return [Renderer] to allow for method chaining - */ - light(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer; - /** - * Finalizes vertices and draws the world renderer. - */ - draw(): void; - /** - * Gets a fixed render position from x, y, and z inputs adjusted with partial ticks - * @param x the X coordinate - * @param y the Y coordinate - * @param z the Z coordinate - * @return the Vec3f position to render at - */ - getRenderPos(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; - drawRect(color: number, x: number, y: number, width: number, height: number): com.chattriggers.ctjs.api.render.Renderer; - drawLine(color: number, x1: number, y1: number, x2: number, y2: number, thickness: number): void; - drawCircle(color: number, x: number, y: number, radius: number, steps: number): void; - drawString(text: string, x: number, y: number): void; - drawString(text: string, x: number, y: number, color: number): void; - drawString(text: string, x: number, y: number, color: number, shadow: boolean): void; - drawStringWithShadow(text: string, x: number, y: number): void; - drawStringWithShadow(text: string, x: number, y: number, color: number): void; - drawImage(image: com.chattriggers.ctjs.api.render.Image, x: number, y: number, width: number, height: number): void; - /** - * Draws a player entity to the screen, similar to the one displayed in the inventory screen. - * - * Takes a parameter with the following options: - * - player: The player entity to draw. Can be a [PlayerMP] or [AbstractClientPlayerEntity]. - * Defaults to Player.toMC() - * - x: The x position on the screen to render the player - * - y: The y position on the screen to render the player - * - size: The size of the rendered player - * - rotate: Whether the player should look at the mouse cursor, similar to the inventory screen - * - pitch: THe pitch the rendered player will face, if rotate is false - * - yaw: The yaw the rendered player will face, if rotate is false - * - showNametag: Whether the nametag of the player should be rendered - * - showArmor: Whether the armor of the player should be rendered - * - showCape: Whether the cape of the player should be rendered - * - showHeldItem: Whether the held item of the player should be rendered - * - showArrows: Whether any arrows stuck in the player's model should be rendered - * - showElytra: Whether the player's Elytra should be rendered - * - showParrot: Whether a perched parrot should be rendered - * - showBeeStinger: Whether any stuck bee stingers should be rendered - * - * @param obj An options bag - */ - drawPlayer(obj: org.mozilla.javascript.NativeObject): void; - new(): com.chattriggers.ctjs.api.render.Renderer; - } - const Renderer$ScreenWrapper: { - new(): com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; - } - interface Renderer$ScreenWrapper { - getWidth(): number; - getHeight(): number; - getScale(): number; - } - const Image: { - new(image: java.awt.image.BufferedImage | null | undefined): com.chattriggers.ctjs.api.render.Image; - } - interface Image { - getImage(): java.awt.image.BufferedImage | null | undefined; - setImage(value: java.awt.image.BufferedImage | null | undefined): void; - getTextureWidth(): number; - getTextureHeight(): number; - getTexture(): net.minecraft.client.renderer.texture.DynamicTexture | null | undefined; - /** - * Clears the image from GPU memory and removes its references CT side - * that way it can be garbage collected if not referenced in js code. - */ - destroy(): void; - draw(x: number, y: number): com.chattriggers.ctjs.api.render.Image; - draw(x: number, y: number, width: number | null | undefined): com.chattriggers.ctjs.api.render.Image; - draw(x: number, y: number, width: number | null | undefined, height: number | null | undefined): com.chattriggers.ctjs.api.render.Image; - } - const Image$Companion: { - /** - * Create an image object from a java.io.File object. Throws an exception - * if the file cannot be found. - */ - fromFile(file: java.io.File): com.chattriggers.ctjs.api.render.Image; - /** - * Create an image object from a file path. Throws an exception - * if the file cannot be found. - */ - fromFile(file: string): com.chattriggers.ctjs.api.render.Image; - /** - * Create an image object from a file path, relative to the assets directory. - * Throws an exception if the file cannot be found. - */ - fromAsset(name: string): com.chattriggers.ctjs.api.render.Image; - /** - * Creates an image object from a URL. Throws an exception if an image - * cannot be created from the URL. Will cache the image in the assets - */ - fromUrl(url: string): com.chattriggers.ctjs.api.render.Image; - /** - * Creates an image object from a URL. Throws an exception if an image - * cannot be created from the URL. Will cache the image in the assets - */ - fromUrl(url: string, cachedImageName: string | null | undefined): com.chattriggers.ctjs.api.render.Image; - new(): com.chattriggers.ctjs.api.render.Image$Companion; - } - interface Image$Companion { - /** - * Create an image object from a java.io.File object. Throws an exception - * if the file cannot be found. - */ - fromFile(file: java.io.File): com.chattriggers.ctjs.api.render.Image; - /** - * Create an image object from a file path. Throws an exception - * if the file cannot be found. - */ - fromFile(file: string): com.chattriggers.ctjs.api.render.Image; - /** - * Create an image object from a file path, relative to the assets directory. - * Throws an exception if the file cannot be found. - */ - fromAsset(name: string): com.chattriggers.ctjs.api.render.Image; - /** - * Creates an image object from a URL. Throws an exception if an image - * cannot be created from the URL. Will cache the image in the assets - */ - fromUrl(url: string): com.chattriggers.ctjs.api.render.Image; - /** - * Creates an image object from a URL. Throws an exception if an image - * cannot be created from the URL. Will cache the image in the assets - */ - fromUrl(url: string, cachedImageName: string | null | undefined): com.chattriggers.ctjs.api.render.Image; - new(): com.chattriggers.ctjs.api.render.Image$Companion; - } - const Rectangle: { - new(color: number, x: number, y: number, width: number, height: number): com.chattriggers.ctjs.api.render.Rectangle; - } - interface Rectangle { - getColor(): number; - setColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; - getX(): number; - setX(x: number): com.chattriggers.ctjs.api.render.Rectangle; - getY(): number; - setY(y: number): com.chattriggers.ctjs.api.render.Rectangle; - getWidth(): number; - setWidth(width: number): com.chattriggers.ctjs.api.render.Rectangle; - getHeight(): number; - setHeight(height: number): com.chattriggers.ctjs.api.render.Rectangle; - isShadow(): boolean; - setShadow(shadow: boolean): com.chattriggers.ctjs.api.render.Rectangle; - setShadow(color: number, x: number, y: number): com.chattriggers.ctjs.api.render.Rectangle; - getShadowOffset(): com.chattriggers.ctjs.api.vec.Vec2f; - getShadowOffsetX(): number; - getShadowOffsetY(): number; - setShadowOffset(x: number, y: number): com.chattriggers.ctjs.api.render.Rectangle; - setShadowOffsetX(x: number): com.chattriggers.ctjs.api.render.Rectangle; - setShadowOffsetY(y: number): com.chattriggers.ctjs.api.render.Rectangle; - getShadowColor(): number; - setShadowColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; - getOutline(): boolean; - setOutline(outline: boolean): com.chattriggers.ctjs.api.render.Rectangle; - setOutline(color: number, thickness: number): com.chattriggers.ctjs.api.render.Rectangle; - getOutlineColor(): number; - setOutlineColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; - getThickness(): number; - setThickness(thickness: number): com.chattriggers.ctjs.api.render.Rectangle; - draw(): com.chattriggers.ctjs.api.render.Rectangle; - } - const Gui: { - new(): com.chattriggers.ctjs.api.render.Gui; - new(title: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; - } - interface Gui extends gg.essential.universal.UScreen { - open(): void; - isOpen(): boolean; - /** - * Registers a method to be run while gui is open. - * Registered method runs on draw. - * Arguments passed through to method: - * - int mouseX - * - int mouseY - * - float partialTicks - * - * @param method the method to run - * @return the trigger - */ - registerDraw(method: any): com.chattriggers.ctjs.api.render.Gui; - /** - * Registers a method to be run while gui is open. - * Registered method runs on mouse click. - * Arguments passed through to method: - * - int mouseX - * - int mouseY - * - int button - * - * @param method the method to run - * @return the trigger - */ - registerClicked(method: any): com.chattriggers.ctjs.api.render.Gui; - /** - * Registers a method to be run while the gui is open. - * Registered method runs on mouse scroll. - * Arguments passed through to method: - * - int mouseX - * - int mouseY - * - int scroll direction - */ - registerScrolled(method: any): com.chattriggers.ctjs.api.render.Gui; - /** - * Registers a method to be run while gui is open. - * Registered method runs on key input. - * Arguments passed through to method: - * - char typed character - * - int key code - * - * @param method the method to run - * @return the trigger - */ - registerKeyTyped(method: any): com.chattriggers.ctjs.api.render.Gui; - /** - * Registers a method to be run while gui is open. - * Registered method runs on key input. - * Arguments passed through to method: - * - int mouseX - * - int mouseY - * - int clickedMouseButton - * - long timeSinceLastClick - * - * @param method the method to run - * @return the trigger - */ - registerMouseDragged(method: any): com.chattriggers.ctjs.api.render.Gui; - /** - * Registers a method to be run while gui is open. - * Registered method runs on mouse release. - * Arguments passed through to method: - * - int mouseX - * - int mouseY - * - int button - * - * @param method the method to run - * @return the trigger - */ - registerMouseReleased(method: any): com.chattriggers.ctjs.api.render.Gui; - /** - * Registers a method to be run while gui is open. - * Registered method runs when an action is performed (clicking a button) - * Arguments passed through to method: - * - the button that is clicked - * - * @param method the method to run - * @return the trigger - */ - registerActionPerformed(method: any): com.chattriggers.ctjs.api.render.Gui; - /** - * Registers a method to be run when the gui is opened. - * Arguments passed through to method: - * - the gui that is opened - * - * @param method the method to run - * @return the trigger - */ - registerOpened(method: any): com.chattriggers.ctjs.api.render.Gui; - /** - * Registers a method to be run when the gui is closed. - * Arguments passed through to method: - * - the gui that is closed - * - * @param method the method to run - * @return the trigger - */ - registerClosed(method: any): com.chattriggers.ctjs.api.render.Gui; - unregisterDraw(): com.chattriggers.ctjs.api.render.Gui; - unregisterClicked(): com.chattriggers.ctjs.api.render.Gui; - unregisterScrolled(): com.chattriggers.ctjs.api.render.Gui; - unregisterKeyTyped(): com.chattriggers.ctjs.api.render.Gui; - unregisterMouseDragged(): com.chattriggers.ctjs.api.render.Gui; - unregisterMouseReleased(): com.chattriggers.ctjs.api.render.Gui; - unregisterActionPerformed(): com.chattriggers.ctjs.api.render.Gui; - unregisterOpened(): com.chattriggers.ctjs.api.render.Gui; - unregisterClosed(): com.chattriggers.ctjs.api.render.Gui; - setDoesPauseGame(doesPauseGame: boolean): com.chattriggers.ctjs.api.render.Gui; - /** - * Add a base Minecraft button to the gui - * - * @param button the button to add - * @return the button ID for use in actionPerformed - */ - addButton(button: net.minecraft.client.gui.components.Button): number; - /** - * Add a base Minecraft button to the gui - * - * @param x the x position of the button - * @param y the y position of the button - * @param width the width of the button - * @param height the height of the button - * @param buttonText the label of the button - * @return the button ID for use in actionPerformed - */ - addButton(x: number, y: number, buttonText: com.chattriggers.ctjs.api.message.TextComponent): number; - /** - * Add a base Minecraft button to the gui - * - * @param x the x position of the button - * @param y the y position of the button - * @param width the width of the button - * @param height the height of the button - * @param buttonText the label of the button - * @return the button ID for use in actionPerformed - */ - addButton(x: number, y: number, width: number, buttonText: com.chattriggers.ctjs.api.message.TextComponent): number; - /** - * Add a base Minecraft button to the gui - * - * @param x the x position of the button - * @param y the y position of the button - * @param width the width of the button - * @param height the height of the button - * @param buttonText the label of the button - * @return the button ID for use in actionPerformed - */ - addButton(x: number, y: number, width: number, height: number, buttonText: com.chattriggers.ctjs.api.message.TextComponent): number; - addButton(x: number, y: number, width: number, height: number, buttonText: string): number; - /** - * Removes a button from the gui with the given id - * - * @param buttonId the id of the button to remove - * @return the Gui for method chaining - */ - removeButton(buttonId: number): com.chattriggers.ctjs.api.render.Gui; - clearButtons(): com.chattriggers.ctjs.api.render.Gui; - getButtonVisibility(buttonId: number): boolean; - /** - * Sets the visibility of a button - * - * @param buttonId the id of the button to change - * @param visible the new visibility of the button - * @return the Gui for method chaining - */ - setButtonVisibility(buttonId: number, visible: boolean): com.chattriggers.ctjs.api.render.Gui; - getButtonEnabled(buttonId: number): boolean; - /** - * Sets the enabled state of a button - * - * @param buttonId the id of the button to set - * @param enabled the enabled state of the button - * @return the Gui for method chaining - */ - setButtonEnabled(buttonId: number, enabled: boolean): com.chattriggers.ctjs.api.render.Gui; - getButtonWidth(buttonId: number): number; - /** - * Sets the button's width. Button textures break if the width is greater than 200 - * - * @param buttonId id of the button - * @param width the new width - * @return the Gui for method chaining - */ - setButtonWidth(buttonId: number, width: number): com.chattriggers.ctjs.api.render.Gui; - getButtonHeight(buttonId: number): number; - /** - * Sets the button's height. Button textures break if the height is not 20 - * - * @param buttonId id of the button - * @param height the new height - * @return the Gui for method chaining - */ - setButtonHeight(buttonId: number, height: number): com.chattriggers.ctjs.api.render.Gui; - getButtonX(buttonId: number): number; - /** - * Sets the button's x position - * - * @param buttonId id of the button - * @param x the new x position - * @return the Gui for method chaining - */ - setButtonX(buttonId: number, x: number): com.chattriggers.ctjs.api.render.Gui; - getButtonY(buttonId: number): number; - /** - * Sets the button's y position - * - * @param buttonId id of the button - * @param y the new y position - * @return the Gui for method chaining - */ - setButtonY(buttonId: number, y: number): com.chattriggers.ctjs.api.render.Gui; - /** - * Sets the button's position - * - * @param buttonId id of the button - * @param x the new x position - * @param y the new y position - * @return the Gui for method chaining - */ - setButtonLoc(buttonId: number, x: number, y: number): com.chattriggers.ctjs.api.render.Gui; - /** - * Sets the button's text - * - * @param buttonId id of the button - * @param text the new text - */ - setButtonText(buttonId: number, text: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; - /** - * Sets the button's text - * - * @param buttonId id of the button - * @param text the new text - */ - setButtonText(buttonId: number, text: string): com.chattriggers.ctjs.api.render.Gui; - /** - * Sets the gui's tooltip, this will be visible on top of the cursor - * when the gui is open. - * - * @param text the contents of the tooltip - */ - setTooltip(text: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; - /** - * Sets the gui's tooltip, this will be visible on top of the cursor - * when the gui is open. - * - * @param text the contents of the tooltip - */ - setTooltip(text: string): com.chattriggers.ctjs.api.render.Gui; - } - const Renderer3d: { - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - begin(): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat, snippet: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets a new vertex in the world renderer. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return [Renderer3d] to allow for method chaining - */ - pos(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the texture location on the last defined vertex. - * - * @param u the u position in the texture - * @param v the v position in the texture - * @return [Renderer3d] to allow for method chaining - */ - tex(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer3d] to allow for method chaining - */ - color(r: number, g: number, b: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer3d] to allow for method chaining - */ - color(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer3d] to allow for method chaining - */ - color(r: number, g: number, b: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer3d] to allow for method chaining - */ - color(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param color the color value, can use [Renderer.getColor] to get this - * @return [Renderer3d] to allow for method chaining - */ - color(color: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the normal of the vertex. This is mostly used with [Renderer.VertexFormat.LINES] - * - * @param x the x position of the normal vector - * @param y the y position of the normal vector - * @param z the z position of the normal vector - * @return [Renderer3d] to allow for method chaining - */ - normal(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the overlay location on the last defined vertex. - * - * @param u the u position in the overlay - * @param v the v position in the overlay - * @return [Renderer3d] to allow for method chaining - */ - overlay(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the light location on the last defined vertex. - * - * @param u the u position in the light - * @param v the v position in the light - * @return [Renderer3d] to allow for method chaining - */ - light(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Finalizes vertices and draws the world renderer. - */ - draw(): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean, scale: number): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean, scale: number, increase: boolean): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean, scale: number, increase: boolean, centered: boolean): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean, scale: number, increase: boolean, centered: boolean, renderThroughBlocks: boolean): void; - /** - * A variant of drawString that takes an object instead of positional parameters - */ - drawString(obj: org.mozilla.javascript.NativeObject): void; - /** - * Draws a line in the world from (x1, y1, z1) to (x2, y2, z2) - * - * @param color the color of the line - * @param x1 the starting x coordinate - * @param y1 the starting y coordinate - * @param z1 the starting z coordinate - * @param x2 the ending x coordinate - * @param y2 the ending y coordinate - * @param z2 the ending z coordinate - */ - drawLine(color: number, x1: number, y1: number, z1: number, x2: number, y2: number, z2: number): void; - new(): com.chattriggers.ctjs.api.render.Renderer3d; - } - interface Renderer3d { - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - begin(): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Begin drawing with the world renderer - * - * @param drawMode the GL draw mode - * @param vertexFormat The [VertexFormat] to use for drawing - * @return [Renderer3d] to allow for method chaining - * @see Renderer.DrawMode - */ - begin(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode, vertexFormat: com.chattriggers.ctjs.api.render.Renderer$VertexFormat, snippet: com.chattriggers.ctjs.api.render.Renderer$RenderSnippet): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets a new vertex in the world renderer. - * - * @param x the x position - * @param y the y position - * @param z the z position - * @return [Renderer3d] to allow for method chaining - */ - pos(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the texture location on the last defined vertex. - * - * @param u the u position in the texture - * @param v the v position in the texture - * @return [Renderer3d] to allow for method chaining - */ - tex(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer3d] to allow for method chaining - */ - color(r: number, g: number, b: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 1 - * @param g the green value of the color, between 0 and 1 - * @param b the blue value of the color, between 0 and 1 - * @param a the alpha value of the color, between 0 and 1 - * @return [Renderer3d] to allow for method chaining - */ - color(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer3d] to allow for method chaining - */ - color(r: number, g: number, b: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param r the red value of the color, between 0 and 255 - * @param g the green value of the color, between 0 and 255 - * @param b the blue value of the color, between 0 and 255 - * @param a the alpha value of the color, between 0 and 255 - * @return [Renderer3d] to allow for method chaining - */ - color(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the color for the last defined vertex. - * - * @param color the color value, can use [Renderer.getColor] to get this - * @return [Renderer3d] to allow for method chaining - */ - color(color: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the normal of the vertex. This is mostly used with [Renderer.VertexFormat.LINES] - * - * @param x the x position of the normal vector - * @param y the y position of the normal vector - * @param z the z position of the normal vector - * @return [Renderer3d] to allow for method chaining - */ - normal(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the overlay location on the last defined vertex. - * - * @param u the u position in the overlay - * @param v the v position in the overlay - * @return [Renderer3d] to allow for method chaining - */ - overlay(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Sets the light location on the last defined vertex. - * - * @param u the u position in the light - * @param v the v position in the light - * @return [Renderer3d] to allow for method chaining - */ - light(u: number, v: number): com.chattriggers.ctjs.api.render.Renderer3d; - /** - * Finalizes vertices and draws the world renderer. - */ - draw(): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean, scale: number): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean, scale: number, increase: boolean): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean, scale: number, increase: boolean, centered: boolean): void; - /** - * Renders floating lines of text in the 3D world at a specific position. - * This should be placed inside a `preRenderWorld` trigger. - * - * @param text The string array of text to render - * @param x X coordinate in the game world - * @param y Y coordinate in the game world - * @param z Z coordinate in the game world - * @param color the color of the text - * @param renderBlackBox render a pretty black border behind the text - * @param scale the scale of the text - * @param increase whether to scale the text up as the player moves away - * @param centered whether to center each line based on the longest line (this has no effect if there are no newline characters) - * @param renderThroughBlocks whether to render the text through blocks - */ - drawString(text: string, x: number, y: number, z: number, color: number, renderBlackBox: boolean, scale: number, increase: boolean, centered: boolean, renderThroughBlocks: boolean): void; - /** - * A variant of drawString that takes an object instead of positional parameters - */ - drawString(obj: org.mozilla.javascript.NativeObject): void; - /** - * Draws a line in the world from (x1, y1, z1) to (x2, y2, z2) - * - * @param color the color of the line - * @param x1 the starting x coordinate - * @param y1 the starting y coordinate - * @param z1 the starting z coordinate - * @param x2 the ending x coordinate - * @param y2 the ending y coordinate - * @param z2 the ending z coordinate - */ - drawLine(color: number, x1: number, y1: number, z1: number, x2: number, y2: number, z2: number): void; - new(): com.chattriggers.ctjs.api.render.Renderer3d; - } - const RenderUtils: { - Color: typeof com.chattriggers.ctjs.api.render.RenderUtils$Color; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number, depth: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number, depth: boolean): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; - new(): com.chattriggers.ctjs.api.render.RenderUtils; - } - interface RenderUtils { - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number): void; - drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number, depth: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number): void; - drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number, depth: boolean): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; - drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; - drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; - new(): com.chattriggers.ctjs.api.render.RenderUtils; - } - const RenderUtils$Color: { - new(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.RenderUtils$Color; - } - interface RenderUtils$Color { - getR(): number; - getG(): number; - getB(): number; - getA(): number; - getRf(): number; - getGf(): number; - getBf(): number; - getAf(): number; - getPacked(): number; - component1(): number; - component2(): number; - component3(): number; - component4(): number; - copy(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.RenderUtils$Color; - } - const DrawContextHolder: { - getCurrentContext(): net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; - setCurrentContext(value: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined): void; - new(): com.chattriggers.ctjs.api.render.DrawContextHolder; - } - interface DrawContextHolder { - getCurrentContext(): net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; - setCurrentContext(value: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined): void; - new(): com.chattriggers.ctjs.api.render.DrawContextHolder; - withContext(context: net.minecraft.client.gui.GuiGraphicsExtractor, block: kotlin.Function0): T; - } - const Book: { - new(): com.chattriggers.ctjs.api.render.Book; - } - interface Book { - /** - * Add a page to the book. - * - * @param contents the entire message for what the page should be - * @return the current book to allow method chaining - */ - addPage(contents: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Book; - /** - * Overloaded method for adding a simple page to the book. - * - * @param message a simple string to make the page - * @return the current book to allow method chaining - */ - addPage(message: string): com.chattriggers.ctjs.api.render.Book; - /** - * Inserts a page at the specified index of the book - * - * @param pageIndex the index of the page to set - * @param message the message to set the page to - * @return the current book to allow method chaining - */ - insertPage(pageIndex: number, message: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Book; - insertPage(pageIndex: number, message: string): com.chattriggers.ctjs.api.render.Book; - /** - * Sets a page of the book to the specified message. - * - * @param pageIndex the index of the page to set - * @param message the message to set the page to - * @return the current book to allow method chaining - */ - setPage(pageIndex: number, message: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Book; - setPage(pageIndex: number, message: string): com.chattriggers.ctjs.api.render.Book; - display(): void; - display(pageIndex: number): void; - isOpen(): boolean; - getCurrentPage(): number; - } - const Shape: { - new(color: number): com.chattriggers.ctjs.api.render.Shape; - } - interface Shape { - copy(): com.chattriggers.ctjs.api.render.Shape; - getColor(): number; - setColor(color: number): com.chattriggers.ctjs.api.render.Shape; - getDrawMode(): com.chattriggers.ctjs.api.render.Renderer$DrawMode; - /** - * Sets the GL draw mode of the shape - */ - setDrawMode(drawMode: com.chattriggers.ctjs.api.render.Renderer$DrawMode): com.chattriggers.ctjs.api.render.Shape; - getVertexes(): Array; - addVertex(x: number, y: number): com.chattriggers.ctjs.api.render.Shape; - insertVertex(index: number, x: number, y: number): com.chattriggers.ctjs.api.render.Shape; - removeVertex(index: number): com.chattriggers.ctjs.api.render.Shape; - clearVertices(): com.chattriggers.ctjs.api.render.Shape; - /** - * Sets the shape as a line pointing from [x1, y1] to [x2, y2] with a thickness - */ - setLine(x1: number, y1: number, x2: number, y2: number, thickness: number): com.chattriggers.ctjs.api.render.Shape; - /** - * Sets the shape as a circle with a center at [x, y] - * with radius and number of steps around the circle - */ - setCircle(x: number, y: number, radius: number, steps: number): com.chattriggers.ctjs.api.render.Shape; - draw(): com.chattriggers.ctjs.api.render.Shape; - } - const NVGRenderer: { - GifData: typeof com.chattriggers.ctjs.api.render.NVGRenderer$GifData; - vg: number; - registerV5Render(runnable: java.lang.Runnable): void; - unregisterV5Render(runnable: java.lang.Runnable): void; - registerV5PreRender(runnable: java.lang.Runnable): void; - unregisterV5PreRender(runnable: java.lang.Runnable): void; - runPreDrawables(): void; - runDrawables(): void; - beginFrame(width: number, height: number): void; - endFrame(): void; - drawCheckerboard(x: number, y: number, w: number, h: number, radius: number): void; - drawCheckerboard(x: number, y: number, w: number, h: number, radius: number, size: number): void; - drawHueBar(x: number, y: number, w: number, h: number, radius: number): void; - drawGradientRect(x: number, y: number, w: number, h: number, color1: number, color2: number, direction: any): void; - drawGradientRect(x: number, y: number, w: number, h: number, color1: number, color2: number, direction: any, radius: number): void; - drawHollowGradientRect(x: number, y: number, w: number, h: number, thickness: number, color1: number, color2: number, direction: any): void; - drawHollowGradientRect(x: number, y: number, w: number, h: number, thickness: number, color1: number, color2: number, direction: any, radius: number): void; - linearGradient(sx: number, sy: number, ex: number, ey: number, color1: number, color2: number): void; - setGlobalCompositeOperation(op: number): void; - save(): void; - restore(): void; - translate(x: number, y: number): void; - rotate(angle: number): void; - scale(x: number, y: number): void; - globalAlpha(alpha: number): void; - drawRect(x: number, y: number, w: number, h: number, color: number): void; - drawRoundedRect(x: number, y: number, w: number, h: number, radius: number, color: number): void; - drawRoundedRectVaried(x: number, y: number, w: number, h: number, color: number, tl: number, tr: number, br: number, bl: number): void; - drawCircle(x: number, y: number, radius: number, color: number): void; - drawDropShadow(x: number, y: number, w: number, h: number, radius: number, blur: number, spread: number, color: number): void; - drawHollowRect(x: number, y: number, w: number, h: number, thickness: number, color: number): void; - drawHollowRect(x: number, y: number, w: number, h: number, thickness: number, color: number, radius: number): void; - drawLine(x1: number, y1: number, x2: number, y2: number, thickness: number, color: number): void; - loadImage(path: string): string; - unloadImage(path: string): void; - isImageLoaded(path: string): boolean; - loadGif(path: string): com.chattriggers.ctjs.api.render.NVGRenderer$GifData | null | undefined; - unloadGif(path: string): void; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number): void; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number): void; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number, alpha: number): void; - drawImage(path: string, x: number, y: number, w: number, h: number): void; - drawImage(path: string, x: number, y: number, w: number, h: number, radius: number): void; - drawImage(path: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - drawGLTexture(glTextureId: number, texW: number, texH: number, x: number, y: number, w: number, h: number): void; - drawGLTexture(glTextureId: number, texW: number, texH: number, x: number, y: number, w: number, h: number, radius: number): void; - drawGLTexture(glTextureId: number, texW: number, texH: number, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - drawGLTextureRegion(glTextureId: number, textureWidth: number, textureHeight: number, subX: number, subY: number, subW: number, subH: number, x: number, y: number, w: number, h: number): void; - drawGLTextureRegion(glTextureId: number, textureWidth: number, textureHeight: number, subX: number, subY: number, subW: number, subH: number, x: number, y: number, w: number, h: number, radius: number): void; - drawGLTextureRegion(glTextureId: number, textureWidth: number, textureHeight: number, subX: number, subY: number, subW: number, subH: number, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - invalidateGLTexture(glTextureId: number): void; - clearImageCache(): void; - getCacheStats(): string; - scissor(x: number, y: number, w: number, h: number): void; - pushScissor(x: number, y: number, w: number, h: number): void; - popScissor(): void; - resetScissor(): void; - text(text: string, x: number, y: number, size: number, color: number, align: number): void; - text(text: string, x: number, y: number, size: number, color: number, font: com.chattriggers.ctjs.api.render.Font | null | undefined, align: number): void; - textWidth(text: string, size: number): number; - textWidth(text: string, size: number, font: com.chattriggers.ctjs.api.render.Font | null | undefined): number; - destroy(): void; - new(): com.chattriggers.ctjs.api.render.NVGRenderer; - } - interface NVGRenderer { - vg: number; - registerV5Render(runnable: java.lang.Runnable): void; - unregisterV5Render(runnable: java.lang.Runnable): void; - registerV5PreRender(runnable: java.lang.Runnable): void; - unregisterV5PreRender(runnable: java.lang.Runnable): void; - runPreDrawables(): void; - runDrawables(): void; - beginFrame(width: number, height: number): void; - endFrame(): void; - drawCheckerboard(x: number, y: number, w: number, h: number, radius: number): void; - drawCheckerboard(x: number, y: number, w: number, h: number, radius: number, size: number): void; - drawHueBar(x: number, y: number, w: number, h: number, radius: number): void; - drawGradientRect(x: number, y: number, w: number, h: number, color1: number, color2: number, direction: any): void; - drawGradientRect(x: number, y: number, w: number, h: number, color1: number, color2: number, direction: any, radius: number): void; - drawHollowGradientRect(x: number, y: number, w: number, h: number, thickness: number, color1: number, color2: number, direction: any): void; - drawHollowGradientRect(x: number, y: number, w: number, h: number, thickness: number, color1: number, color2: number, direction: any, radius: number): void; - linearGradient(sx: number, sy: number, ex: number, ey: number, color1: number, color2: number): void; - setGlobalCompositeOperation(op: number): void; - save(): void; - restore(): void; - translate(x: number, y: number): void; - rotate(angle: number): void; - scale(x: number, y: number): void; - globalAlpha(alpha: number): void; - drawRect(x: number, y: number, w: number, h: number, color: number): void; - drawRoundedRect(x: number, y: number, w: number, h: number, radius: number, color: number): void; - drawRoundedRectVaried(x: number, y: number, w: number, h: number, color: number, tl: number, tr: number, br: number, bl: number): void; - drawCircle(x: number, y: number, radius: number, color: number): void; - drawDropShadow(x: number, y: number, w: number, h: number, radius: number, blur: number, spread: number, color: number): void; - drawHollowRect(x: number, y: number, w: number, h: number, thickness: number, color: number): void; - drawHollowRect(x: number, y: number, w: number, h: number, thickness: number, color: number, radius: number): void; - drawLine(x1: number, y1: number, x2: number, y2: number, thickness: number, color: number): void; - loadImage(path: string): string; - unloadImage(path: string): void; - isImageLoaded(path: string): boolean; - loadGif(path: string): com.chattriggers.ctjs.api.render.NVGRenderer$GifData | null | undefined; - unloadGif(path: string): void; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number): void; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number): void; - drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number, alpha: number): void; - drawImage(path: string, x: number, y: number, w: number, h: number): void; - drawImage(path: string, x: number, y: number, w: number, h: number, radius: number): void; - drawImage(path: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number): void; - drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - drawGLTexture(glTextureId: number, texW: number, texH: number, x: number, y: number, w: number, h: number): void; - drawGLTexture(glTextureId: number, texW: number, texH: number, x: number, y: number, w: number, h: number, radius: number): void; - drawGLTexture(glTextureId: number, texW: number, texH: number, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - drawGLTextureRegion(glTextureId: number, textureWidth: number, textureHeight: number, subX: number, subY: number, subW: number, subH: number, x: number, y: number, w: number, h: number): void; - drawGLTextureRegion(glTextureId: number, textureWidth: number, textureHeight: number, subX: number, subY: number, subW: number, subH: number, x: number, y: number, w: number, h: number, radius: number): void; - drawGLTextureRegion(glTextureId: number, textureWidth: number, textureHeight: number, subX: number, subY: number, subW: number, subH: number, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; - invalidateGLTexture(glTextureId: number): void; - clearImageCache(): void; - getCacheStats(): string; - scissor(x: number, y: number, w: number, h: number): void; - pushScissor(x: number, y: number, w: number, h: number): void; - popScissor(): void; - resetScissor(): void; - text(text: string, x: number, y: number, size: number, color: number, align: number): void; - text(text: string, x: number, y: number, size: number, color: number, font: com.chattriggers.ctjs.api.render.Font | null | undefined, align: number): void; - textWidth(text: string, size: number): number; - textWidth(text: string, size: number, font: com.chattriggers.ctjs.api.render.Font | null | undefined): number; - destroy(): void; - new(): com.chattriggers.ctjs.api.render.NVGRenderer; - getDefaultFont(): com.chattriggers.ctjs.api.render.Font | null | undefined; - clearCallbacks(): void; - } - const NVGRenderer$GifData: { - new(width: number, height: number, frameCount: number, delays: Array): com.chattriggers.ctjs.api.render.NVGRenderer$GifData; - } - interface NVGRenderer$GifData { - getWidth(): number; - getHeight(): number; - getFrameCount(): number; - getDelays(): Array; - component1(): number; - component2(): number; - component3(): number; - component4(): Array; - copy(width: number, height: number, frameCount: number, delays: Array): com.chattriggers.ctjs.api.render.NVGRenderer$GifData; - } - } - namespace triggers { - interface ITriggerType { - getName(): string; - triggerAll(): void; - triggerAll(arg0: any | null | undefined): void; - triggerAll(arg0: any | null | undefined, arg1: any | null | undefined): void; - triggerAll(arg0: any | null | undefined, arg1: any | null | undefined, arg2: any | null | undefined): void; - triggerAll(arg0: any | null | undefined, arg1: any | null | undefined, arg2: any | null | undefined, arg3: any | null | undefined): void; - triggerAll(arg0: any | null | undefined, arg1: any | null | undefined, arg2: any | null | undefined, arg3: any | null | undefined, arg4: any | null | undefined): void; - triggerAll(args: any | null | undefined): void; - } - const TriggerType: { - CHAT: com.chattriggers.ctjs.api.triggers.TriggerType; - ACTION_BAR: com.chattriggers.ctjs.api.triggers.TriggerType; - TICK: com.chattriggers.ctjs.api.triggers.TriggerType; - STEP: com.chattriggers.ctjs.api.triggers.TriggerType; - GAME_UNLOAD: com.chattriggers.ctjs.api.triggers.TriggerType; - GAME_LOAD: com.chattriggers.ctjs.api.triggers.TriggerType; - CLICKED: com.chattriggers.ctjs.api.triggers.TriggerType; - SCROLLED: com.chattriggers.ctjs.api.triggers.TriggerType; - DRAGGED: com.chattriggers.ctjs.api.triggers.TriggerType; - GUI_OPENED: com.chattriggers.ctjs.api.triggers.TriggerType; - MESSAGE_SENT: com.chattriggers.ctjs.api.triggers.TriggerType; - ITEM_TOOLTIP: com.chattriggers.ctjs.api.triggers.TriggerType; - PLAYER_INTERACT: com.chattriggers.ctjs.api.triggers.TriggerType; - GUI_KEY: com.chattriggers.ctjs.api.triggers.TriggerType; - GUI_MOUSE_CLICK: com.chattriggers.ctjs.api.triggers.TriggerType; - GUI_MOUSE_DRAG: com.chattriggers.ctjs.api.triggers.TriggerType; - PACKET_SENT: com.chattriggers.ctjs.api.triggers.TriggerType; - PACKET_RECEIVED: com.chattriggers.ctjs.api.triggers.TriggerType; - SERVER_CONNECT: com.chattriggers.ctjs.api.triggers.TriggerType; - SERVER_DISCONNECT: com.chattriggers.ctjs.api.triggers.TriggerType; - GUI_CLOSED: com.chattriggers.ctjs.api.triggers.TriggerType; - DROP_ITEM: com.chattriggers.ctjs.api.triggers.TriggerType; - PRE_RENDER_WORLD: com.chattriggers.ctjs.api.triggers.TriggerType; - POST_RENDER_WORLD: com.chattriggers.ctjs.api.triggers.TriggerType; - BLOCK_HIGHLIGHT: com.chattriggers.ctjs.api.triggers.TriggerType; - RENDER_OVERLAY: com.chattriggers.ctjs.api.triggers.TriggerType; - RENDER_PLAYER_LIST: com.chattriggers.ctjs.api.triggers.TriggerType; - RENDER_ENTITY: com.chattriggers.ctjs.api.triggers.TriggerType; - RENDER_BLOCK_ENTITY: com.chattriggers.ctjs.api.triggers.TriggerType; - GUI_RENDER: com.chattriggers.ctjs.api.triggers.TriggerType; - POST_GUI_RENDER: com.chattriggers.ctjs.api.triggers.TriggerType; - SOUND_PLAY: com.chattriggers.ctjs.api.triggers.TriggerType; - WORLD_LOAD: com.chattriggers.ctjs.api.triggers.TriggerType; - WORLD_UNLOAD: com.chattriggers.ctjs.api.triggers.TriggerType; - SPAWN_PARTICLE: com.chattriggers.ctjs.api.triggers.TriggerType; - ENTITY_DEATH: com.chattriggers.ctjs.api.triggers.TriggerType; - ENTITY_DAMAGE: com.chattriggers.ctjs.api.triggers.TriggerType; - COMMAND: com.chattriggers.ctjs.api.triggers.TriggerType; - OTHER: com.chattriggers.ctjs.api.triggers.TriggerType; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.triggers.TriggerType; - } - interface TriggerType extends kotlin.Enum, com.chattriggers.ctjs.api.triggers.ITriggerType { - } - const CustomTriggerType: { - new(name: string): com.chattriggers.ctjs.api.triggers.CustomTriggerType; - } - interface CustomTriggerType extends com.chattriggers.ctjs.api.triggers.ITriggerType { - component1(): string; - copy(name: string): com.chattriggers.ctjs.api.triggers.CustomTriggerType; - } - const RegularTrigger: { - new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.RegularTrigger; - } - interface RegularTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { - } - const Trigger: { - Priority: typeof com.chattriggers.ctjs.api.triggers.Trigger$Priority; - } - interface Trigger extends kotlin.Comparable { - getMethod(): any; - setMethod(value: any): void; - getType(): com.chattriggers.ctjs.api.triggers.ITriggerType; - setType(value: com.chattriggers.ctjs.api.triggers.ITriggerType): void; - isRegistered(): boolean; - /** - * Sets a trigger's priority using [Priority]. - * Highest runs first. - * @param priority the priority of the trigger - * @return the trigger for method chaining - */ - setPriority(priority: com.chattriggers.ctjs.api.triggers.Trigger$Priority): com.chattriggers.ctjs.api.triggers.Trigger; - /** - * Registers a trigger based on its type. - * This is done automatically with TriggerRegister. - * @return the trigger for method chaining - */ - register(): com.chattriggers.ctjs.api.triggers.Trigger; - /** - * Unregisters a trigger. - * @return the trigger for method chaining - */ - unregister(): com.chattriggers.ctjs.api.triggers.Trigger; - } - const Trigger$Priority: { - HIGHEST: com.chattriggers.ctjs.api.triggers.Trigger$Priority; - HIGH: com.chattriggers.ctjs.api.triggers.Trigger$Priority; - NORMAL: com.chattriggers.ctjs.api.triggers.Trigger$Priority; - LOW: com.chattriggers.ctjs.api.triggers.Trigger$Priority; - LOWEST: com.chattriggers.ctjs.api.triggers.Trigger$Priority; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.api.triggers.Trigger$Priority; - } - interface Trigger$Priority extends kotlin.Enum { - } - const ChatTrigger: { - Event: typeof com.chattriggers.ctjs.api.triggers.ChatTrigger$Event; - new(method: any, type: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.ChatTrigger; - } - interface ChatTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { - /** - * Sets if the chat trigger should run if the chat event has already been canceled. - * True by default. - * @param bool Boolean to set - * @return the trigger object for method chaining - */ - triggerIfCanceled(bool: boolean): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Sets the chat criteria for [matchesChatCriteria]. - * Arguments for the trigger's method can be passed in using ${variable}. - * Example: `setChatCriteria("<${name}> ${message}");` - * Use ${*} to match a chat message but ignore the pass through. - * @param chatCriteria the chat criteria to set - * @return the trigger object for method chaining - */ - setChatCriteria(chatCriteria: any): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Alias for [setChatCriteria]. - * @param chatCriteria the chat criteria to set - * @return the trigger object for method chaining - */ - setCriteria(chatCriteria: any): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Sets the chat parameter for [Parameter]. - * Clears current parameter list. - * @param parameter the chat parameter to set - * @return the trigger object for method chaining - */ - setParameter(parameter: string): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Sets multiple chat parameters for [Parameter]. - * Clears current parameter list. - * @param parameters the chat parameters to set - * @return the trigger object for method chaining - */ - setParameters(parameters: string): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Adds chat parameter for [Parameter]. - * @param parameter the chat parameter to add - * @return the trigger object for method chaining - */ - addParameter(parameter: string): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Adds multiple chat parameters for [Parameter]. - * @param parameters the chat parameters to add - * @return the trigger object for method chaining - */ - addParameters(parameters: string): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Adds the "start" parameter - * @return the trigger object for method chaining - */ - setStart(): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Adds the "contains" parameter - * @return the trigger object for method chaining - */ - setContains(): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Adds the "end" parameter - * @return the trigger object for method chaining - */ - setEnd(): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Forces this trigger to be formatted or unformatted. If no argument is - * provided, it will be set to formatted. This method overrides the - * behavior of inferring the formatted status from the criteria. - */ - setFormatted(): void; - /** - * Forces this trigger to be formatted or unformatted. If no argument is - * provided, it will be set to formatted. This method overrides the - * behavior of inferring the formatted status from the criteria. - */ - setFormatted(formatted: boolean): void; - /** - * Makes the trigger match the entire chat message - * @return the trigger object for method chaining - */ - setExact(): com.chattriggers.ctjs.api.triggers.ChatTrigger; - /** - * Makes the chat criteria case insensitive - * @return the trigger object for method chaining - */ - setCaseInsensitive(): com.chattriggers.ctjs.api.triggers.ChatTrigger; - } - const ChatTrigger$Event: { - message: com.chattriggers.ctjs.api.message.TextComponent; - new(message: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.triggers.ChatTrigger$Event; - } - interface ChatTrigger$Event extends com.chattriggers.ctjs.api.triggers.CancellableEvent { - } - const CancellableEvent: { - new(): com.chattriggers.ctjs.api.triggers.CancellableEvent; - } - interface CancellableEvent { - setCanceled(): void; - setCanceled(newVal: boolean): void; - setCancelled(): void; - setCancelled(newVal: boolean): void; - isCancelable(): boolean; - isCancellable(): boolean; - isCancelled(): boolean; - isCanceled(): boolean; - } - const StepTrigger: { - new(method: any): com.chattriggers.ctjs.api.triggers.StepTrigger; - } - interface StepTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { - /** - * Sets the frames per second that the trigger activates. - * This has a maximum one step per second. - * @param fps the frames per second to set - * @return the trigger for method chaining - */ - setFps(fps: number): com.chattriggers.ctjs.api.triggers.StepTrigger; - /** - * Sets the delay in seconds between the trigger activation. - * This has a minimum of one step every second. This will override [setFps]. - * @param delay The delay in seconds - * @return the trigger for method chaining - */ - setDelay(delay: number): com.chattriggers.ctjs.api.triggers.StepTrigger; - } - const StepTrigger$Companion: { - new(): com.chattriggers.ctjs.api.triggers.StepTrigger$Companion; - } - interface StepTrigger$Companion { - new(): com.chattriggers.ctjs.api.triggers.StepTrigger$Companion; - } - const CommandTrigger: { - new(method: any): com.chattriggers.ctjs.api.triggers.CommandTrigger; - } - interface CommandTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { - /** - * Sets the tab completion options for the command. - * This method must be used before setting the command name, otherwise, the tab completions will not be set. - * - * @param args all the tab completion options. - */ - setTabCompletions(args: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; - /** - * This sets the possible tab completions for the command. - * This method must be used before setting the command name, otherwise, the tab completions will not be set. - * - * @param callback the callback that returns the tab completion options. - * - * For example: - * ```js - * register("command", () => { - * - * }).setTabCompletions((args) => { - * return ["option1", "option2"]; - * }).setName("test"); - * ``` - * The `args` parameter of the callback are the arguments currently passed to the command. - * For instance, if you want to not show the options after the user tabs the first time, just add a check - * for the length of the arguments and return an empty array. - * - * The return value of the callback **must be an array of strings**, and in this case will always return the 2 - * options in the array. - */ - setTabCompletions(callback: kotlin.Function1, Array>): com.chattriggers.ctjs.api.triggers.CommandTrigger; - /** - * Sets the aliases for the command. - * - * @param args all the aliases. - */ - setAliases(args: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; - /** - * Sets the command name. - * Example: - * setCommandName("test") - * would result in the command being /test - * - * @param commandName The command name - * @param overrideExisting Whether existing commands with the same name should be overridden - * @return the trigger for additional modification - */ - setCommandName(commandName: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; - /** - * Sets the command name. - * Example: - * setCommandName("test") - * would result in the command being /test - * - * @param commandName The command name - * @param overrideExisting Whether existing commands with the same name should be overridden - * @return the trigger for additional modification - */ - setCommandName(commandName: string, overrideExisting: boolean): com.chattriggers.ctjs.api.triggers.CommandTrigger; - /** - * Alias for [setCommandName] - * - * @param commandName The command name - * @param overrideExisting Whether existing commands with the same name should be overridden - * @return the trigger for additional modification - */ - setName(commandName: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; - /** - * Alias for [setCommandName] - * - * @param commandName The command name - * @param overrideExisting Whether existing commands with the same name should be overridden - * @return the trigger for additional modification - */ - setName(commandName: string, overrideExisting: boolean): com.chattriggers.ctjs.api.triggers.CommandTrigger; - } - const PacketEvent: { - RECEIVE: net.fabricmc.fabric.api.event.Event; - new(): com.chattriggers.ctjs.api.triggers.PacketEvent; - } - interface PacketEvent { - RECEIVE: net.fabricmc.fabric.api.event.Event; - new(): com.chattriggers.ctjs.api.triggers.PacketEvent; - } - interface PacketEvent$ReceiveEvent { - trigger(packet: net.minecraft.network.protocol.Packet): void; - } - const SoundPlayTrigger: { - new(method: any): com.chattriggers.ctjs.api.triggers.SoundPlayTrigger; - } - interface SoundPlayTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { - /** - * Sets the sound name criteria. - * - * @param soundNameCriteria the sound name - * @return the trigger for method chaining - */ - setCriteria(soundNameCriteria: string): com.chattriggers.ctjs.api.triggers.SoundPlayTrigger; - } - const EventTrigger: { - new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.EventTrigger; - } - interface EventTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { - /** - * Sets if this trigger should run if the event has already been canceled. - * True by default. - * - * @param bool Boolean to set - * @return the trigger object for method chaining - */ - triggerIfCanceled(bool: boolean): com.chattriggers.ctjs.api.triggers.EventTrigger; - } - const ClassFilterTrigger: { - new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType, wrappedClass: java.lang.Class): com.chattriggers.ctjs.api.triggers.ClassFilterTrigger; - } - interface ClassFilterTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { - /** - * Alias for `setFilteredClasses([A.class])` - * - * @param clazz The class for which this trigger should run for - */ - setFilteredClass(clazz: java.lang.Class): com.chattriggers.ctjs.api.triggers.ClassFilterTrigger; - /** - * Sets which classes this trigger should run for. If the list is empty, it runs - * for every class. - * - * @param classes The classes for which this trigger should run for - * @return This trigger object for chaining - */ - setFilteredClasses(classes: Array>): com.chattriggers.ctjs.api.triggers.ClassFilterTrigger; - } - const RenderEntityTrigger: { - new(method: any): com.chattriggers.ctjs.api.triggers.RenderEntityTrigger; - } - interface RenderEntityTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger { - } - const RenderBlockEntityTrigger: { - new(method: any): com.chattriggers.ctjs.api.triggers.RenderBlockEntityTrigger; - } - interface RenderBlockEntityTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger { - } - const PacketTrigger: { - new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.PacketTrigger; - } - interface PacketTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger, net.minecraft.network.protocol.Packet> { - } - } - interface CTWrapper { - getMcValue(): MCClass; - toMC(): MCClass; - } - const V5Auth: { - getJwtToken(): string | null | undefined; - getFreshJwtToken(): string | null | undefined; - setJwtToken(token: string | null | undefined): void; - shutDownHard(): java.lang.Void; - new(): com.chattriggers.ctjs.api.V5Auth; - } - interface V5Auth { - getJwtToken(): string | null | undefined; - getFreshJwtToken(): string | null | undefined; - setJwtToken(token: string | null | undefined): void; - shutDownHard(): java.lang.Void; - new(): com.chattriggers.ctjs.api.V5Auth; - } - const Mappings: { - /** - * Gets a classes unmapped class name, or throws an error if it is not mapped - */ - unmapClass(clazz: java.lang.Class): string | null | undefined; - /** - * Gets an unmapped class name from a mapped class name, or returns null if - * it either does not exist or is not mapped. - */ - unmapClassName(className: string): string | null | undefined; - /** - * Gets the mapped class name from an unmapped class name or null if the class - * name does not exist. Note that this is not required to use mapped classes, - * as Rhino performs this mapping automatically during runtime. - */ - mapClassName(className: string): string | null | undefined; - /** - * Allows runtime inspection of mappings - */ - new(): com.chattriggers.ctjs.api.Mappings; - } - interface Mappings { - /** - * Gets a classes unmapped class name, or throws an error if it is not mapped - */ - unmapClass(clazz: java.lang.Class): string | null | undefined; - /** - * Gets an unmapped class name from a mapped class name, or returns null if - * it either does not exist or is not mapped. - */ - unmapClassName(className: string): string | null | undefined; - /** - * Gets the mapped class name from an unmapped class name or null if the class - * name does not exist. Note that this is not required to use mapped classes, - * as Rhino performs this mapping automatically during runtime. - */ - mapClassName(className: string): string | null | undefined; - /** - * Allows runtime inspection of mappings - */ - new(): com.chattriggers.ctjs.api.Mappings; - } - const Config: { - ConsoleSettings: typeof com.chattriggers.ctjs.api.Config$ConsoleSettings; - getModuleImportHelp(): boolean; - setModuleImportHelp(value: boolean): void; - getModuleChangelog(): boolean; - setModuleChangelog(value: boolean): void; - getShowUpdatesInChat(): boolean; - setShowUpdatesInChat(value: boolean): void; - getAutoUpdateModules(): boolean; - setAutoUpdateModules(value: boolean): void; - getSendStatistics(): boolean; - setSendStatistics(value: boolean): void; - getClearConsoleOnLoad(): boolean; - setClearConsoleOnLoad(value: boolean): void; - getOpenConsoleOnError(): boolean; - setOpenConsoleOnError(value: boolean): void; - getConsoleFiraCodeFont(): boolean; - setConsoleFiraCodeFont(value: boolean): void; - getConsoleFontSize(): number; - setConsoleFontSize(value: number): void; - getCustomTheme(): boolean; - setCustomTheme(value: boolean): void; - getConsoleTheme(): number; - setConsoleTheme(value: number): void; - getConsoleTextColor(): java.awt.Color; - setConsoleTextColor(value: java.awt.Color): void; - getConsoleBackgroundColor(): java.awt.Color; - setConsoleBackgroundColor(value: java.awt.Color): void; - getConsoleErrorColor(): java.awt.Color; - setConsoleErrorColor(value: java.awt.Color): void; - getConsoleWarningColor(): java.awt.Color; - setConsoleWarningColor(value: java.awt.Color): void; - wasWelcomeShown(): boolean; - markWelcomeShown(): void; - new(): com.chattriggers.ctjs.api.Config; - } - interface Config extends gg.essential.vigilance.Vigilant { - getModuleImportHelp(): boolean; - setModuleImportHelp(value: boolean): void; - getModuleChangelog(): boolean; - setModuleChangelog(value: boolean): void; - getShowUpdatesInChat(): boolean; - setShowUpdatesInChat(value: boolean): void; - getAutoUpdateModules(): boolean; - setAutoUpdateModules(value: boolean): void; - getSendStatistics(): boolean; - setSendStatistics(value: boolean): void; - getClearConsoleOnLoad(): boolean; - setClearConsoleOnLoad(value: boolean): void; - getOpenConsoleOnError(): boolean; - setOpenConsoleOnError(value: boolean): void; - getConsoleFiraCodeFont(): boolean; - setConsoleFiraCodeFont(value: boolean): void; - getConsoleFontSize(): number; - setConsoleFontSize(value: number): void; - getCustomTheme(): boolean; - setCustomTheme(value: boolean): void; - getConsoleTheme(): number; - setConsoleTheme(value: number): void; - getConsoleTextColor(): java.awt.Color; - setConsoleTextColor(value: java.awt.Color): void; - getConsoleBackgroundColor(): java.awt.Color; - setConsoleBackgroundColor(value: java.awt.Color): void; - getConsoleErrorColor(): java.awt.Color; - setConsoleErrorColor(value: java.awt.Color): void; - getConsoleWarningColor(): java.awt.Color; - setConsoleWarningColor(value: java.awt.Color): void; - wasWelcomeShown(): boolean; - markWelcomeShown(): void; - new(): com.chattriggers.ctjs.api.Config; - } - const Config$ConsoleSettings: { - new(clearConsoleOnLoad: boolean, openConsoleOnError: boolean, consoleFiraCodeFont: boolean, consoleFontSize: number, customTheme: boolean, consoleTheme: number, consoleTextColor: java.awt.Color, consoleBackgroundColor: java.awt.Color, consoleErrorColor: java.awt.Color, consoleWarningColor: java.awt.Color): com.chattriggers.ctjs.api.Config$ConsoleSettings; - } - interface Config$ConsoleSettings { - getClearConsoleOnLoad(): boolean; - setClearConsoleOnLoad(value: boolean): void; - getOpenConsoleOnError(): boolean; - setOpenConsoleOnError(value: boolean): void; - getConsoleFiraCodeFont(): boolean; - setConsoleFiraCodeFont(value: boolean): void; - getConsoleFontSize(): number; - setConsoleFontSize(value: number): void; - getCustomTheme(): boolean; - setCustomTheme(value: boolean): void; - getConsoleTheme(): number; - setConsoleTheme(value: number): void; - getConsoleTextColor(): java.awt.Color; - setConsoleTextColor(value: java.awt.Color): void; - getConsoleBackgroundColor(): java.awt.Color; - setConsoleBackgroundColor(value: java.awt.Color): void; - getConsoleErrorColor(): java.awt.Color; - setConsoleErrorColor(value: java.awt.Color): void; - getConsoleWarningColor(): java.awt.Color; - setConsoleWarningColor(value: java.awt.Color): void; - component1(): boolean; - component2(): boolean; - component3(): boolean; - component4(): number; - component5(): boolean; - component6(): number; - component7(): java.awt.Color; - component8(): java.awt.Color; - component9(): java.awt.Color; - component10(): java.awt.Color; - copy(clearConsoleOnLoad: boolean, openConsoleOnError: boolean, consoleFiraCodeFont: boolean, consoleFontSize: number, customTheme: boolean, consoleTheme: number, consoleTextColor: java.awt.Color, consoleBackgroundColor: java.awt.Color, consoleErrorColor: java.awt.Color, consoleWarningColor: java.awt.Color): com.chattriggers.ctjs.api.Config$ConsoleSettings; - } - const Config$ConsoleSettings$Companion: { - new(): unknown; - } - interface Config$ConsoleSettings$Companion { - new(): unknown; - make(): com.chattriggers.ctjs.api.Config$ConsoleSettings; - } - } - namespace internal { - namespace commands { - const CommandCollection: { - new(): com.chattriggers.ctjs.internal.commands.CommandCollection; - } - interface CommandCollection { - register(command: com.chattriggers.ctjs.internal.commands.Command): void; - unregister(command: com.chattriggers.ctjs.internal.commands.Command): void; - unregisterAll(): void; - onExecute(block: kotlin.Function1, void>): T; - } - interface Command { - getOverrideExisting(): boolean; - getName(): string; - registerImpl(dispatcher: com.mojang.brigadier.CommandDispatcher): void; - unregisterImpl(dispatcher: com.mojang.brigadier.CommandDispatcher): void; - } - } - namespace launch { - interface IInjector { - } - } - } - namespace engine { - const WrappedThread: { - new(task: java.lang.Runnable): com.chattriggers.ctjs.engine.WrappedThread; - } - interface WrappedThread { - start(): void; - run(): void; - stop(): void; - interrupt(): void; - isInterrupted(): boolean; - destroy(): void; - isAlive(): boolean; - suspend(): void; - resume(): void; - setDaemon(on: boolean): void; - getId(): number; - } - const WrappedThread$Companion: { - sleep(millis: number): void; - sleep(millis: number, nanos: number): void; - currentThread(): java.lang.Thread; - new(): com.chattriggers.ctjs.engine.WrappedThread$Companion; + const WrappedThread$Companion: { + sleep(millis: number): void; + sleep(millis: number, nanos: number): void; + currentThread(): java.lang.Thread; + new(): com.chattriggers.ctjs.engine.WrappedThread$Companion; } interface WrappedThread$Companion { sleep(millis: number): void; @@ -51817,40 +43478,6 @@ declare global { currentThread(): java.lang.Thread; new(): com.chattriggers.ctjs.engine.WrappedThread$Companion; } - const MixinCallback: { - new(id: number, injector: com.chattriggers.ctjs.internal.launch.IInjector): com.chattriggers.ctjs.engine.MixinCallback; - } - interface MixinCallback { - attach(method: any): void; - component1(): number; - component2(): com.chattriggers.ctjs.internal.launch.IInjector; - copy(id: number, injector: com.chattriggers.ctjs.internal.launch.IInjector): com.chattriggers.ctjs.engine.MixinCallback; - } - const Console: { - new(): com.chattriggers.ctjs.engine.Console; - } - interface Console { - new(): com.chattriggers.ctjs.engine.Console; - clear(): void; - println(obj: any, logType: com.chattriggers.ctjs.engine.LogType, end: string, customColor: java.awt.Color | null | undefined): void; - println(obj: any, logType: com.chattriggers.ctjs.engine.LogType, end: string): void; - println(obj: any, logType: com.chattriggers.ctjs.engine.LogType): void; - println(obj: any): void; - printStackTrace(error: kotlin.Throwable): void; - show(): void; - close(): void; - onConsoleSettingsChanged(settings: com.chattriggers.ctjs.api.Config$ConsoleSettings): void; - } - const LogType: { - INFO: com.chattriggers.ctjs.engine.LogType; - WARN: com.chattriggers.ctjs.engine.LogType; - ERROR: com.chattriggers.ctjs.engine.LogType; - getEntries(): kotlin.enums.EnumEntries; - values(): Array; - valueOf(value: string): com.chattriggers.ctjs.engine.LogType; - } - interface LogType extends kotlin.Enum { - } const Register: { /** * Helper method register a trigger. @@ -52873,121 +44500,7510 @@ declare global { */ registerGuiMouseDrag(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** - * Registers a new trigger that runs whenever a packet is sent from the client to the server - * - * Passes through two arguments: - * - The packet - * - The event, which can be cancelled - * - * Available modifications: - * - [Trigger.setPriority] Sets the priority - * - [ClassFilterTrigger.setFilteredClasses] Sets the packet classes which this trigger - * gets fired for - * - * @param method The method to call when the event is fired - * @return The trigger for additional modification + * Registers a new trigger that runs whenever a packet is sent from the client to the server + * + * Passes through two arguments: + * - The packet + * - The event, which can be cancelled + * + * Available modifications: + * - [Trigger.setPriority] Sets the priority + * - [ClassFilterTrigger.setFilteredClasses] Sets the packet classes which this trigger + * gets fired for + * + * @param method The method to call when the event is fired + * @return The trigger for additional modification + */ + registerPacketSent(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Registers a new trigger that runs whenever a packet is sent to the client from the server + * + * Passes through two arguments: + * - The packet + * - The event, which can be cancelled + * + * Available modifications: + * - [Trigger.setPriority] Sets the priority + * - [ClassFilterTrigger.setFilteredClasses] Sets the packet classes which this trigger + * gets fired for + * + * @param method The method to call when the event is fired + * @return The trigger for additional modification + */ + registerPacketReceived(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Registers a new trigger that runs whenever the player connects to a server + * + * Available modifications: + * - [Trigger.setPriority] Sets the priority + * + * @param method The method to call when the event is fired + * @return The trigger for additional modification + */ + registerServerConnect(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Registers a new trigger that runs whenever the player disconnects from a server + * + * Available modifications: + * - [Trigger.setPriority] Sets the priority + * + * @param method The method to call when the event is fired + * @return The trigger for additional modification + */ + registerServerDisconnect(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Registers a new trigger that runs whenever an entity is rendered + * + * Passes through three arguments: + * - The [com.chattriggers.ctjs.api.entity.Entity] + * - The partial ticks + * - The event, which can be cancelled + * + * Available modifications: + * - [Trigger.setPriority] Sets the priority + * - [ClassFilterTrigger.setFilteredClasses] Sets the entity classes which this trigger + * gets fired for + * + * @param method The method to call when the event is fired + * @return The trigger for additional modification + */ + registerRenderEntity(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Registers a new trigger that runs whenever a block entity is rendered + * + * Passes through three arguments: + * - The [com.chattriggers.ctjs.api.entity.BlockEntity] + * - The partial ticks + * - The event, which can be cancelled + * + * Available modifications: + * - [Trigger.setPriority] Sets the priority + * - [ClassFilterTrigger.setFilteredClasses] Sets the tile entity classes which this trigger + * gets fired for + * + * @param method The method to call when the event is fired + * @return The trigger for additional modification + */ + registerRenderBlockEntity(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Registers a new trigger that runs after the current screen is rendered + * + * Passes through three arguments: + * - The mouseX + * - The mouseY + * - The GuiScreen + * + * Available modifications: + * - [Trigger.setPriority] Sets the priority + * + * @param method The method to call when the event is fired + * @return The trigger for additional modification + */ + registerPostGuiRender(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Registers a new trigger that runs whenever a particle is spawned + * + * Passes through two arguments: + * - The [com.chattriggers.ctjs.api.entity.Particle] + * - The event, which can be cancelled + * + * Available modifications: + * - [Trigger.setPriority] Sets the priority + * + * @param method The method to call when the event is fired + * @return The trigger for additional modification + */ + registerSpawnParticle(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + new(): com.chattriggers.ctjs.engine.Register; + } + const MixinCallback: { + new(id: number, injector: com.chattriggers.ctjs.internal.launch.IInjector): com.chattriggers.ctjs.engine.MixinCallback; + } + interface MixinCallback { + attach(method: any): void; + component1(): number; + component2(): com.chattriggers.ctjs.internal.launch.IInjector; + copy(id: number, injector: com.chattriggers.ctjs.internal.launch.IInjector): com.chattriggers.ctjs.engine.MixinCallback; + } + const Console: { + new(): com.chattriggers.ctjs.engine.Console; + } + interface Console { + new(): com.chattriggers.ctjs.engine.Console; + clear(): void; + println(obj: any, logType: com.chattriggers.ctjs.engine.LogType, end: string, customColor: java.awt.Color | null | undefined): void; + println(obj: any, logType: com.chattriggers.ctjs.engine.LogType, end: string): void; + println(obj: any, logType: com.chattriggers.ctjs.engine.LogType): void; + println(obj: any): void; + printStackTrace(error: kotlin.Throwable): void; + show(): void; + close(): void; + onConsoleSettingsChanged(settings: com.chattriggers.ctjs.api.Config$ConsoleSettings): void; + } + const LogType: { + INFO: com.chattriggers.ctjs.engine.LogType; + WARN: com.chattriggers.ctjs.engine.LogType; + ERROR: com.chattriggers.ctjs.engine.LogType; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.engine.LogType; + } + interface LogType extends kotlin.Enum { + } + } + namespace api { + namespace triggers { + const Trigger: { + Priority: typeof com.chattriggers.ctjs.api.triggers.Trigger$Priority; + } + interface Trigger extends kotlin.Comparable { + getMethod(): any; + setMethod(value: any): void; + getType(): com.chattriggers.ctjs.api.triggers.ITriggerType; + setType(value: com.chattriggers.ctjs.api.triggers.ITriggerType): void; + isRegistered(): boolean; + /** + * Sets a trigger's priority using [Priority]. + * Highest runs first. + * @param priority the priority of the trigger + * @return the trigger for method chaining + */ + setPriority(priority: com.chattriggers.ctjs.api.triggers.Trigger$Priority): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Registers a trigger based on its type. + * This is done automatically with TriggerRegister. + * @return the trigger for method chaining + */ + register(): com.chattriggers.ctjs.api.triggers.Trigger; + /** + * Unregisters a trigger. + * @return the trigger for method chaining + */ + unregister(): com.chattriggers.ctjs.api.triggers.Trigger; + } + interface ITriggerType { + getName(): string; + triggerAll(): void; + triggerAll(arg0: any | null | undefined): void; + triggerAll(arg0: any | null | undefined, arg1: any | null | undefined): void; + triggerAll(arg0: any | null | undefined, arg1: any | null | undefined, arg2: any | null | undefined): void; + triggerAll(arg0: any | null | undefined, arg1: any | null | undefined, arg2: any | null | undefined, arg3: any | null | undefined): void; + triggerAll(arg0: any | null | undefined, arg1: any | null | undefined, arg2: any | null | undefined, arg3: any | null | undefined, arg4: any | null | undefined): void; + triggerAll(args: any | null | undefined): void; + } + const Trigger$Priority: { + HIGHEST: com.chattriggers.ctjs.api.triggers.Trigger$Priority; + HIGH: com.chattriggers.ctjs.api.triggers.Trigger$Priority; + NORMAL: com.chattriggers.ctjs.api.triggers.Trigger$Priority; + LOW: com.chattriggers.ctjs.api.triggers.Trigger$Priority; + LOWEST: com.chattriggers.ctjs.api.triggers.Trigger$Priority; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.triggers.Trigger$Priority; + } + interface Trigger$Priority extends kotlin.Enum { + } + const ChatTrigger: { + Event: typeof com.chattriggers.ctjs.api.triggers.ChatTrigger$Event; + new(method: any, type: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.ChatTrigger; + } + interface ChatTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + /** + * Sets if the chat trigger should run if the chat event has already been canceled. + * True by default. + * @param bool Boolean to set + * @return the trigger object for method chaining + */ + triggerIfCanceled(bool: boolean): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Sets the chat criteria for [matchesChatCriteria]. + * Arguments for the trigger's method can be passed in using ${variable}. + * Example: `setChatCriteria("<${name}> ${message}");` + * Use ${*} to match a chat message but ignore the pass through. + * @param chatCriteria the chat criteria to set + * @return the trigger object for method chaining + */ + setChatCriteria(chatCriteria: any): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Alias for [setChatCriteria]. + * @param chatCriteria the chat criteria to set + * @return the trigger object for method chaining + */ + setCriteria(chatCriteria: any): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Sets the chat parameter for [Parameter]. + * Clears current parameter list. + * @param parameter the chat parameter to set + * @return the trigger object for method chaining + */ + setParameter(parameter: string): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Sets multiple chat parameters for [Parameter]. + * Clears current parameter list. + * @param parameters the chat parameters to set + * @return the trigger object for method chaining + */ + setParameters(parameters: string): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Adds chat parameter for [Parameter]. + * @param parameter the chat parameter to add + * @return the trigger object for method chaining + */ + addParameter(parameter: string): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Adds multiple chat parameters for [Parameter]. + * @param parameters the chat parameters to add + * @return the trigger object for method chaining + */ + addParameters(parameters: string): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Adds the "start" parameter + * @return the trigger object for method chaining + */ + setStart(): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Adds the "contains" parameter + * @return the trigger object for method chaining + */ + setContains(): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Adds the "end" parameter + * @return the trigger object for method chaining + */ + setEnd(): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Forces this trigger to be formatted or unformatted. If no argument is + * provided, it will be set to formatted. This method overrides the + * behavior of inferring the formatted status from the criteria. + */ + setFormatted(): void; + /** + * Forces this trigger to be formatted or unformatted. If no argument is + * provided, it will be set to formatted. This method overrides the + * behavior of inferring the formatted status from the criteria. + */ + setFormatted(formatted: boolean): void; + /** + * Makes the trigger match the entire chat message + * @return the trigger object for method chaining + */ + setExact(): com.chattriggers.ctjs.api.triggers.ChatTrigger; + /** + * Makes the chat criteria case insensitive + * @return the trigger object for method chaining + */ + setCaseInsensitive(): com.chattriggers.ctjs.api.triggers.ChatTrigger; + } + const ChatTrigger$Event: { + message: com.chattriggers.ctjs.api.message.TextComponent; + new(message: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.triggers.ChatTrigger$Event; + } + interface ChatTrigger$Event extends com.chattriggers.ctjs.api.triggers.CancellableEvent { + } + const CancellableEvent: { + new(): com.chattriggers.ctjs.api.triggers.CancellableEvent; + } + interface CancellableEvent { + setCanceled(): void; + setCanceled(newVal: boolean): void; + setCancelled(): void; + setCancelled(newVal: boolean): void; + isCancelable(): boolean; + isCancellable(): boolean; + isCancelled(): boolean; + isCanceled(): boolean; + } + const ClassFilterTrigger: { + new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType, wrappedClass: java.lang.Class): com.chattriggers.ctjs.api.triggers.ClassFilterTrigger; + } + interface ClassFilterTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + /** + * Alias for `setFilteredClasses([A.class])` + * + * @param clazz The class for which this trigger should run for + */ + setFilteredClass(clazz: java.lang.Class): com.chattriggers.ctjs.api.triggers.ClassFilterTrigger; + /** + * Sets which classes this trigger should run for. If the list is empty, it runs + * for every class. + * + * @param classes The classes for which this trigger should run for + * @return This trigger object for chaining + */ + setFilteredClasses(classes: Array>): com.chattriggers.ctjs.api.triggers.ClassFilterTrigger; + } + const RenderEntityTrigger: { + new(method: any): com.chattriggers.ctjs.api.triggers.RenderEntityTrigger; + } + interface RenderEntityTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger { + } + const RenderBlockEntityTrigger: { + new(method: any): com.chattriggers.ctjs.api.triggers.RenderBlockEntityTrigger; + } + interface RenderBlockEntityTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger { + } + const PacketTrigger: { + new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.PacketTrigger; + } + interface PacketTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger, net.minecraft.network.protocol.Packet> { + } + const SoundPlayTrigger: { + new(method: any): com.chattriggers.ctjs.api.triggers.SoundPlayTrigger; + } + interface SoundPlayTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + /** + * Sets the sound name criteria. + * + * @param soundNameCriteria the sound name + * @return the trigger for method chaining + */ + setCriteria(soundNameCriteria: string): com.chattriggers.ctjs.api.triggers.SoundPlayTrigger; + } + const TriggerType: { + CHAT: com.chattriggers.ctjs.api.triggers.TriggerType; + ACTION_BAR: com.chattriggers.ctjs.api.triggers.TriggerType; + TICK: com.chattriggers.ctjs.api.triggers.TriggerType; + STEP: com.chattriggers.ctjs.api.triggers.TriggerType; + GAME_UNLOAD: com.chattriggers.ctjs.api.triggers.TriggerType; + GAME_LOAD: com.chattriggers.ctjs.api.triggers.TriggerType; + CLICKED: com.chattriggers.ctjs.api.triggers.TriggerType; + SCROLLED: com.chattriggers.ctjs.api.triggers.TriggerType; + DRAGGED: com.chattriggers.ctjs.api.triggers.TriggerType; + GUI_OPENED: com.chattriggers.ctjs.api.triggers.TriggerType; + MESSAGE_SENT: com.chattriggers.ctjs.api.triggers.TriggerType; + ITEM_TOOLTIP: com.chattriggers.ctjs.api.triggers.TriggerType; + PLAYER_INTERACT: com.chattriggers.ctjs.api.triggers.TriggerType; + GUI_KEY: com.chattriggers.ctjs.api.triggers.TriggerType; + GUI_MOUSE_CLICK: com.chattriggers.ctjs.api.triggers.TriggerType; + GUI_MOUSE_DRAG: com.chattriggers.ctjs.api.triggers.TriggerType; + PACKET_SENT: com.chattriggers.ctjs.api.triggers.TriggerType; + PACKET_RECEIVED: com.chattriggers.ctjs.api.triggers.TriggerType; + SERVER_CONNECT: com.chattriggers.ctjs.api.triggers.TriggerType; + SERVER_DISCONNECT: com.chattriggers.ctjs.api.triggers.TriggerType; + GUI_CLOSED: com.chattriggers.ctjs.api.triggers.TriggerType; + DROP_ITEM: com.chattriggers.ctjs.api.triggers.TriggerType; + PRE_RENDER_WORLD: com.chattriggers.ctjs.api.triggers.TriggerType; + POST_RENDER_WORLD: com.chattriggers.ctjs.api.triggers.TriggerType; + BLOCK_HIGHLIGHT: com.chattriggers.ctjs.api.triggers.TriggerType; + RENDER_OVERLAY: com.chattriggers.ctjs.api.triggers.TriggerType; + RENDER_PLAYER_LIST: com.chattriggers.ctjs.api.triggers.TriggerType; + RENDER_ENTITY: com.chattriggers.ctjs.api.triggers.TriggerType; + RENDER_BLOCK_ENTITY: com.chattriggers.ctjs.api.triggers.TriggerType; + GUI_RENDER: com.chattriggers.ctjs.api.triggers.TriggerType; + POST_GUI_RENDER: com.chattriggers.ctjs.api.triggers.TriggerType; + SOUND_PLAY: com.chattriggers.ctjs.api.triggers.TriggerType; + WORLD_LOAD: com.chattriggers.ctjs.api.triggers.TriggerType; + WORLD_UNLOAD: com.chattriggers.ctjs.api.triggers.TriggerType; + SPAWN_PARTICLE: com.chattriggers.ctjs.api.triggers.TriggerType; + ENTITY_DEATH: com.chattriggers.ctjs.api.triggers.TriggerType; + ENTITY_DAMAGE: com.chattriggers.ctjs.api.triggers.TriggerType; + COMMAND: com.chattriggers.ctjs.api.triggers.TriggerType; + OTHER: com.chattriggers.ctjs.api.triggers.TriggerType; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.triggers.TriggerType; + } + interface TriggerType extends kotlin.Enum, com.chattriggers.ctjs.api.triggers.ITriggerType { + } + const CustomTriggerType: { + new(name: string): com.chattriggers.ctjs.api.triggers.CustomTriggerType; + } + interface CustomTriggerType extends com.chattriggers.ctjs.api.triggers.ITriggerType { + component1(): string; + copy(name: string): com.chattriggers.ctjs.api.triggers.CustomTriggerType; + } + const EventTrigger: { + new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.EventTrigger; + } + interface EventTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + /** + * Sets if this trigger should run if the event has already been canceled. + * True by default. + * + * @param bool Boolean to set + * @return the trigger object for method chaining + */ + triggerIfCanceled(bool: boolean): com.chattriggers.ctjs.api.triggers.EventTrigger; + } + const CommandTrigger: { + new(method: any): com.chattriggers.ctjs.api.triggers.CommandTrigger; + } + interface CommandTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + /** + * Sets the tab completion options for the command. + * This method must be used before setting the command name, otherwise, the tab completions will not be set. + * + * @param args all the tab completion options. + */ + setTabCompletions(args: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; + /** + * This sets the possible tab completions for the command. + * This method must be used before setting the command name, otherwise, the tab completions will not be set. + * + * @param callback the callback that returns the tab completion options. + * + * For example: + * ```js + * register("command", () => { + * + * }).setTabCompletions((args) => { + * return ["option1", "option2"]; + * }).setName("test"); + * ``` + * The `args` parameter of the callback are the arguments currently passed to the command. + * For instance, if you want to not show the options after the user tabs the first time, just add a check + * for the length of the arguments and return an empty array. + * + * The return value of the callback **must be an array of strings**, and in this case will always return the 2 + * options in the array. + */ + setTabCompletions(callback: kotlin.Function1, Array>): com.chattriggers.ctjs.api.triggers.CommandTrigger; + /** + * Sets the aliases for the command. + * + * @param args all the aliases. + */ + setAliases(args: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; + /** + * Sets the command name. + * Example: + * setCommandName("test") + * would result in the command being /test + * + * @param commandName The command name + * @param overrideExisting Whether existing commands with the same name should be overridden + * @return the trigger for additional modification + */ + setCommandName(commandName: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; + /** + * Sets the command name. + * Example: + * setCommandName("test") + * would result in the command being /test + * + * @param commandName The command name + * @param overrideExisting Whether existing commands with the same name should be overridden + * @return the trigger for additional modification + */ + setCommandName(commandName: string, overrideExisting: boolean): com.chattriggers.ctjs.api.triggers.CommandTrigger; + /** + * Alias for [setCommandName] + * + * @param commandName The command name + * @param overrideExisting Whether existing commands with the same name should be overridden + * @return the trigger for additional modification + */ + setName(commandName: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; + /** + * Alias for [setCommandName] + * + * @param commandName The command name + * @param overrideExisting Whether existing commands with the same name should be overridden + * @return the trigger for additional modification + */ + setName(commandName: string, overrideExisting: boolean): com.chattriggers.ctjs.api.triggers.CommandTrigger; + } + const RegularTrigger: { + new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.RegularTrigger; + } + interface RegularTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + } + const StepTrigger: { + new(method: any): com.chattriggers.ctjs.api.triggers.StepTrigger; + } + interface StepTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + /** + * Sets the frames per second that the trigger activates. + * This has a maximum one step per second. + * @param fps the frames per second to set + * @return the trigger for method chaining + */ + setFps(fps: number): com.chattriggers.ctjs.api.triggers.StepTrigger; + /** + * Sets the delay in seconds between the trigger activation. + * This has a minimum of one step every second. This will override [setFps]. + * @param delay The delay in seconds + * @return the trigger for method chaining + */ + setDelay(delay: number): com.chattriggers.ctjs.api.triggers.StepTrigger; + } + const StepTrigger$Companion: { + new(): com.chattriggers.ctjs.api.triggers.StepTrigger$Companion; + } + interface StepTrigger$Companion { + new(): com.chattriggers.ctjs.api.triggers.StepTrigger$Companion; + } + const PacketEvent: { + RECEIVE: net.fabricmc.fabric.api.event.Event; + new(): com.chattriggers.ctjs.api.triggers.PacketEvent; + } + interface PacketEvent { + RECEIVE: net.fabricmc.fabric.api.event.Event; + new(): com.chattriggers.ctjs.api.triggers.PacketEvent; + } + interface PacketEvent$ReceiveEvent { + trigger(packet: net.minecraft.network.protocol.Packet): void; + } + } + namespace inventory { + namespace action { + const ClickAction: { + ClickType: typeof com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; + new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.ClickAction; + } + interface ClickAction extends com.chattriggers.ctjs.api.inventory.action.Action { + getClickType(): com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; + /** + * The type of click (REQUIRED) + * + * @param clickType the new click type + */ + setClickType(clickType: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType): com.chattriggers.ctjs.api.inventory.action.ClickAction; + getHoldingShift(): boolean; + /** + * Whether the click should act as if shift is being held (defaults to false) + * + * @param holdingShift to hold shift or not + */ + setHoldingShift(holdingShift: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; + getItemInHand(): boolean; + /** + * Whether the click should act as if an item is being held + * (defaults to whether there actually is an item in the hand) + * + * @param itemInHand to be holding an item or not + */ + setItemInHand(itemInHand: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; + getPickupAll(): boolean; + /** + * Whether the click should try to pick up all items of said type in the inventory (essentially double clicking) + * (defaults to whether there actually is an item in the hand) + * + * @param pickupAll to pick up all items of the same type + */ + setPickupAll(pickupAll: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; + /** + * Sets the type of click. + * Possible values are: LEFT, RIGHT, MIDDLE + * + * @param clickType the click type + * @return the current Action for method chaining + */ + setClickString(clickType: string): com.chattriggers.ctjs.api.inventory.action.ClickAction; + } + const Action: { + Type: typeof com.chattriggers.ctjs.api.inventory.action.Action$Type; + new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.Action; + } + interface Action { + getSlot(): number; + setSlot(value: number): void; + getWindowId(): number; + setWindowId(value: number): void; + setSlot(slot: number): com.chattriggers.ctjs.api.inventory.action.Action; + setWindowId(windowId: number): com.chattriggers.ctjs.api.inventory.action.Action; + } + const Action$Companion: { + /** + * Creates a new action. + * The Inventory must be a container, see [Inventory.isContainer]. + * The slot can be -999 for outside of the gui + * + * @param inventory the inventory to complete the action on + * @param slot the slot to complete the action on + * @param typeString the type of action to do (CLICK, DRAG, DROP, KEY) + * @return the new action + */ + of(inventory: com.chattriggers.ctjs.api.inventory.Inventory, slot: number, typeString: string): com.chattriggers.ctjs.api.inventory.action.Action; + new(): com.chattriggers.ctjs.api.inventory.action.Action$Companion; + } + interface Action$Companion { + /** + * Creates a new action. + * The Inventory must be a container, see [Inventory.isContainer]. + * The slot can be -999 for outside of the gui + * + * @param inventory the inventory to complete the action on + * @param slot the slot to complete the action on + * @param typeString the type of action to do (CLICK, DRAG, DROP, KEY) + * @return the new action + */ + of(inventory: com.chattriggers.ctjs.api.inventory.Inventory, slot: number, typeString: string): com.chattriggers.ctjs.api.inventory.action.Action; + new(): com.chattriggers.ctjs.api.inventory.action.Action$Companion; + } + const Action$Type: { + CLICK: com.chattriggers.ctjs.api.inventory.action.Action$Type; + DRAG: com.chattriggers.ctjs.api.inventory.action.Action$Type; + KEY: com.chattriggers.ctjs.api.inventory.action.Action$Type; + DROP: com.chattriggers.ctjs.api.inventory.action.Action$Type; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.Action$Type; + } + interface Action$Type extends kotlin.Enum { + } + const ClickAction$ClickType: { + LEFT: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; + RIGHT: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; + MIDDLE: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; + } + interface ClickAction$ClickType extends kotlin.Enum { + getButton(): number; + } + const DragAction: { + ClickType: typeof com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; + Stage: typeof com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; + new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.DragAction; + } + interface DragAction extends com.chattriggers.ctjs.api.inventory.action.Action { + getClickType(): com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; + /** + * The type of click (REQUIRED) + * + * @param clickType the new click type + */ + setClickType(clickType: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType): com.chattriggers.ctjs.api.inventory.action.DragAction; + getStage(): com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; + /** + * The stage of this drag (REQUIRED) + * BEGIN is when beginning the drag + * SLOT is for each slot being dragged into + * END is for ending the drag + * + * @param stage the stage + */ + setStage(stage: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage): com.chattriggers.ctjs.api.inventory.action.DragAction; + /** + * Sets the type of click. + * Possible values are: LEFT, RIGHT, MIDDLE + * + * @param clickType the click type + * @return the current Action for method chaining + */ + setClickString(clickType: string): com.chattriggers.ctjs.api.inventory.action.DragAction; + /** + * Sets the stage of this drag. + * Possible values are: BEGIN, SLOT, END [stage] + * + * @param stage the stage + * @return the current Action for method chaining + */ + setStageString(stage: string): com.chattriggers.ctjs.api.inventory.action.DragAction; + } + const DragAction$ClickType: { + LEFT: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; + RIGHT: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; + MIDDLE: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; + } + interface DragAction$ClickType extends kotlin.Enum { + getButton(): number; + } + const DragAction$Stage: { + BEGIN: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; + SLOT: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; + END: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; + } + interface DragAction$Stage extends kotlin.Enum { + getStage(): number; + } + const DropAction: { + new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.DropAction; + } + interface DropAction extends com.chattriggers.ctjs.api.inventory.action.Action { + getHoldingCtrl(): boolean; + /** + * Whether the click should act as if control is being held (defaults to false) + * + * @param holdingCtrl to hold ctrl or not + */ + setHoldingCtrl(holdingCtrl: boolean): com.chattriggers.ctjs.api.inventory.action.DropAction; + } + const KeyAction: { + new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.KeyAction; + } + interface KeyAction extends com.chattriggers.ctjs.api.inventory.action.Action { + getKey(): number; + /** + * Which key to act as if has been clicked (REQUIRED). + * Options currently are 0-8, representing the hotbar keys + * + * @param key which key to "click" + */ + setKey(key: number): com.chattriggers.ctjs.api.inventory.action.KeyAction; + } + } + namespace nbt { + const NBTBase: { + new(mcValue: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; + } + interface NBTBase extends com.chattriggers.ctjs.api.CTWrapper { + /** + * Gets the type byte for the tag. + */ + getId(): number; + /** + * Creates a clone of the tag. + */ + copy(): net.minecraft.nbt.Tag; + /** + * Return whether this compound has no tags. + */ + hasNoTags(): boolean; + hasTags(): boolean; + } + const NBTBase$Companion: { + fromMC(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; + new(): com.chattriggers.ctjs.api.inventory.nbt.NBTBase$Companion; + } + interface NBTBase$Companion { + fromMC(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; + new(): com.chattriggers.ctjs.api.inventory.nbt.NBTBase$Companion; + toObject(): any | null | undefined; + toObject(): org.mozilla.javascript.NativeObject; + toObject(): org.mozilla.javascript.NativeArray; + } + const NBTTagCompound: { + NBTDataType: typeof com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + new(mcValue: net.minecraft.nbt.CompoundTag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + } + interface NBTTagCompound extends com.chattriggers.ctjs.api.inventory.nbt.NBTBase { + getTagMap(): Map; + getKeySet(): Set; + getTag(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTBase | null | undefined; + getTagId(key: string): number | null | undefined; + getByte(key: string): java.util.Optional; + getShort(key: string): java.util.Optional; + getInteger(key: string): java.util.Optional; + getLong(key: string): java.util.Optional; + getFloat(key: string): java.util.Optional; + getDouble(key: string): java.util.Optional; + getString(key: string): java.util.Optional; + getByteArray(key: string): java.util.Optional>; + getIntArray(key: string): java.util.Optional>; + getBoolean(key: string): java.util.Optional; + getCompoundTag(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + getTagList(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + get(key: string, type: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType, tagType: number | null | undefined): any | null | undefined; + get(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTBase | null | undefined; + setNBTBase(key: string, value: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setNBTBase(key: string, value: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setBoolean(key: string, value: boolean): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setByte(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setShort(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setInteger(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setLong(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setFloat(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setDouble(key: string, value: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setString(key: string, value: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setByteArray(key: string, value: Array): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + setIntArray(key: string, value: Array): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + putLongArray(key: string, value: Array): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + set(key: string, value: any): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + removeTag(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + toObject(): org.mozilla.javascript.NativeObject; + } + const NBTTagList: { + new(mcValue: net.minecraft.nbt.ListTag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + } + interface NBTTagList extends com.chattriggers.ctjs.api.inventory.nbt.NBTBase { + getTagCount(): number; + appendTag(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + appendTag(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + set(id: number, nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + set(id: number, nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + insertTag(index: number, nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + insertTag(index: number, nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + removeTag(index: number): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; + getShortAt(index: number): java.util.Optional; + getIntAt(index: number): java.util.Optional; + getFloatAt(index: number): java.util.Optional; + getDoubleAt(index: number): java.util.Optional; + getStringTagAt(index: number): string; + getListAt(index: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; + getCompoundTagAt(index: number): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; + getIntArrayAt(index: number): Array; + getLongArrayAt(index: number): Array; + get(index: number): net.minecraft.nbt.Tag; + get(index: number, type: number): any; + toArray(): org.mozilla.javascript.NativeArray; + } + const NBTTagCompound$NBTDataType: { + BYTE: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + SHORT: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + INTEGER: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + LONG: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + FLOAT: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + DOUBLE: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + STRING: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + BYTE_ARRAY: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + INT_ARRAY: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + LONG_ARRAY: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + BOOLEAN: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + COMPOUND_TAG: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + TAG_LIST: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; + } + interface NBTTagCompound$NBTDataType extends kotlin.Enum { + } + const NBT: { + /** + * Creates a new [NBTBase] from the given [nbt] + * + * @param nbt the value to convert to NBT + * @param options optional argument to allow refinement of the NBT data. + * Possible options include: + * - coerceNumericStrings: Boolean, default false. + * E.g. "10b" as a byte, "20s" as a short, "30f" as a float, "40d" as a double, + * "50l" as a long + * - preferArraysOverLists: Boolean, default false + * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or + * NBTTagIntArray accordingly + * + * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] + * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. + */ + parse(nbt: any): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; + /** + * Creates a new [NBTBase] from the given [nbt] + * + * @param nbt the value to convert to NBT + * @param options optional argument to allow refinement of the NBT data. + * Possible options include: + * - coerceNumericStrings: Boolean, default false. + * E.g. "10b" as a byte, "20s" as a short, "30f" as a float, "40d" as a double, + * "50l" as a long + * - preferArraysOverLists: Boolean, default false + * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or + * NBTTagIntArray accordingly + * + * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] + * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. + */ + parse(nbt: any, options: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; + toObject(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound): org.mozilla.javascript.NativeObject; + toArray(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagList): org.mozilla.javascript.NativeArray; + new(): com.chattriggers.ctjs.api.inventory.nbt.NBT; + } + interface NBT { + /** + * Creates a new [NBTBase] from the given [nbt] + * + * @param nbt the value to convert to NBT + * @param options optional argument to allow refinement of the NBT data. + * Possible options include: + * - coerceNumericStrings: Boolean, default false. + * E.g. "10b" as a byte, "20s" as a short, "30f" as a float, "40d" as a double, + * "50l" as a long + * - preferArraysOverLists: Boolean, default false + * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or + * NBTTagIntArray accordingly + * + * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] + * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. + */ + parse(nbt: any): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; + /** + * Creates a new [NBTBase] from the given [nbt] + * + * @param nbt the value to convert to NBT + * @param options optional argument to allow refinement of the NBT data. + * Possible options include: + * - coerceNumericStrings: Boolean, default false. + * E.g. "10b" as a byte, "20s" as a short, "30f" as a float, "40d" as a double, + * "50l" as a long + * - preferArraysOverLists: Boolean, default false + * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or + * NBTTagIntArray accordingly + * + * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] + * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. + */ + parse(nbt: any, options: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; + toObject(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound): org.mozilla.javascript.NativeObject; + toArray(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagList): org.mozilla.javascript.NativeArray; + new(): com.chattriggers.ctjs.api.inventory.nbt.NBT; + } + } + const Slot: { + new(mcValue: net.minecraft.world.inventory.Slot): com.chattriggers.ctjs.api.inventory.Slot; + } + interface Slot extends com.chattriggers.ctjs.api.CTWrapper { + getIndex(): number; + getDisplayX(): number; + getDisplayY(): number; + getInventory(): com.chattriggers.ctjs.api.inventory.Inventory; + getItem(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + isEnabled(): boolean; + } + const Inventory: { + new(inventory: net.minecraft.world.Container): com.chattriggers.ctjs.api.inventory.Inventory; + new(container: net.minecraft.client.gui.screens.inventory.AbstractContainerScreen): com.chattriggers.ctjs.api.inventory.Inventory; + } + interface Inventory { + getInventory(): net.minecraft.world.Container; + getScreen(): net.minecraft.client.gui.screens.inventory.AbstractContainerScreen | null | undefined; + /** + * Gets the total size of the Inventory. + * The player's inventory size is 36, 27 for the main inventory, plus 9 for the hotbar. + * A single chest's size would be 63, because it also counts the player's inventory. + * + * @return the size of the Inventory + */ + getSize(): number; + /** + * Gets the item in any slot, starting from 0. + * + * @param slot the slot index + * @return the [Item] in that slot, or null if there is no item + */ + getStackInSlot(slot: number): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + /** + * Returns the window identifier number of this Inventory. + * This Inventory must be backed by a HandledScreen [isScreen] + * + * @return the window id + */ + getWindowId(): number; + /** + * Checks if an item can be shift clicked into a certain slot, i.e. coal into the bottom of a furnace. + * + * @param slot the slot index + * @param item the item for checking + * @return whether it can be shift clicked in + */ + isItemValidForSlot(slot: number, item: com.chattriggers.ctjs.api.inventory.Item): boolean; + /** + * @return a list of the [Item]s in an inventory + */ + getItems(): Array; + /** + * Checks whether the inventory contains the given item. + * + * @param item the item to check for + * @return whether the inventory contains the item + */ + contains(item: com.chattriggers.ctjs.api.inventory.Item): boolean; + /** + * Checks whether the inventory contains an item with ID. + * + * @param id the ID of the item to match + * @return whether the inventory contains an item with ID + */ + contains(id: number): boolean; + /** + * Gets the index of any item in the inventory, and returns the slot number. + * Returns -1 if the inventory does not contain the item. + * + * @param item the item to check for + * @return the index of the given item + */ + indexOf(item: com.chattriggers.ctjs.api.inventory.Item): number; + /** + * Gets the index of any item in the inventory with matching ID, and returns the slot number. + * Returns -1 if the inventory does not contain the item. + * + * @param id the item ID to check for + * @return the index of the given item with ID + */ + indexOf(id: number): number; + /** + * Returns true if this Inventory wraps a [HandledScreen] object + * rather than an [MCInventory] object + * + * @return if this is a container + */ + isScreen(): boolean; + /** + * Shorthand for [ClickAction] + * + * @param slot the slot to click on + * @param button the mouse button to use. "LEFT" by default. + * @param shift whether shift is being held. False by default + * @return this inventory for method chaining + */ + click(slot: number): com.chattriggers.ctjs.api.inventory.Inventory; + /** + * Shorthand for [ClickAction] + * + * @param slot the slot to click on + * @param button the mouse button to use. "LEFT" by default. + * @param shift whether shift is being held. False by default + * @return this inventory for method chaining + */ + click(slot: number, shift: boolean): com.chattriggers.ctjs.api.inventory.Inventory; + /** + * Shorthand for [ClickAction] + * + * @param slot the slot to click on + * @param button the mouse button to use. "LEFT" by default. + * @param shift whether shift is being held. False by default + * @return this inventory for method chaining + */ + click(slot: number, shift: boolean, button: string): com.chattriggers.ctjs.api.inventory.Inventory; + /** + * Shorthand for [DropAction] + * + * @param slot the slot to drop + * @param ctrl whether control should be held (drops whole stack) + * @return this inventory for method chaining + */ + drop(slot: number, ctrl: boolean): com.chattriggers.ctjs.api.inventory.Inventory; + /** + * Shorthand for [DragAction] + * + * @param type what click type this should be: LEFT, MIDDLE, RIGHT + * @param slots all of the slots to drag onto + * @return this inventory for method chaining + */ + drag(type: string, slots: number): com.chattriggers.ctjs.api.inventory.Inventory; + /** + * Gets the name of the inventory, simply "container" for most chest-like blocks. + * + * @return the name of the inventory + */ + getName(): com.chattriggers.ctjs.api.message.TextComponent; + getClassName(): string; + } + const Item: { + new(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item; + new(type: com.chattriggers.ctjs.api.inventory.ItemType): com.chattriggers.ctjs.api.inventory.Item; + } + interface Item extends com.chattriggers.ctjs.api.CTWrapper { + getType(): com.chattriggers.ctjs.api.inventory.ItemType; + getStackSize(): number; + setStackSize(size: number): com.chattriggers.ctjs.api.inventory.Item; + getEnchantments(): Map | null | undefined, number>; + isEnchantable(): boolean; + isEnchanted(): boolean; + canPlaceOn(pos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; + canPlaceOn(block: com.chattriggers.ctjs.api.world.block.Block): boolean; + canHarvest(pos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; + canHarvest(block: com.chattriggers.ctjs.api.world.block.Block): boolean; + getDurability(): number; + getMaxDamage(): number; + getDamage(): number; + isDamageable(): boolean; + getName(): string; + setName(name: com.chattriggers.ctjs.api.message.TextComponent | null | undefined): com.chattriggers.ctjs.api.inventory.Item; + resetName(): void; + getLore(): Array; + getLore(advanced: boolean): Array; + setLore(lore: Array): void; + resetLore(): void; + getNBT(): net.minecraft.core.component.DataComponentMap; + draw(): void; + draw(x: number): void; + draw(x: number, y: number): void; + draw(x: number, y: number, scale: number): void; + } + const ItemType: { + new(mcValue: net.minecraft.world.item.Item): com.chattriggers.ctjs.api.inventory.ItemType; + new(itemName: string): com.chattriggers.ctjs.api.inventory.ItemType; + new(id: number): com.chattriggers.ctjs.api.inventory.ItemType; + new(blockType: com.chattriggers.ctjs.api.world.block.BlockType): com.chattriggers.ctjs.api.inventory.ItemType; + } + interface ItemType extends com.chattriggers.ctjs.api.CTWrapper { + getName(): string; + getNameComponent(): com.chattriggers.ctjs.api.message.TextComponent; + getId(): number; + getTranslationKey(): string; + getRegistryName(): string; + asItem(): com.chattriggers.ctjs.api.inventory.Item; + } + const ItemType$Companion: { + fromMC(mcValue: net.minecraft.world.item.Item): com.chattriggers.ctjs.api.inventory.ItemType | null | undefined; + new(): com.chattriggers.ctjs.api.inventory.ItemType$Companion; + } + interface ItemType$Companion { + fromMC(mcValue: net.minecraft.world.item.Item): com.chattriggers.ctjs.api.inventory.ItemType | null | undefined; + new(): com.chattriggers.ctjs.api.inventory.ItemType$Companion; + } + const Item$Companion: { + fromMC(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + new(): com.chattriggers.ctjs.api.inventory.Item$Companion; + } + interface Item$Companion { + fromMC(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + new(): com.chattriggers.ctjs.api.inventory.Item$Companion; + } + } + namespace message { + const TextComponent: { + /** + * Creates an empty [TextComponent] with a single, unstyled, empty part. + */ + new(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Creates a [TextComponent] from a variable number of objects. These + * objects can be: + * - A plain string possibly containing formatting codes. If the string has + * formatting codes, it will be split into different parts accordingly + * - A [TextComponent], whose parts will be appended in sequence to this + * [TextComponent]'s list of parts + * - A [Text] object, which acts as a single part + * - A JS object, which must contain a "text" key, and can optionally contain + * any of the [Style] keys: + * - color: a [TextColor] or string format of a [TextColor], [Formatting], or a hex value + * - bold: boolean + * - italic: boolean + * - underline: boolean + * - strikethrough: boolean + * - obfuscated: boolean + * - clickEvent: object with { action: [ClickEvent.Action] or string format of a [ClickEvent.Action], value: string or null } + * - hoverEvent: object with { action: [HoverEvent.Action], string format of a [HoverEvent.Action], or null, value: string or null } + * - insertion: string or null + * - font: string format of an [net.minecraft.util.Identifier] + * + * @see Style + */ + new(parts: any): com.chattriggers.ctjs.api.message.TextComponent; + } + interface TextComponent extends net.minecraft.network.chat.Component, kotlin.collections.Iterable { + /** + * Returns the text of all parts concatenated without formatting codes. + */ + getUnformattedText(): string; + /** + * Returns the text of all parts concatenated with formatting codes. + */ + getFormattedText(): string; + getSize(): number; + /** + * If this [TextComponent] is recursive, sending this instance (via [chat] or + * [actionBar]) may trigger other `chat` triggers as if it had been received by + * the server. [TextComponent]s are non-recursive by default. + * + * @return true if the message can trigger other triggers. + */ + isRecursive(): boolean; + /** + * Get the chat line ID of this message, if it exists. The chat line can be used + * to easily edit or delete a message later via [ChatLib.editChat] and + * [ChatLib.deleteChat]. + * + * @return the chat line ID of the message, or -1 if this [TextComponent] does + * not have an associated chat line ID. + */ + getChatLineId(): number; + /** + * @return a new [TextComponent] with the given chat line id + */ + withChatLineId(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * @return a new [TextComponent] with the given chat line id + */ + withChatLineId(id: number): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sets whether the message can trigger other triggers. + * + * @param recursive true if message can trigger other triggers. + */ + withRecursive(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sets whether the message can trigger other triggers. + * + * @param recursive true if message can trigger other triggers. + */ + withRecursive(recursive: boolean): com.chattriggers.ctjs.api.message.TextComponent; + /** + * @return a new [TextComponent] with the specified [value] appended to the end. + * This accepts all types of objects that the vararg constructor does. + */ + withText(value: any): com.chattriggers.ctjs.api.message.TextComponent; + /** + * @return a new [TextComponent] with the specified [value] inserted at [index]. + * This accepts all types of objects that the vararg constructor does. + */ + withTextAt(index: number, value: any): com.chattriggers.ctjs.api.message.TextComponent; + /** + * @return a new [TextComponent] without the part at [index] + */ + withoutTextAt(index: number): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Edits this text component, replacing it with the given [newText]. Note that + * this compares [TextComponent]s based on [formattedText]; if an exact match + * is needed, use [ChatLib.editChat] in conjunction with a chat line ID. + */ + edit(newText: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Edits this text component, replacing it with a new [TextComponent] from the + * given [parts]. Note that this compares [TextComponent]s based on + * [formattedText]; if an exact match is needed, use [ChatLib.editChat] in + * conjunction with a chat line ID. + */ + edit(parts: any): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sends this [TextComponent] to the players chat. + * + * Note that this is purely client-side, and will not be sent to the server. If [isRecursive], + * will trigger any matching `chat` triggers + * + * @see ChatLib.chat + * @see ChatLib.say + */ + chat(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sends this [TextComponent] to the players action bar. + * + * If [isRecursive], will trigger any matching `actionBar` triggers + * + * @see ChatLib.actionBar + */ + actionBar(): com.chattriggers.ctjs.api.message.TextComponent; + contains(element: org.mozilla.javascript.NativeObject): boolean; + containsAll(elements: Array): boolean; + get(index: number): org.mozilla.javascript.NativeObject; + indexOf(element: org.mozilla.javascript.NativeObject): number; + isEmpty(): boolean; + } + const ChatLib: { + /** + * Prints text in the chat. + * The text can be a String or a [TextComponent] + * + * @param text the text to be printed + */ + chat(text: any | null | undefined): void; + /** + * Shows text in the action bar. + * The text can be a String or a [TextComponent] + * + * @param text the text to show + */ + actionBar(text: any | null | undefined): void; + /** + * Simulates a chat message to be caught by other triggers for testing. + * The text can be a String or a [TextComponent] + * + * @param text The message to simulate + */ + simulateChat(text: any | null | undefined): void; + /** + * Replaces the easier to type '&' color codes with proper color codes in a string. + * + * @param message The string to add color codes to + * @return the formatted message + */ + addColor(message: string | null | undefined): string; + /** + * Says chat message. + * This message is actually sent to the server. + * + * @param text the message to be sent + */ + say(text: string): void; + /** + * Runs a command. + * + * @param text the command to run, without the leading slash (Ex. "help") + * @param clientSide should the command be run as a client side command + */ + command(text: string): void; + /** + * Runs a command. + * + * @param text the command to run, without the leading slash (Ex. "help") + * @param clientSide should the command be run as a client side command + */ + command(text: string, clientSide: boolean): void; + /** + * Clear all chat messages + */ + clearChat(): void; + /** + * Get a message that will be perfectly one line of chat, + * the separator repeated as many times as necessary. + * The separator defaults to "-" + * + * @param separator the message to split chat with + * @return the message that would split chat + */ + getChatBreak(): string; + /** + * Get a message that will be perfectly one line of chat, + * the separator repeated as many times as necessary. + * The separator defaults to "-" + * + * @param separator the message to split chat with + * @return the message that would split chat + */ + getChatBreak(separator: string): string; + /** + * Gets the width of Minecraft's chat + * + * @return the width of chat + */ + getChatWidth(): number; + /** + * Remove all formatting + * + * @param text the string to un-format + * @return the unformatted string + */ + removeFormatting(text: string): string; + /** + * Replaces Minecraft formatted text with normal formatted text + * + * @param text the formatted string + * @return the unformatted string + */ + replaceFormatting(text: string): string; + /** + * Get a message that will be perfectly centered in chat. + * + * @param text the text to be centered + * @return the centered message + */ + getCenteredText(text: string): string; + /** + * Copies the given String to the user's clipboard + * + * @param text the text to copy + */ + copyToClipboard(text: string): void; + /** + * Edits an already sent chat message matched by [regexp]. + * + * @param regexp the regex object to match to the message + * @param replacements the new message(s) to be put in replace of the old one + */ + editChat(regexp: org.mozilla.javascript.regexp.NativeRegExp, replacements: any): void; + /** + * Edits an already sent chat message by the text of the chat + * + * @param toReplace the unformatted text of the message to be replaced + * @param replacements the new message(s) to be put in place of the old one + */ + editChat(toReplace: string, replacements: any): void; + /** + * Edits an already sent chat message by the [TextComponent] + * + * @param toReplace the message to be replaced + * @param replacements the new message(s) to be put in place of the old one + */ + editChat(toReplace: com.chattriggers.ctjs.api.message.TextComponent, replacements: any): void; + /** + * Edits an already sent chat message by its chat line id + * + * @param chatLineId the chat line id of the message to be replaced + * @param replacements the new message(s) to be put in place of the old one + */ + editChat(chatLineId: number, replacements: any): void; + /** + * Edits an already sent chat message by given a callback that receives + * [TextComponent] instances + * + * @param matcher a function that accepts a [TextComponent] and returns a boolean + * @param replacements the new message(s) to be put in place of the old one + */ + editChat(matcher: kotlin.Function1, replacements: any): void; + /** + * Deletes an already sent chat message matching [regexp]. + * + * @param regexp the regex object to match to the message + */ + deleteChat(regexp: org.mozilla.javascript.regexp.NativeRegExp): void; + /** + * Deletes an already sent chat message by the text of the chat + * + * @param toDelete the unformatted text of the message to be deleted + */ + deleteChat(toDelete: string): void; + /** + * Deletes an already sent chat message by the [TextComponent] + * + * @param toDelete the message to be deleted + */ + deleteChat(toDelete: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Deletes an already sent chat message by its chat line id + * + * @param chatLineId the chat line id of the message to be deleted + */ + deleteChat(chatLineId: number): void; + /** + * Deletes an already sent chat message given a callback that receives + * [TextComponent] instances + * + * @param matcher a function that accepts a [TextComponent] and returns a boolean + */ + deleteChat(matcher: kotlin.Function1): void; + /** + * Gets the previous 1000 lines of chat + * + * @return A list of the last 1000 chat lines + */ + getChatLines(): Array; + /** + * Adds a message to the player's chat history. This allows the message to + * show up for the player when pressing the up/down keys while in the chat gui + * + * @param index the index to insert the message + * @param message the message to add to chat history + */ + addToSentMessageHistory(message: string): void; + /** + * Adds a message to the player's chat history. This allows the message to + * show up for the player when pressing the up/down keys while in the chat gui + * + * @param index the index to insert the message + * @param message the message to add to chat history + */ + addToSentMessageHistory(index: number, message: string): void; + new(): com.chattriggers.ctjs.api.message.ChatLib; + } + interface ChatLib { + /** + * Prints text in the chat. + * The text can be a String or a [TextComponent] + * + * @param text the text to be printed + */ + chat(text: any | null | undefined): void; + /** + * Shows text in the action bar. + * The text can be a String or a [TextComponent] + * + * @param text the text to show + */ + actionBar(text: any | null | undefined): void; + /** + * Simulates a chat message to be caught by other triggers for testing. + * The text can be a String or a [TextComponent] + * + * @param text The message to simulate + */ + simulateChat(text: any | null | undefined): void; + /** + * Replaces the easier to type '&' color codes with proper color codes in a string. + * + * @param message The string to add color codes to + * @return the formatted message + */ + addColor(message: string | null | undefined): string; + /** + * Says chat message. + * This message is actually sent to the server. + * + * @param text the message to be sent + */ + say(text: string): void; + /** + * Runs a command. + * + * @param text the command to run, without the leading slash (Ex. "help") + * @param clientSide should the command be run as a client side command + */ + command(text: string): void; + /** + * Runs a command. + * + * @param text the command to run, without the leading slash (Ex. "help") + * @param clientSide should the command be run as a client side command + */ + command(text: string, clientSide: boolean): void; + /** + * Clear all chat messages + */ + clearChat(): void; + /** + * Get a message that will be perfectly one line of chat, + * the separator repeated as many times as necessary. + * The separator defaults to "-" + * + * @param separator the message to split chat with + * @return the message that would split chat + */ + getChatBreak(): string; + /** + * Get a message that will be perfectly one line of chat, + * the separator repeated as many times as necessary. + * The separator defaults to "-" + * + * @param separator the message to split chat with + * @return the message that would split chat + */ + getChatBreak(separator: string): string; + /** + * Gets the width of Minecraft's chat + * + * @return the width of chat + */ + getChatWidth(): number; + /** + * Remove all formatting + * + * @param text the string to un-format + * @return the unformatted string + */ + removeFormatting(text: string): string; + /** + * Replaces Minecraft formatted text with normal formatted text + * + * @param text the formatted string + * @return the unformatted string + */ + replaceFormatting(text: string): string; + /** + * Get a message that will be perfectly centered in chat. + * + * @param text the text to be centered + * @return the centered message + */ + getCenteredText(text: string): string; + /** + * Copies the given String to the user's clipboard + * + * @param text the text to copy + */ + copyToClipboard(text: string): void; + /** + * Edits an already sent chat message matched by [regexp]. + * + * @param regexp the regex object to match to the message + * @param replacements the new message(s) to be put in replace of the old one + */ + editChat(regexp: org.mozilla.javascript.regexp.NativeRegExp, replacements: any): void; + /** + * Edits an already sent chat message by the text of the chat + * + * @param toReplace the unformatted text of the message to be replaced + * @param replacements the new message(s) to be put in place of the old one + */ + editChat(toReplace: string, replacements: any): void; + /** + * Edits an already sent chat message by the [TextComponent] + * + * @param toReplace the message to be replaced + * @param replacements the new message(s) to be put in place of the old one + */ + editChat(toReplace: com.chattriggers.ctjs.api.message.TextComponent, replacements: any): void; + /** + * Edits an already sent chat message by its chat line id + * + * @param chatLineId the chat line id of the message to be replaced + * @param replacements the new message(s) to be put in place of the old one + */ + editChat(chatLineId: number, replacements: any): void; + /** + * Edits an already sent chat message by given a callback that receives + * [TextComponent] instances + * + * @param matcher a function that accepts a [TextComponent] and returns a boolean + * @param replacements the new message(s) to be put in place of the old one + */ + editChat(matcher: kotlin.Function1, replacements: any): void; + /** + * Deletes an already sent chat message matching [regexp]. + * + * @param regexp the regex object to match to the message + */ + deleteChat(regexp: org.mozilla.javascript.regexp.NativeRegExp): void; + /** + * Deletes an already sent chat message by the text of the chat + * + * @param toDelete the unformatted text of the message to be deleted + */ + deleteChat(toDelete: string): void; + /** + * Deletes an already sent chat message by the [TextComponent] + * + * @param toDelete the message to be deleted + */ + deleteChat(toDelete: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Deletes an already sent chat message by its chat line id + * + * @param chatLineId the chat line id of the message to be deleted + */ + deleteChat(chatLineId: number): void; + /** + * Deletes an already sent chat message given a callback that receives + * [TextComponent] instances + * + * @param matcher a function that accepts a [TextComponent] and returns a boolean + */ + deleteChat(matcher: kotlin.Function1): void; + /** + * Gets the previous 1000 lines of chat + * + * @return A list of the last 1000 chat lines + */ + getChatLines(): Array; + /** + * Adds a message to the player's chat history. This allows the message to + * show up for the player when pressing the up/down keys while in the chat gui + * + * @param index the index to insert the message + * @param message the message to add to chat history + */ + addToSentMessageHistory(message: string): void; + /** + * Adds a message to the player's chat history. This allows the message to + * show up for the player when pressing the up/down keys while in the chat gui + * + * @param index the index to insert the message + * @param message the message to add to chat history + */ + addToSentMessageHistory(index: number, message: string): void; + new(): com.chattriggers.ctjs.api.message.ChatLib; + } + const Chat: { + sendGradientMsg(prefix: string, startRgb: number, endRgb: number, messages: any): void; + new(): com.chattriggers.ctjs.api.message.Chat; + } + interface Chat { + sendGradientMsg(prefix: string, startRgb: number, endRgb: number, messages: any): void; + new(): com.chattriggers.ctjs.api.message.Chat; + } + } + namespace world { + namespace block { + const BlockType: { + new(mcValue: net.minecraft.world.level.block.Block): com.chattriggers.ctjs.api.world.block.BlockType; + new(block: com.chattriggers.ctjs.api.world.block.BlockType): com.chattriggers.ctjs.api.world.block.BlockType; + new(blockName: string): com.chattriggers.ctjs.api.world.block.BlockType; + new(blockID: number): com.chattriggers.ctjs.api.world.block.BlockType; + new(item: com.chattriggers.ctjs.api.inventory.Item): com.chattriggers.ctjs.api.world.block.BlockType; + } + interface BlockType extends com.chattriggers.ctjs.api.CTWrapper { + /** + * Returns a [Block] based on this block and the + * provided BlockPos + * + * @param blockPos the block position + * @return a [Block] object + */ + withBlockPos(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): com.chattriggers.ctjs.api.world.block.Block; + getID(): number; + /** + * Gets the block's registry name. + * Example: minecraft:oak_planks + * + * @return the block's registry name + */ + getRegistryName(): string; + /** + * Gets the block's translation key. + * Example: block.minecraft.oak_planks + * + * @return the block's translation key + */ + getTranslationKey(): string; + /** + * Gets the block's localized name. + * Example: Wooden Planks + * + * @return the block's localized name + */ + getName(): string; + getLightValue(): number; + getDefaultState(): net.minecraft.world.level.block.state.BlockState; + canProvidePower(): boolean; + isTranslucent(): boolean; + } + const BlockPos: { + new(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.BlockPos; + new(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.BlockPos; + new(pos: com.chattriggers.ctjs.api.vec.Vec3i): com.chattriggers.ctjs.api.world.block.BlockPos; + new(pos: net.minecraft.core.BlockPos): com.chattriggers.ctjs.api.world.block.BlockPos; + new(source: com.chattriggers.ctjs.api.entity.Entity): com.chattriggers.ctjs.api.world.block.BlockPos; + } + interface BlockPos extends com.chattriggers.ctjs.api.vec.Vec3i, com.chattriggers.ctjs.api.CTWrapper { + up(): com.chattriggers.ctjs.api.world.block.BlockPos; + up(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; + down(): com.chattriggers.ctjs.api.world.block.BlockPos; + down(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; + north(): com.chattriggers.ctjs.api.world.block.BlockPos; + north(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; + south(): com.chattriggers.ctjs.api.world.block.BlockPos; + south(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; + east(): com.chattriggers.ctjs.api.world.block.BlockPos; + east(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; + west(): com.chattriggers.ctjs.api.world.block.BlockPos; + west(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; + offset(facing: com.chattriggers.ctjs.api.world.block.BlockFace): com.chattriggers.ctjs.api.world.block.BlockPos; + offset(facing: com.chattriggers.ctjs.api.world.block.BlockFace, n: number): com.chattriggers.ctjs.api.world.block.BlockPos; + distanceTo(other: com.chattriggers.ctjs.api.world.block.BlockPos): number; + toVec3d(): net.minecraft.world.phys.Vec3; + } + const BlockFace: { + DOWN: com.chattriggers.ctjs.api.world.block.BlockFace; + UP: com.chattriggers.ctjs.api.world.block.BlockFace; + NORTH: com.chattriggers.ctjs.api.world.block.BlockFace; + SOUTH: com.chattriggers.ctjs.api.world.block.BlockFace; + WEST: com.chattriggers.ctjs.api.world.block.BlockFace; + EAST: com.chattriggers.ctjs.api.world.block.BlockFace; + Plane: typeof com.chattriggers.ctjs.api.world.block.BlockFace$Plane; + AxisDirection: typeof com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; + Axis: typeof com.chattriggers.ctjs.api.world.block.BlockFace$Axis; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace; + } + interface BlockFace extends kotlin.Enum, net.minecraft.util.StringRepresentable, com.chattriggers.ctjs.api.CTWrapper { + getAxisDirection(): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; + getAxis(): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; + getDirectionVec(): com.chattriggers.ctjs.api.vec.Vec3i; + getOpposite(): com.chattriggers.ctjs.api.world.block.BlockFace; + getOffsetX(): number; + getOffsetY(): number; + getOffsetZ(): number; + rotateAround(axis: com.chattriggers.ctjs.api.world.block.BlockFace$Axis): com.chattriggers.ctjs.api.world.block.BlockFace; + rotateX(): com.chattriggers.ctjs.api.world.block.BlockFace; + rotateY(): com.chattriggers.ctjs.api.world.block.BlockFace; + rotateZ(): com.chattriggers.ctjs.api.world.block.BlockFace; + } + const BlockFace$AxisDirection: { + POSITIVE: com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; + NEGATIVE: com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; + } + interface BlockFace$AxisDirection extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + getOffset(): number; + } + const BlockFace$AxisDirection$Companion: { + fromMC(axisDirection: net.minecraft.core.Direction$AxisDirection): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; + new(): unknown; + } + interface BlockFace$AxisDirection$Companion { + fromMC(axisDirection: net.minecraft.core.Direction$AxisDirection): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; + new(): unknown; + } + const BlockFace$Axis: { + X: com.chattriggers.ctjs.api.world.block.BlockFace$Axis; + Y: com.chattriggers.ctjs.api.world.block.BlockFace$Axis; + Z: com.chattriggers.ctjs.api.world.block.BlockFace$Axis; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; + } + interface BlockFace$Axis extends kotlin.Enum, net.minecraft.util.StringRepresentable, com.chattriggers.ctjs.api.CTWrapper { + getPlane(): com.chattriggers.ctjs.api.world.block.BlockFace$Plane; + isHorizontal(): boolean; + isVertical(): boolean; + } + const BlockFace$Plane: { + HORIZONTAL: com.chattriggers.ctjs.api.world.block.BlockFace$Plane; + VERTICAL: com.chattriggers.ctjs.api.world.block.BlockFace$Plane; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$Plane; + } + interface BlockFace$Plane extends kotlin.Enum, kotlin.collections.Iterable { + facings(): Array; + } + const BlockFace$Axis$Companion: { + fromMC(axis: net.minecraft.core.Direction$Axis): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; + new(): unknown; + } + interface BlockFace$Axis$Companion { + fromMC(axis: net.minecraft.core.Direction$Axis): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; + new(): unknown; + } + const BlockFace$Companion: { + fromMC(facing: net.minecraft.core.Direction): com.chattriggers.ctjs.api.world.block.BlockFace; + new(): com.chattriggers.ctjs.api.world.block.BlockFace$Companion; + } + interface BlockFace$Companion { + fromMC(facing: net.minecraft.core.Direction): com.chattriggers.ctjs.api.world.block.BlockFace; + new(): com.chattriggers.ctjs.api.world.block.BlockFace$Companion; + } + const Block: { + new(type: com.chattriggers.ctjs.api.world.block.BlockType, pos: com.chattriggers.ctjs.api.world.block.BlockPos, face: com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined): com.chattriggers.ctjs.api.world.block.Block; + } + interface Block { + getType(): com.chattriggers.ctjs.api.world.block.BlockType; + getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; + getFace(): com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined; + getX(): number; + getY(): number; + getZ(): number; + withType(type: com.chattriggers.ctjs.api.world.block.BlockType): com.chattriggers.ctjs.api.world.block.Block; + withPos(pos: com.chattriggers.ctjs.api.world.block.BlockPos): com.chattriggers.ctjs.api.world.block.Block; + /** + * Narrows this block to reference a certain face. Used by + * [Player.lookingAt] to specify the block face + * being looked at. + */ + withFace(face: com.chattriggers.ctjs.api.world.block.BlockFace): com.chattriggers.ctjs.api.world.block.Block; + getState(): net.minecraft.world.level.block.state.BlockState | null | undefined; + isEmittingPower(): boolean; + isEmittingPower(face: com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined): boolean; + getEmittingPower(): number; + getEmittingPower(face: com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined): number; + isReceivingPower(): boolean; + getReceivingPower(): number; + /** + * Checks whether the block can be mined with the tool in the player's hand + * + * @return whether the block can be mined + */ + canBeHarvested(): boolean; + canBeHarvestedWith(item: com.chattriggers.ctjs.api.inventory.Item): boolean; + } + } + namespace pathfinding { + const HypixelManager: { + new(): com.chattriggers.ctjs.api.world.pathfinding.HypixelManager; + } + interface HypixelManager { + new(): com.chattriggers.ctjs.api.world.pathfinding.HypixelManager; + init(): void; + onDisconnect(): void; + } + const NativeStateEncoder: { + flagsForStateId(stateId: number): number; + flagsForState(state: net.minecraft.world.level.block.state.BlockState): number; + flagsShortForState(state: net.minecraft.world.level.block.state.BlockState): number; + flagsShortForStateId(stateId: number): number; + new(): com.chattriggers.ctjs.api.world.pathfinding.NativeStateEncoder; + } + interface NativeStateEncoder { + flagsForStateId(stateId: number): number; + flagsForState(state: net.minecraft.world.level.block.state.BlockState): number; + flagsShortForState(state: net.minecraft.world.level.block.state.BlockState): number; + flagsShortForStateId(stateId: number): number; + new(): com.chattriggers.ctjs.api.world.pathfinding.NativeStateEncoder; + } + const NativeVoxelFlags: { + new(): com.chattriggers.ctjs.api.world.pathfinding.NativeVoxelFlags; + } + interface NativeVoxelFlags { + new(): com.chattriggers.ctjs.api.world.pathfinding.NativeVoxelFlags; + getPASSABLE(): number; + getSOLID(): number; + getPASSABLE_FLY(): number; + getBLOCKING_WALL(): number; + getFLUID(): number; + getSLAB_BOTTOM(): number; + getSLAB_TOP(): number; + getFENCE_LIKE(): number; + getSTAIRS_BOTTOM(): number; + getCARPET_LIKE(): number; + getETHER_PASSABLE(): number; + getETHER_TELEPORT_CLEAR(): number; + getETHER_FEET_BLOCKER(): number; + } + const WorldSerializer: { + new(): com.chattriggers.ctjs.api.world.pathfinding.WorldSerializer; + } + interface WorldSerializer { + new(): com.chattriggers.ctjs.api.world.pathfinding.WorldSerializer; + save(name: string, chunks: Map): void; + load(name: string): java.util.concurrent.ConcurrentHashMap | null | undefined; + } + const CachedChunk: { + minY: number; + maxY: number; + ready: boolean; + new(minY: number, maxY: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk; + } + interface CachedChunk { + getFlags(localX: number, y: number, localZ: number): number; + setFlags(localX: number, y: number, localZ: number, flags: number): void; + hasSection(index: number): boolean; + copySectionFlags(index: number, dest: Array, destOffset: number): void; + setSection(sectionIndex: number, data: Array): void; + } + const CachedChunk$Companion: { + AIR_FLAGS: number; + new(): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk$Companion; + } + interface CachedChunk$Companion { + AIR_FLAGS: number; + new(): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk$Companion; + } + const EtherwarpLandingCandidatesResult: { + goals: Array; + centers: kotlin.DoubleArray; + new(goals: Array, centers: kotlin.DoubleArray): com.chattriggers.ctjs.api.world.pathfinding.EtherwarpLandingCandidatesResult; + } + interface EtherwarpLandingCandidatesResult { + } + const NativeEtherwarpResult: { + path: Array; + angles: kotlin.FloatArray; + timeMs: number; + nodesExplored: number; + nanosecondsPerNode: number; + new(path: Array, angles: kotlin.FloatArray, timeMs: number, nodesExplored: number, nanosecondsPerNode: number): com.chattriggers.ctjs.api.world.pathfinding.NativeEtherwarpResult; + } + interface NativeEtherwarpResult { + } + const NativePathfinderBridge: { + NativePathSearchRequest: typeof com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest; + NativeEtherwarpSearchRequest: typeof com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest; + isAvailable(): boolean; + getLastError(): string | null | undefined; + setWorld(worldKey: string, minY: number, maxY: number): void; + clearWorld(): void; + upsertChunk(chunkX: number, chunkZ: number, minY: number, maxY: number, sectionMask: number, sectionFlags: Array): void; + applyBlockUpdates(updates: Array): void; + findPath(request: com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest): com.chattriggers.ctjs.api.world.pathfinding.NativePathResult | null | undefined; + findEtherwarpPath(request: com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest): com.chattriggers.ctjs.api.world.pathfinding.NativeEtherwarpResult | null | undefined; + cancelSearch(): void; + new(): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge; + } + interface NativePathfinderBridge { + isAvailable(): boolean; + getLastError(): string | null | undefined; + setWorld(worldKey: string, minY: number, maxY: number): void; + clearWorld(): void; + upsertChunk(chunkX: number, chunkZ: number, minY: number, maxY: number, sectionMask: number, sectionFlags: Array): void; + applyBlockUpdates(updates: Array): void; + findPath(request: com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest): com.chattriggers.ctjs.api.world.pathfinding.NativePathResult | null | undefined; + findEtherwarpPath(request: com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest): com.chattriggers.ctjs.api.world.pathfinding.NativeEtherwarpResult | null | undefined; + cancelSearch(): void; + new(): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge; + } + const NativePathfinderBridge$NativePathSearchRequest: { + new(startPoints: Array, endPoints: Array, isFly: boolean, maxIterations: number, heuristicWeight: number, nonPrimaryStartPenalty: number, moveOrderOffset: number, avoidMeta: Array, avoidPenalty: kotlin.DoubleArray): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest; + } + interface NativePathfinderBridge$NativePathSearchRequest { + getStartPoints(): Array; + getEndPoints(): Array; + isFly(): boolean; + getMaxIterations(): number; + getHeuristicWeight(): number; + getNonPrimaryStartPenalty(): number; + getMoveOrderOffset(): number; + getAvoidMeta(): Array; + getAvoidPenalty(): kotlin.DoubleArray; + component1(): Array; + component2(): Array; + component3(): boolean; + component4(): number; + component5(): number; + component6(): number; + component7(): number; + component8(): Array; + component9(): kotlin.DoubleArray; + copy(startPoints: Array, endPoints: Array, isFly: boolean, maxIterations: number, heuristicWeight: number, nonPrimaryStartPenalty: number, moveOrderOffset: number, avoidMeta: Array, avoidPenalty: kotlin.DoubleArray): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest; + } + const NativePathResult: { + path: Array; + keyPath: Array; + timeMs: number; + nodesExplored: number; + nanosecondsPerNode: number; + selectedStartIndex: number; + pathFlags: Array; + keyNodeFlags: Array; + keyNodeMetrics: Array; + pathSignature: string; + new(path: Array, keyPath: Array, timeMs: number, nodesExplored: number, nanosecondsPerNode: number, selectedStartIndex: number, pathFlags: Array, keyNodeFlags: Array, keyNodeMetrics: Array, pathSignature: string): com.chattriggers.ctjs.api.world.pathfinding.NativePathResult; + } + interface NativePathResult { + } + const NativePathfinderBridge$NativeEtherwarpSearchRequest: { + new(goalX: number, goalY: number, goalZ: number, startEyeX: number, startEyeY: number, startEyeZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest; + } + interface NativePathfinderBridge$NativeEtherwarpSearchRequest { + getGoalX(): number; + getGoalY(): number; + getGoalZ(): number; + getStartEyeX(): number; + getStartEyeY(): number; + getStartEyeZ(): number; + getMaxIterations(): number; + getThreadCount(): number; + getYawStep(): number; + getPitchStep(): number; + getNewNodeCost(): number; + getHeuristicWeight(): number; + getRayLength(): number; + getRewireEpsilon(): number; + getEyeHeight(): number; + component1(): number; + component2(): number; + component3(): number; + component4(): number; + component5(): number; + component6(): number; + component7(): number; + component8(): number; + component9(): number; + component10(): number; + component11(): number; + component12(): number; + component13(): number; + component14(): number; + component15(): number; + copy(goalX: number, goalY: number, goalZ: number, startEyeX: number, startEyeY: number, startEyeZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest; + } + const PathManager: { + isSearching(): boolean; + findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number): boolean; + findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number): boolean; + findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number, isFly: boolean): boolean; + findPath(startPoints: Array>, endPoints: Array>): boolean; + findPath(startPoints: Array>, endPoints: Array>, maxIterations: number): boolean; + findPath(startPoints: Array>, endPoints: Array>, maxIterations: number, isFly: boolean): boolean; + findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array): boolean; + findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array, maxIterations: number): boolean; + findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array, maxIterations: number, isFly: boolean): boolean; + findFlyPath(startPoints: Array>, endPoints: Array>): boolean; + findFlyPath(startPoints: Array>, endPoints: Array>, maxIterations: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): boolean; + isFlyPositionClear(x: number, y: number, z: number): boolean; + isValidEtherwarpLanding(x: number, y: number, z: number): boolean; + getEtherwarpLandingCenter(x: number, y: number, z: number): kotlin.DoubleArray | null | undefined; + getEtherwarpLandingCandidates(anchorX: number, anchorY: number, anchorZ: number, radius: number, maxDistance: number, sortOriginX: number, sortOriginY: number, sortOriginZ: number): com.chattriggers.ctjs.api.world.pathfinding.EtherwarpLandingCandidatesResult | null | undefined; + getCurrentEtherwarpEyeHeight(): number; + getCurrentEtherwarpSneakOffset(): number; + cancelSearch(): void; + getPathArray(): Array; + getKeyNodesArray(): Array; + getEtherwarpPathArray(): Array; + getEtherwarpAnglesArray(): kotlin.FloatArray; + getPathFlagsArray(): Array; + getKeyNodeFlagsArray(): Array; + getKeyNodeMetricsArray(): Array; + getPathSignature(): string; + getPathFlagBits(): Array; + getEtherwarpVoxelFlagsAt(x: number, y: number, z: number): number; + isEtherwarpSupportSolid(flags: number): boolean; + getEtherwarpStandOffsetForFlags(flags: number): number; + isEtherwarpTeleportSpaceClearFlags(flags: number): boolean; + addTransientAvoidPoint(x: number, y: number, z: number): void; + addTransientAvoidPoint(x: number, y: number, z: number, radius: number): void; + addTransientAvoidPoint(x: number, y: number, z: number, radius: number, penalty: number): void; + addTransientAvoidPoint(x: number, y: number, z: number, radius: number, penalty: number, ttlSearches: number): void; + addTransientAvoidPoints(points: Array): void; + addTransientAvoidPoints(points: Array, radius: number): void; + addTransientAvoidPoints(points: Array, radius: number, penalty: number): void; + addTransientAvoidPoints(points: Array, radius: number, penalty: number, ttlSearches: number): void; + clearTransientAvoidPoints(): void; + getPathSize(): number; + getEtherwarpPathSize(): number; + getKeyNodeCount(): number; + getLastTimeMs(): number; + getEtherwarpLastTimeMs(): number; + getNodesExplored(): number; + getEtherwarpNodesExplored(): number; + getNanosecondsPerNode(): number; + getEtherwarpNanosecondsPerNode(): number; + getSelectedStartIndex(): number; + setSearchVariantSeed(seed: number): void; + getLastError(): string | null | undefined; + hasPath(): boolean; + hasEtherwarpPath(): boolean; + clear(): void; + new(): com.chattriggers.ctjs.api.world.pathfinding.PathManager; + } + interface PathManager { + isSearching(): boolean; + findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number): boolean; + findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number): boolean; + findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number, isFly: boolean): boolean; + findPath(startPoints: Array>, endPoints: Array>): boolean; + findPath(startPoints: Array>, endPoints: Array>, maxIterations: number): boolean; + findPath(startPoints: Array>, endPoints: Array>, maxIterations: number, isFly: boolean): boolean; + findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array): boolean; + findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array, maxIterations: number): boolean; + findPathMultipleGoals(startX: number, startY: number, startZ: number, endGoals: Array, maxIterations: number, isFly: boolean): boolean; + findFlyPath(startPoints: Array>, endPoints: Array>): boolean; + findFlyPath(startPoints: Array>, endPoints: Array>, maxIterations: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number): boolean; + findEtherwarpPath(goalX: number, goalY: number, goalZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): boolean; + isFlyPositionClear(x: number, y: number, z: number): boolean; + isValidEtherwarpLanding(x: number, y: number, z: number): boolean; + getEtherwarpLandingCenter(x: number, y: number, z: number): kotlin.DoubleArray | null | undefined; + getEtherwarpLandingCandidates(anchorX: number, anchorY: number, anchorZ: number, radius: number, maxDistance: number, sortOriginX: number, sortOriginY: number, sortOriginZ: number): com.chattriggers.ctjs.api.world.pathfinding.EtherwarpLandingCandidatesResult | null | undefined; + getCurrentEtherwarpEyeHeight(): number; + getCurrentEtherwarpSneakOffset(): number; + cancelSearch(): void; + getPathArray(): Array; + getKeyNodesArray(): Array; + getEtherwarpPathArray(): Array; + getEtherwarpAnglesArray(): kotlin.FloatArray; + getPathFlagsArray(): Array; + getKeyNodeFlagsArray(): Array; + getKeyNodeMetricsArray(): Array; + getPathSignature(): string; + getPathFlagBits(): Array; + getEtherwarpVoxelFlagsAt(x: number, y: number, z: number): number; + isEtherwarpSupportSolid(flags: number): boolean; + getEtherwarpStandOffsetForFlags(flags: number): number; + isEtherwarpTeleportSpaceClearFlags(flags: number): boolean; + addTransientAvoidPoint(x: number, y: number, z: number): void; + addTransientAvoidPoint(x: number, y: number, z: number, radius: number): void; + addTransientAvoidPoint(x: number, y: number, z: number, radius: number, penalty: number): void; + addTransientAvoidPoint(x: number, y: number, z: number, radius: number, penalty: number, ttlSearches: number): void; + addTransientAvoidPoints(points: Array): void; + addTransientAvoidPoints(points: Array, radius: number): void; + addTransientAvoidPoints(points: Array, radius: number, penalty: number): void; + addTransientAvoidPoints(points: Array, radius: number, penalty: number, ttlSearches: number): void; + clearTransientAvoidPoints(): void; + getPathSize(): number; + getEtherwarpPathSize(): number; + getKeyNodeCount(): number; + getLastTimeMs(): number; + getEtherwarpLastTimeMs(): number; + getNodesExplored(): number; + getEtherwarpNodesExplored(): number; + getNanosecondsPerNode(): number; + getEtherwarpNanosecondsPerNode(): number; + getSelectedStartIndex(): number; + setSearchVariantSeed(seed: number): void; + getLastError(): string | null | undefined; + hasPath(): boolean; + hasEtherwarpPath(): boolean; + clear(): void; + new(): com.chattriggers.ctjs.api.world.pathfinding.PathManager; + getFLAG_FLUID_FEET(): number; + getFLAG_FLUID_HEAD(): number; + getFLAG_LOW_HEADROOM(): number; + getFLAG_NEAR_EDGE(): number; + getFLAG_NEAR_WALL(): number; + getFLAG_STEP_UP_NEXT(): number; + getFLAG_DROP_NEXT(): number; + getFLAG_TIGHT_CORRIDOR(): number; + getETHERWARP_VOXEL_SOLID(): number; + getETHERWARP_VOXEL_FENCE_LIKE(): number; + getETHERWARP_VOXEL_TELEPORT_CLEAR(): number; + getETHERWARP_VOXEL_FEET_BLOCKER(): number; + } + const Swift: { + new(): com.chattriggers.ctjs.api.world.pathfinding.Swift; + } + interface Swift extends net.fabricmc.api.ClientModInitializer { + } + const Swift$Companion: { + executor: java.util.concurrent.ExecutorService; + new(): com.chattriggers.ctjs.api.world.pathfinding.Swift$Companion; + } + interface Swift$Companion { + executor: java.util.concurrent.ExecutorService; + new(): com.chattriggers.ctjs.api.world.pathfinding.Swift$Companion; + getCHUNKS_PER_TICK(): number; + getMAXIMUM_CACHED_CHUNKS(): number; + } + const WynncraftManager: { + new(): com.chattriggers.ctjs.api.world.pathfinding.WynncraftManager; + } + interface WynncraftManager { + new(): com.chattriggers.ctjs.api.world.pathfinding.WynncraftManager; + init(): void; + onDisconnect(): void; + } + const CachedWorld: { + getBlockFlags(x: number, y: number, z: number): number | null | undefined; + getChunk(x: number, z: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk | null | undefined; + new(): com.chattriggers.ctjs.api.world.pathfinding.CachedWorld; + } + interface CachedWorld { + getBlockFlags(x: number, y: number, z: number): number | null | undefined; + getChunk(x: number, z: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk | null | undefined; + new(): com.chattriggers.ctjs.api.world.pathfinding.CachedWorld; + onPacketReceive(packet: net.minecraft.network.protocol.Packet): void; + processPendingChunks(): void; + saveAndClear(lobbyName: string): void; + load(lobbyName: string): void; + waitForLoad(): void; + clear(): void; + getCacheStats(): string; + setUnlimitedChunkCache(enabled: boolean): void; + setWorldKey(newWorldKey: string | null | undefined): void; + } + } + const Chunk: { + new(mcValue: net.minecraft.world.level.chunk.ChunkAccess): com.chattriggers.ctjs.api.world.Chunk; + } + interface Chunk extends com.chattriggers.ctjs.api.CTWrapper { + /** + * Gets the x position of the chunk + */ + getX(): number; + /** + * Gets the z position of the chunk + */ + getZ(): number; + /** + * Gets the minimum x coordinate of a block in the chunk + * + * @return the minimum x coordinate + */ + getMinBlockX(): number; + /** + * Gets the minimum z coordinate of a block in the chunk + * + * @return the minimum z coordinate + */ + getMinBlockZ(): number; + /** + * Gets every entity in this chunk + * + * @return the entity list + */ + getAllEntities(): Array; + /** + * Gets every entity in this chunk of a certain class + * + * @param clazz the class to filter for (Use `Java.type().class` to get this) + * @return the entity list + */ + getAllEntitiesOfType(clazz: java.lang.Class): Array; + /** + * Gets every block entity in this chunk + * + * @return the block entity list + */ + getAllBlockEntities(): Array; + /** + * Gets every block entity in this chunk of a certain class + * + * @param clazz the class to filter for (Use `Java.type().class` to get this) + * @return the block entity list + */ + getAllBlockEntitiesOfType(clazz: java.lang.Class): Array; + } + const PotionEffectType: { + new(type: net.minecraft.world.effect.MobEffect): com.chattriggers.ctjs.api.world.PotionEffectType; + } + interface PotionEffectType { + getType(): net.minecraft.world.effect.MobEffect; + /** + * The Int associated with this type + */ + getRawId(): number; + /** + * Whether this effect is instant (e.g. instant health) + */ + isInstant(): boolean; + /** + * The raw key used for this effect type + */ + getTranslationKey(): string; + /** + * The user-friendly name of this type as a [TextComponent] + */ + getName(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * The [net.minecraft.entity.effect.StatusEffectCategory] of this type + */ + getCategory(): net.minecraft.world.effect.MobEffectCategory; + /** + * The color of this type + */ + getColor(): java.awt.Color; + } + const PotionEffect: { + new(effect: net.minecraft.world.effect.MobEffectInstance): com.chattriggers.ctjs.api.world.PotionEffect; + } + interface PotionEffect { + getEffect(): net.minecraft.world.effect.MobEffectInstance; + /** + * The type of this potion + */ + getType(): com.chattriggers.ctjs.api.world.PotionEffectType; + /** + * Returns the translation key of the potion. + * Ex: "potion.poison" + */ + getName(): string; + /** + * Returns the localized name of the potion that + * is displayed in the player's inventory. + * Ex: "Poison" + */ + getLocalizedName(): string; + getAmplifier(): number; + getDuration(): number; + getId(): number; + getAmbient(): boolean; + isInfinite(): boolean; + getShowsParticles(): boolean; + } + const BossBars: { + BossBar: typeof com.chattriggers.ctjs.api.world.BossBars$BossBar; + Color: typeof com.chattriggers.ctjs.api.world.BossBars$Color; + Style: typeof com.chattriggers.ctjs.api.world.BossBars$Style; + toMC(): net.minecraft.client.gui.components.BossHealthOverlay; + /** + * Gets the list of currently shown [BossBar]s + * + * @return the currently displayed [BossBar]s + */ + getBossBars(): Array; + /** + * Gets all [BossBar]s with a given name + * + * @param name the name to match + * @return the [BossBar]s + */ + getBossBarsByName(name: string): Array; + /** + * Adds a new [BossBar] to be displayed + * + * Takes a parameter with the following options: + * - name: The name to appear above the BossBar. Defaults to an empty string + * - percent: The percent full the BossBar is. Defaults to 1 (full health) + * - color: The color of the BossBar. Can be any [Color], but defaults to white + * - sections: The number of notches/sections to appear on the BossBar. Can be any [Style], but + * defaults to 1 entire section + * - darkenSky: Whether the BossBar should darken the screen of the player. Defaults to false + * - dragonMusic: Whether the BossBar should play dragon music while in the End. Defaults to false + * - thickenFog: Whether the BossBar should thicken the fog around the player. Defaults to false + * + * @param obj An options bag + * + * @return the [BossBar] for further modification + */ + addBossBar(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.world.BossBars$BossBar; + /** + * Clears all [BossBar]s on screen + */ + clearBossBars(): void; + /** + * Removes all [BossBar]s with the given name + * + * @param name the name to match + */ + removeBossBarsByName(name: string): void; + /** + * Removes the given [BossBar] + * + * @param bossBar the BossBar to remove + */ + removeBossBar(bossBar: com.chattriggers.ctjs.api.world.BossBars$BossBar): void; + new(): com.chattriggers.ctjs.api.world.BossBars; + } + interface BossBars { + toMC(): net.minecraft.client.gui.components.BossHealthOverlay; + /** + * Gets the list of currently shown [BossBar]s + * + * @return the currently displayed [BossBar]s + */ + getBossBars(): Array; + /** + * Gets all [BossBar]s with a given name + * + * @param name the name to match + * @return the [BossBar]s + */ + getBossBarsByName(name: string): Array; + /** + * Adds a new [BossBar] to be displayed + * + * Takes a parameter with the following options: + * - name: The name to appear above the BossBar. Defaults to an empty string + * - percent: The percent full the BossBar is. Defaults to 1 (full health) + * - color: The color of the BossBar. Can be any [Color], but defaults to white + * - sections: The number of notches/sections to appear on the BossBar. Can be any [Style], but + * defaults to 1 entire section + * - darkenSky: Whether the BossBar should darken the screen of the player. Defaults to false + * - dragonMusic: Whether the BossBar should play dragon music while in the End. Defaults to false + * - thickenFog: Whether the BossBar should thicken the fog around the player. Defaults to false + * + * @param obj An options bag + * + * @return the [BossBar] for further modification + */ + addBossBar(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.world.BossBars$BossBar; + /** + * Clears all [BossBar]s on screen + */ + clearBossBars(): void; + /** + * Removes all [BossBar]s with the given name + * + * @param name the name to match + */ + removeBossBarsByName(name: string): void; + /** + * Removes the given [BossBar] + * + * @param bossBar the BossBar to remove + */ + removeBossBar(bossBar: com.chattriggers.ctjs.api.world.BossBars$BossBar): void; + new(): com.chattriggers.ctjs.api.world.BossBars; + } + const BossBars$BossBar: { + new(mcValue: net.minecraft.client.gui.components.LerpingBossEvent): com.chattriggers.ctjs.api.world.BossBars$BossBar; + } + interface BossBars$BossBar extends com.chattriggers.ctjs.api.CTWrapper { + /** + * Gets the UUID of this BossBar + * + * @return the uuid + */ + getUUID(): java.util.UUID; + /** + * Gets the name of this BossBar + * + * @return the name + */ + getName(): string; + /** + * Sets the name of this BossBar + * + * @param name the name to set + */ + setName(name: string): com.chattriggers.ctjs.api.world.BossBars$BossBar; + /** + * Gets how full this BossBar is + * + * @return how full the BossBar is + */ + getPercent(): number; + /** + * Sets how full this BossBar is + * + * @param percent how full to set this BossBar. Must be between 0 and 1 + */ + setPercent(percent: number): com.chattriggers.ctjs.api.world.BossBars$BossBar; + /** + * Gets the [Color] of this BossBar + */ + getColor(): com.chattriggers.ctjs.api.world.BossBars$Color; + /** + * Sets the [Color] of this BossBar + * + * @param color the color to set. Can be [Color], [MCBossBarColor], or a string + */ + setColor(color: any): com.chattriggers.ctjs.api.world.BossBars$BossBar; + /** + * Gets the style of this BossBar. e.g. how many notches are displayed + */ + getStyle(): com.chattriggers.ctjs.api.world.BossBars$Style; + /** + * Sets the style of this BossBar + * + * @param style the style to set. Can be [Style], [MCBossBarStyle], a string, + * or a number of how many notches to put + */ + setStyle(style: any): com.chattriggers.ctjs.api.world.BossBars$BossBar; + /** + * Gets whether this BossBar darkens the sky + */ + shouldDarkenSky(): boolean; + /** + * Sets whether this BossBar should darken the sky + * + * @param darken whether to darken the sky + */ + setShouldDarkenSky(darken: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; + /** + * Gets whether this BossBar will play dragon music. + * This will do nothing when the player is not in the end dimension + */ + hasDragonMusic(): boolean; + /** + * Sets whether this BossBar will play dragon music + * + * @param music whether to play dragon music + */ + setHasDragonMusic(music: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; + /** + * Gets whether this BossBar should thicken the fog around the player + */ + shouldThickenFog(): boolean; + /** + * Sets whether this BossBar should thicken the fog around the player + * + * @param fog whether to thicken the fog + */ + setShouldThickenFog(fog: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; + } + const BossBars$Color: { + PINK: com.chattriggers.ctjs.api.world.BossBars$Color; + BLUE: com.chattriggers.ctjs.api.world.BossBars$Color; + RED: com.chattriggers.ctjs.api.world.BossBars$Color; + GREEN: com.chattriggers.ctjs.api.world.BossBars$Color; + YELLOW: com.chattriggers.ctjs.api.world.BossBars$Color; + PURPLE: com.chattriggers.ctjs.api.world.BossBars$Color; + WHITE: com.chattriggers.ctjs.api.world.BossBars$Color; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.world.BossBars$Color; + } + interface BossBars$Color extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + } + const BossBars$Color$Companion: { + fromMC(mcValue: net.minecraft.world.BossEvent$BossBarColor): com.chattriggers.ctjs.api.world.BossBars$Color; + from(value: any): com.chattriggers.ctjs.api.world.BossBars$Color; + new(): unknown; + } + interface BossBars$Color$Companion { + fromMC(mcValue: net.minecraft.world.BossEvent$BossBarColor): com.chattriggers.ctjs.api.world.BossBars$Color; + from(value: any): com.chattriggers.ctjs.api.world.BossBars$Color; + new(): unknown; + } + const BossBars$Style: { + ONE: com.chattriggers.ctjs.api.world.BossBars$Style; + SIX: com.chattriggers.ctjs.api.world.BossBars$Style; + TEN: com.chattriggers.ctjs.api.world.BossBars$Style; + TWELVE: com.chattriggers.ctjs.api.world.BossBars$Style; + TWENTY: com.chattriggers.ctjs.api.world.BossBars$Style; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.world.BossBars$Style; + } + interface BossBars$Style extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + getSections(): number; + } + const BossBars$Style$Companion: { + fromMC(mcValue: net.minecraft.world.BossEvent$BossBarOverlay): com.chattriggers.ctjs.api.world.BossBars$Style; + from(value: any): com.chattriggers.ctjs.api.world.BossBars$Style; + new(): unknown; + } + interface BossBars$Style$Companion { + fromMC(mcValue: net.minecraft.world.BossEvent$BossBarOverlay): com.chattriggers.ctjs.api.world.BossBars$Style; + from(value: any): com.chattriggers.ctjs.api.world.BossBars$Style; + new(): unknown; + } + const Server: { + toMC(): net.minecraft.client.multiplayer.ServerData | null | undefined; + isSingleplayer(): boolean; + /** + * Gets the current server's IP, or "localhost" if the player + * is in a single-player world. + * + * @return The IP of the current server + */ + getIP(): string; + /** + * Gets the current server's name, or "SinglePlayer" if the player + * is in a single-player world. + * + * @return The name of the current server + */ + getName(): string; + /** + * Gets the current server's MOTD, or "SinglePlayer" if the player + * is in a single-player world. + * + * @return The MOTD of the current server + */ + getMOTD(): string; + /** + * Gets the ping to the current server, or 5 if the player + * is in a single-player world. Returns -1 if not in a world + * + * @return The ping to the current server + */ + getPing(): number; + new(): com.chattriggers.ctjs.api.world.Server; + } + interface Server { + toMC(): net.minecraft.client.multiplayer.ServerData | null | undefined; + isSingleplayer(): boolean; + /** + * Gets the current server's IP, or "localhost" if the player + * is in a single-player world. + * + * @return The IP of the current server + */ + getIP(): string; + /** + * Gets the current server's name, or "SinglePlayer" if the player + * is in a single-player world. + * + * @return The name of the current server + */ + getName(): string; + /** + * Gets the current server's MOTD, or "SinglePlayer" if the player + * is in a single-player world. + * + * @return The MOTD of the current server + */ + getMOTD(): string; + /** + * Gets the ping to the current server, or 5 if the player + * is in a single-player world. Returns -1 if not in a world + * + * @return The ping to the current server + */ + getPing(): number; + new(): com.chattriggers.ctjs.api.world.Server; + } + const World: { + BorderWrapper: typeof com.chattriggers.ctjs.api.world.World$BorderWrapper; + SpawnWrapper: typeof com.chattriggers.ctjs.api.world.World$SpawnWrapper; + ParticleWrapper: typeof com.chattriggers.ctjs.api.world.World$ParticleWrapper; + spawn: com.chattriggers.ctjs.api.world.World$SpawnWrapper; + particle: com.chattriggers.ctjs.api.world.World$ParticleWrapper; + border: com.chattriggers.ctjs.api.world.World$BorderWrapper; + toMC(): net.minecraft.client.multiplayer.ClientLevel | null | undefined; + getWorld(): net.minecraft.client.multiplayer.ClientLevel | null | undefined; + isLoaded(): boolean; + isRaining(): boolean; + getTime(): number; + /** + * Gets the [Block] at a location in the world. + * + * @param x the x position + * @param y the y position + * @param z the z position + * @return the [Block] at the location + */ + getBlockAt(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.Block; + /** + * Gets the [Block] at a location in the world. + * + * @param pos The block position + * @return the [Block] at the location + */ + getBlockAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): com.chattriggers.ctjs.api.world.block.Block; + getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): Array; + getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number, types: Array): Array; + /** + * Gets the [BlockState] at a location in the world. + * + * @param pos The block position + * @return the [BlockState] at the location + */ + getBlockStateAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): net.minecraft.world.level.block.state.BlockState; + /** + * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @return the skylight level at the location + */ + getSkyLightLevel(x: number, y: number, z: number): number; + /** + * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu + * + * @param pos The block position + * @return the skylight level at the location + */ + getSkyLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; + /** + * Gets the block light level at the given position. This is the value seen in the debug (F3) menu + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @return the block light level at the location + */ + getBlockLightLevel(x: number, y: number, z: number): number; + /** + * Gets the block light level at the given position. This is the value seen in the debug (F3) menu + * + * @param pos The block position + * @return the block light level at the location + */ + getBlockLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; + /** + * Gets all of the players in the world, and returns their wrapped versions. + * + * @return the players + */ + getAllPlayers(): Array; + /** + * Gets a player by their username, must be in the currently loaded chunks! + * + * @param name the username + * @return the player with said username, or null if they don't exist. + */ + getPlayerByName(name: string): com.chattriggers.ctjs.api.entity.PlayerMP | null | undefined; + getChunk(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.Chunk; + getAllEntities(): Array; + /** + * Gets every entity loaded in the world of a certain class + * + * @param clazz the class to filter for (Use `Java.type().class` to get this) + * @return the entity list + */ + getAllEntitiesOfType(clazz: java.lang.Class): Array; + getAllBlockEntities(): Array; + getAllBlockEntitiesOfType(clazz: java.lang.Class): Array; + /** + * Returns the TPS of the current world. + * + * On modern version (1.20.3+), this is variable. On earlier versions, + * it is always 20. + */ + getTicksPerSecond(): number; + new(): com.chattriggers.ctjs.api.world.World; + } + interface World { + spawn: com.chattriggers.ctjs.api.world.World$SpawnWrapper; + particle: com.chattriggers.ctjs.api.world.World$ParticleWrapper; + border: com.chattriggers.ctjs.api.world.World$BorderWrapper; + toMC(): net.minecraft.client.multiplayer.ClientLevel | null | undefined; + getWorld(): net.minecraft.client.multiplayer.ClientLevel | null | undefined; + isLoaded(): boolean; + isRaining(): boolean; + getTime(): number; + /** + * Gets the [Block] at a location in the world. + * + * @param x the x position + * @param y the y position + * @param z the z position + * @return the [Block] at the location + */ + getBlockAt(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.Block; + /** + * Gets the [Block] at a location in the world. + * + * @param pos The block position + * @return the [Block] at the location + */ + getBlockAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): com.chattriggers.ctjs.api.world.block.Block; + getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): Array; + getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number, types: Array): Array; + /** + * Gets the [BlockState] at a location in the world. + * + * @param pos The block position + * @return the [BlockState] at the location + */ + getBlockStateAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): net.minecraft.world.level.block.state.BlockState; + /** + * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @return the skylight level at the location + */ + getSkyLightLevel(x: number, y: number, z: number): number; + /** + * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu + * + * @param pos The block position + * @return the skylight level at the location + */ + getSkyLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; + /** + * Gets the block light level at the given position. This is the value seen in the debug (F3) menu + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @return the block light level at the location + */ + getBlockLightLevel(x: number, y: number, z: number): number; + /** + * Gets the block light level at the given position. This is the value seen in the debug (F3) menu + * + * @param pos The block position + * @return the block light level at the location + */ + getBlockLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; + /** + * Gets all of the players in the world, and returns their wrapped versions. + * + * @return the players + */ + getAllPlayers(): Array; + /** + * Gets a player by their username, must be in the currently loaded chunks! + * + * @param name the username + * @return the player with said username, or null if they don't exist. + */ + getPlayerByName(name: string): com.chattriggers.ctjs.api.entity.PlayerMP | null | undefined; + getChunk(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.Chunk; + getAllEntities(): Array; + /** + * Gets every entity loaded in the world of a certain class + * + * @param clazz the class to filter for (Use `Java.type().class` to get this) + * @return the entity list + */ + getAllEntitiesOfType(clazz: java.lang.Class): Array; + getAllBlockEntities(): Array; + getAllBlockEntitiesOfType(clazz: java.lang.Class): Array; + /** + * Returns the TPS of the current world. + * + * On modern version (1.20.3+), this is variable. On earlier versions, + * it is always 20. + */ + getTicksPerSecond(): number; + new(): com.chattriggers.ctjs.api.world.World; + } + const World$SpawnWrapper: { + /** + * World spawn object for getting spawn location. + */ + new(): com.chattriggers.ctjs.api.world.World$SpawnWrapper; + } + interface World$SpawnWrapper { + /** + * Gets the spawn x location. + * + * @return the spawn x location. + */ + getX(): number; + /** + * Gets the spawn y location. + * + * @return the spawn y location. + */ + getY(): number; + /** + * Gets the spawn z location. + * + * @return the spawn z location. + */ + getZ(): number; + } + const World$ParticleWrapper: { + new(): com.chattriggers.ctjs.api.world.World$ParticleWrapper; + } + interface World$ParticleWrapper { + /** + * Gets an array of all the different particle names you can pass + * to [spawnParticle] + * + * @return the array of name strings + */ + getParticleNames(): Array; + /** + * Spawns a particle into the world with the given attributes, + * which can be configured further with the returned [com.chattriggers.ctjs.api.entity.Particle] + * + * @param particle the name of the particle to spawn, see [getParticleNames] + * @param x the x coordinate to spawn the particle at + * @param y the y coordinate to spawn the particle at + * @param z the z coordinate to spawn the particle at + * @param xSpeed the motion the particle should have in the x direction + * @param ySpeed the motion the particle should have in the y direction + * @param zSpeed the motion the particle should have in the z direction + * @return the newly spawned particle for further configuration + */ + spawnParticle(particle: string, x: number, y: number, z: number, xSpeed: number, ySpeed: number, zSpeed: number): com.chattriggers.ctjs.api.entity.Particle | null | undefined; + spawnParticle(particle: net.minecraft.client.particle.Particle): com.chattriggers.ctjs.api.entity.Particle; + } + const World$BorderWrapper: { + /** + * World border object to get border parameters + */ + new(): com.chattriggers.ctjs.api.world.World$BorderWrapper; + } + interface World$BorderWrapper { + /** + * Gets the border center x location. + * + * @return the border center x location + */ + getCenterX(): number; + /** + * Gets the border center z location. + * + * @return the border center z location + */ + getCenterZ(): number; + /** + * Gets the border size. + * + * @return the border size + */ + getSize(): number; + } + const StructureFinder: { + submitChunkScan(chunkX: number, chunkZ: number): void; + submitBlockUpdate(blockX: number, blockY: number, blockZ: number): void; + getRenderBlocksArray(): Array; + getRenderLabelsArray(): Array; + clear(): void; + shutdown(): void; + new(): com.chattriggers.ctjs.api.world.StructureFinder; + } + interface StructureFinder { + submitChunkScan(chunkX: number, chunkZ: number): void; + submitBlockUpdate(blockX: number, blockY: number, blockZ: number): void; + getRenderBlocksArray(): Array; + getRenderLabelsArray(): Array; + clear(): void; + shutdown(): void; + new(): com.chattriggers.ctjs.api.world.StructureFinder; + } + const TabList: { + Name: typeof com.chattriggers.ctjs.api.world.TabList$Name; + toMC(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; + /** + * Gets the scoreboard objective corresponding to the tab list, or null if it doesn't exist + */ + getObjective(): net.minecraft.world.scores.Objective | null | undefined; + /** + * Gets the tab list header as a [TextComponent] + * + * @return the header + */ + getHeaderComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; + /** + * Gets the tab list header as a formatted string. + * + * @return the header + */ + getHeader(): string | null | undefined; + /** + * Sets the header text for the TabList. + * If [header] is null, it will remove the header entirely + * + * @param header the header to set, or null to clear + */ + setHeader(header: any | null | undefined): void; + clearHeader(): void; + /** + * Gets the tab list footer as a [TextComponent] + * + * @return the footer + */ + getFooterComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; + /** + * Gets the tab list footer as a string. + * Be aware that this can contain color codes. + * + * @return the footer + */ + getFooter(): string | null | undefined; + /** + * Sets the footer text for the TabList. + * If [footer] is null, it will remove the footer entirely + * + * @param footer the footer to set, or null to clear + */ + setFooter(footer: any | null | undefined): void; + clearFooter(): void; + /** + * Gets names set in scoreboard objectives + * + * @return The formatted names + */ + getNamesByObjectives(): Array; + /** + * Get all names on the tab list + * + * @return the list of names + */ + getNames(): Array; + /** + * Gets all names in tabs without formatting + * + * @return the unformatted names + */ + getUnformattedNames(): Array; + /** + * Adds a new name to the tab list + * + * @param name the formatted name to add + * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. + * If false, will use a random default skin (Steve, Alex, etc) + */ + addName(name: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Adds a new name to the tab list + * + * @param name the formatted name to add + * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. + * If false, will use a random default skin (Steve, Alex, etc) + */ + addName(name: com.chattriggers.ctjs.api.message.TextComponent, useExistingSkin: boolean): void; + addName(name: string): void; + addName(name: string, useExistingSkin: boolean): void; + /** + * Removes all names from the tab list with a certain name + * + * @param name the name of the entry to remove + */ + removeNames(name: com.chattriggers.ctjs.api.message.TextComponent): void; + removeNames(name: string): void; + new(): com.chattriggers.ctjs.api.world.TabList; + } + interface TabList { + toMC(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; + /** + * Gets the scoreboard objective corresponding to the tab list, or null if it doesn't exist + */ + getObjective(): net.minecraft.world.scores.Objective | null | undefined; + /** + * Gets the tab list header as a [TextComponent] + * + * @return the header + */ + getHeaderComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; + /** + * Gets the tab list header as a formatted string. + * + * @return the header + */ + getHeader(): string | null | undefined; + /** + * Sets the header text for the TabList. + * If [header] is null, it will remove the header entirely + * + * @param header the header to set, or null to clear + */ + setHeader(header: any | null | undefined): void; + clearHeader(): void; + /** + * Gets the tab list footer as a [TextComponent] + * + * @return the footer + */ + getFooterComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; + /** + * Gets the tab list footer as a string. + * Be aware that this can contain color codes. + * + * @return the footer + */ + getFooter(): string | null | undefined; + /** + * Sets the footer text for the TabList. + * If [footer] is null, it will remove the footer entirely + * + * @param footer the footer to set, or null to clear + */ + setFooter(footer: any | null | undefined): void; + clearFooter(): void; + /** + * Gets names set in scoreboard objectives + * + * @return The formatted names + */ + getNamesByObjectives(): Array; + /** + * Get all names on the tab list + * + * @return the list of names + */ + getNames(): Array; + /** + * Gets all names in tabs without formatting + * + * @return the unformatted names + */ + getUnformattedNames(): Array; + /** + * Adds a new name to the tab list + * + * @param name the formatted name to add + * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. + * If false, will use a random default skin (Steve, Alex, etc) + */ + addName(name: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Adds a new name to the tab list + * + * @param name the formatted name to add + * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. + * If false, will use a random default skin (Steve, Alex, etc) + */ + addName(name: com.chattriggers.ctjs.api.message.TextComponent, useExistingSkin: boolean): void; + addName(name: string): void; + addName(name: string, useExistingSkin: boolean): void; + /** + * Removes all names from the tab list with a certain name + * + * @param name the name of the entry to remove + */ + removeNames(name: com.chattriggers.ctjs.api.message.TextComponent): void; + removeNames(name: string): void; + new(): com.chattriggers.ctjs.api.world.TabList; + } + const TabList$Name: { + new(mcValue: net.minecraft.client.multiplayer.PlayerInfo): com.chattriggers.ctjs.api.world.TabList$Name; + } + interface TabList$Name extends com.chattriggers.ctjs.api.CTWrapper { + /** + * Gets the latency associated with this name + * + * @return the latency + */ + getLatency(): number; + /** + * Sets the latency associated with this name. + * - latency between 0 and 149 represents all 5 bars + * - latency between 150 and 299 represents 4 bars + * - latency between 300 and 599 represents 3 bars + * - latency between 600 and 999 represents 2 bars + * - latency between 1000 and more represents 1 bar + * + * @param latency the latency to set + * @return the name to allow for method chaining + */ + setLatency(latency: number): com.chattriggers.ctjs.api.world.TabList$Name; + /** + * Gets the team associated with this name, if it exists + * + * @return the team, or null if it does not exist + */ + getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; + /** + * Sets the team associated with this name + * + * @param team the new team to set for this name. Custom teams can be created + * using [Scoreboard.createTeam] + * @return the score to allow for method chaining + */ + setTeam(team: com.chattriggers.ctjs.api.entity.Team | null | undefined): com.chattriggers.ctjs.api.world.TabList$Name; + /** + * Gets the display text of this name + * + * @return the display name + */ + getName(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sets the display name of this name + * + * @param name the new name + * @return the name to allow for method chaining + */ + setName(name: com.chattriggers.ctjs.api.message.TextComponent | null | undefined): com.chattriggers.ctjs.api.world.TabList$Name; + /** + * Removes this name from the tab list + */ + remove(): void; + } + const Scoreboard: { + Score: typeof com.chattriggers.ctjs.api.world.Scoreboard$Score; + toMC(): net.minecraft.world.scores.Scoreboard | null | undefined; + getSidebar(): net.minecraft.world.scores.Objective | null | undefined; + /** + * Gets the top-most string which is displayed on the scoreboard. (doesn't have a score on the side). + * Be aware that this can contain color codes. + * + * @return the scoreboard title + */ + getTitle(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sets the scoreboard title. + * + * @param title the new title + * @return the scoreboard title + */ + setTitle(title: com.chattriggers.ctjs.api.message.TextComponent): void; + setTitle(title: string): void; + /** + * Get all currently visible strings on the scoreboard. (excluding title) + * Be aware that this can contain color codes. + * + * @return the list of lines + */ + getLines(): Array; + /** + * Get all currently visible strings on the scoreboard. (excluding title) + * Be aware that this can contain color codes. + * + * @return the list of lines + */ + getLines(descending: boolean): Array; + /** + * Gets the line at the specified index (0 based) + * Equivalent to Scoreboard.getLines().get(index) + * + * @param index the line index + * @return the score object at the index + */ + getLineByIndex(index: number): com.chattriggers.ctjs.api.world.Scoreboard$Score; + /** + * Gets a list of lines that have a certain score, + * i.e. the numbers shown on the right + * + * @param score the score to look for + * @return a list of actual score objects + */ + getLinesByScore(score: number): Array; + /** + * Sets a line in the scoreboard to the specified name and score. + * + * @param score the score value for this item + * @param line the [TextComponent] to display on said line + * @param override whether to remove old lines with the same score + */ + setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Sets a line in the scoreboard to the specified name and score. + * + * @param score the score value for this item + * @param line the [TextComponent] to display on said line + * @param override whether to remove old lines with the same score + */ + setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent, override: boolean): void; + setLine(score: number, line: string): void; + setLine(score: number, line: string, override: boolean): void; + /** + * Adds a line to the scoreboard + * + * @param score the score value for this item + * @param line the [TextComponent] to display on said line + */ + addLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; + addLine(score: number, line: string): void; + /** + * Removes all lines from the scoreboard matching with a certain score + * + * @param score the score of the lines to remove + */ + removeScores(score: number): void; + /** + * Removes the line at a certain index + * + * @param index the index of the line to remove + */ + removeIndex(index: number): void; + /** + * Removes the line at a certain index + * + * @param index the index of the line to remove + */ + removeIndex(index: number, descending: boolean): void; + setShouldRender(shouldRender: boolean): void; + getShouldRender(): boolean; + /** + * Creates or gets a [Team] with a given name + * + * @param name the name of the team + */ + createTeam(name: string): com.chattriggers.ctjs.api.entity.Team; + new(): com.chattriggers.ctjs.api.world.Scoreboard; + } + interface Scoreboard { + toMC(): net.minecraft.world.scores.Scoreboard | null | undefined; + getSidebar(): net.minecraft.world.scores.Objective | null | undefined; + /** + * Gets the top-most string which is displayed on the scoreboard. (doesn't have a score on the side). + * Be aware that this can contain color codes. + * + * @return the scoreboard title + */ + getTitle(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sets the scoreboard title. + * + * @param title the new title + * @return the scoreboard title + */ + setTitle(title: com.chattriggers.ctjs.api.message.TextComponent): void; + setTitle(title: string): void; + /** + * Get all currently visible strings on the scoreboard. (excluding title) + * Be aware that this can contain color codes. + * + * @return the list of lines + */ + getLines(): Array; + /** + * Get all currently visible strings on the scoreboard. (excluding title) + * Be aware that this can contain color codes. + * + * @return the list of lines + */ + getLines(descending: boolean): Array; + /** + * Gets the line at the specified index (0 based) + * Equivalent to Scoreboard.getLines().get(index) + * + * @param index the line index + * @return the score object at the index + */ + getLineByIndex(index: number): com.chattriggers.ctjs.api.world.Scoreboard$Score; + /** + * Gets a list of lines that have a certain score, + * i.e. the numbers shown on the right + * + * @param score the score to look for + * @return a list of actual score objects + */ + getLinesByScore(score: number): Array; + /** + * Sets a line in the scoreboard to the specified name and score. + * + * @param score the score value for this item + * @param line the [TextComponent] to display on said line + * @param override whether to remove old lines with the same score + */ + setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Sets a line in the scoreboard to the specified name and score. + * + * @param score the score value for this item + * @param line the [TextComponent] to display on said line + * @param override whether to remove old lines with the same score + */ + setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent, override: boolean): void; + setLine(score: number, line: string): void; + setLine(score: number, line: string, override: boolean): void; + /** + * Adds a line to the scoreboard + * + * @param score the score value for this item + * @param line the [TextComponent] to display on said line + */ + addLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; + addLine(score: number, line: string): void; + /** + * Removes all lines from the scoreboard matching with a certain score + * + * @param score the score of the lines to remove + */ + removeScores(score: number): void; + /** + * Removes the line at a certain index + * + * @param index the index of the line to remove + */ + removeIndex(index: number): void; + /** + * Removes the line at a certain index + * + * @param index the index of the line to remove + */ + removeIndex(index: number, descending: boolean): void; + setShouldRender(shouldRender: boolean): void; + getShouldRender(): boolean; + /** + * Creates or gets a [Team] with a given name + * + * @param name the name of the team + */ + createTeam(name: string): com.chattriggers.ctjs.api.entity.Team; + new(): com.chattriggers.ctjs.api.world.Scoreboard; + } + const Scoreboard$Score: { + new(mcValue: net.minecraft.world.scores.ScoreAccess): com.chattriggers.ctjs.api.world.Scoreboard$Score; + } + interface Scoreboard$Score extends com.chattriggers.ctjs.api.CTWrapper { + /** + * Gets the team associated with this score, if it exists + * + * @return the team, or null if it does not exist + */ + getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; + /** + * Sets the team associated with this score + * + * @param team the new team to set for this line. Custom teams can be created using [createTeam] + * @return the score to allow for method chaining + */ + setTeam(team: com.chattriggers.ctjs.api.entity.Team | null | undefined): com.chattriggers.ctjs.api.world.Scoreboard$Score; + /** + * Gets the score value for this score, + * i.e. the number on the right of the board + * + * @return the actual point value + */ + getScore(): number; + /** + * Sets the score value for this score + * + * @param score the new point value + * @return the score to allow for method chaining + */ + setScore(score: number): com.chattriggers.ctjs.api.world.Scoreboard$Score; + /** + * Gets the display text of this score + * + * @return the display name + */ + getName(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sets the name of this score + * + * @param name the new name + * @return the score to allow for method chaining + */ + setName(name: com.chattriggers.ctjs.api.message.TextComponent | null | undefined): com.chattriggers.ctjs.api.world.Scoreboard$Score; + /** + * Gets the number format of this score + * + * @return the number format + */ + getNumberFormat(): net.minecraft.network.chat.numbers.NumberFormat | null | undefined; + /** + * Sets the number format of this score + * + * @param format either a formatting string, i.e. "&6", style in the form of an object, see [TextComponent], a + * [NumberFormat], or hex value + * @return the score to allow for method chaining + * + * @see [TextComponent] + */ + setNumberFormat(format: any | null | undefined): com.chattriggers.ctjs.api.world.Scoreboard$Score; + /** + * Removes this score from the scoreboard + */ + remove(): void; + } + } + namespace vec { + const Vec3i: { + new(): com.chattriggers.ctjs.api.vec.Vec3i; + new(x: number): com.chattriggers.ctjs.api.vec.Vec3i; + new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec3i; + new(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3i; + } + interface Vec3i { + getX(): number; + getY(): number; + getZ(): number; + magnitudeSquared(): number; + magnitude(): number; + translated(dx: number, dy: number, dz: number): com.chattriggers.ctjs.api.vec.Vec3i; + scaled(scale: number): com.chattriggers.ctjs.api.vec.Vec3i; + scaled(xScale: number, yScale: number, zScale: number): com.chattriggers.ctjs.api.vec.Vec3i; + crossProduct(other: com.chattriggers.ctjs.api.vec.Vec3i): com.chattriggers.ctjs.api.vec.Vec3i; + dotProduct(other: com.chattriggers.ctjs.api.vec.Vec3i): number; + angleTo(other: com.chattriggers.ctjs.api.vec.Vec3i): number; + normalized(): com.chattriggers.ctjs.api.vec.Vec3f; + unaryMinus(): com.chattriggers.ctjs.api.vec.Vec3i; + plus(other: com.chattriggers.ctjs.api.vec.Vec3i): com.chattriggers.ctjs.api.vec.Vec3i; + minus(other: com.chattriggers.ctjs.api.vec.Vec3i): com.chattriggers.ctjs.api.vec.Vec3i; + } + const Vec3f: { + new(): com.chattriggers.ctjs.api.vec.Vec3f; + new(x: number): com.chattriggers.ctjs.api.vec.Vec3f; + new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec3f; + new(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; + } + interface Vec3f { + getX(): number; + getY(): number; + getZ(): number; + magnitudeSquared(): number; + magnitude(): number; + translated(dx: number, dy: number, dz: number): com.chattriggers.ctjs.api.vec.Vec3f; + scaled(scale: number): com.chattriggers.ctjs.api.vec.Vec3f; + scaled(xScale: number, yScale: number, zScale: number): com.chattriggers.ctjs.api.vec.Vec3f; + crossProduct(other: com.chattriggers.ctjs.api.vec.Vec3f): com.chattriggers.ctjs.api.vec.Vec3f; + dotProduct(other: com.chattriggers.ctjs.api.vec.Vec3f): number; + angleTo(other: com.chattriggers.ctjs.api.vec.Vec3f): number; + normalized(): com.chattriggers.ctjs.api.vec.Vec3f; + unaryMinus(): com.chattriggers.ctjs.api.vec.Vec3f; + plus(other: com.chattriggers.ctjs.api.vec.Vec3f): com.chattriggers.ctjs.api.vec.Vec3f; + minus(other: com.chattriggers.ctjs.api.vec.Vec3f): com.chattriggers.ctjs.api.vec.Vec3f; + component1(): number; + component2(): number; + component3(): number; + copy(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; + } + const Vec2f: { + new(): com.chattriggers.ctjs.api.vec.Vec2f; + new(x: number): com.chattriggers.ctjs.api.vec.Vec2f; + new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec2f; + } + interface Vec2f { + getX(): number; + getY(): number; + magnitudeSquared(): number; + magnitude(): number; + translated(dx: number, dy: number): com.chattriggers.ctjs.api.vec.Vec2f; + scaled(scale: number): com.chattriggers.ctjs.api.vec.Vec2f; + scaled(xScale: number, yScale: number): com.chattriggers.ctjs.api.vec.Vec2f; + dotProduct(other: com.chattriggers.ctjs.api.vec.Vec2f): number; + angleTo(other: com.chattriggers.ctjs.api.vec.Vec2f): number; + normalized(): com.chattriggers.ctjs.api.vec.Vec2f; + unaryMinus(): com.chattriggers.ctjs.api.vec.Vec2f; + plus(other: com.chattriggers.ctjs.api.vec.Vec2f): com.chattriggers.ctjs.api.vec.Vec2f; + minus(other: com.chattriggers.ctjs.api.vec.Vec2f): com.chattriggers.ctjs.api.vec.Vec2f; + component1(): number; + component2(): number; + copy(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec2f; + } + } + namespace entity { + const Entity: { + DimensionType: typeof com.chattriggers.ctjs.api.entity.Entity$DimensionType; + new(mcValue: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; + } + interface Entity extends com.chattriggers.ctjs.api.CTWrapper { + getX(): number; + getY(): number; + getZ(): number; + getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; + getRotation(): net.minecraft.world.phys.Vec2; + getLastX(): number; + getLastY(): number; + getLastZ(): number; + getRenderX(): number; + getRenderY(): number; + getRenderZ(): number; + /** + * Gets the pitch, the horizontal direction the entity is facing towards. + * This has a range of -180 to 180. + * + * @return the entity's pitch + */ + getPitch(): number; + /** + * Gets the yaw, the vertical direction the entity is facing towards. + * This has a range of -180 to 180. + * + * @return the entity's yaw + */ + getYaw(): number; + /** + * Gets the entity's x motion. + * This is the amount the entity will move in the x direction next tick. + * + * @return the entity's x motion + */ + getMotionX(): number; + /** + * Gets the entity's y motion. + * This is the amount the entity will move in the y direction next tick. + * + * @return the entity's y motion + */ + getMotionY(): number; + /** + * Gets the entity's z motion. + * This is the amount the entity will move in the z direction next tick. + * + * @return the entity's z motion + */ + getMotionZ(): number; + /** + * Returns the entity this entity is riding, if one exists + * + * @return an Entity or null + */ + getRiding(): com.chattriggers.ctjs.api.entity.Entity | null | undefined; + /** + * Returns a list of all entity riding this entity + * + * @return List of entities, empty if there are no riders + */ + getRiders(): Array; + /** + * Checks whether the entity is dead. + * This is a fairly loose term, dead for a particle could mean it has faded, + * while dead for an entity means it has no health. + * + * @return whether an entity is dead + */ + isDead(): boolean; + /** + * Gets the entire width of the entity's hitbox + * + * @return the entity's width + */ + getWidth(): number; + /** + * Gets the entire height of the entity's hitbox + * + * @return the entity's height + */ + getHeight(): number; + /** + * Gets the height of the eyes on the entity, + * can be added to its Y coordinate to get the actual Y location of the eyes. + * This value defaults to 85% of an entity's height, however is different for some entities. + * + * @return the height of the entity's eyes + */ + getEyeHeight(): number; + /** + * Gets the name of the entity, could be "Villager", + * or, if the entity has a custom name, it returns that. + * + * @return the (custom) name of the entity as a String + */ + getName(): string; + /** + * Gets the name of the entity, could be "Villager", + * or, if the entity has a custom name, it returns that. + * + * @return the (custom) name of the entity as a [TextComponent] + */ + getNameComponent(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Gets the Java class name of the entity, for example "EntityVillager" + * + * @return the entity's class name + */ + getClassName(): string; + /** + * Gets the Java UUID object of this entity. + * Use of [UUID.toString] in conjunction is recommended. + * + * @return the entity's uuid + */ + getUUID(): java.util.UUID; + /** + * Gets the entity's air level. + * + * The returned value will be an integer. If the player is not taking damage, it + * will be between 300 (not in water) and 0. If the player is taking damage, it + * will be between -20 and 0, getting reset to 0 every time the player takes damage. + * + * @return the entity's air level + */ + getAir(): number; + distanceTo(other: com.chattriggers.ctjs.api.entity.Entity): number; + distanceTo(other: net.minecraft.world.entity.Entity): number; + distanceTo(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): number; + distanceTo(x: number, y: number, z: number): number; + isOnGround(): boolean; + isCollided(): boolean; + getDistanceWalked(): number; + getStepHeight(): number; + hasNoClip(): boolean; + getTicksExisted(): number; + getFireResistance(): number; + isImmuneToFire(): boolean; + isInWater(): boolean; + isWet(): boolean; + getDimension(): com.chattriggers.ctjs.api.entity.Entity$DimensionType; + getMaxInPortalTime(): number; + isSilent(): boolean; + isInLava(): boolean; + getLookVector(): net.minecraft.world.phys.Vec3; + getLookVector(partialTicks: number): net.minecraft.world.phys.Vec3; + getEyePosition(): net.minecraft.world.phys.Vec3; + getEyePosition(partialTicks: number): net.minecraft.world.phys.Vec3; + canBeCollidedWith(): boolean; + canBePushed(): boolean; + isSneaking(): boolean; + isSprinting(): boolean; + isInvisible(): boolean; + isOutsideBorder(): boolean; + isBurning(): boolean; + getWorld(): net.minecraft.world.level.Level; + getChunk(): com.chattriggers.ctjs.api.world.Chunk; + } + const Entity$DimensionType: { + OVERWORLD: com.chattriggers.ctjs.api.entity.Entity$DimensionType; + NETHER: com.chattriggers.ctjs.api.entity.Entity$DimensionType; + END: com.chattriggers.ctjs.api.entity.Entity$DimensionType; + OVERWORLD_CAVES: com.chattriggers.ctjs.api.entity.Entity$DimensionType; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.entity.Entity$DimensionType; + } + interface Entity$DimensionType extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper> { + } + const Entity$Companion: { + fromMC(entity: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; + new(): com.chattriggers.ctjs.api.entity.Entity$Companion; + } + interface Entity$Companion { + fromMC(entity: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; + new(): com.chattriggers.ctjs.api.entity.Entity$Companion; + } + const PlayerInteraction: { + UseBlock: typeof com.chattriggers.ctjs.api.entity.PlayerInteraction$UseBlock; + UseEntity: typeof com.chattriggers.ctjs.api.entity.PlayerInteraction$UseEntity; + UseItem: typeof com.chattriggers.ctjs.api.entity.PlayerInteraction$UseItem; + new(name: string, mainHand: boolean): com.chattriggers.ctjs.api.entity.PlayerInteraction; + } + interface PlayerInteraction { + getName(): string; + getMainHand(): boolean; + } + const PlayerInteraction$AttackBlock: { + new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackBlock; + } + interface PlayerInteraction$AttackBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackBlock; + } + const PlayerInteraction$AttackEntity: { + new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackEntity; + } + interface PlayerInteraction$AttackEntity extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackEntity; + } + const PlayerInteraction$BreakBlock: { + new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$BreakBlock; + } + interface PlayerInteraction$BreakBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$BreakBlock; + } + const PlayerInteraction$UseBlock: { + new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseBlock; + } + interface PlayerInteraction$UseBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + } + const PlayerInteraction$UseEntity: { + new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseEntity; + } + interface PlayerInteraction$UseEntity extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + } + const PlayerInteraction$UseItem: { + new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseItem; + } + interface PlayerInteraction$UseItem extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + } + const LivingEntity: { + new(mcValue: net.minecraft.world.entity.LivingEntity): com.chattriggers.ctjs.api.entity.LivingEntity; + } + interface LivingEntity extends com.chattriggers.ctjs.api.entity.Entity { + getActivePotionEffects(): Array; + canSeeEntity(other: net.minecraft.world.entity.Entity): boolean; + canSeeEntity(other: com.chattriggers.ctjs.api.entity.Entity): boolean; + /** + * Gets the item currently in the entity's specified inventory slot. + * 0 for main hand, 1 for offhand, 2-5 for armor + * + * @param slot the slot to access + * @return the item in said slot + */ + getStackInSlot(slot: number): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + getHP(): number; + getMaxHP(): number; + getAbsorption(): number; + getAge(): number; + getArmorValue(): number; + isPotionActive(id: number): boolean; + isPotionActive(type: com.chattriggers.ctjs.api.world.PotionEffectType): boolean; + isPotionActive(effect: com.chattriggers.ctjs.api.world.PotionEffect): boolean; + } + const BlockEntity: { + new(mcValue: net.minecraft.world.level.block.entity.BlockEntity): com.chattriggers.ctjs.api.entity.BlockEntity; + } + interface BlockEntity extends com.chattriggers.ctjs.api.CTWrapper { + getX(): number; + getY(): number; + getZ(): number; + getBlockType(): com.chattriggers.ctjs.api.world.block.BlockType; + getBlockPos(): com.chattriggers.ctjs.api.world.block.BlockPos; + getBlock(): com.chattriggers.ctjs.api.world.block.Block; + } + const Particle: { + new(mcValue: net.minecraft.client.particle.Particle): com.chattriggers.ctjs.api.entity.Particle; + } + interface Particle extends com.chattriggers.ctjs.api.CTWrapper { + getX(): number; + setX(value: number): void; + getY(): number; + setY(value: number): void; + getZ(): number; + setZ(value: number): void; + getLastX(): number; + setLastX(value: number): void; + getLastY(): number; + setLastY(value: number): void; + getLastZ(): number; + setLastZ(value: number): void; + getRenderX(): number; + getRenderY(): number; + getRenderZ(): number; + getMotionX(): number; + setMotionX(value: number): void; + getMotionY(): number; + setMotionY(value: number): void; + getMotionZ(): number; + setMotionZ(value: number): void; + getAge(): number; + setAge(value: number): void; + getDead(): boolean; + setDead(value: boolean): void; + scale(scale: number): com.chattriggers.ctjs.api.entity.Particle; + /** + * Sets the amount of ticks this particle will live for + * + * @param maxAge the particle's max age (in ticks) + */ + setMaxAge(maxAge: number): com.chattriggers.ctjs.api.entity.Particle; + remove(): com.chattriggers.ctjs.api.entity.Particle; + } + const PlayerMP: { + new(mcValue: net.minecraft.world.entity.player.Player): com.chattriggers.ctjs.api.entity.PlayerMP; + } + interface PlayerMP extends com.chattriggers.ctjs.api.entity.LivingEntity { + isSpectator(): boolean; + getPing(): number; + getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; + /** + * Gets the display name for this player, + * i.e. the name shown in tab list and in the player's nametag. + * @return the display name + */ + getDisplayName(): com.chattriggers.ctjs.api.message.TextComponent; + setTabDisplayName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Sets the name for this player shown above their head, + * in their name tag + * + * @param textComponent the new name to display + */ + setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] + * minus `player`. + * + * @see Renderer.drawPlayer + */ + draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.entity.PlayerMP; + } + const Team: { + Visibility: typeof com.chattriggers.ctjs.api.entity.Team$Visibility; + new(mcValue: net.minecraft.world.scores.PlayerTeam): com.chattriggers.ctjs.api.entity.Team; + } + interface Team extends com.chattriggers.ctjs.api.CTWrapper { + /** + * Gets the registered name of the team + */ + getRegisteredName(): string; + /** + * Gets the display name of the team + */ + getName(): string; + /** + * Sets the display name of the team + * @param name the new display name + * @return the team for method chaining + */ + setName(name: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.entity.Team; + /** + * Sets the display name of the team + * @param name the new display name + * @return the team for method chaining + */ + setName(name: string): com.chattriggers.ctjs.api.entity.Team; + /** + * Gets the list of names on the team + */ + getMembers(): Array; + /** + * Gets the team prefix + */ + getPrefix(): string; + /** + * Sets the team prefix + * @param prefix the prefix to set + * @return the team for method chaining + */ + setPrefix(prefix: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.entity.Team; + /** + * Sets the team prefix + * @param prefix the prefix to set + * @return the team for method chaining + */ + setPrefix(prefix: string): com.chattriggers.ctjs.api.entity.Team; + /** + * Gets the team suffix + */ + getSuffix(): string; + /** + * Sets the team suffix + * @param suffix the suffix to set + * @return the team for method chaining + */ + setSuffix(suffix: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.entity.Team; + /** + * Sets the team suffix + * @param suffix the suffix to set + * @return the team for method chaining + */ + setSuffix(suffix: string): com.chattriggers.ctjs.api.entity.Team; + getColor(): string; + /** + * Sets the team color + * @param color a string format of a [Formatting], or a hex value + * @return the team for method chaining + */ + setColor(color: any | null | undefined): com.chattriggers.ctjs.api.entity.Team; + /** + * Gets the team's friendly fire setting + */ + getFriendlyFire(): boolean; + /** + * Gets whether the team can see invisible players on the same team + */ + canSeeInvisibleTeammates(): boolean; + /** + * Gets the team's name tag visibility + */ + getNameTagVisibility(): com.chattriggers.ctjs.api.entity.Team$Visibility; + /** + * Gets the team's death message visibility + */ + getDeathMessageVisibility(): com.chattriggers.ctjs.api.entity.Team$Visibility; + } + const Team$Visibility: { + ALWAYS: com.chattriggers.ctjs.api.entity.Team$Visibility; + NEVER: com.chattriggers.ctjs.api.entity.Team$Visibility; + HIDE_FOR_OTHERS_TEAMS: com.chattriggers.ctjs.api.entity.Team$Visibility; + HIDE_FOR_OWN_TEAM: com.chattriggers.ctjs.api.entity.Team$Visibility; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.entity.Team$Visibility; + } + interface Team$Visibility extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + } + const Team$Visibility$Companion: { + fromMC(mcValue: net.minecraft.world.scores.Team$Visibility): com.chattriggers.ctjs.api.entity.Team$Visibility; + new(): unknown; + } + interface Team$Visibility$Companion { + fromMC(mcValue: net.minecraft.world.scores.Team$Visibility): com.chattriggers.ctjs.api.entity.Team$Visibility; + new(): unknown; + } + } + namespace commands { + interface RootCommand { + register(): void; + } + const DynamicCommands: { + AngleArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$AngleArgumentWrapper; + PosArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$PosArgumentWrapper; + BlockPredicateWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$BlockPredicateWrapper; + BlockStateArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$BlockStateArgumentWrapper; + EntitySelectorWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$EntitySelectorWrapper; + ItemStackArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$ItemStackArgumentWrapper; + MessageFormatArgumentWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$MessageFormatArgumentWrapper; + NbtPathWrapper: typeof com.chattriggers.ctjs.api.commands.DynamicCommands$NbtPathWrapper; + registerCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; + registerCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; + buildCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; + buildCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; + argument(name: string, type: com.mojang.brigadier.arguments.ArgumentType, builder: org.mozilla.javascript.Function): void; + literal(name: string, builder: org.mozilla.javascript.Function): void; + redirect(node: com.chattriggers.ctjs.api.commands.RootCommand): void; + redirect(node: com.mojang.brigadier.tree.CommandNode): void; + exec(method: org.mozilla.javascript.Function): void; + /** + * A helper method for getting Fabric's client CommandDispatcher root node. This allows user + * commands to be redirected to the root node in the same way that "/execute run ..." does. + * + * As the result is a CommandNode, `.getChild(name)` can be used to access sub-command nodes + * to, for example, redirect to just `/advancement` instead of `/`. + */ + getDispatcherRoot(): com.mojang.brigadier.tree.RootCommandNode | null | undefined; + /** + * @see Argument Types: bool + */ + bool(): com.mojang.brigadier.arguments.BoolArgumentType; + /** + * @see brigadier:double + */ + double(): com.mojang.brigadier.arguments.DoubleArgumentType; + /** + * @see brigadier:double + */ + double(min: number): com.mojang.brigadier.arguments.DoubleArgumentType; + /** + * @see brigadier:double + */ + double(min: number, max: number): com.mojang.brigadier.arguments.DoubleArgumentType; + /** + * @see brigadier:float + */ + float(): com.mojang.brigadier.arguments.FloatArgumentType; + /** + * @see brigadier:float + */ + float(min: number): com.mojang.brigadier.arguments.FloatArgumentType; + /** + * @see brigadier:float + */ + float(min: number, max: number): com.mojang.brigadier.arguments.FloatArgumentType; + /** + * @see brigadier:integer + */ + integer(): com.mojang.brigadier.arguments.IntegerArgumentType; + /** + * @see brigadier:integer + */ + integer(min: number): com.mojang.brigadier.arguments.IntegerArgumentType; + /** + * @see brigadier:integer + */ + integer(min: number, max: number): com.mojang.brigadier.arguments.IntegerArgumentType; + /** + * @see brigadier:long + */ + long(): com.mojang.brigadier.arguments.LongArgumentType; + /** + * @see brigadier:long + */ + long(min: number): com.mojang.brigadier.arguments.LongArgumentType; + /** + * @see brigadier:long + */ + long(min: number, max: number): com.mojang.brigadier.arguments.LongArgumentType; + /** + * @see brigadier:string + */ + string(): com.mojang.brigadier.arguments.StringArgumentType; + /** + * @see brigadier:string + */ + greedyString(): com.mojang.brigadier.arguments.StringArgumentType; + /** + * @see brigadier:string + */ + word(): com.mojang.brigadier.arguments.StringArgumentType; + /** + * @see minecraft:angle + */ + angle(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:block_pos + */ + blockPos(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:block_predicate + */ + blockPredicate(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:block_state + */ + blockState(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:color + */ + color(): net.minecraft.commands.arguments.ColorArgument; + /** + * @see minecraft:column_pos + */ + columnPos(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:dimension + */ + dimension(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:entity + */ + entity(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:entity + */ + entities(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:float_range + */ + floatRange(): net.minecraft.commands.arguments.RangeArgument$Floats; + /** + * @see minecraft:game_profile + */ + gameProfile(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:game_profile + */ + player(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:game_profile + */ + players(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:gamemode + */ + gameMode(): net.minecraft.commands.arguments.GameModeArgument; + /** + * @see minecraft:int_range + */ + intRange(): net.minecraft.commands.arguments.RangeArgument$Ints; + /** + * @see minecraft:item_predicate + */ + itemPredicate(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:item_slot + */ + itemSlot(): net.minecraft.commands.arguments.SlotArgument; + /** + * @see minecraft:item_stack + */ + itemStack(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:message + */ + message(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:nbt_compound_tag + */ + nbtCompoundTag(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:nbt_path + */ + nbtPath(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:nbt_tag + */ + nbtTag(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:resource + */ + resource(): net.minecraft.commands.arguments.IdentifierArgument; + /** + * @see minecraft:rotation + */ + rotation(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:swizzle + */ + swizzle(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:time + */ + time(): net.minecraft.commands.arguments.TimeArgument; + /** + * @see minecraft:time + */ + time(minimum: number): net.minecraft.commands.arguments.TimeArgument; + /** + * @see minecraft:uuid + */ + uuid(): net.minecraft.commands.arguments.UuidArgument; + /** + * @see minecraft:vec2 + */ + vec2(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:vec2 + */ + vec2(centerIntegers: boolean): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:vec3 + */ + vec3(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:vec3 + */ + vec3(centerIntegers: boolean): com.mojang.brigadier.arguments.ArgumentType; + /** + * Allows choosing from a set list of strings. When suggested to the user, this + * will look as though this argument is multiple "literal()" nodes. + */ + choices(options: string): com.mojang.brigadier.arguments.ArgumentType; + /** + * Allows easy creation of a custom ArgumentType without needing to use + * JavaAdapter. Example: + * + * ```js + * const HEADS = 0; + * const TAILS = 1; + * + * const coinFlipArgType = Commands.custom({ + * parse(reader) { + * // `reader` is a com.mojang.brigadier.StringReader + * + * const savedCursor = reader.getCursor(); + * const str = reader.readString(); + * if (str === 'heads') + * return HEADS; + * if (str === 'tails') + * return TAILS; + * Commands.error(reader, `Expected one of: 'heads', 'tails'`); + * }, + * suggest(ctx, builder) { + * // ctx is a com.mojang.brigadier.context.CommandContext + * // builder is a com.mojang.brigadier.suggestion.SuggestionsBuilder + * builder.suggest('heads'); + * builder.suggest('tails'); + * return builder.buildFuture(); + * }, + * getExamples() { + * return ['heads', 'tails']; + * } + * }); + * ``` + * + * @see StringReader + * @see CommandContext + * @see SuggestionsBuilder + */ + custom(obj: org.mozilla.javascript.NativeObject): com.mojang.brigadier.arguments.ArgumentType; + /** + * Throw a detailed error given the reader, meant to be used with [custom] + */ + error(reader: com.mojang.brigadier.ImmutableStringReader, message: string): never; + /** + * Throw a detailed error given the reader, meant to be used with [custom] + */ + error(reader: com.mojang.brigadier.ImmutableStringReader, message: com.chattriggers.ctjs.api.message.TextComponent): never; + /** + * An alternative to the command register that allows full use of the + * functionality provided by Brigadier. + * + * For more information about Brigadier, see + * their GitHub page. + * Also see [CTCommand] for an example Brigadier command. + * + * ## General + * + * This API works similarly to Brigadier, however much of the annoyance + * of using the Brigadier API has been eliminated, mainly the excessive + * use of nested function calls. It works via a global context, so function + * calls are free. However, this means that multiples commands cannot be + * built at once. This means that commands should only ever be built on the + * main thread. If two commands are built at the same time, an error will be + * thrown. + * + * ## Argument Types + * + * The [ArgumentType] interface is a fundamental part of Brigadier, and + * most of the MC argument types have been exposed via helper function + * in this class. It is also possible to build new instances of + * [ArgumentType] via [custom]. + * + * When possible, the argument types returned from the helper function on + * this class resolve in a way that their Minecraft variants do. For example, + * the [message] type will replace selectors with their target entity, if + * possible. + * + * ## Basic Example + * + * Here is an example command that recreates the `/advancement` command + * (without any of the actual functionality, of course): + * + * ```js + * // The `Commands` object supports destructuring, which makes assembling long + * // commands much nicer + * const { argument, choices, exec, greedyString, literal, registerCommand, resource, players } = Commands; + * + * registerCommand('ctadvancement', () => { + * // Note the use of choices to avoid having to copy-paste two separate literal() trees + * argument('kind', choices('grant', 'revoke'), () => { + * argument('targets', players(), () => { + * literal('everything', () => { + * // exec() receives a single object with all of the arguments, which means we can + * // destructure it to pull out the ones we want. Only values from argument() calls + * // are included here; the literal nodes are ignored and have no impact on this object. + * exec(({ kind, targets }) => { + * ChatLib.chat(`${kind} everything from ${targets}`); + * }); + * }); + * + * literal('only', () => { + * argument('advancement', resource(), () => { + * argument('criterion', greedyString(), () => { + * exec(({ kind, targets, advancement, criterion }) => { + * ChatLib.chat(`${kind} only ${advancement} applied to ${targets} (criterion = ${criterion})`); + * }); + * }); + * }); + * }); + * + * argument('subkind', choices('from', 'through', 'until'), () => { + * argument('advancement', resource(), () => { + * exec(({ kind, subkind, targets, advancement }) => { + * ChatLib.chat(`kind = ${kind}, subkind = ${subkind}, advancement = ${advancement}, targets = ${targets}`); + * }); + * }); + * }); + * }); + * }); + * }); + * ``` + * + * ## Redirect + * + * Like Brigadier, this API supports assembling partial command nodes for use + * in redirection. To do this, use [buildCommand], which returns the command node + * (well, an internal representation of it). This object can then be passed to + * further calls to [redirect] inside of a [literal] or [argument] block. + * + * Examples: + * + * ```js + * // destructuring omitted + * + * const testCmdNode = buildCommand('testcmd', () => { + * exec(({ arg }) => { + * if (arg) { + * ChatLib.chat(`arg supplied, value = ${arg}`); + * } else { + * ChatLib.chat('no arg supplied'); + * } + * }); + * }); + * + * // Manually register it since we used buildCommand() instead of registerCommand() + * testCmdNode.register() + * + * registerCommand('testcmd', () => { + * argument('arg', greedyString(), () => { + * redirect(testCmdNode); + * }); + * }); + * ``` + */ + new(): com.chattriggers.ctjs.api.commands.DynamicCommands; + } + interface DynamicCommands extends com.chattriggers.ctjs.internal.commands.CommandCollection { + registerCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; + registerCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; + buildCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; + buildCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; + argument(name: string, type: com.mojang.brigadier.arguments.ArgumentType, builder: org.mozilla.javascript.Function): void; + literal(name: string, builder: org.mozilla.javascript.Function): void; + redirect(node: com.chattriggers.ctjs.api.commands.RootCommand): void; + redirect(node: com.mojang.brigadier.tree.CommandNode): void; + exec(method: org.mozilla.javascript.Function): void; + /** + * A helper method for getting Fabric's client CommandDispatcher root node. This allows user + * commands to be redirected to the root node in the same way that "/execute run ..." does. + * + * As the result is a CommandNode, `.getChild(name)` can be used to access sub-command nodes + * to, for example, redirect to just `/advancement` instead of `/`. + */ + getDispatcherRoot(): com.mojang.brigadier.tree.RootCommandNode | null | undefined; + /** + * @see Argument Types: bool + */ + bool(): com.mojang.brigadier.arguments.BoolArgumentType; + /** + * @see brigadier:double + */ + double(): com.mojang.brigadier.arguments.DoubleArgumentType; + /** + * @see brigadier:double + */ + double(min: number): com.mojang.brigadier.arguments.DoubleArgumentType; + /** + * @see brigadier:double + */ + double(min: number, max: number): com.mojang.brigadier.arguments.DoubleArgumentType; + /** + * @see brigadier:float + */ + float(): com.mojang.brigadier.arguments.FloatArgumentType; + /** + * @see brigadier:float + */ + float(min: number): com.mojang.brigadier.arguments.FloatArgumentType; + /** + * @see brigadier:float + */ + float(min: number, max: number): com.mojang.brigadier.arguments.FloatArgumentType; + /** + * @see brigadier:integer + */ + integer(): com.mojang.brigadier.arguments.IntegerArgumentType; + /** + * @see brigadier:integer + */ + integer(min: number): com.mojang.brigadier.arguments.IntegerArgumentType; + /** + * @see brigadier:integer + */ + integer(min: number, max: number): com.mojang.brigadier.arguments.IntegerArgumentType; + /** + * @see brigadier:long + */ + long(): com.mojang.brigadier.arguments.LongArgumentType; + /** + * @see brigadier:long + */ + long(min: number): com.mojang.brigadier.arguments.LongArgumentType; + /** + * @see brigadier:long + */ + long(min: number, max: number): com.mojang.brigadier.arguments.LongArgumentType; + /** + * @see brigadier:string + */ + string(): com.mojang.brigadier.arguments.StringArgumentType; + /** + * @see brigadier:string + */ + greedyString(): com.mojang.brigadier.arguments.StringArgumentType; + /** + * @see brigadier:string + */ + word(): com.mojang.brigadier.arguments.StringArgumentType; + /** + * @see minecraft:angle + */ + angle(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:block_pos + */ + blockPos(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:block_predicate + */ + blockPredicate(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:block_state + */ + blockState(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:color + */ + color(): net.minecraft.commands.arguments.ColorArgument; + /** + * @see minecraft:column_pos + */ + columnPos(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:dimension + */ + dimension(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:entity + */ + entity(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:entity + */ + entities(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:float_range + */ + floatRange(): net.minecraft.commands.arguments.RangeArgument$Floats; + /** + * @see minecraft:game_profile + */ + gameProfile(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:game_profile + */ + player(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:game_profile + */ + players(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:gamemode + */ + gameMode(): net.minecraft.commands.arguments.GameModeArgument; + /** + * @see minecraft:int_range + */ + intRange(): net.minecraft.commands.arguments.RangeArgument$Ints; + /** + * @see minecraft:item_predicate + */ + itemPredicate(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:item_slot + */ + itemSlot(): net.minecraft.commands.arguments.SlotArgument; + /** + * @see minecraft:item_stack + */ + itemStack(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:message + */ + message(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:nbt_compound_tag + */ + nbtCompoundTag(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:nbt_path + */ + nbtPath(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:nbt_tag + */ + nbtTag(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:resource + */ + resource(): net.minecraft.commands.arguments.IdentifierArgument; + /** + * @see minecraft:rotation + */ + rotation(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:swizzle + */ + swizzle(): com.mojang.brigadier.arguments.ArgumentType>; + /** + * @see minecraft:time + */ + time(): net.minecraft.commands.arguments.TimeArgument; + /** + * @see minecraft:time + */ + time(minimum: number): net.minecraft.commands.arguments.TimeArgument; + /** + * @see minecraft:uuid + */ + uuid(): net.minecraft.commands.arguments.UuidArgument; + /** + * @see minecraft:vec2 + */ + vec2(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:vec2 + */ + vec2(centerIntegers: boolean): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:vec3 + */ + vec3(): com.mojang.brigadier.arguments.ArgumentType; + /** + * @see minecraft:vec3 + */ + vec3(centerIntegers: boolean): com.mojang.brigadier.arguments.ArgumentType; + /** + * Allows choosing from a set list of strings. When suggested to the user, this + * will look as though this argument is multiple "literal()" nodes. + */ + choices(options: string): com.mojang.brigadier.arguments.ArgumentType; + /** + * Allows easy creation of a custom ArgumentType without needing to use + * JavaAdapter. Example: + * + * ```js + * const HEADS = 0; + * const TAILS = 1; + * + * const coinFlipArgType = Commands.custom({ + * parse(reader) { + * // `reader` is a com.mojang.brigadier.StringReader + * + * const savedCursor = reader.getCursor(); + * const str = reader.readString(); + * if (str === 'heads') + * return HEADS; + * if (str === 'tails') + * return TAILS; + * Commands.error(reader, `Expected one of: 'heads', 'tails'`); + * }, + * suggest(ctx, builder) { + * // ctx is a com.mojang.brigadier.context.CommandContext + * // builder is a com.mojang.brigadier.suggestion.SuggestionsBuilder + * builder.suggest('heads'); + * builder.suggest('tails'); + * return builder.buildFuture(); + * }, + * getExamples() { + * return ['heads', 'tails']; + * } + * }); + * ``` + * + * @see StringReader + * @see CommandContext + * @see SuggestionsBuilder + */ + custom(obj: org.mozilla.javascript.NativeObject): com.mojang.brigadier.arguments.ArgumentType; + /** + * Throw a detailed error given the reader, meant to be used with [custom] + */ + error(reader: com.mojang.brigadier.ImmutableStringReader, message: string): never; + /** + * Throw a detailed error given the reader, meant to be used with [custom] + */ + error(reader: com.mojang.brigadier.ImmutableStringReader, message: com.chattriggers.ctjs.api.message.TextComponent): never; + /** + * An alternative to the command register that allows full use of the + * functionality provided by Brigadier. + * + * For more information about Brigadier, see + * their GitHub page. + * Also see [CTCommand] for an example Brigadier command. + * + * ## General + * + * This API works similarly to Brigadier, however much of the annoyance + * of using the Brigadier API has been eliminated, mainly the excessive + * use of nested function calls. It works via a global context, so function + * calls are free. However, this means that multiples commands cannot be + * built at once. This means that commands should only ever be built on the + * main thread. If two commands are built at the same time, an error will be + * thrown. + * + * ## Argument Types + * + * The [ArgumentType] interface is a fundamental part of Brigadier, and + * most of the MC argument types have been exposed via helper function + * in this class. It is also possible to build new instances of + * [ArgumentType] via [custom]. + * + * When possible, the argument types returned from the helper function on + * this class resolve in a way that their Minecraft variants do. For example, + * the [message] type will replace selectors with their target entity, if + * possible. + * + * ## Basic Example + * + * Here is an example command that recreates the `/advancement` command + * (without any of the actual functionality, of course): + * + * ```js + * // The `Commands` object supports destructuring, which makes assembling long + * // commands much nicer + * const { argument, choices, exec, greedyString, literal, registerCommand, resource, players } = Commands; + * + * registerCommand('ctadvancement', () => { + * // Note the use of choices to avoid having to copy-paste two separate literal() trees + * argument('kind', choices('grant', 'revoke'), () => { + * argument('targets', players(), () => { + * literal('everything', () => { + * // exec() receives a single object with all of the arguments, which means we can + * // destructure it to pull out the ones we want. Only values from argument() calls + * // are included here; the literal nodes are ignored and have no impact on this object. + * exec(({ kind, targets }) => { + * ChatLib.chat(`${kind} everything from ${targets}`); + * }); + * }); + * + * literal('only', () => { + * argument('advancement', resource(), () => { + * argument('criterion', greedyString(), () => { + * exec(({ kind, targets, advancement, criterion }) => { + * ChatLib.chat(`${kind} only ${advancement} applied to ${targets} (criterion = ${criterion})`); + * }); + * }); + * }); + * }); + * + * argument('subkind', choices('from', 'through', 'until'), () => { + * argument('advancement', resource(), () => { + * exec(({ kind, subkind, targets, advancement }) => { + * ChatLib.chat(`kind = ${kind}, subkind = ${subkind}, advancement = ${advancement}, targets = ${targets}`); + * }); + * }); + * }); + * }); + * }); + * }); + * ``` + * + * ## Redirect + * + * Like Brigadier, this API supports assembling partial command nodes for use + * in redirection. To do this, use [buildCommand], which returns the command node + * (well, an internal representation of it). This object can then be passed to + * further calls to [redirect] inside of a [literal] or [argument] block. + * + * Examples: + * + * ```js + * // destructuring omitted + * + * const testCmdNode = buildCommand('testcmd', () => { + * exec(({ arg }) => { + * if (arg) { + * ChatLib.chat(`arg supplied, value = ${arg}`); + * } else { + * ChatLib.chat('no arg supplied'); + * } + * }); + * }); + * + * // Manually register it since we used buildCommand() instead of registerCommand() + * testCmdNode.register() + * + * registerCommand('testcmd', () => { + * argument('arg', greedyString(), () => { + * redirect(testCmdNode); + * }); + * }); + * ``` + */ + new(): com.chattriggers.ctjs.api.commands.DynamicCommands; + } + const DynamicCommands$AngleArgumentWrapper: { + new(angle: net.minecraft.commands.arguments.AngleArgument$SingleAngle): com.chattriggers.ctjs.api.commands.DynamicCommands$AngleArgumentWrapper; + } + interface DynamicCommands$AngleArgumentWrapper { + getAngle(): net.minecraft.commands.arguments.AngleArgument$SingleAngle; + getAngle(): number; + getAngle(entity: com.chattriggers.ctjs.api.entity.Entity): number; + component1(): net.minecraft.commands.arguments.AngleArgument$SingleAngle; + copy(angle: net.minecraft.commands.arguments.AngleArgument$SingleAngle): com.chattriggers.ctjs.api.commands.DynamicCommands$AngleArgumentWrapper; + } + const DynamicCommands$PosArgumentWrapper: { + new(impl: net.minecraft.commands.arguments.coordinates.Coordinates): com.chattriggers.ctjs.api.commands.DynamicCommands$PosArgumentWrapper; + } + interface DynamicCommands$PosArgumentWrapper extends net.minecraft.commands.arguments.coordinates.Coordinates { + getImpl(): net.minecraft.commands.arguments.coordinates.Coordinates; + toAbsolutePos(): net.minecraft.world.phys.Vec3; + toAbsoluteBlockPos(): com.chattriggers.ctjs.api.world.block.BlockPos; + toAbsoluteRotation(): net.minecraft.world.phys.Vec2; + component1(): net.minecraft.commands.arguments.coordinates.Coordinates; + copy(impl: net.minecraft.commands.arguments.coordinates.Coordinates): com.chattriggers.ctjs.api.commands.DynamicCommands$PosArgumentWrapper; + } + const DynamicCommands$BlockPredicateWrapper: { + new(impl: net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockPredicateWrapper; + } + interface DynamicCommands$BlockPredicateWrapper { + getImpl(): net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result; + test(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; + component1(): net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result; + copy(impl: net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockPredicateWrapper; + } + const DynamicCommands$BlockStateArgumentWrapper: { + new(impl: net.minecraft.commands.arguments.blocks.BlockInput): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockStateArgumentWrapper; + } + interface DynamicCommands$BlockStateArgumentWrapper { + getImpl(): net.minecraft.commands.arguments.blocks.BlockInput; + test(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; + component1(): net.minecraft.commands.arguments.blocks.BlockInput; + copy(impl: net.minecraft.commands.arguments.blocks.BlockInput): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockStateArgumentWrapper; + } + const DynamicCommands$EntitySelectorWrapper: { + new(impl: net.minecraft.commands.arguments.selector.EntitySelector): com.chattriggers.ctjs.api.commands.DynamicCommands$EntitySelectorWrapper; + } + interface DynamicCommands$EntitySelectorWrapper { + getEntity(): com.chattriggers.ctjs.api.entity.Entity; + getEntities(): Array; + getPlayers(): Array; + } + const DynamicCommands$ItemStackArgumentWrapper: { + new(impl: net.minecraft.commands.arguments.item.ItemInput): com.chattriggers.ctjs.api.commands.DynamicCommands$ItemStackArgumentWrapper; + } + interface DynamicCommands$ItemStackArgumentWrapper { + getItemType(): com.chattriggers.ctjs.api.inventory.ItemType; + test(type: com.chattriggers.ctjs.api.inventory.ItemType): boolean; + component1(): net.minecraft.commands.arguments.item.ItemInput; + copy(impl: net.minecraft.commands.arguments.item.ItemInput): com.chattriggers.ctjs.api.commands.DynamicCommands$ItemStackArgumentWrapper; + } + const DynamicCommands$MessageFormatArgumentWrapper: { + new(impl: net.minecraft.commands.arguments.MessageArgument$Message): com.chattriggers.ctjs.api.commands.DynamicCommands$MessageFormatArgumentWrapper; + } + interface DynamicCommands$MessageFormatArgumentWrapper { + getText(): string; + setText(value: string): void; + format(): com.chattriggers.ctjs.api.message.TextComponent; + component1(): net.minecraft.commands.arguments.MessageArgument$Message; + copy(impl: net.minecraft.commands.arguments.MessageArgument$Message): com.chattriggers.ctjs.api.commands.DynamicCommands$MessageFormatArgumentWrapper; + } + const DynamicCommands$NbtPathWrapper: { + new(impl: net.minecraft.commands.arguments.NbtPathArgument$NbtPath): com.chattriggers.ctjs.api.commands.DynamicCommands$NbtPathWrapper; + } + interface DynamicCommands$NbtPathWrapper { + get(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): Array; + count(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): number; + getOrInit(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase, supplier: kotlin.Function0): Array; + put(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase, source: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): number; + insert(index: number, compound: com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound, elements: Array): number; + remove(element: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): number; + component1(): net.minecraft.commands.arguments.NbtPathArgument$NbtPath; + copy(impl: net.minecraft.commands.arguments.NbtPathArgument$NbtPath): com.chattriggers.ctjs.api.commands.DynamicCommands$NbtPathWrapper; + } + } + namespace client { + const KeyBind: { + /** + * Creates a new keybind, editable in the user's controls. + * + * @param description what the keybind does + * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A + * @param category the keybind category the keybind will be in + * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) + */ + new(description: string, keyCode: number): com.chattriggers.ctjs.api.client.KeyBind; + /** + * Creates a new keybind, editable in the user's controls. + * + * @param description what the keybind does + * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A + * @param category the keybind category the keybind will be in + * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) + */ + new(description: string, keyCode: number, category: string): com.chattriggers.ctjs.api.client.KeyBind; + new(keyBinding: net.minecraft.client.KeyMapping): com.chattriggers.ctjs.api.client.KeyBind; + } + interface KeyBind { + registerKeyPress(method: any): com.chattriggers.ctjs.api.client.KeyBind; + registerKeyRelease(method: any): com.chattriggers.ctjs.api.client.KeyBind; + registerKeyDown(method: any): com.chattriggers.ctjs.api.client.KeyBind; + unregisterKeyPress(): com.chattriggers.ctjs.api.client.KeyBind; + unregisterKeyRelease(): com.chattriggers.ctjs.api.client.KeyBind; + unregisterKeyDown(): com.chattriggers.ctjs.api.client.KeyBind; + /** + * Returns true if the key is pressed (used for continuous querying). + * + * @return whether the key is pressed + */ + isKeyDown(): boolean; + /** + * Returns true on the initial key press. For continuous querying use [isKeyDown]. + * + * @return whether the key has just been pressed + */ + isPressed(): boolean; + /** + * Gets the description of the key. + * + * @return the description + */ + getDescription(): string; + /** + * Gets the key code of the key. + * + * @return the integer key code + */ + getKeyCode(): number; + /** + * Gets the category of the key. + * + * @return the category + */ + getCategory(): string; + /** + * Sets the state of the key. + * + * @param pressed True to press, False to release + */ + setState(pressed: boolean): void; + } + const KeyBind$Companion: { + new(): com.chattriggers.ctjs.api.client.KeyBind$Companion; + } + interface KeyBind$Companion { + new(): com.chattriggers.ctjs.api.client.KeyBind$Companion; + } + const ScreenHelper: { + MenuButton: typeof com.chattriggers.ctjs.api.client.ScreenHelper$MenuButton; + titleFont: com.chattriggers.ctjs.api.render.Font; + smallerFont: com.chattriggers.ctjs.api.render.Font; + drawMenuButton(label: string, x: number, y: number, width: number, height: number, hovered: boolean, textColorOverride: number | null | undefined): void; + argb(a: number, r: number, g: number, b: number): number; + new(): com.chattriggers.ctjs.api.client.ScreenHelper; + } + interface ScreenHelper { + titleFont: com.chattriggers.ctjs.api.render.Font; + smallerFont: com.chattriggers.ctjs.api.render.Font; + drawMenuButton(label: string, x: number, y: number, width: number, height: number, hovered: boolean, textColorOverride: number | null | undefined): void; + argb(a: number, r: number, g: number, b: number): number; + new(): com.chattriggers.ctjs.api.client.ScreenHelper; + } + const ScreenHelper$MenuButton: { + new(label: string, x: number, y: number, width: number, height: number, onClick: kotlin.Function0): com.chattriggers.ctjs.api.client.ScreenHelper$MenuButton; + } + interface ScreenHelper$MenuButton { + getLabel(): string; + getX(): number; + getY(): number; + getWidth(): number; + getHeight(): number; + getOnClick(): kotlin.Function0; + isHovered(mouseX: number, mouseY: number): boolean; + component1(): string; + component2(): number; + component3(): number; + component4(): number; + component5(): number; + component6(): kotlin.Function0; + copy(label: string, x: number, y: number, width: number, height: number, onClick: kotlin.Function0): com.chattriggers.ctjs.api.client.ScreenHelper$MenuButton; + } + const WelcomeScreen: { + new(): com.chattriggers.ctjs.api.client.WelcomeScreen; + } + interface WelcomeScreen extends net.minecraft.client.gui.screens.Screen { + } + const WelcomeScreen$Companion: { + open(): void; + new(): com.chattriggers.ctjs.api.client.WelcomeScreen$Companion; + } + interface WelcomeScreen$Companion { + open(): void; + new(): com.chattriggers.ctjs.api.client.WelcomeScreen$Companion; + } + const FileLib: { + /** + * Writes a file to folder in modules. + * + * @param importName name of the import + * @param fileName name of the file + * @param toWrite string to write in file + * @param recursive whether to create folders to the file location if they don't exist + */ + write(importName: string, fileName: string, toWrite: string): void; + /** + * Writes a file to folder in modules. + * + * @param importName name of the import + * @param fileName name of the file + * @param toWrite string to write in file + * @param recursive whether to create folders to the file location if they don't exist + */ + write(importName: string, fileName: string, toWrite: string, recursive: boolean): void; + /** + * Writes a file to anywhere on the system. + * Use "./" for the ".minecraft" folder. + * + * @param fileLocation the location and file name + * @param toWrite string to write in file + * @param recursive whether to create folders to the file location if they don't exist + */ + write(fileLocation: string, toWrite: string): void; + /** + * Writes a file to anywhere on the system. + * Use "./" for the ".minecraft" folder. + * + * @param fileLocation the location and file name + * @param toWrite string to write in file + * @param recursive whether to create folders to the file location if they don't exist + */ + write(fileLocation: string, toWrite: string, recursive: boolean): void; + /** + * Writes a file to folder in modules. + * + * @param importName name of the import + * @param fileName name of the file + * @param toAppend string to append in file + */ + append(importName: string, fileName: string, toAppend: string): void; + /** + * Writes a file to anywhere on the system. + * Use "./" for the ".minecraft" folder. + * + * @param fileLocation the location and file name + * @param toAppend string to append in file + */ + append(fileLocation: string, toAppend: string): void; + /** + * Reads a file from folder in modules. + * Returns null if file is not found. + * + * @param importName name of the import + * @param fileName name of the file + * @return the string in the file, or null if not found + */ + read(importName: string, fileName: string): string | null | undefined; + /** + * Reads a file from anywhere on the system. + * Use "./" for the ".minecraft" folder. + * Returns null if file is not found. + * + * @param fileLocation the location and file name + * @return the string in the file, or null if not found + */ + read(fileLocation: string): string | null | undefined; + /** + * Reads a file from anywhere on the system using java.io.File. + * + * @param file the java.io.File to read + * @return the string in the file, or null if not found + */ + read(file: java.io.File): string | null | undefined; + /** + * Determines if a file or directory exists at the specified location + * + * @param importName name of the import + * @param fileName name of the file + * @return if the file exists + */ + exists(importName: string, fileName: string): boolean; + /** + * Determines if a file or directory exists at the specified location + * + * @param fileLocation the path of the file + * @return if the file exists + */ + exists(fileLocation: string): boolean; + /** + * Determines if a file or directory exists at the specified location + * + * @param importName name of the import + * @param fileName name of the file + * @return if the location is a directory + */ + isDirectory(importName: string, fileName: string): boolean; + /** + * Determines if a file or directory exists at the specified location + * + * @param fileLocation the path of the file + * @return if the location is a directory + */ + isDirectory(fileLocation: string): boolean; + /** + * Gets the contents of a url as a string. + * + * @param theUrl the url to get the data from + * @param userAgent the user agent to use in the connection + * @return the string stored in the url content + */ + getUrlContent(theUrl: string): string; + /** + * Gets the contents of a url as a string. + * + * @param theUrl the url to get the data from + * @param userAgent the user agent to use in the connection + * @return the string stored in the url content + */ + getUrlContent(theUrl: string, userAgent: string | null | undefined): string; + /** + * Deletes a directory at the specified location + * + * @param dir the directory to delete + * @return if the directory was deleted + */ + deleteDirectory(dir: string): boolean; + /** + * Deletes a directory at the specified location + * + * @param dir the directory to delete + * @return if the directory was deleted + */ + deleteDirectory(dir: java.io.File): boolean; + /** + * Extracts a zip file specified by the zipFilePath to a directory specified by + * destDirectory (will be created if does not exist). + * @param zipFilePath the zip file path + * @param destDirectory the destination directory + * @throws IOException IOException + */ + unzip(zipFilePath: string, destDirectory: string): void; + /** + * Encodes a string to a base64 string + * + * @param toEncode string to encode + * @return base64 encoded string + */ + encodeBase64(toEncode: string): string; + /** + * Decodes a base64 string to a string + * + * @param toDecode base64 encoded string to decode + * @return decoded string + */ + decodeBase64(toDecode: string): string; + /** + * Opens a url in the default browser + * + * @param url the url to open + */ + open(url: string): void; + /** + * Opens a path in the file explorer + * + * @param path the path to open + */ + open(path: java.io.File): void; + new(): com.chattriggers.ctjs.api.client.FileLib; + } + interface FileLib { + /** + * Writes a file to folder in modules. + * + * @param importName name of the import + * @param fileName name of the file + * @param toWrite string to write in file + * @param recursive whether to create folders to the file location if they don't exist + */ + write(importName: string, fileName: string, toWrite: string): void; + /** + * Writes a file to folder in modules. + * + * @param importName name of the import + * @param fileName name of the file + * @param toWrite string to write in file + * @param recursive whether to create folders to the file location if they don't exist + */ + write(importName: string, fileName: string, toWrite: string, recursive: boolean): void; + /** + * Writes a file to anywhere on the system. + * Use "./" for the ".minecraft" folder. + * + * @param fileLocation the location and file name + * @param toWrite string to write in file + * @param recursive whether to create folders to the file location if they don't exist + */ + write(fileLocation: string, toWrite: string): void; + /** + * Writes a file to anywhere on the system. + * Use "./" for the ".minecraft" folder. + * + * @param fileLocation the location and file name + * @param toWrite string to write in file + * @param recursive whether to create folders to the file location if they don't exist + */ + write(fileLocation: string, toWrite: string, recursive: boolean): void; + /** + * Writes a file to folder in modules. + * + * @param importName name of the import + * @param fileName name of the file + * @param toAppend string to append in file + */ + append(importName: string, fileName: string, toAppend: string): void; + /** + * Writes a file to anywhere on the system. + * Use "./" for the ".minecraft" folder. + * + * @param fileLocation the location and file name + * @param toAppend string to append in file + */ + append(fileLocation: string, toAppend: string): void; + /** + * Reads a file from folder in modules. + * Returns null if file is not found. + * + * @param importName name of the import + * @param fileName name of the file + * @return the string in the file, or null if not found + */ + read(importName: string, fileName: string): string | null | undefined; + /** + * Reads a file from anywhere on the system. + * Use "./" for the ".minecraft" folder. + * Returns null if file is not found. + * + * @param fileLocation the location and file name + * @return the string in the file, or null if not found + */ + read(fileLocation: string): string | null | undefined; + /** + * Reads a file from anywhere on the system using java.io.File. + * + * @param file the java.io.File to read + * @return the string in the file, or null if not found + */ + read(file: java.io.File): string | null | undefined; + /** + * Determines if a file or directory exists at the specified location + * + * @param importName name of the import + * @param fileName name of the file + * @return if the file exists + */ + exists(importName: string, fileName: string): boolean; + /** + * Determines if a file or directory exists at the specified location + * + * @param fileLocation the path of the file + * @return if the file exists + */ + exists(fileLocation: string): boolean; + /** + * Determines if a file or directory exists at the specified location + * + * @param importName name of the import + * @param fileName name of the file + * @return if the location is a directory + */ + isDirectory(importName: string, fileName: string): boolean; + /** + * Determines if a file or directory exists at the specified location + * + * @param fileLocation the path of the file + * @return if the location is a directory + */ + isDirectory(fileLocation: string): boolean; + /** + * Gets the contents of a url as a string. + * + * @param theUrl the url to get the data from + * @param userAgent the user agent to use in the connection + * @return the string stored in the url content + */ + getUrlContent(theUrl: string): string; + /** + * Gets the contents of a url as a string. + * + * @param theUrl the url to get the data from + * @param userAgent the user agent to use in the connection + * @return the string stored in the url content + */ + getUrlContent(theUrl: string, userAgent: string | null | undefined): string; + /** + * Deletes a directory at the specified location + * + * @param dir the directory to delete + * @return if the directory was deleted + */ + deleteDirectory(dir: string): boolean; + /** + * Deletes a directory at the specified location + * + * @param dir the directory to delete + * @return if the directory was deleted + */ + deleteDirectory(dir: java.io.File): boolean; + /** + * Extracts a zip file specified by the zipFilePath to a directory specified by + * destDirectory (will be created if does not exist). + * @param zipFilePath the zip file path + * @param destDirectory the destination directory + * @throws IOException IOException + */ + unzip(zipFilePath: string, destDirectory: string): void; + /** + * Encodes a string to a base64 string + * + * @param toEncode string to encode + * @return base64 encoded string + */ + encodeBase64(toEncode: string): string; + /** + * Decodes a base64 string to a string + * + * @param toDecode base64 encoded string to decode + * @return decoded string + */ + decodeBase64(toDecode: string): string; + /** + * Opens a url in the default browser + * + * @param url the url to open + */ + open(url: string): void; + /** + * Opens a path in the file explorer + * + * @param path the path to open + */ + open(path: java.io.File): void; + new(): com.chattriggers.ctjs.api.client.FileLib; + } + const MathLib: { + /** + * Maps a number from one range to another. + * + * @param number the number to map + * @param in_min the original range min + * @param in_max the original range max + * @param out_min the final range min + * @param out_max the final range max + * @return the re-mapped number + */ + map(number: number, in_min: number, in_max: number, out_min: number, out_max: number): number; + /** + * Clamps a floating number between two values. + * + * @param number the number to clamp + * @param min the minimum + * @param max the maximum + * @return the clamped number + */ + clampFloat(number: number, min: number, max: number): number; + /** + * Clamps an integer number between two values. + * + * @param number the number to clamp + * @param min the minimum + * @param max the maximum + * @return the clamped number + */ + clamp(number: number, min: number, max: number): number; + new(): com.chattriggers.ctjs.api.client.MathLib; + } + interface MathLib { + /** + * Maps a number from one range to another. + * + * @param number the number to map + * @param in_min the original range min + * @param in_max the original range max + * @param out_min the final range min + * @param out_max the final range max + * @return the re-mapped number + */ + map(number: number, in_min: number, in_max: number, out_min: number, out_max: number): number; + /** + * Clamps a floating number between two values. + * + * @param number the number to clamp + * @param min the minimum + * @param max the maximum + * @return the clamped number + */ + clampFloat(number: number, min: number, max: number): number; + /** + * Clamps an integer number between two values. + * + * @param number the number to clamp + * @param min the minimum + * @param max the maximum + * @return the clamped number + */ + clamp(number: number, min: number, max: number): number; + new(): com.chattriggers.ctjs.api.client.MathLib; + } + const ProxyInfo: { + getProxies(): Array; + addProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; + removeProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; + updateProxy(original: com.chattriggers.ctjs.api.client.Proxy, newProxy: com.chattriggers.ctjs.api.client.Proxy): void; + setProxyEnabled(proxy: com.chattriggers.ctjs.api.client.Proxy, enabled: boolean): void; + getEnabledProxies(): Array; + new(): com.chattriggers.ctjs.api.client.ProxyInfo; + } + interface ProxyInfo { + getProxies(): Array; + addProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; + removeProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; + updateProxy(original: com.chattriggers.ctjs.api.client.Proxy, newProxy: com.chattriggers.ctjs.api.client.Proxy): void; + setProxyEnabled(proxy: com.chattriggers.ctjs.api.client.Proxy, enabled: boolean): void; + getEnabledProxies(): Array; + new(): com.chattriggers.ctjs.api.client.ProxyInfo; + } + const Proxy: { + new(ip: string, port: number, name: string, username: string, password: string, isEnabled: boolean): com.chattriggers.ctjs.api.client.Proxy; + } + interface Proxy { + getIp(): string; + setIp(value: string): void; + getPort(): number; + setPort(value: number): void; + getName(): string; + setName(value: string): void; + getUsername(): string; + setUsername(value: string): void; + getPassword(): string; + setPassword(value: string): void; + isEnabled(): boolean; + setEnabled(value: boolean): void; + component1(): string; + component2(): number; + component3(): string; + component4(): string; + component5(): string; + component6(): boolean; + copy(ip: string, port: number, name: string, username: string, password: string, isEnabled: boolean): com.chattriggers.ctjs.api.client.Proxy; + } + const DiscordRPC: { + stayOn(): void; + turnOff(): void; + updatePresence(details: string, state: string): void; + resetTimestamp(): void; + revertToIdle(): void; + new(): com.chattriggers.ctjs.api.client.DiscordRPC; + } + interface DiscordRPC { + stayOn(): void; + turnOff(): void; + updatePresence(details: string, state: string): void; + resetTimestamp(): void; + revertToIdle(): void; + new(): com.chattriggers.ctjs.api.client.DiscordRPC; + } + const ProxyManagerScreen: { + new(parent: net.minecraft.client.gui.screens.Screen): com.chattriggers.ctjs.api.client.ProxyManagerScreen; + } + interface ProxyManagerScreen extends net.minecraft.client.gui.screens.Screen { + refreshList(): void; + } + const ProxyEditScreen: { + new(parent: com.chattriggers.ctjs.api.client.ProxyManagerScreen, existingProxy: com.chattriggers.ctjs.api.client.Proxy | null | undefined): com.chattriggers.ctjs.api.client.ProxyEditScreen; + } + interface ProxyEditScreen extends net.minecraft.client.gui.screens.Screen { + } + const Client: { + RenderLimiter: typeof com.chattriggers.ctjs.api.client.Client$RenderLimiter; + CurrentGuiWrapper: typeof com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; + CameraWrapper: typeof com.chattriggers.ctjs.api.client.Client$CameraWrapper; + isFreecam(): boolean; + setFreecam(value: boolean): void; + isFreelook(): boolean; + setFreelook(value: boolean): void; + isUngrabbed(): boolean; + setUngrabbed(value: boolean): void; + isInputLocked(): boolean; + setInputLocked(value: boolean): void; + isMacroEnabled(): boolean; + setMacroEnabled(value: boolean): void; + isForcePerspective(): boolean; + setForcePerspective(value: boolean): void; + getLimitFps(): boolean; + setLimitFps(value: boolean): void; + getMuteGame(): boolean; + setMuteGame(value: boolean): void; + getRenderLimiter(): com.chattriggers.ctjs.api.client.Client$RenderLimiter; + setRenderLimiter(value: com.chattriggers.ctjs.api.client.Client$RenderLimiter): void; + getCameraPosition(): net.minecraft.world.phys.Vec3 | null | undefined; + setCameraPosition(value: net.minecraft.world.phys.Vec3 | null | undefined): void; + getFreelookDistance(): number; + setFreelookDistance(value: number): void; + getSpectatedEntity(): net.minecraft.world.entity.LivingEntity | null | undefined; + setSpectatedEntity(value: net.minecraft.world.entity.LivingEntity | null | undefined): void; + currentGui: com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; + camera: com.chattriggers.ctjs.api.client.Client$CameraWrapper; + setCameraRotation(yaw: number, pitch: number): void; + clearCameraRotation(): void; + getCameraYaw(): number | null | undefined; + getCameraPitch(): number | null | undefined; + setNameProcessor(processor: org.mozilla.javascript.Callable | null | undefined): void; + processName(original: net.minecraft.network.chat.Component): net.minecraft.network.chat.Component; + /** + * Gets Minecraft's Minecraft object + * + * @return The Minecraft object + */ + getMinecraft(): net.minecraft.client.Minecraft; + /** + * Gets Minecraft's NetHandlerPlayClient object + * + * @return The NetHandlerPlayClient object + */ + getConnection(): net.minecraft.client.multiplayer.ClientPacketListener | null | undefined; + /** + * Schedule's a task to run on Minecraft's main thread in [delay] ticks. + * Defaults to the next tick. + * @param delay The delay in ticks + * @param callback The task to run on the main thread + */ + scheduleTask(callback: kotlin.Function0): void; + /** + * Schedule's a task to run on Minecraft's main thread in [delay] ticks. + * Defaults to the next tick. + * @param delay The delay in ticks + * @param callback The task to run on the main thread + */ + scheduleTask(delay: number, callback: kotlin.Function0): void; + /** + * Quits the client back to the main menu. + * This acts just like clicking the "Disconnect" or "Save and quit to title" button. + */ + disconnect(): void; + /** + * Connects to the server with the given ip. + * @param ip The ip to connect to + */ + connect(ip: string): void; + /** + * Connects to the server with the given ip. + * @param ip The ip to connect to + */ + connect(ip: string, port: number): void; + /** + * Gets the Minecraft ChatHud object for the chat gui + * + * @return The GuiNewChat object for the chat gui + */ + getChatGui(): net.minecraft.client.gui.components.ChatComponent | null | undefined; + isInChat(): boolean; + getTabGui(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; + isInTab(): boolean; + /** + * Gets whether the Minecraft window is active + * and in the foreground of the user's screen. + * + * @return true if the game is active, false otherwise + */ + isTabbedIn(): boolean; + isControlDown(): boolean; + isShiftDown(): boolean; + isAltDown(): boolean; + getFPS(): number; + getVersion(): string; + getSystemTime(): number; + getMouseX(): number; + getMouseY(): number; + isInGui(): boolean; + /** + * Gets the chat message currently typed into the chat gui. + * + * @return A blank string if the gui isn't open, otherwise, the message + */ + getCurrentChatMessage(): string; + /** + * Sets the current chat message, if the chat gui is not open, one will be opened. + * + * @param message the message to put in the chat text box. + */ + setCurrentChatMessage(message: string): void; + setSignLine(line: number, text: string): void; + resumeHeldKeys(): void; + releaseHeldKey(input: com.mojang.blaze3d.platform.InputConstants$Key): void; + leftClick(): void; + rightClick(): void; + setKey(key: string): boolean; + setKey(key: string, pressed: boolean): boolean; + isKeyDown(key: string): boolean; + stopMovement(): void; + unpressKeys(): void; + sendPacket(packet: net.minecraft.network.protocol.Packet): void; + sendSequencedPacket(packetFactory: kotlin.Function1>): void; + /** + * Display a title. + * + * @param title title text + * @param subtitle subtitle text + * @param fadeIn time to fade in + * @param time time to stay on screen + * @param fadeOut time to fade out + */ + showTitle(title: string | null | undefined, subtitle: string | null | undefined, fadeIn: number, time: number, fadeOut: number): void; + /** + * Copies a string to the clipboard + * + * @param text The text to copy + */ + copy(): void; + /** + * Copies a string to the clipboard + * + * @param text The text to copy + */ + copy(text: string): void; + /** + * Get the string currently on the clipboard + */ + paste(): string; + /** + * Get the [KeyBinding] from an already existing Minecraft KeyBinding, otherwise, returns null. + * + * @param keyCode the keycode to search for, see Keyboard below. Ex. Keyboard.KEY_A + * @return the [KeyBinding] from a Minecraft KeyBinding, or null if one doesn't exist + * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) + */ + getKeyBindFromKey(keyCode: number): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; + /** + * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. + * + * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A + * @param description the description of the keybind + * @param category the keybind category the keybind will be in + * @return the [KeyBinding] from a Minecraft KeyBinding, or a new one if one doesn't exist + * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) + */ + getKeyBindFromKey(keyCode: number, description: string): com.chattriggers.ctjs.api.client.KeyBind; + /** + * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. + * + * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A + * @param description the description of the keybind + * @param category the keybind category the keybind will be in + * @return the [KeyBinding] from a Minecraft KeyBinding, or a new one if one doesn't exist + * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) + */ + getKeyBindFromKey(keyCode: number, description: string, category: string): com.chattriggers.ctjs.api.client.KeyBind; + /** + * Get the [KeyBinding] from an already existing + * Minecraft KeyBinding, otherwise, returns null. + * + * @param description the description of the keybind + * @return the [KeyBinding], or null if one doesn't exist + */ + getKeyBindFromDescription(description: string): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; + new(): com.chattriggers.ctjs.api.client.Client; + } + interface Client { + isFreecam(): boolean; + setFreecam(value: boolean): void; + isFreelook(): boolean; + setFreelook(value: boolean): void; + isUngrabbed(): boolean; + setUngrabbed(value: boolean): void; + isInputLocked(): boolean; + setInputLocked(value: boolean): void; + isMacroEnabled(): boolean; + setMacroEnabled(value: boolean): void; + isForcePerspective(): boolean; + setForcePerspective(value: boolean): void; + getLimitFps(): boolean; + setLimitFps(value: boolean): void; + getMuteGame(): boolean; + setMuteGame(value: boolean): void; + getRenderLimiter(): com.chattriggers.ctjs.api.client.Client$RenderLimiter; + setRenderLimiter(value: com.chattriggers.ctjs.api.client.Client$RenderLimiter): void; + getCameraPosition(): net.minecraft.world.phys.Vec3 | null | undefined; + setCameraPosition(value: net.minecraft.world.phys.Vec3 | null | undefined): void; + getFreelookDistance(): number; + setFreelookDistance(value: number): void; + getSpectatedEntity(): net.minecraft.world.entity.LivingEntity | null | undefined; + setSpectatedEntity(value: net.minecraft.world.entity.LivingEntity | null | undefined): void; + currentGui: com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; + camera: com.chattriggers.ctjs.api.client.Client$CameraWrapper; + setCameraRotation(yaw: number, pitch: number): void; + clearCameraRotation(): void; + getCameraYaw(): number | null | undefined; + getCameraPitch(): number | null | undefined; + setNameProcessor(processor: org.mozilla.javascript.Callable | null | undefined): void; + processName(original: net.minecraft.network.chat.Component): net.minecraft.network.chat.Component; + /** + * Gets Minecraft's Minecraft object + * + * @return The Minecraft object + */ + getMinecraft(): net.minecraft.client.Minecraft; + /** + * Gets Minecraft's NetHandlerPlayClient object + * + * @return The NetHandlerPlayClient object + */ + getConnection(): net.minecraft.client.multiplayer.ClientPacketListener | null | undefined; + /** + * Schedule's a task to run on Minecraft's main thread in [delay] ticks. + * Defaults to the next tick. + * @param delay The delay in ticks + * @param callback The task to run on the main thread + */ + scheduleTask(callback: kotlin.Function0): void; + /** + * Schedule's a task to run on Minecraft's main thread in [delay] ticks. + * Defaults to the next tick. + * @param delay The delay in ticks + * @param callback The task to run on the main thread + */ + scheduleTask(delay: number, callback: kotlin.Function0): void; + /** + * Quits the client back to the main menu. + * This acts just like clicking the "Disconnect" or "Save and quit to title" button. + */ + disconnect(): void; + /** + * Connects to the server with the given ip. + * @param ip The ip to connect to + */ + connect(ip: string): void; + /** + * Connects to the server with the given ip. + * @param ip The ip to connect to + */ + connect(ip: string, port: number): void; + /** + * Gets the Minecraft ChatHud object for the chat gui + * + * @return The GuiNewChat object for the chat gui + */ + getChatGui(): net.minecraft.client.gui.components.ChatComponent | null | undefined; + isInChat(): boolean; + getTabGui(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; + isInTab(): boolean; + /** + * Gets whether the Minecraft window is active + * and in the foreground of the user's screen. + * + * @return true if the game is active, false otherwise + */ + isTabbedIn(): boolean; + isControlDown(): boolean; + isShiftDown(): boolean; + isAltDown(): boolean; + getFPS(): number; + getVersion(): string; + getSystemTime(): number; + getMouseX(): number; + getMouseY(): number; + isInGui(): boolean; + /** + * Gets the chat message currently typed into the chat gui. + * + * @return A blank string if the gui isn't open, otherwise, the message + */ + getCurrentChatMessage(): string; + /** + * Sets the current chat message, if the chat gui is not open, one will be opened. + * + * @param message the message to put in the chat text box. + */ + setCurrentChatMessage(message: string): void; + setSignLine(line: number, text: string): void; + resumeHeldKeys(): void; + releaseHeldKey(input: com.mojang.blaze3d.platform.InputConstants$Key): void; + leftClick(): void; + rightClick(): void; + setKey(key: string): boolean; + setKey(key: string, pressed: boolean): boolean; + isKeyDown(key: string): boolean; + stopMovement(): void; + unpressKeys(): void; + sendPacket(packet: net.minecraft.network.protocol.Packet): void; + sendSequencedPacket(packetFactory: kotlin.Function1>): void; + /** + * Display a title. + * + * @param title title text + * @param subtitle subtitle text + * @param fadeIn time to fade in + * @param time time to stay on screen + * @param fadeOut time to fade out + */ + showTitle(title: string | null | undefined, subtitle: string | null | undefined, fadeIn: number, time: number, fadeOut: number): void; + /** + * Copies a string to the clipboard + * + * @param text The text to copy + */ + copy(): void; + /** + * Copies a string to the clipboard + * + * @param text The text to copy + */ + copy(text: string): void; + /** + * Get the string currently on the clipboard + */ + paste(): string; + /** + * Get the [KeyBinding] from an already existing Minecraft KeyBinding, otherwise, returns null. + * + * @param keyCode the keycode to search for, see Keyboard below. Ex. Keyboard.KEY_A + * @return the [KeyBinding] from a Minecraft KeyBinding, or null if one doesn't exist + * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) + */ + getKeyBindFromKey(keyCode: number): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; + /** + * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. + * + * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A + * @param description the description of the keybind + * @param category the keybind category the keybind will be in + * @return the [KeyBinding] from a Minecraft KeyBinding, or a new one if one doesn't exist + * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) + */ + getKeyBindFromKey(keyCode: number, description: string): com.chattriggers.ctjs.api.client.KeyBind; + /** + * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. + * + * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A + * @param description the description of the keybind + * @param category the keybind category the keybind will be in + * @return the [KeyBinding] from a Minecraft KeyBinding, or a new one if one doesn't exist + * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) + */ + getKeyBindFromKey(keyCode: number, description: string, category: string): com.chattriggers.ctjs.api.client.KeyBind; + /** + * Get the [KeyBinding] from an already existing + * Minecraft KeyBinding, otherwise, returns null. + * + * @param description the description of the keybind + * @return the [KeyBinding], or null if one doesn't exist + */ + getKeyBindFromDescription(description: string): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; + new(): com.chattriggers.ctjs.api.client.Client; + } + const Client$RenderLimiter: { + OFF: com.chattriggers.ctjs.api.client.Client$RenderLimiter; + LIMIT_CHUNKS: com.chattriggers.ctjs.api.client.Client$RenderLimiter; + NO_RENDER: com.chattriggers.ctjs.api.client.Client$RenderLimiter; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.client.Client$RenderLimiter; + } + interface Client$RenderLimiter extends kotlin.Enum { + } + const Client$CurrentGuiWrapper: { + new(): com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; + } + interface Client$CurrentGuiWrapper { + /** + * Gets the Java class name of the currently open gui, for example, "GuiChest" + * + * @return the class name of the current gui + */ + getClassName(): string; + /** + * Gets the Minecraft gui class that is currently open + * + * @return the Minecraft gui + */ + get(): net.minecraft.client.gui.screens.Screen | null | undefined; + set(screen: net.minecraft.client.gui.screens.Screen | null | undefined): void; + /** + * Gets the slot under the mouse in the current gui, if one exists. + * + * @return the [Slot] under the mouse + */ + getSlotUnderMouse(): com.chattriggers.ctjs.api.inventory.Slot | null | undefined; + /** + * Closes the currently open gui + */ + close(): void; + } + const Client$CameraWrapper: { + new(): com.chattriggers.ctjs.api.client.Client$CameraWrapper; + } + interface Client$CameraWrapper { + getX(): number; + getY(): number; + getZ(): number; + } + const Player: { + ArmorWrapper: typeof com.chattriggers.ctjs.api.client.Player$ArmorWrapper; + armor: com.chattriggers.ctjs.api.client.Player$ArmorWrapper; + toMC(): net.minecraft.client.player.LocalPlayer | null | undefined; + /** + * Gets Minecraft's EntityPlayerSP object representing the user + * + * @return The Minecraft EntityPlayerSP object representing the user + */ + getPlayer(): net.minecraft.client.player.LocalPlayer | null | undefined; + getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; + asPlayerMP(): com.chattriggers.ctjs.api.entity.PlayerMP | null | undefined; + getX(): number; + getY(): number; + getZ(): number; + getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; + getRotation(): net.minecraft.world.phys.Vec2; + getLastX(): number; + getLastY(): number; + getLastZ(): number; + getRenderX(): number; + getRenderY(): number; + getRenderZ(): number; + /** + * Gets the player's x motion. + * This is the amount the player will move in the x direction next tick. + * + * @return the player's x motion + */ + getMotionX(): number; + /** + * Gets the player's y motion. + * This is the amount the player will move in the y direction next tick. + * + * @return the player's y motion + */ + getMotionY(): number; + /** + * Gets the player's z motion. + * This is the amount the player will move in the z direction next tick. + * + * @return the player's z motion + */ + getMotionZ(): number; + /** + * Gets the player's camera pitch. + * + * @return the player's camera pitch + */ + getPitch(): number; + /** + * Gets the player's camera yaw. + * + * @return the player's camera yaw + */ + getYaw(): number; + /** + * Gets the player's username. + * + * @return the player's username + */ + getName(): string; + /** + * Gets the Java UUID object of the player. + * Use of [UUID.toString] in conjunction is recommended. + * + * @return the player's uuid + */ + getUUID(): java.util.UUID; + getHP(): number; + /** + * Gets the player's air level. + * + * The returned value will be an integer. If the player is not taking damage, it + * will be between 300 (not in water) and 0. If the player is taking damage, it + * will be between -20 and 0, getting reset to 0 every time the player takes damage. + * + * @return the player's air level + */ + getAirLevel(): number; + getXPLevel(): number; + isMoving(): boolean; + isSneaking(): boolean; + isSprinting(): boolean; + /** + * Checks if player can be pushed by water. + * + * @return true if the player is flying, false otherwise + */ + isFlying(): boolean; + isSleeping(): boolean; + /** + * Gets the direction the player is facing. + * Example: "South West" + * + * @return The direction the player is facing, one of the four cardinal directions + */ + facing(): string; + /** + * Gets the current active potion effects. Returns an empty list + * if the player has no active potion effects. + * + * @return a list of the active [PotionEffect]s + */ + getActivePotionEffects(): Array; + /** + * Gets the current object that the player is looking at, + * whether that be a block or an entity. Returns null when not looking + * at anything. + * + * @return the [Block] or [Entity] being looked at, or null if air + */ + lookingAt(): any | null | undefined; + /** + * Gets the current item in the player's hand. + * + * @param hand the hand of the item + * @return the current held [Item] + */ + getHeldItem(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + /** + * Gets the current item in the player's hand. + * + * @param hand the hand of the item + * @return the current held [Item] + */ + getHeldItem(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + /** + * Sets the current held item based on the provided index. + * + * @param index the new held item index + */ + setHeldItemIndex(index: number): void; + /** + * Gets the current index of the held item. + * + * @return the current index + */ + getHeldItemIndex(): number; + /** + * Gets the inventory of the player, i.e. the inventory accessed by 'e'. + * + * @return the player's inventory + */ + getInventory(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; + /** + * Gets the display name for the player, + * i.e. the name shown in tab list and in the player's nametag. + * @return the display name + */ + getDisplayName(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sets the name for this player shown in tab list + * + * @param textComponent the new name to display + */ + setTabDisplayName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Sets the name for this player shown above their head, + * in their name tag + * + * @param textComponent the new name to display + */ + setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Gets the container the user currently has open, i.e. a chest. + * + * @return the currently opened container + */ + getContainer(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; + /** + * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] + * minus `player`. + * + * @see Renderer.drawPlayer + */ + draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Player; + new(): com.chattriggers.ctjs.api.client.Player; + } + interface Player { + armor: com.chattriggers.ctjs.api.client.Player$ArmorWrapper; + toMC(): net.minecraft.client.player.LocalPlayer | null | undefined; + /** + * Gets Minecraft's EntityPlayerSP object representing the user + * + * @return The Minecraft EntityPlayerSP object representing the user + */ + getPlayer(): net.minecraft.client.player.LocalPlayer | null | undefined; + getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; + asPlayerMP(): com.chattriggers.ctjs.api.entity.PlayerMP | null | undefined; + getX(): number; + getY(): number; + getZ(): number; + getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; + getRotation(): net.minecraft.world.phys.Vec2; + getLastX(): number; + getLastY(): number; + getLastZ(): number; + getRenderX(): number; + getRenderY(): number; + getRenderZ(): number; + /** + * Gets the player's x motion. + * This is the amount the player will move in the x direction next tick. + * + * @return the player's x motion + */ + getMotionX(): number; + /** + * Gets the player's y motion. + * This is the amount the player will move in the y direction next tick. + * + * @return the player's y motion + */ + getMotionY(): number; + /** + * Gets the player's z motion. + * This is the amount the player will move in the z direction next tick. + * + * @return the player's z motion + */ + getMotionZ(): number; + /** + * Gets the player's camera pitch. + * + * @return the player's camera pitch + */ + getPitch(): number; + /** + * Gets the player's camera yaw. + * + * @return the player's camera yaw + */ + getYaw(): number; + /** + * Gets the player's username. + * + * @return the player's username + */ + getName(): string; + /** + * Gets the Java UUID object of the player. + * Use of [UUID.toString] in conjunction is recommended. + * + * @return the player's uuid + */ + getUUID(): java.util.UUID; + getHP(): number; + /** + * Gets the player's air level. + * + * The returned value will be an integer. If the player is not taking damage, it + * will be between 300 (not in water) and 0. If the player is taking damage, it + * will be between -20 and 0, getting reset to 0 every time the player takes damage. + * + * @return the player's air level + */ + getAirLevel(): number; + getXPLevel(): number; + isMoving(): boolean; + isSneaking(): boolean; + isSprinting(): boolean; + /** + * Checks if player can be pushed by water. + * + * @return true if the player is flying, false otherwise + */ + isFlying(): boolean; + isSleeping(): boolean; + /** + * Gets the direction the player is facing. + * Example: "South West" + * + * @return The direction the player is facing, one of the four cardinal directions + */ + facing(): string; + /** + * Gets the current active potion effects. Returns an empty list + * if the player has no active potion effects. + * + * @return a list of the active [PotionEffect]s + */ + getActivePotionEffects(): Array; + /** + * Gets the current object that the player is looking at, + * whether that be a block or an entity. Returns null when not looking + * at anything. + * + * @return the [Block] or [Entity] being looked at, or null if air + */ + lookingAt(): any | null | undefined; + /** + * Gets the current item in the player's hand. + * + * @param hand the hand of the item + * @return the current held [Item] + */ + getHeldItem(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + /** + * Gets the current item in the player's hand. + * + * @param hand the hand of the item + * @return the current held [Item] + */ + getHeldItem(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + /** + * Sets the current held item based on the provided index. + * + * @param index the new held item index + */ + setHeldItemIndex(index: number): void; + /** + * Gets the current index of the held item. + * + * @return the current index + */ + getHeldItemIndex(): number; + /** + * Gets the inventory of the player, i.e. the inventory accessed by 'e'. + * + * @return the player's inventory + */ + getInventory(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; + /** + * Gets the display name for the player, + * i.e. the name shown in tab list and in the player's nametag. + * @return the display name + */ + getDisplayName(): com.chattriggers.ctjs.api.message.TextComponent; + /** + * Sets the name for this player shown in tab list + * + * @param textComponent the new name to display + */ + setTabDisplayName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Sets the name for this player shown above their head, + * in their name tag + * + * @param textComponent the new name to display + */ + setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; + /** + * Gets the container the user currently has open, i.e. a chest. + * + * @return the currently opened container + */ + getContainer(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; + /** + * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] + * minus `player`. + * + * @see Renderer.drawPlayer + */ + draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Player; + new(): com.chattriggers.ctjs.api.client.Player; + } + const Player$ArmorWrapper: { + new(): com.chattriggers.ctjs.api.client.Player$ArmorWrapper; + } + interface Player$ArmorWrapper { + /** + * @return the [Item] in the player's helmet slot or null if the slot is empty + */ + getHelmet(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + /** + * @return the [Item] in the player's chestplate slot or null if the slot is empty + */ + getChestplate(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + /** + * @return the [Item] in the player's leggings slot or null if the slot is empty + */ + getLeggings(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + /** + * @return the [Item] in the player's boots slot or null if the slot is empty + */ + getBoots(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; + } + const Sound: { + Category: typeof com.chattriggers.ctjs.api.client.Sound$Category; + AttenuationType: typeof com.chattriggers.ctjs.api.client.Sound$AttenuationType; + new(config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Sound; + } + interface Sound { + destroy(): void; + /** + * Gets the category of this sound, making it respect the Player's sound volume sliders. + * + * @return the category + */ + getCategory(): com.chattriggers.ctjs.api.client.Sound$Category; + /** + * Sets the category of this sound, making it respect the Player's sound volume sliders. + * + * @param category the category + */ + setCategory(category: com.chattriggers.ctjs.api.client.Sound$Category): com.chattriggers.ctjs.api.client.Sound; + /** + * Gets this sound's volume. + * + * @return A float value (0.0f - 1.0f). + */ + getVolume(): number; + /** + * Sets this sound's volume. + * + * @param volume A float value (0.0f - 1.0f). + */ + setVolume(volume: number): com.chattriggers.ctjs.api.client.Sound; + getX(): number; + getY(): number; + getZ(): number; + setX(x: number): com.chattriggers.ctjs.api.client.Sound; + setY(y: number): com.chattriggers.ctjs.api.client.Sound; + setZ(z: number): com.chattriggers.ctjs.api.client.Sound; + getPosition(): net.minecraft.world.phys.Vec3; + setPosition(x: number, y: number, z: number): com.chattriggers.ctjs.api.client.Sound; + /** + * Gets this sound's pitch. + * + * @return A float value (0.5f - 2.0f). + */ + getPitch(): number; + /** + * Sets this sound's pitch. + * + * @param pitch A float value (0.5f - 2.0f). + */ + setPitch(pitch: number): com.chattriggers.ctjs.api.client.Sound; + /** + * Gets the attenuation type (fade out over space) of the sound + * + * @return The type of Attenuation + */ + getAttenuationType(): com.chattriggers.ctjs.api.client.Sound$AttenuationType; + /** + * Sets the attenuation type (fade out over space) of the sound + * + * @param attenuationType The type of Attenuation + */ + setAttenuationType(attenuationType: com.chattriggers.ctjs.api.client.Sound$AttenuationType): com.chattriggers.ctjs.api.client.Sound; + /** + * Gets the attenuation distance of the sound + */ + getAttenuation(): number; + /** + * Sets the attenuation distance of the sound + */ + setAttenuation(attenuation: number): com.chattriggers.ctjs.api.client.Sound; + /** + * Gets whether the sound should repeat after finishing + */ + getLoop(): boolean; + /** + * Sets whether the sound should repeat after finishing + */ + setLoop(loop: boolean): com.chattriggers.ctjs.api.client.Sound; + /** + * Gets the tick delay after finishing before looping again (if getLoop() is true) + */ + getLoopDelay(): number; + /** + * Sets the tick delay after finishing before looping again (if getLoop() is true) + */ + setLoopDelay(loopDelay: number): com.chattriggers.ctjs.api.client.Sound; + /** + * Plays/resumes the sound. This requires the world to be loaded + */ + play(): void; + /** + * Plays/resumes the sound. This requires the world to be loaded + */ + play(delay: number): void; + /** + * Pauses the sound, to be resumed later. This requires the world to be loaded + */ + pause(): void; + /** + * Completely stops the sound. This requires the world to be loaded + */ + stop(): void; + /** + * Immediately restarts the sound. This requires the world to be loaded + */ + rewind(): void; + } + const Sound$Category: { + MASTER: com.chattriggers.ctjs.api.client.Sound$Category; + MUSIC: com.chattriggers.ctjs.api.client.Sound$Category; + RECORDS: com.chattriggers.ctjs.api.client.Sound$Category; + WEATHER: com.chattriggers.ctjs.api.client.Sound$Category; + BLOCKS: com.chattriggers.ctjs.api.client.Sound$Category; + HOSTILE: com.chattriggers.ctjs.api.client.Sound$Category; + NEUTRAL: com.chattriggers.ctjs.api.client.Sound$Category; + PLAYERS: com.chattriggers.ctjs.api.client.Sound$Category; + AMBIENT: com.chattriggers.ctjs.api.client.Sound$Category; + VOICE: com.chattriggers.ctjs.api.client.Sound$Category; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.client.Sound$Category; + } + interface Sound$Category extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + } + const Sound$Category$Companion: { + fromMC(mcValue: net.minecraft.sounds.SoundSource): com.chattriggers.ctjs.api.client.Sound$Category; + from(value: any): com.chattriggers.ctjs.api.client.Sound$Category; + new(): unknown; + } + interface Sound$Category$Companion { + fromMC(mcValue: net.minecraft.sounds.SoundSource): com.chattriggers.ctjs.api.client.Sound$Category; + from(value: any): com.chattriggers.ctjs.api.client.Sound$Category; + new(): unknown; + } + const Sound$AttenuationType: { + NONE: com.chattriggers.ctjs.api.client.Sound$AttenuationType; + LINEAR: com.chattriggers.ctjs.api.client.Sound$AttenuationType; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.client.Sound$AttenuationType; + } + interface Sound$AttenuationType extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + } + const Sound$AttenuationType$Companion: { + fromMC(mcValue: net.minecraft.client.resources.sounds.SoundInstance$Attenuation): com.chattriggers.ctjs.api.client.Sound$AttenuationType; + from(value: any): com.chattriggers.ctjs.api.client.Sound$AttenuationType; + new(): unknown; + } + interface Sound$AttenuationType$Companion { + fromMC(mcValue: net.minecraft.client.resources.sounds.SoundInstance$Attenuation): com.chattriggers.ctjs.api.client.Sound$AttenuationType; + from(value: any): com.chattriggers.ctjs.api.client.Sound$AttenuationType; + new(): unknown; + } + } + namespace render { + const Font: { + new(name: string, resourcePath: string): com.chattriggers.ctjs.api.render.Font; + new(name: string, inputStream: java.io.InputStream): com.chattriggers.ctjs.api.render.Font; + } + interface Font { + getName(): string; + buffer(): java.nio.ByteBuffer; + } + const Display: { + Background: typeof com.chattriggers.ctjs.api.render.Display$Background; + Order: typeof com.chattriggers.ctjs.api.render.Display$Order; + new(): com.chattriggers.ctjs.api.render.Display; + new(config: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.render.Display; + } + interface Display { + getTextColor(): number; + /** + * Sets the color of the texts + * + * Overrides the color of the individual texts + */ + setTextColor(textColor: number): com.chattriggers.ctjs.api.render.Display; + getAlign(): com.chattriggers.ctjs.api.render.Text$Align; + /** + * Set the alignment of the texts in the display + * + * Overrides alignment of the individual texts + */ + setAlign(align: any): com.chattriggers.ctjs.api.render.Display; + getOrder(): com.chattriggers.ctjs.api.render.Display$Order; + setOrder(order: any): com.chattriggers.ctjs.api.render.Display; + getBackground(): com.chattriggers.ctjs.api.render.Display$Background; + setBackground(background: any): com.chattriggers.ctjs.api.render.Display; + getBackgroundColor(): number; + setBackgroundColor(backgroundColor: number): com.chattriggers.ctjs.api.render.Display; + setLine(index: number, line: any): com.chattriggers.ctjs.api.render.Display; + getLine(index: number): com.chattriggers.ctjs.api.render.Text; + getLines(): Array; + setLines(lines: Array): com.chattriggers.ctjs.api.render.Display; + addLine(line: any): com.chattriggers.ctjs.api.render.Display; + addLines(lines: any): com.chattriggers.ctjs.api.render.Display; + removeLine(index: number): com.chattriggers.ctjs.api.render.Display; + clearLines(): com.chattriggers.ctjs.api.render.Display; + getX(): number; + setX(x: number): com.chattriggers.ctjs.api.render.Display; + getY(): number; + setY(y: number): com.chattriggers.ctjs.api.render.Display; + getWidth(): number; + getHeight(): number; + getMinWidth(): number; + setMinWidth(minWidth: number): com.chattriggers.ctjs.api.render.Display; + draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor): void; + } + const Text$Align: { + LEFT: com.chattriggers.ctjs.api.render.Text$Align; + CENTER: com.chattriggers.ctjs.api.render.Text$Align; + RIGHT: com.chattriggers.ctjs.api.render.Text$Align; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.render.Text$Align; + } + interface Text$Align extends kotlin.Enum { + } + const Display$Order: { + REVERSED: com.chattriggers.ctjs.api.render.Display$Order; + NORMAL: com.chattriggers.ctjs.api.render.Display$Order; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Order; + } + interface Display$Order extends kotlin.Enum { + } + const Display$Background: { + NONE: com.chattriggers.ctjs.api.render.Display$Background; + FULL: com.chattriggers.ctjs.api.render.Display$Background; + PER_LINE: com.chattriggers.ctjs.api.render.Display$Background; + getEntries(): kotlin.enums.EnumEntries; + values(): Array; + valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Background; + } + interface Display$Background extends kotlin.Enum { + } + const Text: { + Align: typeof com.chattriggers.ctjs.api.render.Text$Align; + new(string: string): com.chattriggers.ctjs.api.render.Text; + new(string: string, x: number): com.chattriggers.ctjs.api.render.Text; + new(string: string, x: number, y: number): com.chattriggers.ctjs.api.render.Text; + new(string: string, config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.render.Text; + } + interface Text { + getString(): string; + setString(string: string): com.chattriggers.ctjs.api.render.Text; + getColor(): number; + setColor(color: number): com.chattriggers.ctjs.api.render.Text; + getFormatted(): boolean; + setFormatted(formatted: boolean): com.chattriggers.ctjs.api.render.Text; + getShadow(): boolean; + setShadow(shadow: boolean): com.chattriggers.ctjs.api.render.Text; + getAlign(): com.chattriggers.ctjs.api.render.Text$Align; + setAlign(align: any): com.chattriggers.ctjs.api.render.Text; + getBackground(): boolean; + /** + * Set the background + * + * true: Background is enabled + * false: Background is disabled + */ + setBackground(background: boolean): com.chattriggers.ctjs.api.render.Text; + getBackgroundColor(): number; + setBackgroundColor(backgroundColor: number): com.chattriggers.ctjs.api.render.Text; + getX(): number; + setX(x: number): com.chattriggers.ctjs.api.render.Text; + getY(): number; + setY(y: number): com.chattriggers.ctjs.api.render.Text; + /** + * Gets the width of the text + * This is automatically updated when the text is drawn. + * + * @return the width of the text + */ + getWidth(): number; + getLines(): Array; + getMaxLines(): number; + setMaxLines(maxLines: number): com.chattriggers.ctjs.api.render.Text; + getScale(): number; + setScale(scale: number): com.chattriggers.ctjs.api.render.Text; + /** + * Sets the maximum width of the text, splitting it into multiple lines if necessary. + * + * @param maxWidth the maximum width of the text + * @return the Text object for method chaining + */ + setMaxWidth(maxWidth: number): com.chattriggers.ctjs.api.render.Text; + getMaxWidth(): number; + getHeight(): number; + exceedsMaxLines(): boolean; + draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor): com.chattriggers.ctjs.api.render.Text; + draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor, x: number | null | undefined): com.chattriggers.ctjs.api.render.Text; + draw(ctx: net.minecraft.client.gui.GuiGraphicsExtractor, x: number | null | undefined, y: number | null | undefined): com.chattriggers.ctjs.api.render.Text; + } + const DrawContextHolder: { + currentContext: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; + new(): com.chattriggers.ctjs.api.render.DrawContextHolder; + } + interface DrawContextHolder { + currentContext: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; + new(): com.chattriggers.ctjs.api.render.DrawContextHolder; + withContext(context: net.minecraft.client.gui.GuiGraphicsExtractor, block: kotlin.Function0): T; + } + const RenderPipelines: { + LINE_LIST: com.mojang.blaze3d.pipeline.RenderPipeline; + TRIANGLE_STRIP: com.mojang.blaze3d.pipeline.RenderPipeline; + LINE_LIST_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; + TRIANGLE_STRIP_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; + /** + * The only custom world pipelines are the two states vanilla does not expose: no-depth ESP. + */ + new(): com.chattriggers.ctjs.api.render.RenderPipelines; + } + interface RenderPipelines { + LINE_LIST: com.mojang.blaze3d.pipeline.RenderPipeline; + TRIANGLE_STRIP: com.mojang.blaze3d.pipeline.RenderPipeline; + LINE_LIST_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; + TRIANGLE_STRIP_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; + /** + * The only custom world pipelines are the two states vanilla does not expose: no-depth ESP. + */ + new(): com.chattriggers.ctjs.api.render.RenderPipelines; + } + const RenderLayers: { + LINE_LIST: net.minecraft.client.renderer.rendertype.RenderType; + LINE_LIST_ESP: net.minecraft.client.renderer.rendertype.RenderType; + TRIANGLE_STRIP: net.minecraft.client.renderer.rendertype.RenderType; + TRIANGLE_STRIP_ESP: net.minecraft.client.renderer.rendertype.RenderType; + new(): com.chattriggers.ctjs.api.render.RenderLayers; + } + interface RenderLayers { + LINE_LIST: net.minecraft.client.renderer.rendertype.RenderType; + LINE_LIST_ESP: net.minecraft.client.renderer.rendertype.RenderType; + TRIANGLE_STRIP: net.minecraft.client.renderer.rendertype.RenderType; + TRIANGLE_STRIP_ESP: net.minecraft.client.renderer.rendertype.RenderType; + new(): com.chattriggers.ctjs.api.render.RenderLayers; + } + const Rectangle: { + new(color: number, x: number, y: number, width: number, height: number): com.chattriggers.ctjs.api.render.Rectangle; + } + interface Rectangle { + getColor(): number; + setColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; + getX(): number; + setX(x: number): com.chattriggers.ctjs.api.render.Rectangle; + getY(): number; + setY(y: number): com.chattriggers.ctjs.api.render.Rectangle; + getWidth(): number; + setWidth(width: number): com.chattriggers.ctjs.api.render.Rectangle; + getHeight(): number; + setHeight(height: number): com.chattriggers.ctjs.api.render.Rectangle; + isShadow(): boolean; + setShadow(shadow: boolean): com.chattriggers.ctjs.api.render.Rectangle; + setShadow(color: number, x: number, y: number): com.chattriggers.ctjs.api.render.Rectangle; + getShadowOffset(): com.chattriggers.ctjs.api.vec.Vec2f; + getShadowOffsetX(): number; + getShadowOffsetY(): number; + setShadowOffset(x: number, y: number): com.chattriggers.ctjs.api.render.Rectangle; + setShadowOffsetX(x: number): com.chattriggers.ctjs.api.render.Rectangle; + setShadowOffsetY(y: number): com.chattriggers.ctjs.api.render.Rectangle; + getShadowColor(): number; + setShadowColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; + getOutline(): boolean; + setOutline(outline: boolean): com.chattriggers.ctjs.api.render.Rectangle; + setOutline(color: number, thickness: number): com.chattriggers.ctjs.api.render.Rectangle; + getOutlineColor(): number; + setOutlineColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; + getThickness(): number; + setThickness(thickness: number): com.chattriggers.ctjs.api.render.Rectangle; + draw(): com.chattriggers.ctjs.api.render.Rectangle; + } + const Renderer: { + ScreenWrapper: typeof com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; + screen: com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; + getPartialTicks(): number; + BLACK: number; + DARK_BLUE: number; + DARK_GREEN: number; + DARK_AQUA: number; + DARK_RED: number; + DARK_PURPLE: number; + GOLD: number; + GRAY: number; + DARK_GRAY: number; + BLUE: number; + GREEN: number; + AQUA: number; + RED: number; + LIGHT_PURPLE: number; + YELLOW: number; + WHITE: number; + color(color: number): number; + getFontRenderer(): net.minecraft.client.gui.Font; + getRenderManager(): net.minecraft.client.renderer.LevelRenderer; + getStringWidth(text: string): number; + getColor(red: number, green: number, blue: number): number; + getColor(red: number, green: number, blue: number, alpha: number): number; + getRainbow(step: number): number; + getRainbow(step: number, speed: number): number; + getRainbowColors(step: number): Array; + getRainbowColors(step: number, speed: number): Array; + deleteTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Renderer; + pushMatrix(): com.chattriggers.ctjs.api.render.Renderer; + pushMatrix(stack: gg.essential.universal.UMatrixStack): com.chattriggers.ctjs.api.render.Renderer; + popMatrix(): com.chattriggers.ctjs.api.render.Renderer; + translate(x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; + translate(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; + scale(scaleX: number): com.chattriggers.ctjs.api.render.Renderer; + scale(scaleX: number, scaleY: number): com.chattriggers.ctjs.api.render.Renderer; + scale(scaleX: number, scaleY: number, scaleZ: number): com.chattriggers.ctjs.api.render.Renderer; + rotate(angle: number): com.chattriggers.ctjs.api.render.Renderer; + rotate(angle: number, x: number): com.chattriggers.ctjs.api.render.Renderer; + rotate(angle: number, x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; + rotate(angle: number, x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; + multiply(quaternion: org.joml.Quaternionf): com.chattriggers.ctjs.api.render.Renderer; + fixAlpha(color: number): number; + /** + * Gets a fixed render position from x, y, and z inputs adjusted with partial ticks + * @param x the X coordinate + * @param y the Y coordinate + * @param z the Z coordinate + * @return the Vec3f position to render at + */ + getRenderPos(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; + drawString(text: string, x: number, y: number): void; + drawString(text: string, x: number, y: number, color: number): void; + drawString(text: string, x: number, y: number, color: number, shadow: boolean): void; + drawStringWithShadow(text: string, x: number, y: number): void; + drawStringWithShadow(text: string, x: number, y: number, color: number): void; + drawImage(image: com.chattriggers.ctjs.api.render.Image, x: number, y: number, width: number, height: number): void; + /** + * Draws a player entity to the screen, similar to the one displayed in the inventory screen. + * + * Takes a parameter with the following options: + * - player: The player entity to draw. Can be a [PlayerMP] or [AbstractClientPlayerEntity]. + * Defaults to Player.toMC() + * - x: The x position on the screen to render the player + * - y: The y position on the screen to render the player + * - size: The size of the rendered player + * - rotate: Whether the player should look at the mouse cursor, similar to the inventory screen + * - pitch: THe pitch the rendered player will face, if rotate is false + * - yaw: The yaw the rendered player will face, if rotate is false + * - showNametag: Whether the nametag of the player should be rendered + * - showArmor: Whether the armor of the player should be rendered + * - showCape: Whether the cape of the player should be rendered + * - showHeldItem: Whether the held item of the player should be rendered + * - showArrows: Whether any arrows stuck in the player's model should be rendered + * - showElytra: Whether the player's Elytra should be rendered + * - showParrot: Whether a perched parrot should be rendered + * - showBeeStinger: Whether any stuck bee stingers should be rendered + * + * @param obj An options bag + */ + drawPlayer(obj: org.mozilla.javascript.NativeObject): void; + new(): com.chattriggers.ctjs.api.render.Renderer; + } + interface Renderer extends com.chattriggers.ctjs.api.render.GuiRendererBackend { + screen: com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; + getPartialTicks(): number; + BLACK: number; + DARK_BLUE: number; + DARK_GREEN: number; + DARK_AQUA: number; + DARK_RED: number; + DARK_PURPLE: number; + GOLD: number; + GRAY: number; + DARK_GRAY: number; + BLUE: number; + GREEN: number; + AQUA: number; + RED: number; + LIGHT_PURPLE: number; + YELLOW: number; + WHITE: number; + color(color: number): number; + getFontRenderer(): net.minecraft.client.gui.Font; + getRenderManager(): net.minecraft.client.renderer.LevelRenderer; + getStringWidth(text: string): number; + getColor(red: number, green: number, blue: number): number; + getColor(red: number, green: number, blue: number, alpha: number): number; + getRainbow(step: number): number; + getRainbow(step: number, speed: number): number; + getRainbowColors(step: number): Array; + getRainbowColors(step: number, speed: number): Array; + deleteTexture(texture: com.chattriggers.ctjs.api.render.Image): com.chattriggers.ctjs.api.render.Renderer; + pushMatrix(): com.chattriggers.ctjs.api.render.Renderer; + pushMatrix(stack: gg.essential.universal.UMatrixStack): com.chattriggers.ctjs.api.render.Renderer; + popMatrix(): com.chattriggers.ctjs.api.render.Renderer; + translate(x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; + translate(x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; + scale(scaleX: number): com.chattriggers.ctjs.api.render.Renderer; + scale(scaleX: number, scaleY: number): com.chattriggers.ctjs.api.render.Renderer; + scale(scaleX: number, scaleY: number, scaleZ: number): com.chattriggers.ctjs.api.render.Renderer; + rotate(angle: number): com.chattriggers.ctjs.api.render.Renderer; + rotate(angle: number, x: number): com.chattriggers.ctjs.api.render.Renderer; + rotate(angle: number, x: number, y: number): com.chattriggers.ctjs.api.render.Renderer; + rotate(angle: number, x: number, y: number, z: number): com.chattriggers.ctjs.api.render.Renderer; + multiply(quaternion: org.joml.Quaternionf): com.chattriggers.ctjs.api.render.Renderer; + fixAlpha(color: number): number; + /** + * Gets a fixed render position from x, y, and z inputs adjusted with partial ticks + * @param x the X coordinate + * @param y the Y coordinate + * @param z the Z coordinate + * @return the Vec3f position to render at + */ + getRenderPos(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; + drawString(text: string, x: number, y: number): void; + drawString(text: string, x: number, y: number, color: number): void; + drawString(text: string, x: number, y: number, color: number, shadow: boolean): void; + drawStringWithShadow(text: string, x: number, y: number): void; + drawStringWithShadow(text: string, x: number, y: number, color: number): void; + drawImage(image: com.chattriggers.ctjs.api.render.Image, x: number, y: number, width: number, height: number): void; + /** + * Draws a player entity to the screen, similar to the one displayed in the inventory screen. + * + * Takes a parameter with the following options: + * - player: The player entity to draw. Can be a [PlayerMP] or [AbstractClientPlayerEntity]. + * Defaults to Player.toMC() + * - x: The x position on the screen to render the player + * - y: The y position on the screen to render the player + * - size: The size of the rendered player + * - rotate: Whether the player should look at the mouse cursor, similar to the inventory screen + * - pitch: THe pitch the rendered player will face, if rotate is false + * - yaw: The yaw the rendered player will face, if rotate is false + * - showNametag: Whether the nametag of the player should be rendered + * - showArmor: Whether the armor of the player should be rendered + * - showCape: Whether the cape of the player should be rendered + * - showHeldItem: Whether the held item of the player should be rendered + * - showArrows: Whether any arrows stuck in the player's model should be rendered + * - showElytra: Whether the player's Elytra should be rendered + * - showParrot: Whether a perched parrot should be rendered + * - showBeeStinger: Whether any stuck bee stingers should be rendered + * + * @param obj An options bag + */ + drawPlayer(obj: org.mozilla.javascript.NativeObject): void; + new(): com.chattriggers.ctjs.api.render.Renderer; + } + const GuiRendererBackend: { + GifData: typeof com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData; + defaultFont: com.chattriggers.ctjs.api.render.Font; + ALIGN_CENTER: number; + ALIGN_MIDDLE: number; + /** + * Minecraft GUI extraction and GPU resource implementation for [Renderer]. + */ + new(): com.chattriggers.ctjs.api.render.GuiRendererBackend; + } + interface GuiRendererBackend { + registerV5Render(runnable: java.lang.Runnable): void; + unregisterV5Render(runnable: java.lang.Runnable): void; + registerV5PreRender(runnable: java.lang.Runnable): void; + unregisterV5PreRender(runnable: java.lang.Runnable): void; + clearCallbacks(): void; + runPreDrawables(context: net.minecraft.client.gui.GuiGraphicsExtractor): void; + runDrawables(context: net.minecraft.client.gui.GuiGraphicsExtractor): void; + blurBackground(): void; + save(): void; + restore(): void; + globalAlpha(value: number): void; + scissor(x: number, y: number, w: number, h: number): void; + resetScissor(): void; + pushScissor(x: number, y: number, w: number, h: number): void; + popScissor(): void; + drawRect(x: number, y: number, w: number, h: number, color: number): void; + drawRoundedRect(x: number, y: number, w: number, h: number, radius: number, color: number): void; + drawRoundedRectVaried(x: number, y: number, w: number, h: number, color: number, tl: number, tr: number, br: number, bl: number): void; + drawCircle(x: number, y: number, radius: number, color: number): void; + drawHollowRect(x: number, y: number, w: number, h: number, thickness: number, color: number): void; + drawHollowRect(x: number, y: number, w: number, h: number, thickness: number, color: number, radius: number): void; + drawLine(x1: number, y1: number, x2: number, y2: number, thickness: number, color: number): void; + drawDropShadow(x: number, y: number, w: number, h: number, radius: number, blur: number, spread: number, color: number): void; + drawGradientRect(x: number, y: number, w: number, h: number, color1: number, color2: number, direction: any): void; + drawGradientRect(x: number, y: number, w: number, h: number, color1: number, color2: number, direction: any, radius: number): void; + drawHollowGradientRect(x: number, y: number, w: number, h: number, thickness: number, color1: number, color2: number, direction: any): void; + drawHollowGradientRect(x: number, y: number, w: number, h: number, thickness: number, color1: number, color2: number, direction: any, radius: number): void; + drawCheckerboard(x: number, y: number, w: number, h: number, radius: number): void; + drawCheckerboard(x: number, y: number, w: number, h: number, radius: number, size: number): void; + drawHueBar(x: number, y: number, w: number, h: number, radius: number): void; + getDefaultFont(): com.chattriggers.ctjs.api.render.Font; + text(text: string, x: number, y: number, size: number, color: number, align: number): void; + text(text: string, x: number, y: number, size: number, color: number, font: com.chattriggers.ctjs.api.render.Font | null | undefined, align: number): void; + textWidth(text: string, size: number): number; + textWidth(text: string, size: number, font: com.chattriggers.ctjs.api.render.Font | null | undefined): number; + loadImage(path: string): string; + unloadImage(path: string): void | null | undefined; + isImageLoaded(path: string): boolean; + drawImage(path: string, x: number, y: number, w: number, h: number): void; + drawImage(path: string, x: number, y: number, w: number, h: number, radius: number): void; + drawImage(path: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; + drawImageFromUrl(url: string, x: number, y: number, w: number, h: number): void; + drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number): void; + drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; + loadGif(path: string): com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData | null | undefined; + unloadGif(path: string): void; + drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number): void; + drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number): void; + drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number, alpha: number): void; + clearImageCache(): void; + getCacheStats(): string; + destroy(): void; + } + const GuiRendererBackend$GifData: { + new(width: number, height: number, frameCount: number, delays: Array): com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData; + } + interface GuiRendererBackend$GifData { + getWidth(): number; + getHeight(): number; + getFrameCount(): number; + getDelays(): Array; + component1(): number; + component2(): number; + component3(): number; + component4(): Array; + copy(width: number, height: number, frameCount: number, delays: Array): com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData; + } + const Renderer$ScreenWrapper: { + new(): com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; + } + interface Renderer$ScreenWrapper { + getWidth(): number; + getHeight(): number; + getScale(): number; + } + const Image: { + new(image: java.awt.image.BufferedImage | null | undefined): com.chattriggers.ctjs.api.render.Image; + } + interface Image { + getImage(): java.awt.image.BufferedImage | null | undefined; + setImage(value: java.awt.image.BufferedImage | null | undefined): void; + getTextureWidth(): number; + getTextureHeight(): number; + getTexture(): net.minecraft.client.renderer.texture.DynamicTexture | null | undefined; + /** + * Clears the image from GPU memory and removes its references CT side + * that way it can be garbage collected if not referenced in js code. + */ + destroy(): void; + draw(x: number, y: number): com.chattriggers.ctjs.api.render.Image; + draw(x: number, y: number, width: number | null | undefined): com.chattriggers.ctjs.api.render.Image; + draw(x: number, y: number, width: number | null | undefined, height: number | null | undefined): com.chattriggers.ctjs.api.render.Image; + } + const Image$Companion: { + /** + * Create an image object from a java.io.File object. Throws an exception + * if the file cannot be found. + */ + fromFile(file: java.io.File): com.chattriggers.ctjs.api.render.Image; + /** + * Create an image object from a file path. Throws an exception + * if the file cannot be found. + */ + fromFile(file: string): com.chattriggers.ctjs.api.render.Image; + /** + * Create an image object from a file path, relative to the assets directory. + * Throws an exception if the file cannot be found. + */ + fromAsset(name: string): com.chattriggers.ctjs.api.render.Image; + /** + * Creates an image object from a URL. Throws an exception if an image + * cannot be created from the URL. Will cache the image in the assets + */ + fromUrl(url: string): com.chattriggers.ctjs.api.render.Image; + /** + * Creates an image object from a URL. Throws an exception if an image + * cannot be created from the URL. Will cache the image in the assets + */ + fromUrl(url: string, cachedImageName: string | null | undefined): com.chattriggers.ctjs.api.render.Image; + new(): com.chattriggers.ctjs.api.render.Image$Companion; + } + interface Image$Companion { + /** + * Create an image object from a java.io.File object. Throws an exception + * if the file cannot be found. + */ + fromFile(file: java.io.File): com.chattriggers.ctjs.api.render.Image; + /** + * Create an image object from a file path. Throws an exception + * if the file cannot be found. + */ + fromFile(file: string): com.chattriggers.ctjs.api.render.Image; + /** + * Create an image object from a file path, relative to the assets directory. + * Throws an exception if the file cannot be found. + */ + fromAsset(name: string): com.chattriggers.ctjs.api.render.Image; + /** + * Creates an image object from a URL. Throws an exception if an image + * cannot be created from the URL. Will cache the image in the assets + */ + fromUrl(url: string): com.chattriggers.ctjs.api.render.Image; + /** + * Creates an image object from a URL. Throws an exception if an image + * cannot be created from the URL. Will cache the image in the assets + */ + fromUrl(url: string, cachedImageName: string | null | undefined): com.chattriggers.ctjs.api.render.Image; + new(): com.chattriggers.ctjs.api.render.Image$Companion; + } + const Book: { + new(): com.chattriggers.ctjs.api.render.Book; + } + interface Book { + /** + * Add a page to the book. + * + * @param contents the entire message for what the page should be + * @return the current book to allow method chaining + */ + addPage(contents: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Book; + /** + * Overloaded method for adding a simple page to the book. + * + * @param message a simple string to make the page + * @return the current book to allow method chaining + */ + addPage(message: string): com.chattriggers.ctjs.api.render.Book; + /** + * Inserts a page at the specified index of the book + * + * @param pageIndex the index of the page to set + * @param message the message to set the page to + * @return the current book to allow method chaining + */ + insertPage(pageIndex: number, message: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Book; + insertPage(pageIndex: number, message: string): com.chattriggers.ctjs.api.render.Book; + /** + * Sets a page of the book to the specified message. + * + * @param pageIndex the index of the page to set + * @param message the message to set the page to + * @return the current book to allow method chaining + */ + setPage(pageIndex: number, message: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Book; + setPage(pageIndex: number, message: string): com.chattriggers.ctjs.api.render.Book; + display(): void; + display(pageIndex: number): void; + isOpen(): boolean; + getCurrentPage(): number; + } + const Gui: { + new(): com.chattriggers.ctjs.api.render.Gui; + new(title: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; + } + interface Gui extends gg.essential.universal.UScreen { + open(): void; + isOpen(): boolean; + /** + * Registers a method to be run while gui is open. + * Registered method runs on draw. + * Arguments passed through to method: + * - int mouseX + * - int mouseY + * - float partialTicks + * + * @param method the method to run + * @return the trigger + */ + registerDraw(method: any): com.chattriggers.ctjs.api.render.Gui; + /** + * Registers a method to be run while gui is open. + * Registered method runs on mouse click. + * Arguments passed through to method: + * - int mouseX + * - int mouseY + * - int button + * + * @param method the method to run + * @return the trigger + */ + registerClicked(method: any): com.chattriggers.ctjs.api.render.Gui; + /** + * Registers a method to be run while the gui is open. + * Registered method runs on mouse scroll. + * Arguments passed through to method: + * - int mouseX + * - int mouseY + * - int scroll direction + */ + registerScrolled(method: any): com.chattriggers.ctjs.api.render.Gui; + /** + * Registers a method to be run while gui is open. + * Registered method runs on key input. + * Arguments passed through to method: + * - char typed character + * - int key code + * + * @param method the method to run + * @return the trigger + */ + registerKeyTyped(method: any): com.chattriggers.ctjs.api.render.Gui; + /** + * Registers a method to be run while gui is open. + * Registered method runs on key input. + * Arguments passed through to method: + * - int mouseX + * - int mouseY + * - int clickedMouseButton + * - long timeSinceLastClick + * + * @param method the method to run + * @return the trigger + */ + registerMouseDragged(method: any): com.chattriggers.ctjs.api.render.Gui; + /** + * Registers a method to be run while gui is open. + * Registered method runs on mouse release. + * Arguments passed through to method: + * - int mouseX + * - int mouseY + * - int button + * + * @param method the method to run + * @return the trigger + */ + registerMouseReleased(method: any): com.chattriggers.ctjs.api.render.Gui; + /** + * Registers a method to be run while gui is open. + * Registered method runs when an action is performed (clicking a button) + * Arguments passed through to method: + * - the button that is clicked + * + * @param method the method to run + * @return the trigger + */ + registerActionPerformed(method: any): com.chattriggers.ctjs.api.render.Gui; + /** + * Registers a method to be run when the gui is opened. + * Arguments passed through to method: + * - the gui that is opened + * + * @param method the method to run + * @return the trigger + */ + registerOpened(method: any): com.chattriggers.ctjs.api.render.Gui; + /** + * Registers a method to be run when the gui is closed. + * Arguments passed through to method: + * - the gui that is closed + * + * @param method the method to run + * @return the trigger + */ + registerClosed(method: any): com.chattriggers.ctjs.api.render.Gui; + unregisterDraw(): com.chattriggers.ctjs.api.render.Gui; + unregisterClicked(): com.chattriggers.ctjs.api.render.Gui; + unregisterScrolled(): com.chattriggers.ctjs.api.render.Gui; + unregisterKeyTyped(): com.chattriggers.ctjs.api.render.Gui; + unregisterMouseDragged(): com.chattriggers.ctjs.api.render.Gui; + unregisterMouseReleased(): com.chattriggers.ctjs.api.render.Gui; + unregisterActionPerformed(): com.chattriggers.ctjs.api.render.Gui; + unregisterOpened(): com.chattriggers.ctjs.api.render.Gui; + unregisterClosed(): com.chattriggers.ctjs.api.render.Gui; + setDoesPauseGame(doesPauseGame: boolean): com.chattriggers.ctjs.api.render.Gui; + /** + * Add a base Minecraft button to the gui + * + * @param button the button to add + * @return the button ID for use in actionPerformed + */ + addButton(button: net.minecraft.client.gui.components.Button): number; + /** + * Add a base Minecraft button to the gui + * + * @param x the x position of the button + * @param y the y position of the button + * @param width the width of the button + * @param height the height of the button + * @param buttonText the label of the button + * @return the button ID for use in actionPerformed + */ + addButton(x: number, y: number, buttonText: com.chattriggers.ctjs.api.message.TextComponent): number; + /** + * Add a base Minecraft button to the gui + * + * @param x the x position of the button + * @param y the y position of the button + * @param width the width of the button + * @param height the height of the button + * @param buttonText the label of the button + * @return the button ID for use in actionPerformed + */ + addButton(x: number, y: number, width: number, buttonText: com.chattriggers.ctjs.api.message.TextComponent): number; + /** + * Add a base Minecraft button to the gui + * + * @param x the x position of the button + * @param y the y position of the button + * @param width the width of the button + * @param height the height of the button + * @param buttonText the label of the button + * @return the button ID for use in actionPerformed + */ + addButton(x: number, y: number, width: number, height: number, buttonText: com.chattriggers.ctjs.api.message.TextComponent): number; + addButton(x: number, y: number, width: number, height: number, buttonText: string): number; + /** + * Removes a button from the gui with the given id + * + * @param buttonId the id of the button to remove + * @return the Gui for method chaining + */ + removeButton(buttonId: number): com.chattriggers.ctjs.api.render.Gui; + clearButtons(): com.chattriggers.ctjs.api.render.Gui; + getButtonVisibility(buttonId: number): boolean; + /** + * Sets the visibility of a button + * + * @param buttonId the id of the button to change + * @param visible the new visibility of the button + * @return the Gui for method chaining + */ + setButtonVisibility(buttonId: number, visible: boolean): com.chattriggers.ctjs.api.render.Gui; + getButtonEnabled(buttonId: number): boolean; + /** + * Sets the enabled state of a button + * + * @param buttonId the id of the button to set + * @param enabled the enabled state of the button + * @return the Gui for method chaining + */ + setButtonEnabled(buttonId: number, enabled: boolean): com.chattriggers.ctjs.api.render.Gui; + getButtonWidth(buttonId: number): number; + /** + * Sets the button's width. Button textures break if the width is greater than 200 + * + * @param buttonId id of the button + * @param width the new width + * @return the Gui for method chaining + */ + setButtonWidth(buttonId: number, width: number): com.chattriggers.ctjs.api.render.Gui; + getButtonHeight(buttonId: number): number; + /** + * Sets the button's height. Button textures break if the height is not 20 + * + * @param buttonId id of the button + * @param height the new height + * @return the Gui for method chaining + */ + setButtonHeight(buttonId: number, height: number): com.chattriggers.ctjs.api.render.Gui; + getButtonX(buttonId: number): number; + /** + * Sets the button's x position + * + * @param buttonId id of the button + * @param x the new x position + * @return the Gui for method chaining + */ + setButtonX(buttonId: number, x: number): com.chattriggers.ctjs.api.render.Gui; + getButtonY(buttonId: number): number; + /** + * Sets the button's y position + * + * @param buttonId id of the button + * @param y the new y position + * @return the Gui for method chaining + */ + setButtonY(buttonId: number, y: number): com.chattriggers.ctjs.api.render.Gui; + /** + * Sets the button's position + * + * @param buttonId id of the button + * @param x the new x position + * @param y the new y position + * @return the Gui for method chaining + */ + setButtonLoc(buttonId: number, x: number, y: number): com.chattriggers.ctjs.api.render.Gui; + /** + * Sets the button's text + * + * @param buttonId id of the button + * @param text the new text + */ + setButtonText(buttonId: number, text: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; + /** + * Sets the button's text + * + * @param buttonId id of the button + * @param text the new text + */ + setButtonText(buttonId: number, text: string): com.chattriggers.ctjs.api.render.Gui; + /** + * Sets the gui's tooltip, this will be visible on top of the cursor + * when the gui is open. + * + * @param text the contents of the tooltip + */ + setTooltip(text: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; + /** + * Sets the gui's tooltip, this will be visible on top of the cursor + * when the gui is open. + * + * @param text the contents of the tooltip + */ + setTooltip(text: string): com.chattriggers.ctjs.api.render.Gui; + } + const Toast: { + new(config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.render.Toast; + } + interface Toast extends net.minecraft.client.gui.components.toasts.Toast { + getTitle(): any | null | undefined; + setTitle(value: any | null | undefined): void; + getDescription(): any | null | undefined; + setDescription(value: any | null | undefined): void; + getBackground(): any | null | undefined; + setBackground(value: any | null | undefined): void; + getIcon(): any | null | undefined; + setIcon(value: any | null | undefined): void; + getDisplayTime(): number; + setDisplayTime(value: number): void; + show(): com.chattriggers.ctjs.api.render.Toast; + } + const RenderUtils: { + Color: typeof com.chattriggers.ctjs.api.render.RenderUtils$Color; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number, depth: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number, depth: boolean): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; + new(): com.chattriggers.ctjs.api.render.RenderUtils; + } + interface RenderUtils { + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawWireFrameBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawWireFrameBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number): void; + drawStyledBox(pos: net.minecraft.world.phys.Vec3, color1: com.chattriggers.ctjs.api.render.RenderUtils$Color, color2: com.chattriggers.ctjs.api.render.RenderUtils$Color, wireThickness: number, depth: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number): void; + drawSizedBox(pos: net.minecraft.world.phys.Vec3, width: number, height: number, length: number, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, filled: boolean, thickness: number, depth: boolean): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawHitbox(entity: net.minecraft.world.entity.Entity, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawLine(start: net.minecraft.world.phys.Vec3, end: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number): void; + drawTracer(targetPos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, thickness: number, depth: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean): void; + drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; + new(): com.chattriggers.ctjs.api.render.RenderUtils; + } + const RenderUtils$Color: { + new(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.RenderUtils$Color; + } + interface RenderUtils$Color { + getR(): number; + getG(): number; + getB(): number; + getA(): number; + getRf(): number; + getGf(): number; + getBf(): number; + getAf(): number; + getPacked(): number; + component1(): number; + component2(): number; + component3(): number; + component4(): number; + copy(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.RenderUtils$Color; + } + } + const Config$ConsoleSettings: { + new(clearConsoleOnLoad: boolean, openConsoleOnError: boolean, consoleFiraCodeFont: boolean, consoleFontSize: number, customTheme: boolean, consoleTheme: number, consoleTextColor: java.awt.Color, consoleBackgroundColor: java.awt.Color, consoleErrorColor: java.awt.Color, consoleWarningColor: java.awt.Color): com.chattriggers.ctjs.api.Config$ConsoleSettings; + } + interface Config$ConsoleSettings { + getClearConsoleOnLoad(): boolean; + setClearConsoleOnLoad(value: boolean): void; + getOpenConsoleOnError(): boolean; + setOpenConsoleOnError(value: boolean): void; + getConsoleFiraCodeFont(): boolean; + setConsoleFiraCodeFont(value: boolean): void; + getConsoleFontSize(): number; + setConsoleFontSize(value: number): void; + getCustomTheme(): boolean; + setCustomTheme(value: boolean): void; + getConsoleTheme(): number; + setConsoleTheme(value: number): void; + getConsoleTextColor(): java.awt.Color; + setConsoleTextColor(value: java.awt.Color): void; + getConsoleBackgroundColor(): java.awt.Color; + setConsoleBackgroundColor(value: java.awt.Color): void; + getConsoleErrorColor(): java.awt.Color; + setConsoleErrorColor(value: java.awt.Color): void; + getConsoleWarningColor(): java.awt.Color; + setConsoleWarningColor(value: java.awt.Color): void; + component1(): boolean; + component2(): boolean; + component3(): boolean; + component4(): number; + component5(): boolean; + component6(): number; + component7(): java.awt.Color; + component8(): java.awt.Color; + component9(): java.awt.Color; + component10(): java.awt.Color; + copy(clearConsoleOnLoad: boolean, openConsoleOnError: boolean, consoleFiraCodeFont: boolean, consoleFontSize: number, customTheme: boolean, consoleTheme: number, consoleTextColor: java.awt.Color, consoleBackgroundColor: java.awt.Color, consoleErrorColor: java.awt.Color, consoleWarningColor: java.awt.Color): com.chattriggers.ctjs.api.Config$ConsoleSettings; + } + const Config$ConsoleSettings$Companion: { + new(): unknown; + } + interface Config$ConsoleSettings$Companion { + new(): unknown; + make(): com.chattriggers.ctjs.api.Config$ConsoleSettings; + } + interface CTWrapper { + getMcValue(): MCClass; + toMC(): MCClass; + } + const Config: { + ConsoleSettings: typeof com.chattriggers.ctjs.api.Config$ConsoleSettings; + getModuleImportHelp(): boolean; + setModuleImportHelp(value: boolean): void; + getModuleChangelog(): boolean; + setModuleChangelog(value: boolean): void; + getShowUpdatesInChat(): boolean; + setShowUpdatesInChat(value: boolean): void; + getAutoUpdateModules(): boolean; + setAutoUpdateModules(value: boolean): void; + getSendStatistics(): boolean; + setSendStatistics(value: boolean): void; + getClearConsoleOnLoad(): boolean; + setClearConsoleOnLoad(value: boolean): void; + getOpenConsoleOnError(): boolean; + setOpenConsoleOnError(value: boolean): void; + getConsoleFiraCodeFont(): boolean; + setConsoleFiraCodeFont(value: boolean): void; + getConsoleFontSize(): number; + setConsoleFontSize(value: number): void; + getCustomTheme(): boolean; + setCustomTheme(value: boolean): void; + getConsoleTheme(): number; + setConsoleTheme(value: number): void; + getConsoleTextColor(): java.awt.Color; + setConsoleTextColor(value: java.awt.Color): void; + getConsoleBackgroundColor(): java.awt.Color; + setConsoleBackgroundColor(value: java.awt.Color): void; + getConsoleErrorColor(): java.awt.Color; + setConsoleErrorColor(value: java.awt.Color): void; + getConsoleWarningColor(): java.awt.Color; + setConsoleWarningColor(value: java.awt.Color): void; + wasWelcomeShown(): boolean; + markWelcomeShown(): void; + new(): com.chattriggers.ctjs.api.Config; + } + interface Config extends gg.essential.vigilance.Vigilant { + getModuleImportHelp(): boolean; + setModuleImportHelp(value: boolean): void; + getModuleChangelog(): boolean; + setModuleChangelog(value: boolean): void; + getShowUpdatesInChat(): boolean; + setShowUpdatesInChat(value: boolean): void; + getAutoUpdateModules(): boolean; + setAutoUpdateModules(value: boolean): void; + getSendStatistics(): boolean; + setSendStatistics(value: boolean): void; + getClearConsoleOnLoad(): boolean; + setClearConsoleOnLoad(value: boolean): void; + getOpenConsoleOnError(): boolean; + setOpenConsoleOnError(value: boolean): void; + getConsoleFiraCodeFont(): boolean; + setConsoleFiraCodeFont(value: boolean): void; + getConsoleFontSize(): number; + setConsoleFontSize(value: number): void; + getCustomTheme(): boolean; + setCustomTheme(value: boolean): void; + getConsoleTheme(): number; + setConsoleTheme(value: number): void; + getConsoleTextColor(): java.awt.Color; + setConsoleTextColor(value: java.awt.Color): void; + getConsoleBackgroundColor(): java.awt.Color; + setConsoleBackgroundColor(value: java.awt.Color): void; + getConsoleErrorColor(): java.awt.Color; + setConsoleErrorColor(value: java.awt.Color): void; + getConsoleWarningColor(): java.awt.Color; + setConsoleWarningColor(value: java.awt.Color): void; + wasWelcomeShown(): boolean; + markWelcomeShown(): void; + new(): com.chattriggers.ctjs.api.Config; + } + const V5Auth: { + getJwtToken(): string | null | undefined; + getFreshJwtToken(): string | null | undefined; + setJwtToken(token: string | null | undefined): void; + shutDownHard(): java.lang.Void; + new(): com.chattriggers.ctjs.api.V5Auth; + } + interface V5Auth { + getJwtToken(): string | null | undefined; + getFreshJwtToken(): string | null | undefined; + setJwtToken(token: string | null | undefined): void; + shutDownHard(): java.lang.Void; + new(): com.chattriggers.ctjs.api.V5Auth; + } + const Mappings: { + /** + * Gets a classes unmapped class name, or throws an error if it is not mapped */ - registerPacketSent(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + unmapClass(clazz: java.lang.Class): string | null | undefined; /** - * Registers a new trigger that runs whenever a packet is sent to the client from the server - * - * Passes through two arguments: - * - The packet - * - The event, which can be cancelled - * - * Available modifications: - * - [Trigger.setPriority] Sets the priority - * - [ClassFilterTrigger.setFilteredClasses] Sets the packet classes which this trigger - * gets fired for - * - * @param method The method to call when the event is fired - * @return The trigger for additional modification + * Gets an unmapped class name from a mapped class name, or returns null if + * it either does not exist or is not mapped. */ - registerPacketReceived(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + unmapClassName(className: string): string | null | undefined; /** - * Registers a new trigger that runs whenever the player connects to a server - * - * Available modifications: - * - [Trigger.setPriority] Sets the priority - * - * @param method The method to call when the event is fired - * @return The trigger for additional modification + * Gets the mapped class name from an unmapped class name or null if the class + * name does not exist. Note that this is not required to use mapped classes, + * as Rhino performs this mapping automatically during runtime. */ - registerServerConnect(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + mapClassName(className: string): string | null | undefined; /** - * Registers a new trigger that runs whenever the player disconnects from a server - * - * Available modifications: - * - [Trigger.setPriority] Sets the priority - * - * @param method The method to call when the event is fired - * @return The trigger for additional modification + * Allows runtime inspection of mappings */ - registerServerDisconnect(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + new(): com.chattriggers.ctjs.api.Mappings; + } + interface Mappings { /** - * Registers a new trigger that runs whenever an entity is rendered - * - * Passes through three arguments: - * - The [com.chattriggers.ctjs.api.entity.Entity] - * - The partial ticks - * - The event, which can be cancelled - * - * Available modifications: - * - [Trigger.setPriority] Sets the priority - * - [ClassFilterTrigger.setFilteredClasses] Sets the entity classes which this trigger - * gets fired for - * - * @param method The method to call when the event is fired - * @return The trigger for additional modification + * Gets a classes unmapped class name, or throws an error if it is not mapped */ - registerRenderEntity(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + unmapClass(clazz: java.lang.Class): string | null | undefined; /** - * Registers a new trigger that runs whenever a block entity is rendered - * - * Passes through three arguments: - * - The [com.chattriggers.ctjs.api.entity.BlockEntity] - * - The partial ticks - * - The event, which can be cancelled - * - * Available modifications: - * - [Trigger.setPriority] Sets the priority - * - [ClassFilterTrigger.setFilteredClasses] Sets the tile entity classes which this trigger - * gets fired for - * - * @param method The method to call when the event is fired - * @return The trigger for additional modification + * Gets an unmapped class name from a mapped class name, or returns null if + * it either does not exist or is not mapped. */ - registerRenderBlockEntity(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + unmapClassName(className: string): string | null | undefined; /** - * Registers a new trigger that runs after the current screen is rendered - * - * Passes through three arguments: - * - The mouseX - * - The mouseY - * - The GuiScreen - * - * Available modifications: - * - [Trigger.setPriority] Sets the priority - * - * @param method The method to call when the event is fired - * @return The trigger for additional modification + * Gets the mapped class name from an unmapped class name or null if the class + * name does not exist. Note that this is not required to use mapped classes, + * as Rhino performs this mapping automatically during runtime. */ - registerPostGuiRender(method: any): com.chattriggers.ctjs.api.triggers.Trigger; + mapClassName(className: string): string | null | undefined; /** - * Registers a new trigger that runs whenever a particle is spawned - * - * Passes through two arguments: - * - The [com.chattriggers.ctjs.api.entity.Particle] - * - The event, which can be cancelled - * - * Available modifications: - * - [Trigger.setPriority] Sets the priority - * - * @param method The method to call when the event is fired - * @return The trigger for additional modification + * Allows runtime inspection of mappings */ - registerSpawnParticle(method: any): com.chattriggers.ctjs.api.triggers.Trigger; - new(): com.chattriggers.ctjs.engine.Register; + new(): com.chattriggers.ctjs.api.Mappings; + } + } + namespace internal { + namespace launch { + interface IInjector { + } + } + namespace commands { + const CommandCollection: { + new(): com.chattriggers.ctjs.internal.commands.CommandCollection; + } + interface CommandCollection { + register(command: com.chattriggers.ctjs.internal.commands.Command): void; + unregister(command: com.chattriggers.ctjs.internal.commands.Command): void; + unregisterAll(): void; + onExecute(block: kotlin.Function1, void>): T; + } + interface Command { + getOverrideExisting(): boolean; + getName(): string; + registerImpl(dispatcher: com.mojang.brigadier.CommandDispatcher): void; + unregisterImpl(dispatcher: com.mojang.brigadier.CommandDispatcher): void; + } } } const CTJS: { @@ -53015,117 +52031,6 @@ declare global { } } } - namespace v5 { - namespace loader { - const V5PreLaunch: { - new(): com.v5.loader.V5PreLaunch; - } - interface V5PreLaunch extends net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint { - } - } - namespace storage { - const V5MixinStorage: { - get(key: string, defaultValue: any): any; - getBoolean(key: string, defaultValue: boolean): boolean; - getString(key: string, defaultValue: string): string; - set(key: string, value: any): void; - clear(): void; - applyMethod(methodName: string, original: T, expectedType: java.lang.Class): T; - } - interface V5MixinStorage { - } - } - namespace mixins { - const CrossCollisionBlockMixin: { - new(): com.v5.mixins.CrossCollisionBlockMixin; - } - interface CrossCollisionBlockMixin { - } - const MinecraftMixin: { - new(): com.v5.mixins.MinecraftMixin; - } - interface MinecraftMixin { - options: net.minecraft.client.Options; - } - const MouseHandlerMixin: { - new(): com.v5.mixins.MouseHandlerMixin; - } - interface MouseHandlerMixin { - } - const DrawContextCapture: { - new(): com.v5.mixins.DrawContextCapture; - } - interface DrawContextCapture { - } - const BlockMixin: { - new(): com.v5.mixins.BlockMixin; - } - interface BlockMixin { - } - const FramerateLimitTrackerMixin: { - new(): com.v5.mixins.FramerateLimitTrackerMixin; - } - interface FramerateLimitTrackerMixin { - } - interface JoinMultiplayerScreenMixin extends net.minecraft.client.gui.screens.Screen { - } - const KeyboardHandlerMixin: { - new(): com.v5.mixins.KeyboardHandlerMixin; - } - interface KeyboardHandlerMixin { - } - const YggdrasilServicesKeyInfoMixin: { - new(): com.v5.mixins.YggdrasilServicesKeyInfoMixin; - } - interface YggdrasilServicesKeyInfoMixin { - } - const EntityRendererMixin: { - new(): com.v5.mixins.EntityRendererMixin; - } - interface EntityRendererMixin { - } - const ChatComponentMixin: { - new(): com.v5.mixins.ChatComponentMixin; - } - interface ChatComponentMixin { - } - const FirmamentModAnnouncerMixin: { - new(): com.v5.mixins.FirmamentModAnnouncerMixin; - } - interface FirmamentModAnnouncerMixin { - } - const ConnectionProxyMixin: { - new(): com.v5.mixins.ConnectionProxyMixin; - } - interface ConnectionProxyMixin { - } - const GameRendererMixin: { - new(): com.v5.mixins.GameRendererMixin; - } - interface GameRendererMixin { - } - const LevelRendererMixin: { - new(): com.v5.mixins.LevelRendererMixin; - } - interface LevelRendererMixin { - } - const CameraMixin: { - new(): com.v5.mixins.CameraMixin; - } - interface CameraMixin { - } - const ConnectionMixin: { - new(): com.v5.mixins.ConnectionMixin; - } - interface ConnectionMixin { - } - const PlayerTabOverlayMixin: { - new(): com.v5.mixins.PlayerTabOverlayMixin; - } - interface PlayerTabOverlayMixin { - } - } - } } namespace javax { namespace security { @@ -59241,4893 +58146,88 @@ declare global { } } } - namespace lwjgl { - namespace opengl { - const GL11: { - GL_ACCUM: number; - GL_LOAD: number; - GL_RETURN: number; - GL_MULT: number; - GL_ADD: number; - GL_NEVER: number; - GL_LESS: number; - GL_EQUAL: number; - GL_LEQUAL: number; - GL_GREATER: number; - GL_NOTEQUAL: number; - GL_GEQUAL: number; - GL_ALWAYS: number; - GL_CURRENT_BIT: number; - GL_POINT_BIT: number; - GL_LINE_BIT: number; - GL_POLYGON_BIT: number; - GL_POLYGON_STIPPLE_BIT: number; - GL_PIXEL_MODE_BIT: number; - GL_LIGHTING_BIT: number; - GL_FOG_BIT: number; - GL_DEPTH_BUFFER_BIT: number; - GL_ACCUM_BUFFER_BIT: number; - GL_STENCIL_BUFFER_BIT: number; - GL_VIEWPORT_BIT: number; - GL_TRANSFORM_BIT: number; - GL_ENABLE_BIT: number; - GL_COLOR_BUFFER_BIT: number; - GL_HINT_BIT: number; - GL_EVAL_BIT: number; - GL_LIST_BIT: number; - GL_TEXTURE_BIT: number; - GL_SCISSOR_BIT: number; - GL_ALL_ATTRIB_BITS: number; - GL_POINTS: number; - GL_LINES: number; - GL_LINE_LOOP: number; - GL_LINE_STRIP: number; - GL_TRIANGLES: number; - GL_TRIANGLE_STRIP: number; - GL_TRIANGLE_FAN: number; - GL_QUADS: number; - GL_QUAD_STRIP: number; - GL_POLYGON: number; - GL_ZERO: number; - GL_ONE: number; - GL_SRC_COLOR: number; - GL_ONE_MINUS_SRC_COLOR: number; - GL_SRC_ALPHA: number; - GL_ONE_MINUS_SRC_ALPHA: number; - GL_DST_ALPHA: number; - GL_ONE_MINUS_DST_ALPHA: number; - GL_DST_COLOR: number; - GL_ONE_MINUS_DST_COLOR: number; - GL_SRC_ALPHA_SATURATE: number; - GL_TRUE: number; - GL_FALSE: number; - GL_CLIP_PLANE0: number; - GL_CLIP_PLANE1: number; - GL_CLIP_PLANE2: number; - GL_CLIP_PLANE3: number; - GL_CLIP_PLANE4: number; - GL_CLIP_PLANE5: number; - GL_BYTE: number; - GL_UNSIGNED_BYTE: number; - GL_SHORT: number; - GL_UNSIGNED_SHORT: number; - GL_INT: number; - GL_UNSIGNED_INT: number; - GL_FLOAT: number; - GL_2_BYTES: number; - GL_3_BYTES: number; - GL_4_BYTES: number; - GL_DOUBLE: number; - GL_NONE: number; - GL_FRONT_LEFT: number; - GL_FRONT_RIGHT: number; - GL_BACK_LEFT: number; - GL_BACK_RIGHT: number; - GL_FRONT: number; - GL_BACK: number; - GL_LEFT: number; - GL_RIGHT: number; - GL_FRONT_AND_BACK: number; - GL_AUX0: number; - GL_AUX1: number; - GL_AUX2: number; - GL_AUX3: number; - GL_NO_ERROR: number; - GL_INVALID_ENUM: number; - GL_INVALID_VALUE: number; - GL_INVALID_OPERATION: number; - GL_STACK_OVERFLOW: number; - GL_STACK_UNDERFLOW: number; - GL_OUT_OF_MEMORY: number; - GL_2D: number; - GL_3D: number; - GL_3D_COLOR: number; - GL_3D_COLOR_TEXTURE: number; - GL_4D_COLOR_TEXTURE: number; - GL_PASS_THROUGH_TOKEN: number; - GL_POINT_TOKEN: number; - GL_LINE_TOKEN: number; - GL_POLYGON_TOKEN: number; - GL_BITMAP_TOKEN: number; - GL_DRAW_PIXEL_TOKEN: number; - GL_COPY_PIXEL_TOKEN: number; - GL_LINE_RESET_TOKEN: number; - GL_EXP: number; - GL_EXP2: number; - GL_CW: number; - GL_CCW: number; - GL_COEFF: number; - GL_ORDER: number; - GL_DOMAIN: number; - GL_CURRENT_COLOR: number; - GL_CURRENT_INDEX: number; - GL_CURRENT_NORMAL: number; - GL_CURRENT_TEXTURE_COORDS: number; - GL_CURRENT_RASTER_COLOR: number; - GL_CURRENT_RASTER_INDEX: number; - GL_CURRENT_RASTER_TEXTURE_COORDS: number; - GL_CURRENT_RASTER_POSITION: number; - GL_CURRENT_RASTER_POSITION_VALID: number; - GL_CURRENT_RASTER_DISTANCE: number; - GL_POINT_SMOOTH: number; - GL_POINT_SIZE: number; - GL_POINT_SIZE_RANGE: number; - GL_POINT_SIZE_GRANULARITY: number; - GL_LINE_SMOOTH: number; - GL_LINE_WIDTH: number; - GL_LINE_WIDTH_RANGE: number; - GL_LINE_WIDTH_GRANULARITY: number; - GL_LINE_STIPPLE: number; - GL_LINE_STIPPLE_PATTERN: number; - GL_LINE_STIPPLE_REPEAT: number; - GL_LIST_MODE: number; - GL_MAX_LIST_NESTING: number; - GL_LIST_BASE: number; - GL_LIST_INDEX: number; - GL_POLYGON_MODE: number; - GL_POLYGON_SMOOTH: number; - GL_POLYGON_STIPPLE: number; - GL_EDGE_FLAG: number; - GL_CULL_FACE: number; - GL_CULL_FACE_MODE: number; - GL_FRONT_FACE: number; - GL_LIGHTING: number; - GL_LIGHT_MODEL_LOCAL_VIEWER: number; - GL_LIGHT_MODEL_TWO_SIDE: number; - GL_LIGHT_MODEL_AMBIENT: number; - GL_SHADE_MODEL: number; - GL_COLOR_MATERIAL_FACE: number; - GL_COLOR_MATERIAL_PARAMETER: number; - GL_COLOR_MATERIAL: number; - GL_FOG: number; - GL_FOG_INDEX: number; - GL_FOG_DENSITY: number; - GL_FOG_START: number; - GL_FOG_END: number; - GL_FOG_MODE: number; - GL_FOG_COLOR: number; - GL_DEPTH_RANGE: number; - GL_DEPTH_TEST: number; - GL_DEPTH_WRITEMASK: number; - GL_DEPTH_CLEAR_VALUE: number; - GL_DEPTH_FUNC: number; - GL_ACCUM_CLEAR_VALUE: number; - GL_STENCIL_TEST: number; - GL_STENCIL_CLEAR_VALUE: number; - GL_STENCIL_FUNC: number; - GL_STENCIL_VALUE_MASK: number; - GL_STENCIL_FAIL: number; - GL_STENCIL_PASS_DEPTH_FAIL: number; - GL_STENCIL_PASS_DEPTH_PASS: number; - GL_STENCIL_REF: number; - GL_STENCIL_WRITEMASK: number; - GL_MATRIX_MODE: number; - GL_NORMALIZE: number; - GL_VIEWPORT: number; - GL_MODELVIEW_STACK_DEPTH: number; - GL_PROJECTION_STACK_DEPTH: number; - GL_TEXTURE_STACK_DEPTH: number; - GL_MODELVIEW_MATRIX: number; - GL_PROJECTION_MATRIX: number; - GL_TEXTURE_MATRIX: number; - GL_ATTRIB_STACK_DEPTH: number; - GL_CLIENT_ATTRIB_STACK_DEPTH: number; - GL_ALPHA_TEST: number; - GL_ALPHA_TEST_FUNC: number; - GL_ALPHA_TEST_REF: number; - GL_DITHER: number; - GL_BLEND_DST: number; - GL_BLEND_SRC: number; - GL_BLEND: number; - GL_LOGIC_OP_MODE: number; - GL_INDEX_LOGIC_OP: number; - GL_LOGIC_OP: number; - GL_COLOR_LOGIC_OP: number; - GL_AUX_BUFFERS: number; - GL_DRAW_BUFFER: number; - GL_READ_BUFFER: number; - GL_SCISSOR_BOX: number; - GL_SCISSOR_TEST: number; - GL_INDEX_CLEAR_VALUE: number; - GL_INDEX_WRITEMASK: number; - GL_COLOR_CLEAR_VALUE: number; - GL_COLOR_WRITEMASK: number; - GL_INDEX_MODE: number; - GL_RGBA_MODE: number; - GL_DOUBLEBUFFER: number; - GL_STEREO: number; - GL_RENDER_MODE: number; - GL_PERSPECTIVE_CORRECTION_HINT: number; - GL_POINT_SMOOTH_HINT: number; - GL_LINE_SMOOTH_HINT: number; - GL_POLYGON_SMOOTH_HINT: number; - GL_FOG_HINT: number; - GL_TEXTURE_GEN_S: number; - GL_TEXTURE_GEN_T: number; - GL_TEXTURE_GEN_R: number; - GL_TEXTURE_GEN_Q: number; - GL_PIXEL_MAP_I_TO_I: number; - GL_PIXEL_MAP_S_TO_S: number; - GL_PIXEL_MAP_I_TO_R: number; - GL_PIXEL_MAP_I_TO_G: number; - GL_PIXEL_MAP_I_TO_B: number; - GL_PIXEL_MAP_I_TO_A: number; - GL_PIXEL_MAP_R_TO_R: number; - GL_PIXEL_MAP_G_TO_G: number; - GL_PIXEL_MAP_B_TO_B: number; - GL_PIXEL_MAP_A_TO_A: number; - GL_PIXEL_MAP_I_TO_I_SIZE: number; - GL_PIXEL_MAP_S_TO_S_SIZE: number; - GL_PIXEL_MAP_I_TO_R_SIZE: number; - GL_PIXEL_MAP_I_TO_G_SIZE: number; - GL_PIXEL_MAP_I_TO_B_SIZE: number; - GL_PIXEL_MAP_I_TO_A_SIZE: number; - GL_PIXEL_MAP_R_TO_R_SIZE: number; - GL_PIXEL_MAP_G_TO_G_SIZE: number; - GL_PIXEL_MAP_B_TO_B_SIZE: number; - GL_PIXEL_MAP_A_TO_A_SIZE: number; - GL_UNPACK_SWAP_BYTES: number; - GL_UNPACK_LSB_FIRST: number; - GL_UNPACK_ROW_LENGTH: number; - GL_UNPACK_SKIP_ROWS: number; - GL_UNPACK_SKIP_PIXELS: number; - GL_UNPACK_ALIGNMENT: number; - GL_PACK_SWAP_BYTES: number; - GL_PACK_LSB_FIRST: number; - GL_PACK_ROW_LENGTH: number; - GL_PACK_SKIP_ROWS: number; - GL_PACK_SKIP_PIXELS: number; - GL_PACK_ALIGNMENT: number; - GL_MAP_COLOR: number; - GL_MAP_STENCIL: number; - GL_INDEX_SHIFT: number; - GL_INDEX_OFFSET: number; - GL_RED_SCALE: number; - GL_RED_BIAS: number; - GL_ZOOM_X: number; - GL_ZOOM_Y: number; - GL_GREEN_SCALE: number; - GL_GREEN_BIAS: number; - GL_BLUE_SCALE: number; - GL_BLUE_BIAS: number; - GL_ALPHA_SCALE: number; - GL_ALPHA_BIAS: number; - GL_DEPTH_SCALE: number; - GL_DEPTH_BIAS: number; - GL_MAX_EVAL_ORDER: number; - GL_MAX_LIGHTS: number; - GL_MAX_CLIP_PLANES: number; - GL_MAX_TEXTURE_SIZE: number; - GL_MAX_PIXEL_MAP_TABLE: number; - GL_MAX_ATTRIB_STACK_DEPTH: number; - GL_MAX_MODELVIEW_STACK_DEPTH: number; - GL_MAX_NAME_STACK_DEPTH: number; - GL_MAX_PROJECTION_STACK_DEPTH: number; - GL_MAX_TEXTURE_STACK_DEPTH: number; - GL_MAX_VIEWPORT_DIMS: number; - GL_MAX_CLIENT_ATTRIB_STACK_DEPTH: number; - GL_SUBPIXEL_BITS: number; - GL_INDEX_BITS: number; - GL_RED_BITS: number; - GL_GREEN_BITS: number; - GL_BLUE_BITS: number; - GL_ALPHA_BITS: number; - GL_DEPTH_BITS: number; - GL_STENCIL_BITS: number; - GL_ACCUM_RED_BITS: number; - GL_ACCUM_GREEN_BITS: number; - GL_ACCUM_BLUE_BITS: number; - GL_ACCUM_ALPHA_BITS: number; - GL_NAME_STACK_DEPTH: number; - GL_AUTO_NORMAL: number; - GL_MAP1_COLOR_4: number; - GL_MAP1_INDEX: number; - GL_MAP1_NORMAL: number; - GL_MAP1_TEXTURE_COORD_1: number; - GL_MAP1_TEXTURE_COORD_2: number; - GL_MAP1_TEXTURE_COORD_3: number; - GL_MAP1_TEXTURE_COORD_4: number; - GL_MAP1_VERTEX_3: number; - GL_MAP1_VERTEX_4: number; - GL_MAP2_COLOR_4: number; - GL_MAP2_INDEX: number; - GL_MAP2_NORMAL: number; - GL_MAP2_TEXTURE_COORD_1: number; - GL_MAP2_TEXTURE_COORD_2: number; - GL_MAP2_TEXTURE_COORD_3: number; - GL_MAP2_TEXTURE_COORD_4: number; - GL_MAP2_VERTEX_3: number; - GL_MAP2_VERTEX_4: number; - GL_MAP1_GRID_DOMAIN: number; - GL_MAP1_GRID_SEGMENTS: number; - GL_MAP2_GRID_DOMAIN: number; - GL_MAP2_GRID_SEGMENTS: number; - GL_TEXTURE_1D: number; - GL_TEXTURE_2D: number; - GL_FEEDBACK_BUFFER_POINTER: number; - GL_FEEDBACK_BUFFER_SIZE: number; - GL_FEEDBACK_BUFFER_TYPE: number; - GL_SELECTION_BUFFER_POINTER: number; - GL_SELECTION_BUFFER_SIZE: number; - GL_TEXTURE_WIDTH: number; - GL_TEXTURE_HEIGHT: number; - GL_TEXTURE_INTERNAL_FORMAT: number; - GL_TEXTURE_COMPONENTS: number; - GL_TEXTURE_BORDER_COLOR: number; - GL_TEXTURE_BORDER: number; - GL_DONT_CARE: number; - GL_FASTEST: number; - GL_NICEST: number; - GL_LIGHT0: number; - GL_LIGHT1: number; - GL_LIGHT2: number; - GL_LIGHT3: number; - GL_LIGHT4: number; - GL_LIGHT5: number; - GL_LIGHT6: number; - GL_LIGHT7: number; - GL_AMBIENT: number; - GL_DIFFUSE: number; - GL_SPECULAR: number; - GL_POSITION: number; - GL_SPOT_DIRECTION: number; - GL_SPOT_EXPONENT: number; - GL_SPOT_CUTOFF: number; - GL_CONSTANT_ATTENUATION: number; - GL_LINEAR_ATTENUATION: number; - GL_QUADRATIC_ATTENUATION: number; - GL_COMPILE: number; - GL_COMPILE_AND_EXECUTE: number; - GL_CLEAR: number; - GL_AND: number; - GL_AND_REVERSE: number; - GL_COPY: number; - GL_AND_INVERTED: number; - GL_NOOP: number; - GL_XOR: number; - GL_OR: number; - GL_NOR: number; - GL_EQUIV: number; - GL_INVERT: number; - GL_OR_REVERSE: number; - GL_COPY_INVERTED: number; - GL_OR_INVERTED: number; - GL_NAND: number; - GL_SET: number; - GL_EMISSION: number; - GL_SHININESS: number; - GL_AMBIENT_AND_DIFFUSE: number; - GL_COLOR_INDEXES: number; - GL_MODELVIEW: number; - GL_PROJECTION: number; - GL_TEXTURE: number; - GL_COLOR: number; - GL_DEPTH: number; - GL_STENCIL: number; - GL_COLOR_INDEX: number; - GL_STENCIL_INDEX: number; - GL_DEPTH_COMPONENT: number; - GL_RED: number; - GL_GREEN: number; - GL_BLUE: number; - GL_ALPHA: number; - GL_RGB: number; - GL_RGBA: number; - GL_LUMINANCE: number; - GL_LUMINANCE_ALPHA: number; - GL_BITMAP: number; - GL_POINT: number; - GL_LINE: number; - GL_FILL: number; - GL_RENDER: number; - GL_FEEDBACK: number; - GL_SELECT: number; - GL_FLAT: number; - GL_SMOOTH: number; - GL_KEEP: number; - GL_REPLACE: number; - GL_INCR: number; - GL_DECR: number; - GL_VENDOR: number; - GL_RENDERER: number; - GL_VERSION: number; - GL_EXTENSIONS: number; - GL_S: number; - GL_T: number; - GL_R: number; - GL_Q: number; - GL_MODULATE: number; - GL_DECAL: number; - GL_TEXTURE_ENV_MODE: number; - GL_TEXTURE_ENV_COLOR: number; - GL_TEXTURE_ENV: number; - GL_EYE_LINEAR: number; - GL_OBJECT_LINEAR: number; - GL_SPHERE_MAP: number; - GL_TEXTURE_GEN_MODE: number; - GL_OBJECT_PLANE: number; - GL_EYE_PLANE: number; - GL_NEAREST: number; - GL_LINEAR: number; - GL_NEAREST_MIPMAP_NEAREST: number; - GL_LINEAR_MIPMAP_NEAREST: number; - GL_NEAREST_MIPMAP_LINEAR: number; - GL_LINEAR_MIPMAP_LINEAR: number; - GL_TEXTURE_MAG_FILTER: number; - GL_TEXTURE_MIN_FILTER: number; - GL_TEXTURE_WRAP_S: number; - GL_TEXTURE_WRAP_T: number; - GL_CLAMP: number; - GL_REPEAT: number; - GL_CLIENT_PIXEL_STORE_BIT: number; - GL_CLIENT_VERTEX_ARRAY_BIT: number; - GL_CLIENT_ALL_ATTRIB_BITS: number; - GL_POLYGON_OFFSET_FACTOR: number; - GL_POLYGON_OFFSET_UNITS: number; - GL_POLYGON_OFFSET_POINT: number; - GL_POLYGON_OFFSET_LINE: number; - GL_POLYGON_OFFSET_FILL: number; - GL_ALPHA4: number; - GL_ALPHA8: number; - GL_ALPHA12: number; - GL_ALPHA16: number; - GL_LUMINANCE4: number; - GL_LUMINANCE8: number; - GL_LUMINANCE12: number; - GL_LUMINANCE16: number; - GL_LUMINANCE4_ALPHA4: number; - GL_LUMINANCE6_ALPHA2: number; - GL_LUMINANCE8_ALPHA8: number; - GL_LUMINANCE12_ALPHA4: number; - GL_LUMINANCE12_ALPHA12: number; - GL_LUMINANCE16_ALPHA16: number; - GL_INTENSITY: number; - GL_INTENSITY4: number; - GL_INTENSITY8: number; - GL_INTENSITY12: number; - GL_INTENSITY16: number; - GL_R3_G3_B2: number; - GL_RGB4: number; - GL_RGB5: number; - GL_RGB8: number; - GL_RGB10: number; - GL_RGB12: number; - GL_RGB16: number; - GL_RGBA2: number; - GL_RGBA4: number; - GL_RGB5_A1: number; - GL_RGBA8: number; - GL_RGB10_A2: number; - GL_RGBA12: number; - GL_RGBA16: number; - GL_TEXTURE_RED_SIZE: number; - GL_TEXTURE_GREEN_SIZE: number; - GL_TEXTURE_BLUE_SIZE: number; - GL_TEXTURE_ALPHA_SIZE: number; - GL_TEXTURE_LUMINANCE_SIZE: number; - GL_TEXTURE_INTENSITY_SIZE: number; - GL_PROXY_TEXTURE_1D: number; - GL_PROXY_TEXTURE_2D: number; - GL_TEXTURE_PRIORITY: number; - GL_TEXTURE_RESIDENT: number; - GL_TEXTURE_BINDING_1D: number; - GL_TEXTURE_BINDING_2D: number; - GL_VERTEX_ARRAY: number; - GL_NORMAL_ARRAY: number; - GL_COLOR_ARRAY: number; - GL_INDEX_ARRAY: number; - GL_TEXTURE_COORD_ARRAY: number; - GL_EDGE_FLAG_ARRAY: number; - GL_VERTEX_ARRAY_SIZE: number; - GL_VERTEX_ARRAY_TYPE: number; - GL_VERTEX_ARRAY_STRIDE: number; - GL_NORMAL_ARRAY_TYPE: number; - GL_NORMAL_ARRAY_STRIDE: number; - GL_COLOR_ARRAY_SIZE: number; - GL_COLOR_ARRAY_TYPE: number; - GL_COLOR_ARRAY_STRIDE: number; - GL_INDEX_ARRAY_TYPE: number; - GL_INDEX_ARRAY_STRIDE: number; - GL_TEXTURE_COORD_ARRAY_SIZE: number; - GL_TEXTURE_COORD_ARRAY_TYPE: number; - GL_TEXTURE_COORD_ARRAY_STRIDE: number; - GL_EDGE_FLAG_ARRAY_STRIDE: number; - GL_VERTEX_ARRAY_POINTER: number; - GL_NORMAL_ARRAY_POINTER: number; - GL_COLOR_ARRAY_POINTER: number; - GL_INDEX_ARRAY_POINTER: number; - GL_TEXTURE_COORD_ARRAY_POINTER: number; - GL_EDGE_FLAG_ARRAY_POINTER: number; - GL_V2F: number; - GL_V3F: number; - GL_C4UB_V2F: number; - GL_C4UB_V3F: number; - GL_C3F_V3F: number; - GL_N3F_V3F: number; - GL_C4F_N3F_V3F: number; - GL_T2F_V3F: number; - GL_T4F_V4F: number; - GL_T2F_C4UB_V3F: number; - GL_T2F_C3F_V3F: number; - GL_T2F_N3F_V3F: number; - GL_T2F_C4F_N3F_V3F: number; - GL_T4F_C4F_N3F_V4F: number; - glEnable(p0: number): void; - glDisable(p0: number): void; - glAccum(p0: number, p1: number): void; - glAlphaFunc(p0: number, p1: number): void; - nglAreTexturesResident(p0: number, p1: number, p2: number): boolean; - glAreTexturesResident(p0: java.nio.IntBuffer, p1: java.nio.ByteBuffer): boolean; - glAreTexturesResident(p0: number, p1: java.nio.ByteBuffer): boolean; - glAreTexturesResident(p0: Array, p1: java.nio.ByteBuffer): boolean; - glArrayElement(p0: number): void; - glBegin(p0: number): void; - glBindTexture(p0: number, p1: number): void; - nglBitmap(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glBitmap(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ByteBuffer | null | undefined): void; - glBitmap(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glBlendFunc(p0: number, p1: number): void; - glCallList(p0: number): void; - nglCallLists(p0: number, p1: number, p2: number): void; - glCallLists(p0: number, p1: java.nio.ByteBuffer): void; - glCallLists(p0: java.nio.ByteBuffer): void; - glCallLists(p0: java.nio.ShortBuffer): void; - glCallLists(p0: java.nio.IntBuffer): void; - glClear(p0: number): void; - glClearAccum(p0: number, p1: number, p2: number, p3: number): void; - glClearColor(p0: number, p1: number, p2: number, p3: number): void; - glClearDepth(p0: number): void; - glClearIndex(p0: number): void; - glClearStencil(p0: number): void; - nglClipPlane(p0: number, p1: number): void; - glClipPlane(p0: number, p1: java.nio.DoubleBuffer): void; - glClipPlane(p0: number, p1: kotlin.DoubleArray): void; - glColor3b(p0: number, p1: number, p2: number): void; - glColor3s(p0: number, p1: number, p2: number): void; - glColor3i(p0: number, p1: number, p2: number): void; - glColor3f(p0: number, p1: number, p2: number): void; - glColor3d(p0: number, p1: number, p2: number): void; - glColor3ub(p0: number, p1: number, p2: number): void; - glColor3us(p0: number, p1: number, p2: number): void; - glColor3ui(p0: number, p1: number, p2: number): void; - nglColor3bv(p0: number): void; - glColor3bv(p0: java.nio.ByteBuffer): void; - nglColor3sv(p0: number): void; - glColor3sv(p0: java.nio.ShortBuffer): void; - glColor3sv(p0: Array): void; - nglColor3iv(p0: number): void; - glColor3iv(p0: java.nio.IntBuffer): void; - glColor3iv(p0: Array): void; - nglColor3fv(p0: number): void; - glColor3fv(p0: java.nio.FloatBuffer): void; - glColor3fv(p0: kotlin.FloatArray): void; - nglColor3dv(p0: number): void; - glColor3dv(p0: java.nio.DoubleBuffer): void; - glColor3dv(p0: kotlin.DoubleArray): void; - nglColor3ubv(p0: number): void; - glColor3ubv(p0: java.nio.ByteBuffer): void; - nglColor3usv(p0: number): void; - glColor3usv(p0: java.nio.ShortBuffer): void; - glColor3usv(p0: Array): void; - nglColor3uiv(p0: number): void; - glColor3uiv(p0: java.nio.IntBuffer): void; - glColor3uiv(p0: Array): void; - glColor4b(p0: number, p1: number, p2: number, p3: number): void; - glColor4s(p0: number, p1: number, p2: number, p3: number): void; - glColor4i(p0: number, p1: number, p2: number, p3: number): void; - glColor4f(p0: number, p1: number, p2: number, p3: number): void; - glColor4d(p0: number, p1: number, p2: number, p3: number): void; - glColor4ub(p0: number, p1: number, p2: number, p3: number): void; - glColor4us(p0: number, p1: number, p2: number, p3: number): void; - glColor4ui(p0: number, p1: number, p2: number, p3: number): void; - nglColor4bv(p0: number): void; - glColor4bv(p0: java.nio.ByteBuffer): void; - nglColor4sv(p0: number): void; - glColor4sv(p0: java.nio.ShortBuffer): void; - glColor4sv(p0: Array): void; - nglColor4iv(p0: number): void; - glColor4iv(p0: java.nio.IntBuffer): void; - glColor4iv(p0: Array): void; - nglColor4fv(p0: number): void; - glColor4fv(p0: java.nio.FloatBuffer): void; - glColor4fv(p0: kotlin.FloatArray): void; - nglColor4dv(p0: number): void; - glColor4dv(p0: java.nio.DoubleBuffer): void; - glColor4dv(p0: kotlin.DoubleArray): void; - nglColor4ubv(p0: number): void; - glColor4ubv(p0: java.nio.ByteBuffer): void; - nglColor4usv(p0: number): void; - glColor4usv(p0: java.nio.ShortBuffer): void; - glColor4usv(p0: Array): void; - nglColor4uiv(p0: number): void; - glColor4uiv(p0: java.nio.IntBuffer): void; - glColor4uiv(p0: Array): void; - glColorMask(p0: boolean, p1: boolean, p2: boolean, p3: boolean): void; - glColorMaterial(p0: number, p1: number): void; - nglColorPointer(p0: number, p1: number, p2: number, p3: number): void; - glColorPointer(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer): void; - glColorPointer(p0: number, p1: number, p2: number, p3: number): void; - glColorPointer(p0: number, p1: number, p2: number, p3: java.nio.ShortBuffer): void; - glColorPointer(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glColorPointer(p0: number, p1: number, p2: number, p3: java.nio.FloatBuffer): void; - glCopyPixels(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glCullFace(p0: number): void; - glDeleteLists(p0: number, p1: number): void; - glDepthFunc(p0: number): void; - glDepthMask(p0: boolean): void; - glDepthRange(p0: number, p1: number): void; - glDisableClientState(p0: number): void; - glDrawArrays(p0: number, p1: number, p2: number): void; - glDrawBuffer(p0: number): void; - nglDrawElements(p0: number, p1: number, p2: number, p3: number): void; - glDrawElements(p0: number, p1: number, p2: number, p3: number): void; - glDrawElements(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glDrawElements(p0: number, p1: java.nio.ByteBuffer): void; - glDrawElements(p0: number, p1: java.nio.ShortBuffer): void; - glDrawElements(p0: number, p1: java.nio.IntBuffer): void; - nglDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - glDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ShortBuffer): void; - glDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer): void; - glDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: java.nio.FloatBuffer): void; - glDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glDrawPixels(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): void; - glEdgeFlag(p0: boolean): void; - nglEdgeFlagv(p0: number): void; - glEdgeFlagv(p0: java.nio.ByteBuffer): void; - nglEdgeFlagPointer(p0: number, p1: number): void; - glEdgeFlagPointer(p0: number, p1: java.nio.ByteBuffer): void; - glEdgeFlagPointer(p0: number, p1: number): void; - glEnableClientState(p0: number): void; - glEnd(): void; - glEvalCoord1f(p0: number): void; - nglEvalCoord1fv(p0: number): void; - glEvalCoord1fv(p0: java.nio.FloatBuffer): void; - glEvalCoord1fv(p0: kotlin.FloatArray): void; - glEvalCoord1d(p0: number): void; - nglEvalCoord1dv(p0: number): void; - glEvalCoord1dv(p0: java.nio.DoubleBuffer): void; - glEvalCoord1dv(p0: kotlin.DoubleArray): void; - glEvalCoord2f(p0: number, p1: number): void; - nglEvalCoord2fv(p0: number): void; - glEvalCoord2fv(p0: java.nio.FloatBuffer): void; - glEvalCoord2fv(p0: kotlin.FloatArray): void; - glEvalCoord2d(p0: number, p1: number): void; - nglEvalCoord2dv(p0: number): void; - glEvalCoord2dv(p0: java.nio.DoubleBuffer): void; - glEvalCoord2dv(p0: kotlin.DoubleArray): void; - glEvalMesh1(p0: number, p1: number, p2: number): void; - glEvalMesh2(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glEvalPoint1(p0: number): void; - glEvalPoint2(p0: number, p1: number): void; - nglFeedbackBuffer(p0: number, p1: number, p2: number): void; - glFeedbackBuffer(p0: number, p1: java.nio.FloatBuffer): void; - glFeedbackBuffer(p0: number, p1: kotlin.FloatArray): void; - glFinish(): void; - glFlush(): void; - glFogi(p0: number, p1: number): void; - nglFogiv(p0: number, p1: number): void; - glFogiv(p0: number, p1: java.nio.IntBuffer): void; - glFogiv(p0: number, p1: Array): void; - glFogf(p0: number, p1: number): void; - nglFogfv(p0: number, p1: number): void; - glFogfv(p0: number, p1: java.nio.FloatBuffer): void; - glFogfv(p0: number, p1: kotlin.FloatArray): void; - glFrontFace(p0: number): void; - glGenLists(p0: number): number; - nglGenTextures(p0: number, p1: number): void; - glGenTextures(p0: java.nio.IntBuffer): void; - glGenTextures(): number; - glGenTextures(p0: Array): void; - nglDeleteTextures(p0: number, p1: number): void; - glDeleteTextures(p0: java.nio.IntBuffer): void; - glDeleteTextures(p0: number): void; - glDeleteTextures(p0: Array): void; - nglGetClipPlane(p0: number, p1: number): void; - glGetClipPlane(p0: number, p1: java.nio.DoubleBuffer): void; - glGetClipPlane(p0: number, p1: kotlin.DoubleArray): void; - nglGetBooleanv(p0: number, p1: number): void; - glGetBooleanv(p0: number, p1: java.nio.ByteBuffer): void; - glGetBoolean(p0: number): boolean; - nglGetFloatv(p0: number, p1: number): void; - glGetFloatv(p0: number, p1: java.nio.FloatBuffer): void; - glGetFloatv(p0: number, p1: kotlin.FloatArray): void; - glGetFloat(p0: number): number; - nglGetIntegerv(p0: number, p1: number): void; - glGetIntegerv(p0: number, p1: java.nio.IntBuffer): void; - glGetIntegerv(p0: number, p1: Array): void; - glGetInteger(p0: number): number; - nglGetDoublev(p0: number, p1: number): void; - glGetDoublev(p0: number, p1: java.nio.DoubleBuffer): void; - glGetDoublev(p0: number, p1: kotlin.DoubleArray): void; - glGetDouble(p0: number): number; - glGetError(): number; - nglGetLightiv(p0: number, p1: number, p2: number): void; - glGetLightiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetLightiv(p0: number, p1: number, p2: Array): void; - glGetLighti(p0: number, p1: number): number; - nglGetLightfv(p0: number, p1: number, p2: number): void; - glGetLightfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetLightfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetLightf(p0: number, p1: number): number; - nglGetMapiv(p0: number, p1: number, p2: number): void; - glGetMapiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetMapiv(p0: number, p1: number, p2: Array): void; - glGetMapi(p0: number, p1: number): number; - nglGetMapfv(p0: number, p1: number, p2: number): void; - glGetMapfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetMapfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetMapf(p0: number, p1: number): number; - nglGetMapdv(p0: number, p1: number, p2: number): void; - glGetMapdv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetMapdv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - glGetMapd(p0: number, p1: number): number; - nglGetMaterialiv(p0: number, p1: number, p2: number): void; - glGetMaterialiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetMaterialiv(p0: number, p1: number, p2: Array): void; - nglGetMaterialfv(p0: number, p1: number, p2: number): void; - glGetMaterialfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetMaterialfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - nglGetPixelMapfv(p0: number, p1: number): void; - glGetPixelMapfv(p0: number, p1: java.nio.FloatBuffer): void; - glGetPixelMapfv(p0: number, p1: number): void; - glGetPixelMapfv(p0: number, p1: kotlin.FloatArray): void; - nglGetPixelMapusv(p0: number, p1: number): void; - glGetPixelMapusv(p0: number, p1: java.nio.ShortBuffer): void; - glGetPixelMapusv(p0: number, p1: number): void; - glGetPixelMapusv(p0: number, p1: Array): void; - nglGetPixelMapuiv(p0: number, p1: number): void; - glGetPixelMapuiv(p0: number, p1: java.nio.IntBuffer): void; - glGetPixelMapuiv(p0: number, p1: number): void; - glGetPixelMapuiv(p0: number, p1: Array): void; - nglGetPointerv(p0: number, p1: number): void; - glGetPointerv(p0: number, p1: org.lwjgl.PointerBuffer): void; - glGetPointer(p0: number): number; - nglGetPolygonStipple(p0: number): void; - glGetPolygonStipple(p0: java.nio.ByteBuffer): void; - glGetPolygonStipple(p0: number): void; - nglGetString(p0: number): number; - glGetString(p0: number): string | null | undefined; - nglGetTexEnviv(p0: number, p1: number, p2: number): void; - glGetTexEnviv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTexEnviv(p0: number, p1: number, p2: Array): void; - glGetTexEnvi(p0: number, p1: number): number; - nglGetTexEnvfv(p0: number, p1: number, p2: number): void; - glGetTexEnvfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetTexEnvfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetTexEnvf(p0: number, p1: number): number; - nglGetTexGeniv(p0: number, p1: number, p2: number): void; - glGetTexGeniv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTexGeniv(p0: number, p1: number, p2: Array): void; - glGetTexGeni(p0: number, p1: number): number; - nglGetTexGenfv(p0: number, p1: number, p2: number): void; - glGetTexGenfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetTexGenfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetTexGenf(p0: number, p1: number): number; - nglGetTexGendv(p0: number, p1: number, p2: number): void; - glGetTexGendv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetTexGendv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - glGetTexGend(p0: number, p1: number): number; - nglGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ShortBuffer): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.FloatBuffer): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.DoubleBuffer): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): void; - glGetTexImage(p0: number, p1: number, p2: number, p3: number, p4: kotlin.DoubleArray): void; - nglGetTexLevelParameteriv(p0: number, p1: number, p2: number, p3: number): void; - glGetTexLevelParameteriv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetTexLevelParameteriv(p0: number, p1: number, p2: number, p3: Array): void; - glGetTexLevelParameteri(p0: number, p1: number, p2: number): number; - nglGetTexLevelParameterfv(p0: number, p1: number, p2: number, p3: number): void; - glGetTexLevelParameterfv(p0: number, p1: number, p2: number, p3: java.nio.FloatBuffer): void; - glGetTexLevelParameterfv(p0: number, p1: number, p2: number, p3: kotlin.FloatArray): void; - glGetTexLevelParameterf(p0: number, p1: number, p2: number): number; - nglGetTexParameteriv(p0: number, p1: number, p2: number): void; - glGetTexParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTexParameteriv(p0: number, p1: number, p2: Array): void; - glGetTexParameteri(p0: number, p1: number): number; - nglGetTexParameterfv(p0: number, p1: number, p2: number): void; - glGetTexParameterfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetTexParameterfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetTexParameterf(p0: number, p1: number): number; - glHint(p0: number, p1: number): void; - glIndexi(p0: number): void; - glIndexub(p0: number): void; - glIndexs(p0: number): void; - glIndexf(p0: number): void; - glIndexd(p0: number): void; - nglIndexiv(p0: number): void; - glIndexiv(p0: java.nio.IntBuffer): void; - glIndexiv(p0: Array): void; - nglIndexubv(p0: number): void; - glIndexubv(p0: java.nio.ByteBuffer): void; - nglIndexsv(p0: number): void; - glIndexsv(p0: java.nio.ShortBuffer): void; - glIndexsv(p0: Array): void; - nglIndexfv(p0: number): void; - glIndexfv(p0: java.nio.FloatBuffer): void; - glIndexfv(p0: kotlin.FloatArray): void; - nglIndexdv(p0: number): void; - glIndexdv(p0: java.nio.DoubleBuffer): void; - glIndexdv(p0: kotlin.DoubleArray): void; - glIndexMask(p0: number): void; - nglIndexPointer(p0: number, p1: number, p2: number): void; - glIndexPointer(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glIndexPointer(p0: number, p1: number, p2: number): void; - glIndexPointer(p0: number, p1: java.nio.ByteBuffer): void; - glIndexPointer(p0: number, p1: java.nio.ShortBuffer): void; - glIndexPointer(p0: number, p1: java.nio.IntBuffer): void; - glInitNames(): void; - nglInterleavedArrays(p0: number, p1: number, p2: number): void; - glInterleavedArrays(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glInterleavedArrays(p0: number, p1: number, p2: number): void; - glInterleavedArrays(p0: number, p1: number, p2: java.nio.ShortBuffer): void; - glInterleavedArrays(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glInterleavedArrays(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glInterleavedArrays(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glInterleavedArrays(p0: number, p1: number, p2: Array): void; - glInterleavedArrays(p0: number, p1: number, p2: Array): void; - glInterleavedArrays(p0: number, p1: number, p2: kotlin.FloatArray): void; - glInterleavedArrays(p0: number, p1: number, p2: kotlin.DoubleArray): void; - glIsEnabled(p0: number): boolean; - glIsList(p0: number): boolean; - glIsTexture(p0: number): boolean; - glLightModeli(p0: number, p1: number): void; - glLightModelf(p0: number, p1: number): void; - nglLightModeliv(p0: number, p1: number): void; - glLightModeliv(p0: number, p1: java.nio.IntBuffer): void; - glLightModeliv(p0: number, p1: Array): void; - nglLightModelfv(p0: number, p1: number): void; - glLightModelfv(p0: number, p1: java.nio.FloatBuffer): void; - glLightModelfv(p0: number, p1: kotlin.FloatArray): void; - glLighti(p0: number, p1: number, p2: number): void; - glLightf(p0: number, p1: number, p2: number): void; - nglLightiv(p0: number, p1: number, p2: number): void; - glLightiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glLightiv(p0: number, p1: number, p2: Array): void; - nglLightfv(p0: number, p1: number, p2: number): void; - glLightfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glLightfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glLineStipple(p0: number, p1: number): void; - glLineWidth(p0: number): void; - glListBase(p0: number): void; - nglLoadMatrixf(p0: number): void; - glLoadMatrixf(p0: java.nio.FloatBuffer): void; - glLoadMatrixf(p0: kotlin.FloatArray): void; - nglLoadMatrixd(p0: number): void; - glLoadMatrixd(p0: java.nio.DoubleBuffer): void; - glLoadMatrixd(p0: kotlin.DoubleArray): void; - glLoadIdentity(): void; - glLoadName(p0: number): void; - glLogicOp(p0: number): void; - nglMap1f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glMap1f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: java.nio.FloatBuffer): void; - glMap1f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: kotlin.FloatArray): void; - nglMap1d(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glMap1d(p0: number, p1: number, p2: number, p3: number, p4: number, p5: java.nio.DoubleBuffer): void; - glMap1d(p0: number, p1: number, p2: number, p3: number, p4: number, p5: kotlin.DoubleArray): void; - nglMap2f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): void; - glMap2f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.FloatBuffer): void; - glMap2f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: kotlin.FloatArray): void; - nglMap2d(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): void; - glMap2d(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.DoubleBuffer): void; - glMap2d(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: kotlin.DoubleArray): void; - glMapGrid1f(p0: number, p1: number, p2: number): void; - glMapGrid1d(p0: number, p1: number, p2: number): void; - glMapGrid2f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glMapGrid2d(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glMateriali(p0: number, p1: number, p2: number): void; - glMaterialf(p0: number, p1: number, p2: number): void; - nglMaterialiv(p0: number, p1: number, p2: number): void; - glMaterialiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glMaterialiv(p0: number, p1: number, p2: Array): void; - nglMaterialfv(p0: number, p1: number, p2: number): void; - glMaterialfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glMaterialfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glMatrixMode(p0: number): void; - nglMultMatrixf(p0: number): void; - glMultMatrixf(p0: java.nio.FloatBuffer): void; - glMultMatrixf(p0: kotlin.FloatArray): void; - nglMultMatrixd(p0: number): void; - glMultMatrixd(p0: java.nio.DoubleBuffer): void; - glMultMatrixd(p0: kotlin.DoubleArray): void; - glFrustum(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glNewList(p0: number, p1: number): void; - glEndList(): void; - glNormal3f(p0: number, p1: number, p2: number): void; - glNormal3b(p0: number, p1: number, p2: number): void; - glNormal3s(p0: number, p1: number, p2: number): void; - glNormal3i(p0: number, p1: number, p2: number): void; - glNormal3d(p0: number, p1: number, p2: number): void; - nglNormal3fv(p0: number): void; - glNormal3fv(p0: java.nio.FloatBuffer): void; - glNormal3fv(p0: kotlin.FloatArray): void; - nglNormal3bv(p0: number): void; - glNormal3bv(p0: java.nio.ByteBuffer): void; - nglNormal3sv(p0: number): void; - glNormal3sv(p0: java.nio.ShortBuffer): void; - glNormal3sv(p0: Array): void; - nglNormal3iv(p0: number): void; - glNormal3iv(p0: java.nio.IntBuffer): void; - glNormal3iv(p0: Array): void; - nglNormal3dv(p0: number): void; - glNormal3dv(p0: java.nio.DoubleBuffer): void; - glNormal3dv(p0: kotlin.DoubleArray): void; - nglNormalPointer(p0: number, p1: number, p2: number): void; - glNormalPointer(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glNormalPointer(p0: number, p1: number, p2: number): void; - glNormalPointer(p0: number, p1: number, p2: java.nio.ShortBuffer): void; - glNormalPointer(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glNormalPointer(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glOrtho(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glPassThrough(p0: number): void; - nglPixelMapfv(p0: number, p1: number, p2: number): void; - glPixelMapfv(p0: number, p1: number, p2: number): void; - glPixelMapfv(p0: number, p1: java.nio.FloatBuffer): void; - glPixelMapfv(p0: number, p1: kotlin.FloatArray): void; - nglPixelMapusv(p0: number, p1: number, p2: number): void; - glPixelMapusv(p0: number, p1: number, p2: number): void; - glPixelMapusv(p0: number, p1: java.nio.ShortBuffer): void; - glPixelMapusv(p0: number, p1: Array): void; - nglPixelMapuiv(p0: number, p1: number, p2: number): void; - glPixelMapuiv(p0: number, p1: number, p2: number): void; - glPixelMapuiv(p0: number, p1: java.nio.IntBuffer): void; - glPixelMapuiv(p0: number, p1: Array): void; - glPixelStorei(p0: number, p1: number): void; - glPixelStoref(p0: number, p1: number): void; - glPixelTransferi(p0: number, p1: number): void; - glPixelTransferf(p0: number, p1: number): void; - glPixelZoom(p0: number, p1: number): void; - glPointSize(p0: number): void; - glPolygonMode(p0: number, p1: number): void; - glPolygonOffset(p0: number, p1: number): void; - nglPolygonStipple(p0: number): void; - glPolygonStipple(p0: java.nio.ByteBuffer): void; - glPolygonStipple(p0: number): void; - glPushAttrib(p0: number): void; - glPushClientAttrib(p0: number): void; - glPopAttrib(): void; - glPopClientAttrib(): void; - glPopMatrix(): void; - glPopName(): void; - nglPrioritizeTextures(p0: number, p1: number, p2: number): void; - glPrioritizeTextures(p0: java.nio.IntBuffer, p1: java.nio.FloatBuffer): void; - glPrioritizeTextures(p0: Array, p1: kotlin.FloatArray): void; - glPushMatrix(): void; - glPushName(p0: number): void; - glRasterPos2i(p0: number, p1: number): void; - glRasterPos2s(p0: number, p1: number): void; - glRasterPos2f(p0: number, p1: number): void; - glRasterPos2d(p0: number, p1: number): void; - nglRasterPos2iv(p0: number): void; - glRasterPos2iv(p0: java.nio.IntBuffer): void; - glRasterPos2iv(p0: Array): void; - nglRasterPos2sv(p0: number): void; - glRasterPos2sv(p0: java.nio.ShortBuffer): void; - glRasterPos2sv(p0: Array): void; - nglRasterPos2fv(p0: number): void; - glRasterPos2fv(p0: java.nio.FloatBuffer): void; - glRasterPos2fv(p0: kotlin.FloatArray): void; - nglRasterPos2dv(p0: number): void; - glRasterPos2dv(p0: java.nio.DoubleBuffer): void; - glRasterPos2dv(p0: kotlin.DoubleArray): void; - glRasterPos3i(p0: number, p1: number, p2: number): void; - glRasterPos3s(p0: number, p1: number, p2: number): void; - glRasterPos3f(p0: number, p1: number, p2: number): void; - glRasterPos3d(p0: number, p1: number, p2: number): void; - nglRasterPos3iv(p0: number): void; - glRasterPos3iv(p0: java.nio.IntBuffer): void; - glRasterPos3iv(p0: Array): void; - nglRasterPos3sv(p0: number): void; - glRasterPos3sv(p0: java.nio.ShortBuffer): void; - glRasterPos3sv(p0: Array): void; - nglRasterPos3fv(p0: number): void; - glRasterPos3fv(p0: java.nio.FloatBuffer): void; - glRasterPos3fv(p0: kotlin.FloatArray): void; - nglRasterPos3dv(p0: number): void; - glRasterPos3dv(p0: java.nio.DoubleBuffer): void; - glRasterPos3dv(p0: kotlin.DoubleArray): void; - glRasterPos4i(p0: number, p1: number, p2: number, p3: number): void; - glRasterPos4s(p0: number, p1: number, p2: number, p3: number): void; - glRasterPos4f(p0: number, p1: number, p2: number, p3: number): void; - glRasterPos4d(p0: number, p1: number, p2: number, p3: number): void; - nglRasterPos4iv(p0: number): void; - glRasterPos4iv(p0: java.nio.IntBuffer): void; - glRasterPos4iv(p0: Array): void; - nglRasterPos4sv(p0: number): void; - glRasterPos4sv(p0: java.nio.ShortBuffer): void; - glRasterPos4sv(p0: Array): void; - nglRasterPos4fv(p0: number): void; - glRasterPos4fv(p0: java.nio.FloatBuffer): void; - glRasterPos4fv(p0: kotlin.FloatArray): void; - nglRasterPos4dv(p0: number): void; - glRasterPos4dv(p0: java.nio.DoubleBuffer): void; - glRasterPos4dv(p0: kotlin.DoubleArray): void; - glReadBuffer(p0: number): void; - nglReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ByteBuffer): void; - glReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ShortBuffer): void; - glReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.IntBuffer): void; - glReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.FloatBuffer): void; - glReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glReadPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.FloatArray): void; - glRecti(p0: number, p1: number, p2: number, p3: number): void; - glRects(p0: number, p1: number, p2: number, p3: number): void; - glRectf(p0: number, p1: number, p2: number, p3: number): void; - glRectd(p0: number, p1: number, p2: number, p3: number): void; - nglRectiv(p0: number, p1: number): void; - glRectiv(p0: java.nio.IntBuffer, p1: java.nio.IntBuffer): void; - glRectiv(p0: Array, p1: Array): void; - nglRectsv(p0: number, p1: number): void; - glRectsv(p0: java.nio.ShortBuffer, p1: java.nio.ShortBuffer): void; - glRectsv(p0: Array, p1: Array): void; - nglRectfv(p0: number, p1: number): void; - glRectfv(p0: java.nio.FloatBuffer, p1: java.nio.FloatBuffer): void; - glRectfv(p0: kotlin.FloatArray, p1: kotlin.FloatArray): void; - nglRectdv(p0: number, p1: number): void; - glRectdv(p0: java.nio.DoubleBuffer, p1: java.nio.DoubleBuffer): void; - glRectdv(p0: kotlin.DoubleArray, p1: kotlin.DoubleArray): void; - glRenderMode(p0: number): number; - glRotatef(p0: number, p1: number, p2: number, p3: number): void; - glRotated(p0: number, p1: number, p2: number, p3: number): void; - glScalef(p0: number, p1: number, p2: number): void; - glScaled(p0: number, p1: number, p2: number): void; - glScissor(p0: number, p1: number, p2: number, p3: number): void; - nglSelectBuffer(p0: number, p1: number): void; - glSelectBuffer(p0: java.nio.IntBuffer): void; - glSelectBuffer(p0: Array): void; - glShadeModel(p0: number): void; - glStencilFunc(p0: number, p1: number, p2: number): void; - glStencilMask(p0: number): void; - glStencilOp(p0: number, p1: number, p2: number): void; - glTexCoord1f(p0: number): void; - glTexCoord1s(p0: number): void; - glTexCoord1i(p0: number): void; - glTexCoord1d(p0: number): void; - nglTexCoord1fv(p0: number): void; - glTexCoord1fv(p0: java.nio.FloatBuffer): void; - glTexCoord1fv(p0: kotlin.FloatArray): void; - nglTexCoord1sv(p0: number): void; - glTexCoord1sv(p0: java.nio.ShortBuffer): void; - glTexCoord1sv(p0: Array): void; - nglTexCoord1iv(p0: number): void; - glTexCoord1iv(p0: java.nio.IntBuffer): void; - glTexCoord1iv(p0: Array): void; - nglTexCoord1dv(p0: number): void; - glTexCoord1dv(p0: java.nio.DoubleBuffer): void; - glTexCoord1dv(p0: kotlin.DoubleArray): void; - glTexCoord2f(p0: number, p1: number): void; - glTexCoord2s(p0: number, p1: number): void; - glTexCoord2i(p0: number, p1: number): void; - glTexCoord2d(p0: number, p1: number): void; - nglTexCoord2fv(p0: number): void; - glTexCoord2fv(p0: java.nio.FloatBuffer): void; - glTexCoord2fv(p0: kotlin.FloatArray): void; - nglTexCoord2sv(p0: number): void; - glTexCoord2sv(p0: java.nio.ShortBuffer): void; - glTexCoord2sv(p0: Array): void; - nglTexCoord2iv(p0: number): void; - glTexCoord2iv(p0: java.nio.IntBuffer): void; - glTexCoord2iv(p0: Array): void; - nglTexCoord2dv(p0: number): void; - glTexCoord2dv(p0: java.nio.DoubleBuffer): void; - glTexCoord2dv(p0: kotlin.DoubleArray): void; - glTexCoord3f(p0: number, p1: number, p2: number): void; - glTexCoord3s(p0: number, p1: number, p2: number): void; - glTexCoord3i(p0: number, p1: number, p2: number): void; - glTexCoord3d(p0: number, p1: number, p2: number): void; - nglTexCoord3fv(p0: number): void; - glTexCoord3fv(p0: java.nio.FloatBuffer): void; - glTexCoord3fv(p0: kotlin.FloatArray): void; - nglTexCoord3sv(p0: number): void; - glTexCoord3sv(p0: java.nio.ShortBuffer): void; - glTexCoord3sv(p0: Array): void; - nglTexCoord3iv(p0: number): void; - glTexCoord3iv(p0: java.nio.IntBuffer): void; - glTexCoord3iv(p0: Array): void; - nglTexCoord3dv(p0: number): void; - glTexCoord3dv(p0: java.nio.DoubleBuffer): void; - glTexCoord3dv(p0: kotlin.DoubleArray): void; - glTexCoord4f(p0: number, p1: number, p2: number, p3: number): void; - glTexCoord4s(p0: number, p1: number, p2: number, p3: number): void; - glTexCoord4i(p0: number, p1: number, p2: number, p3: number): void; - glTexCoord4d(p0: number, p1: number, p2: number, p3: number): void; - nglTexCoord4fv(p0: number): void; - glTexCoord4fv(p0: java.nio.FloatBuffer): void; - glTexCoord4fv(p0: kotlin.FloatArray): void; - nglTexCoord4sv(p0: number): void; - glTexCoord4sv(p0: java.nio.ShortBuffer): void; - glTexCoord4sv(p0: Array): void; - nglTexCoord4iv(p0: number): void; - glTexCoord4iv(p0: java.nio.IntBuffer): void; - glTexCoord4iv(p0: Array): void; - nglTexCoord4dv(p0: number): void; - glTexCoord4dv(p0: java.nio.DoubleBuffer): void; - glTexCoord4dv(p0: kotlin.DoubleArray): void; - nglTexCoordPointer(p0: number, p1: number, p2: number, p3: number): void; - glTexCoordPointer(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer): void; - glTexCoordPointer(p0: number, p1: number, p2: number, p3: number): void; - glTexCoordPointer(p0: number, p1: number, p2: number, p3: java.nio.ShortBuffer): void; - glTexCoordPointer(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glTexCoordPointer(p0: number, p1: number, p2: number, p3: java.nio.FloatBuffer): void; - glTexEnvi(p0: number, p1: number, p2: number): void; - nglTexEnviv(p0: number, p1: number, p2: number): void; - glTexEnviv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glTexEnviv(p0: number, p1: number, p2: Array): void; - glTexEnvf(p0: number, p1: number, p2: number): void; - nglTexEnvfv(p0: number, p1: number, p2: number): void; - glTexEnvfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glTexEnvfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glTexGeni(p0: number, p1: number, p2: number): void; - nglTexGeniv(p0: number, p1: number, p2: number): void; - glTexGeniv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glTexGeniv(p0: number, p1: number, p2: Array): void; - glTexGenf(p0: number, p1: number, p2: number): void; - nglTexGenfv(p0: number, p1: number, p2: number): void; - glTexGenfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glTexGenfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glTexGend(p0: number, p1: number, p2: number): void; - nglTexGendv(p0: number, p1: number, p2: number): void; - glTexGendv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glTexGendv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.ByteBuffer | null | undefined): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.ShortBuffer | null | undefined): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.IntBuffer | null | undefined): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.FloatBuffer | null | undefined): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.DoubleBuffer | null | undefined): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: Array): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: Array): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: kotlin.FloatArray | null | undefined): void; - glTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: kotlin.DoubleArray | null | undefined): void; - nglTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.ByteBuffer | null | undefined): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.ShortBuffer | null | undefined): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.IntBuffer | null | undefined): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.FloatBuffer | null | undefined): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.DoubleBuffer | null | undefined): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: Array): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: Array): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: kotlin.FloatArray | null | undefined): void; - glTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: kotlin.DoubleArray | null | undefined): void; - glCopyTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glCopyTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glCopyTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glCopyTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glTexParameteri(p0: number, p1: number, p2: number): void; - nglTexParameteriv(p0: number, p1: number, p2: number): void; - glTexParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glTexParameteriv(p0: number, p1: number, p2: Array): void; - glTexParameterf(p0: number, p1: number, p2: number): void; - nglTexParameterfv(p0: number, p1: number, p2: number): void; - glTexParameterfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glTexParameterfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - nglTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ByteBuffer): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ShortBuffer): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.IntBuffer): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.FloatBuffer): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.DoubleBuffer): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.FloatArray): void; - glTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.DoubleArray): void; - nglTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.ByteBuffer): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.ShortBuffer): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.IntBuffer): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.FloatBuffer): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.DoubleBuffer): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: Array): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: Array): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: kotlin.FloatArray): void; - glTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: kotlin.DoubleArray): void; - glTranslatef(p0: number, p1: number, p2: number): void; - glTranslated(p0: number, p1: number, p2: number): void; - glVertex2f(p0: number, p1: number): void; - glVertex2s(p0: number, p1: number): void; - glVertex2i(p0: number, p1: number): void; - glVertex2d(p0: number, p1: number): void; - nglVertex2fv(p0: number): void; - glVertex2fv(p0: java.nio.FloatBuffer): void; - glVertex2fv(p0: kotlin.FloatArray): void; - nglVertex2sv(p0: number): void; - glVertex2sv(p0: java.nio.ShortBuffer): void; - glVertex2sv(p0: Array): void; - nglVertex2iv(p0: number): void; - glVertex2iv(p0: java.nio.IntBuffer): void; - glVertex2iv(p0: Array): void; - nglVertex2dv(p0: number): void; - glVertex2dv(p0: java.nio.DoubleBuffer): void; - glVertex2dv(p0: kotlin.DoubleArray): void; - glVertex3f(p0: number, p1: number, p2: number): void; - glVertex3s(p0: number, p1: number, p2: number): void; - glVertex3i(p0: number, p1: number, p2: number): void; - glVertex3d(p0: number, p1: number, p2: number): void; - nglVertex3fv(p0: number): void; - glVertex3fv(p0: java.nio.FloatBuffer): void; - glVertex3fv(p0: kotlin.FloatArray): void; - nglVertex3sv(p0: number): void; - glVertex3sv(p0: java.nio.ShortBuffer): void; - glVertex3sv(p0: Array): void; - nglVertex3iv(p0: number): void; - glVertex3iv(p0: java.nio.IntBuffer): void; - glVertex3iv(p0: Array): void; - nglVertex3dv(p0: number): void; - glVertex3dv(p0: java.nio.DoubleBuffer): void; - glVertex3dv(p0: kotlin.DoubleArray): void; - glVertex4f(p0: number, p1: number, p2: number, p3: number): void; - glVertex4s(p0: number, p1: number, p2: number, p3: number): void; - glVertex4i(p0: number, p1: number, p2: number, p3: number): void; - glVertex4d(p0: number, p1: number, p2: number, p3: number): void; - nglVertex4fv(p0: number): void; - glVertex4fv(p0: java.nio.FloatBuffer): void; - glVertex4fv(p0: kotlin.FloatArray): void; - nglVertex4sv(p0: number): void; - glVertex4sv(p0: java.nio.ShortBuffer): void; - glVertex4sv(p0: Array): void; - nglVertex4iv(p0: number): void; - glVertex4iv(p0: java.nio.IntBuffer): void; - glVertex4iv(p0: Array): void; - nglVertex4dv(p0: number): void; - glVertex4dv(p0: java.nio.DoubleBuffer): void; - glVertex4dv(p0: kotlin.DoubleArray): void; - nglVertexPointer(p0: number, p1: number, p2: number, p3: number): void; - glVertexPointer(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer): void; - glVertexPointer(p0: number, p1: number, p2: number, p3: number): void; - glVertexPointer(p0: number, p1: number, p2: number, p3: java.nio.ShortBuffer): void; - glVertexPointer(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glVertexPointer(p0: number, p1: number, p2: number, p3: java.nio.FloatBuffer): void; - glViewport(p0: number, p1: number, p2: number, p3: number): void; - } - interface GL11 { - } - const GL12: { - GL_ALIASED_POINT_SIZE_RANGE: number; - GL_ALIASED_LINE_WIDTH_RANGE: number; - GL_SMOOTH_POINT_SIZE_RANGE: number; - GL_SMOOTH_POINT_SIZE_GRANULARITY: number; - GL_SMOOTH_LINE_WIDTH_RANGE: number; - GL_SMOOTH_LINE_WIDTH_GRANULARITY: number; - GL_TEXTURE_BINDING_3D: number; - GL_PACK_SKIP_IMAGES: number; - GL_PACK_IMAGE_HEIGHT: number; - GL_UNPACK_SKIP_IMAGES: number; - GL_UNPACK_IMAGE_HEIGHT: number; - GL_TEXTURE_3D: number; - GL_PROXY_TEXTURE_3D: number; - GL_TEXTURE_DEPTH: number; - GL_TEXTURE_WRAP_R: number; - GL_MAX_3D_TEXTURE_SIZE: number; - GL_BGR: number; - GL_BGRA: number; - GL_UNSIGNED_BYTE_3_3_2: number; - GL_UNSIGNED_BYTE_2_3_3_REV: number; - GL_UNSIGNED_SHORT_5_6_5: number; - GL_UNSIGNED_SHORT_5_6_5_REV: number; - GL_UNSIGNED_SHORT_4_4_4_4: number; - GL_UNSIGNED_SHORT_4_4_4_4_REV: number; - GL_UNSIGNED_SHORT_5_5_5_1: number; - GL_UNSIGNED_SHORT_1_5_5_5_REV: number; - GL_UNSIGNED_INT_8_8_8_8: number; - GL_UNSIGNED_INT_8_8_8_8_REV: number; - GL_UNSIGNED_INT_10_10_10_2: number; - GL_UNSIGNED_INT_2_10_10_10_REV: number; - GL_RESCALE_NORMAL: number; - GL_LIGHT_MODEL_COLOR_CONTROL: number; - GL_SINGLE_COLOR: number; - GL_SEPARATE_SPECULAR_COLOR: number; - GL_CLAMP_TO_EDGE: number; - GL_TEXTURE_MIN_LOD: number; - GL_TEXTURE_MAX_LOD: number; - GL_TEXTURE_BASE_LEVEL: number; - GL_TEXTURE_MAX_LEVEL: number; - GL_MAX_ELEMENTS_VERTICES: number; - GL_MAX_ELEMENTS_INDICES: number; - nglTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.ByteBuffer | null | undefined): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.ShortBuffer | null | undefined): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.IntBuffer | null | undefined): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.FloatBuffer | null | undefined): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.DoubleBuffer | null | undefined): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: Array): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: Array): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: kotlin.FloatArray | null | undefined): void; - glTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: kotlin.DoubleArray | null | undefined): void; - nglTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.ByteBuffer): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.ShortBuffer): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.IntBuffer): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.FloatBuffer): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.DoubleBuffer): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: Array): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: Array): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: kotlin.FloatArray): void; - glTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: kotlin.DoubleArray): void; - glCopyTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - nglDrawRangeElements(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glDrawRangeElements(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glDrawRangeElements(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - glDrawRangeElements(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer): void; - glDrawRangeElements(p0: number, p1: number, p2: number, p3: java.nio.ShortBuffer): void; - glDrawRangeElements(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - } - interface GL12 extends org.lwjgl.opengl.GL11 { - } - const GL13: { - GL_COMPRESSED_ALPHA: number; - GL_COMPRESSED_LUMINANCE: number; - GL_COMPRESSED_LUMINANCE_ALPHA: number; - GL_COMPRESSED_INTENSITY: number; - GL_COMPRESSED_RGB: number; - GL_COMPRESSED_RGBA: number; - GL_TEXTURE_COMPRESSION_HINT: number; - GL_TEXTURE_COMPRESSED_IMAGE_SIZE: number; - GL_TEXTURE_COMPRESSED: number; - GL_NUM_COMPRESSED_TEXTURE_FORMATS: number; - GL_COMPRESSED_TEXTURE_FORMATS: number; - GL_NORMAL_MAP: number; - GL_REFLECTION_MAP: number; - GL_TEXTURE_CUBE_MAP: number; - GL_TEXTURE_BINDING_CUBE_MAP: number; - GL_TEXTURE_CUBE_MAP_POSITIVE_X: number; - GL_TEXTURE_CUBE_MAP_NEGATIVE_X: number; - GL_TEXTURE_CUBE_MAP_POSITIVE_Y: number; - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: number; - GL_TEXTURE_CUBE_MAP_POSITIVE_Z: number; - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: number; - GL_PROXY_TEXTURE_CUBE_MAP: number; - GL_MAX_CUBE_MAP_TEXTURE_SIZE: number; - GL_MULTISAMPLE: number; - GL_SAMPLE_ALPHA_TO_COVERAGE: number; - GL_SAMPLE_ALPHA_TO_ONE: number; - GL_SAMPLE_COVERAGE: number; - GL_MULTISAMPLE_BIT: number; - GL_SAMPLE_BUFFERS: number; - GL_SAMPLES: number; - GL_SAMPLE_COVERAGE_VALUE: number; - GL_SAMPLE_COVERAGE_INVERT: number; - GL_TEXTURE0: number; - GL_TEXTURE1: number; - GL_TEXTURE2: number; - GL_TEXTURE3: number; - GL_TEXTURE4: number; - GL_TEXTURE5: number; - GL_TEXTURE6: number; - GL_TEXTURE7: number; - GL_TEXTURE8: number; - GL_TEXTURE9: number; - GL_TEXTURE10: number; - GL_TEXTURE11: number; - GL_TEXTURE12: number; - GL_TEXTURE13: number; - GL_TEXTURE14: number; - GL_TEXTURE15: number; - GL_TEXTURE16: number; - GL_TEXTURE17: number; - GL_TEXTURE18: number; - GL_TEXTURE19: number; - GL_TEXTURE20: number; - GL_TEXTURE21: number; - GL_TEXTURE22: number; - GL_TEXTURE23: number; - GL_TEXTURE24: number; - GL_TEXTURE25: number; - GL_TEXTURE26: number; - GL_TEXTURE27: number; - GL_TEXTURE28: number; - GL_TEXTURE29: number; - GL_TEXTURE30: number; - GL_TEXTURE31: number; - GL_ACTIVE_TEXTURE: number; - GL_CLIENT_ACTIVE_TEXTURE: number; - GL_MAX_TEXTURE_UNITS: number; - GL_COMBINE: number; - GL_COMBINE_RGB: number; - GL_COMBINE_ALPHA: number; - GL_SOURCE0_RGB: number; - GL_SOURCE1_RGB: number; - GL_SOURCE2_RGB: number; - GL_SOURCE0_ALPHA: number; - GL_SOURCE1_ALPHA: number; - GL_SOURCE2_ALPHA: number; - GL_OPERAND0_RGB: number; - GL_OPERAND1_RGB: number; - GL_OPERAND2_RGB: number; - GL_OPERAND0_ALPHA: number; - GL_OPERAND1_ALPHA: number; - GL_OPERAND2_ALPHA: number; - GL_RGB_SCALE: number; - GL_ADD_SIGNED: number; - GL_INTERPOLATE: number; - GL_SUBTRACT: number; - GL_CONSTANT: number; - GL_PRIMARY_COLOR: number; - GL_PREVIOUS: number; - GL_DOT3_RGB: number; - GL_DOT3_RGBA: number; - GL_CLAMP_TO_BORDER: number; - GL_TRANSPOSE_MODELVIEW_MATRIX: number; - GL_TRANSPOSE_PROJECTION_MATRIX: number; - GL_TRANSPOSE_TEXTURE_MATRIX: number; - GL_TRANSPOSE_COLOR_MATRIX: number; - nglCompressedTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glCompressedTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glCompressedTexImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.ByteBuffer | null | undefined): void; - nglCompressedTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glCompressedTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glCompressedTexImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ByteBuffer | null | undefined): void; - nglCompressedTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glCompressedTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glCompressedTexImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: java.nio.ByteBuffer | null | undefined): void; - nglCompressedTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glCompressedTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glCompressedTexSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.ByteBuffer): void; - nglCompressedTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glCompressedTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glCompressedTexSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.ByteBuffer): void; - nglCompressedTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glCompressedTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glCompressedTexSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: java.nio.ByteBuffer): void; - nglGetCompressedTexImage(p0: number, p1: number, p2: number): void; - glGetCompressedTexImage(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glGetCompressedTexImage(p0: number, p1: number, p2: number): void; - glSampleCoverage(p0: number, p1: boolean): void; - glActiveTexture(p0: number): void; - glClientActiveTexture(p0: number): void; - glMultiTexCoord1f(p0: number, p1: number): void; - glMultiTexCoord1s(p0: number, p1: number): void; - glMultiTexCoord1i(p0: number, p1: number): void; - glMultiTexCoord1d(p0: number, p1: number): void; - nglMultiTexCoord1fv(p0: number, p1: number): void; - glMultiTexCoord1fv(p0: number, p1: java.nio.FloatBuffer): void; - glMultiTexCoord1fv(p0: number, p1: kotlin.FloatArray): void; - nglMultiTexCoord1sv(p0: number, p1: number): void; - glMultiTexCoord1sv(p0: number, p1: java.nio.ShortBuffer): void; - glMultiTexCoord1sv(p0: number, p1: Array): void; - nglMultiTexCoord1iv(p0: number, p1: number): void; - glMultiTexCoord1iv(p0: number, p1: java.nio.IntBuffer): void; - glMultiTexCoord1iv(p0: number, p1: Array): void; - nglMultiTexCoord1dv(p0: number, p1: number): void; - glMultiTexCoord1dv(p0: number, p1: java.nio.DoubleBuffer): void; - glMultiTexCoord1dv(p0: number, p1: kotlin.DoubleArray): void; - glMultiTexCoord2f(p0: number, p1: number, p2: number): void; - glMultiTexCoord2s(p0: number, p1: number, p2: number): void; - glMultiTexCoord2i(p0: number, p1: number, p2: number): void; - glMultiTexCoord2d(p0: number, p1: number, p2: number): void; - nglMultiTexCoord2fv(p0: number, p1: number): void; - glMultiTexCoord2fv(p0: number, p1: java.nio.FloatBuffer): void; - glMultiTexCoord2fv(p0: number, p1: kotlin.FloatArray): void; - nglMultiTexCoord2sv(p0: number, p1: number): void; - glMultiTexCoord2sv(p0: number, p1: java.nio.ShortBuffer): void; - glMultiTexCoord2sv(p0: number, p1: Array): void; - nglMultiTexCoord2iv(p0: number, p1: number): void; - glMultiTexCoord2iv(p0: number, p1: java.nio.IntBuffer): void; - glMultiTexCoord2iv(p0: number, p1: Array): void; - nglMultiTexCoord2dv(p0: number, p1: number): void; - glMultiTexCoord2dv(p0: number, p1: java.nio.DoubleBuffer): void; - glMultiTexCoord2dv(p0: number, p1: kotlin.DoubleArray): void; - glMultiTexCoord3f(p0: number, p1: number, p2: number, p3: number): void; - glMultiTexCoord3s(p0: number, p1: number, p2: number, p3: number): void; - glMultiTexCoord3i(p0: number, p1: number, p2: number, p3: number): void; - glMultiTexCoord3d(p0: number, p1: number, p2: number, p3: number): void; - nglMultiTexCoord3fv(p0: number, p1: number): void; - glMultiTexCoord3fv(p0: number, p1: java.nio.FloatBuffer): void; - glMultiTexCoord3fv(p0: number, p1: kotlin.FloatArray): void; - nglMultiTexCoord3sv(p0: number, p1: number): void; - glMultiTexCoord3sv(p0: number, p1: java.nio.ShortBuffer): void; - glMultiTexCoord3sv(p0: number, p1: Array): void; - nglMultiTexCoord3iv(p0: number, p1: number): void; - glMultiTexCoord3iv(p0: number, p1: java.nio.IntBuffer): void; - glMultiTexCoord3iv(p0: number, p1: Array): void; - nglMultiTexCoord3dv(p0: number, p1: number): void; - glMultiTexCoord3dv(p0: number, p1: java.nio.DoubleBuffer): void; - glMultiTexCoord3dv(p0: number, p1: kotlin.DoubleArray): void; - glMultiTexCoord4f(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glMultiTexCoord4s(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glMultiTexCoord4i(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glMultiTexCoord4d(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglMultiTexCoord4fv(p0: number, p1: number): void; - glMultiTexCoord4fv(p0: number, p1: java.nio.FloatBuffer): void; - glMultiTexCoord4fv(p0: number, p1: kotlin.FloatArray): void; - nglMultiTexCoord4sv(p0: number, p1: number): void; - glMultiTexCoord4sv(p0: number, p1: java.nio.ShortBuffer): void; - glMultiTexCoord4sv(p0: number, p1: Array): void; - nglMultiTexCoord4iv(p0: number, p1: number): void; - glMultiTexCoord4iv(p0: number, p1: java.nio.IntBuffer): void; - glMultiTexCoord4iv(p0: number, p1: Array): void; - nglMultiTexCoord4dv(p0: number, p1: number): void; - glMultiTexCoord4dv(p0: number, p1: java.nio.DoubleBuffer): void; - glMultiTexCoord4dv(p0: number, p1: kotlin.DoubleArray): void; - nglLoadTransposeMatrixf(p0: number): void; - glLoadTransposeMatrixf(p0: java.nio.FloatBuffer): void; - glLoadTransposeMatrixf(p0: kotlin.FloatArray): void; - nglLoadTransposeMatrixd(p0: number): void; - glLoadTransposeMatrixd(p0: java.nio.DoubleBuffer): void; - glLoadTransposeMatrixd(p0: kotlin.DoubleArray): void; - nglMultTransposeMatrixf(p0: number): void; - glMultTransposeMatrixf(p0: java.nio.FloatBuffer): void; - glMultTransposeMatrixf(p0: kotlin.FloatArray): void; - nglMultTransposeMatrixd(p0: number): void; - glMultTransposeMatrixd(p0: java.nio.DoubleBuffer): void; - glMultTransposeMatrixd(p0: kotlin.DoubleArray): void; - } - interface GL13 extends org.lwjgl.opengl.GL12 { - } - const GL14: { - GL_GENERATE_MIPMAP: number; - GL_GENERATE_MIPMAP_HINT: number; - GL_CONSTANT_COLOR: number; - GL_ONE_MINUS_CONSTANT_COLOR: number; - GL_CONSTANT_ALPHA: number; - GL_ONE_MINUS_CONSTANT_ALPHA: number; - GL_BLEND_COLOR: number; - GL_FUNC_ADD: number; - GL_MIN: number; - GL_MAX: number; - GL_BLEND_EQUATION: number; - GL_FUNC_SUBTRACT: number; - GL_FUNC_REVERSE_SUBTRACT: number; - GL_DEPTH_COMPONENT16: number; - GL_DEPTH_COMPONENT24: number; - GL_DEPTH_COMPONENT32: number; - GL_TEXTURE_DEPTH_SIZE: number; - GL_DEPTH_TEXTURE_MODE: number; - GL_TEXTURE_COMPARE_MODE: number; - GL_TEXTURE_COMPARE_FUNC: number; - GL_COMPARE_R_TO_TEXTURE: number; - GL_FOG_COORDINATE_SOURCE: number; - GL_FOG_COORDINATE: number; - GL_FRAGMENT_DEPTH: number; - GL_CURRENT_FOG_COORDINATE: number; - GL_FOG_COORDINATE_ARRAY_TYPE: number; - GL_FOG_COORDINATE_ARRAY_STRIDE: number; - GL_FOG_COORDINATE_ARRAY_POINTER: number; - GL_FOG_COORDINATE_ARRAY: number; - GL_POINT_SIZE_MIN: number; - GL_POINT_SIZE_MAX: number; - GL_POINT_FADE_THRESHOLD_SIZE: number; - GL_POINT_DISTANCE_ATTENUATION: number; - GL_COLOR_SUM: number; - GL_CURRENT_SECONDARY_COLOR: number; - GL_SECONDARY_COLOR_ARRAY_SIZE: number; - GL_SECONDARY_COLOR_ARRAY_TYPE: number; - GL_SECONDARY_COLOR_ARRAY_STRIDE: number; - GL_SECONDARY_COLOR_ARRAY_POINTER: number; - GL_SECONDARY_COLOR_ARRAY: number; - GL_BLEND_DST_RGB: number; - GL_BLEND_SRC_RGB: number; - GL_BLEND_DST_ALPHA: number; - GL_BLEND_SRC_ALPHA: number; - GL_INCR_WRAP: number; - GL_DECR_WRAP: number; - GL_TEXTURE_FILTER_CONTROL: number; - GL_TEXTURE_LOD_BIAS: number; - GL_MAX_TEXTURE_LOD_BIAS: number; - GL_MIRRORED_REPEAT: number; - glBlendColor(p0: number, p1: number, p2: number, p3: number): void; - glBlendEquation(p0: number): void; - glFogCoordf(p0: number): void; - glFogCoordd(p0: number): void; - nglFogCoordfv(p0: number): void; - glFogCoordfv(p0: java.nio.FloatBuffer): void; - glFogCoordfv(p0: kotlin.FloatArray): void; - nglFogCoorddv(p0: number): void; - glFogCoorddv(p0: java.nio.DoubleBuffer): void; - glFogCoorddv(p0: kotlin.DoubleArray): void; - nglFogCoordPointer(p0: number, p1: number, p2: number): void; - glFogCoordPointer(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glFogCoordPointer(p0: number, p1: number, p2: number): void; - glFogCoordPointer(p0: number, p1: number, p2: java.nio.ShortBuffer): void; - glFogCoordPointer(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - nglMultiDrawArrays(p0: number, p1: number, p2: number, p3: number): void; - glMultiDrawArrays(p0: number, p1: java.nio.IntBuffer, p2: java.nio.IntBuffer): void; - glMultiDrawArrays(p0: number, p1: Array, p2: Array): void; - nglMultiDrawElements(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glMultiDrawElements(p0: number, p1: java.nio.IntBuffer, p2: number, p3: org.lwjgl.PointerBuffer): void; - glMultiDrawElements(p0: number, p1: Array, p2: number, p3: org.lwjgl.PointerBuffer): void; - glPointParameterf(p0: number, p1: number): void; - glPointParameteri(p0: number, p1: number): void; - nglPointParameterfv(p0: number, p1: number): void; - glPointParameterfv(p0: number, p1: java.nio.FloatBuffer): void; - glPointParameterfv(p0: number, p1: kotlin.FloatArray): void; - nglPointParameteriv(p0: number, p1: number): void; - glPointParameteriv(p0: number, p1: java.nio.IntBuffer): void; - glPointParameteriv(p0: number, p1: Array): void; - glSecondaryColor3b(p0: number, p1: number, p2: number): void; - glSecondaryColor3s(p0: number, p1: number, p2: number): void; - glSecondaryColor3i(p0: number, p1: number, p2: number): void; - glSecondaryColor3f(p0: number, p1: number, p2: number): void; - glSecondaryColor3d(p0: number, p1: number, p2: number): void; - glSecondaryColor3ub(p0: number, p1: number, p2: number): void; - glSecondaryColor3us(p0: number, p1: number, p2: number): void; - glSecondaryColor3ui(p0: number, p1: number, p2: number): void; - nglSecondaryColor3bv(p0: number): void; - glSecondaryColor3bv(p0: java.nio.ByteBuffer): void; - nglSecondaryColor3sv(p0: number): void; - glSecondaryColor3sv(p0: java.nio.ShortBuffer): void; - glSecondaryColor3sv(p0: Array): void; - nglSecondaryColor3iv(p0: number): void; - glSecondaryColor3iv(p0: java.nio.IntBuffer): void; - glSecondaryColor3iv(p0: Array): void; - nglSecondaryColor3fv(p0: number): void; - glSecondaryColor3fv(p0: java.nio.FloatBuffer): void; - glSecondaryColor3fv(p0: kotlin.FloatArray): void; - nglSecondaryColor3dv(p0: number): void; - glSecondaryColor3dv(p0: java.nio.DoubleBuffer): void; - glSecondaryColor3dv(p0: kotlin.DoubleArray): void; - nglSecondaryColor3ubv(p0: number): void; - glSecondaryColor3ubv(p0: java.nio.ByteBuffer): void; - nglSecondaryColor3usv(p0: number): void; - glSecondaryColor3usv(p0: java.nio.ShortBuffer): void; - glSecondaryColor3usv(p0: Array): void; - nglSecondaryColor3uiv(p0: number): void; - glSecondaryColor3uiv(p0: java.nio.IntBuffer): void; - glSecondaryColor3uiv(p0: Array): void; - nglSecondaryColorPointer(p0: number, p1: number, p2: number, p3: number): void; - glSecondaryColorPointer(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer): void; - glSecondaryColorPointer(p0: number, p1: number, p2: number, p3: number): void; - glSecondaryColorPointer(p0: number, p1: number, p2: number, p3: java.nio.ShortBuffer): void; - glSecondaryColorPointer(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glSecondaryColorPointer(p0: number, p1: number, p2: number, p3: java.nio.FloatBuffer): void; - glBlendFuncSeparate(p0: number, p1: number, p2: number, p3: number): void; - glWindowPos2i(p0: number, p1: number): void; - glWindowPos2s(p0: number, p1: number): void; - glWindowPos2f(p0: number, p1: number): void; - glWindowPos2d(p0: number, p1: number): void; - nglWindowPos2iv(p0: number): void; - glWindowPos2iv(p0: java.nio.IntBuffer): void; - glWindowPos2iv(p0: Array): void; - nglWindowPos2sv(p0: number): void; - glWindowPos2sv(p0: java.nio.ShortBuffer): void; - glWindowPos2sv(p0: Array): void; - nglWindowPos2fv(p0: number): void; - glWindowPos2fv(p0: java.nio.FloatBuffer): void; - glWindowPos2fv(p0: kotlin.FloatArray): void; - nglWindowPos2dv(p0: number): void; - glWindowPos2dv(p0: java.nio.DoubleBuffer): void; - glWindowPos2dv(p0: kotlin.DoubleArray): void; - glWindowPos3i(p0: number, p1: number, p2: number): void; - glWindowPos3s(p0: number, p1: number, p2: number): void; - glWindowPos3f(p0: number, p1: number, p2: number): void; - glWindowPos3d(p0: number, p1: number, p2: number): void; - nglWindowPos3iv(p0: number): void; - glWindowPos3iv(p0: java.nio.IntBuffer): void; - glWindowPos3iv(p0: Array): void; - nglWindowPos3sv(p0: number): void; - glWindowPos3sv(p0: java.nio.ShortBuffer): void; - glWindowPos3sv(p0: Array): void; - nglWindowPos3fv(p0: number): void; - glWindowPos3fv(p0: java.nio.FloatBuffer): void; - glWindowPos3fv(p0: kotlin.FloatArray): void; - nglWindowPos3dv(p0: number): void; - glWindowPos3dv(p0: java.nio.DoubleBuffer): void; - glWindowPos3dv(p0: kotlin.DoubleArray): void; - } - interface GL14 extends org.lwjgl.opengl.GL13 { - } - const GL15: { - GL_FOG_COORD_SRC: number; - GL_FOG_COORD: number; - GL_CURRENT_FOG_COORD: number; - GL_FOG_COORD_ARRAY_TYPE: number; - GL_FOG_COORD_ARRAY_STRIDE: number; - GL_FOG_COORD_ARRAY_POINTER: number; - GL_FOG_COORD_ARRAY: number; - GL_FOG_COORD_ARRAY_BUFFER_BINDING: number; - GL_SRC0_RGB: number; - GL_SRC1_RGB: number; - GL_SRC2_RGB: number; - GL_SRC0_ALPHA: number; - GL_SRC1_ALPHA: number; - GL_SRC2_ALPHA: number; - GL_ARRAY_BUFFER: number; - GL_ELEMENT_ARRAY_BUFFER: number; - GL_ARRAY_BUFFER_BINDING: number; - GL_ELEMENT_ARRAY_BUFFER_BINDING: number; - GL_VERTEX_ARRAY_BUFFER_BINDING: number; - GL_NORMAL_ARRAY_BUFFER_BINDING: number; - GL_COLOR_ARRAY_BUFFER_BINDING: number; - GL_INDEX_ARRAY_BUFFER_BINDING: number; - GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING: number; - GL_EDGE_FLAG_ARRAY_BUFFER_BINDING: number; - GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING: number; - GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING: number; - GL_WEIGHT_ARRAY_BUFFER_BINDING: number; - GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number; - GL_STREAM_DRAW: number; - GL_STREAM_READ: number; - GL_STREAM_COPY: number; - GL_STATIC_DRAW: number; - GL_STATIC_READ: number; - GL_STATIC_COPY: number; - GL_DYNAMIC_DRAW: number; - GL_DYNAMIC_READ: number; - GL_DYNAMIC_COPY: number; - GL_READ_ONLY: number; - GL_WRITE_ONLY: number; - GL_READ_WRITE: number; - GL_BUFFER_SIZE: number; - GL_BUFFER_USAGE: number; - GL_BUFFER_ACCESS: number; - GL_BUFFER_MAPPED: number; - GL_BUFFER_MAP_POINTER: number; - GL_SAMPLES_PASSED: number; - GL_QUERY_COUNTER_BITS: number; - GL_CURRENT_QUERY: number; - GL_QUERY_RESULT: number; - GL_QUERY_RESULT_AVAILABLE: number; - glBindBuffer(p0: number, p1: number): void; - nglDeleteBuffers(p0: number, p1: number): void; - glDeleteBuffers(p0: java.nio.IntBuffer): void; - glDeleteBuffers(p0: number): void; - glDeleteBuffers(p0: Array): void; - nglGenBuffers(p0: number, p1: number): void; - glGenBuffers(p0: java.nio.IntBuffer): void; - glGenBuffers(): number; - glGenBuffers(p0: Array): void; - glIsBuffer(p0: number): boolean; - nglBufferData(p0: number, p1: number, p2: number, p3: number): void; - glBufferData(p0: number, p1: number, p2: number): void; - glBufferData(p0: number, p1: java.nio.ByteBuffer, p2: number): void; - glBufferData(p0: number, p1: java.nio.ShortBuffer, p2: number): void; - glBufferData(p0: number, p1: java.nio.IntBuffer, p2: number): void; - glBufferData(p0: number, p1: java.nio.LongBuffer, p2: number): void; - glBufferData(p0: number, p1: java.nio.FloatBuffer, p2: number): void; - glBufferData(p0: number, p1: java.nio.DoubleBuffer, p2: number): void; - glBufferData(p0: number, p1: Array, p2: number): void; - glBufferData(p0: number, p1: Array, p2: number): void; - glBufferData(p0: number, p1: Array, p2: number): void; - glBufferData(p0: number, p1: kotlin.FloatArray, p2: number): void; - glBufferData(p0: number, p1: kotlin.DoubleArray, p2: number): void; - nglBufferSubData(p0: number, p1: number, p2: number, p3: number): void; - glBufferSubData(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glBufferSubData(p0: number, p1: number, p2: java.nio.ShortBuffer): void; - glBufferSubData(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glBufferSubData(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glBufferSubData(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glBufferSubData(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glBufferSubData(p0: number, p1: number, p2: Array): void; - glBufferSubData(p0: number, p1: number, p2: Array): void; - glBufferSubData(p0: number, p1: number, p2: Array): void; - glBufferSubData(p0: number, p1: number, p2: kotlin.FloatArray): void; - glBufferSubData(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglGetBufferSubData(p0: number, p1: number, p2: number, p3: number): void; - glGetBufferSubData(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glGetBufferSubData(p0: number, p1: number, p2: java.nio.ShortBuffer): void; - glGetBufferSubData(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetBufferSubData(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glGetBufferSubData(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetBufferSubData(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetBufferSubData(p0: number, p1: number, p2: Array): void; - glGetBufferSubData(p0: number, p1: number, p2: Array): void; - glGetBufferSubData(p0: number, p1: number, p2: Array): void; - glGetBufferSubData(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetBufferSubData(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglMapBuffer(p0: number, p1: number): number; - glMapBuffer(p0: number, p1: number): java.nio.ByteBuffer | null | undefined; - glMapBuffer(p0: number, p1: number, p2: java.nio.ByteBuffer | null | undefined): java.nio.ByteBuffer | null | undefined; - glMapBuffer(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer | null | undefined): java.nio.ByteBuffer | null | undefined; - glUnmapBuffer(p0: number): boolean; - nglGetBufferParameteriv(p0: number, p1: number, p2: number): void; - glGetBufferParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetBufferParameteriv(p0: number, p1: number, p2: Array): void; - glGetBufferParameteri(p0: number, p1: number): number; - nglGetBufferPointerv(p0: number, p1: number, p2: number): void; - glGetBufferPointerv(p0: number, p1: number, p2: org.lwjgl.PointerBuffer): void; - glGetBufferPointer(p0: number, p1: number): number; - nglGenQueries(p0: number, p1: number): void; - glGenQueries(p0: java.nio.IntBuffer): void; - glGenQueries(): number; - glGenQueries(p0: Array): void; - nglDeleteQueries(p0: number, p1: number): void; - glDeleteQueries(p0: java.nio.IntBuffer): void; - glDeleteQueries(p0: number): void; - glDeleteQueries(p0: Array): void; - glIsQuery(p0: number): boolean; - glBeginQuery(p0: number, p1: number): void; - glEndQuery(p0: number): void; - nglGetQueryiv(p0: number, p1: number, p2: number): void; - glGetQueryiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetQueryiv(p0: number, p1: number, p2: Array): void; - glGetQueryi(p0: number, p1: number): number; - nglGetQueryObjectiv(p0: number, p1: number, p2: number): void; - glGetQueryObjectiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetQueryObjectiv(p0: number, p1: number, p2: number): void; - glGetQueryObjectiv(p0: number, p1: number, p2: Array): void; - glGetQueryObjecti(p0: number, p1: number): number; - nglGetQueryObjectuiv(p0: number, p1: number, p2: number): void; - glGetQueryObjectuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetQueryObjectuiv(p0: number, p1: number, p2: number): void; - glGetQueryObjectuiv(p0: number, p1: number, p2: Array): void; - glGetQueryObjectui(p0: number, p1: number): number; - } - interface GL15 extends org.lwjgl.opengl.GL14 { - } - const GL20: { - GL_SHADING_LANGUAGE_VERSION: number; - GL_CURRENT_PROGRAM: number; - GL_SHADER_TYPE: number; - GL_DELETE_STATUS: number; - GL_COMPILE_STATUS: number; - GL_LINK_STATUS: number; - GL_VALIDATE_STATUS: number; - GL_INFO_LOG_LENGTH: number; - GL_ATTACHED_SHADERS: number; - GL_ACTIVE_UNIFORMS: number; - GL_ACTIVE_UNIFORM_MAX_LENGTH: number; - GL_ACTIVE_ATTRIBUTES: number; - GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: number; - GL_SHADER_SOURCE_LENGTH: number; - GL_FLOAT_VEC2: number; - GL_FLOAT_VEC3: number; - GL_FLOAT_VEC4: number; - GL_INT_VEC2: number; - GL_INT_VEC3: number; - GL_INT_VEC4: number; - GL_BOOL: number; - GL_BOOL_VEC2: number; - GL_BOOL_VEC3: number; - GL_BOOL_VEC4: number; - GL_FLOAT_MAT2: number; - GL_FLOAT_MAT3: number; - GL_FLOAT_MAT4: number; - GL_SAMPLER_1D: number; - GL_SAMPLER_2D: number; - GL_SAMPLER_3D: number; - GL_SAMPLER_CUBE: number; - GL_SAMPLER_1D_SHADOW: number; - GL_SAMPLER_2D_SHADOW: number; - GL_VERTEX_SHADER: number; - GL_MAX_VERTEX_UNIFORM_COMPONENTS: number; - GL_MAX_VARYING_FLOATS: number; - GL_MAX_VERTEX_ATTRIBS: number; - GL_MAX_TEXTURE_IMAGE_UNITS: number; - GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: number; - GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: number; - GL_MAX_TEXTURE_COORDS: number; - GL_VERTEX_PROGRAM_POINT_SIZE: number; - GL_VERTEX_PROGRAM_TWO_SIDE: number; - GL_VERTEX_ATTRIB_ARRAY_ENABLED: number; - GL_VERTEX_ATTRIB_ARRAY_SIZE: number; - GL_VERTEX_ATTRIB_ARRAY_STRIDE: number; - GL_VERTEX_ATTRIB_ARRAY_TYPE: number; - GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: number; - GL_CURRENT_VERTEX_ATTRIB: number; - GL_VERTEX_ATTRIB_ARRAY_POINTER: number; - GL_FRAGMENT_SHADER: number; - GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: number; - GL_FRAGMENT_SHADER_DERIVATIVE_HINT: number; - GL_MAX_DRAW_BUFFERS: number; - GL_DRAW_BUFFER0: number; - GL_DRAW_BUFFER1: number; - GL_DRAW_BUFFER2: number; - GL_DRAW_BUFFER3: number; - GL_DRAW_BUFFER4: number; - GL_DRAW_BUFFER5: number; - GL_DRAW_BUFFER6: number; - GL_DRAW_BUFFER7: number; - GL_DRAW_BUFFER8: number; - GL_DRAW_BUFFER9: number; - GL_DRAW_BUFFER10: number; - GL_DRAW_BUFFER11: number; - GL_DRAW_BUFFER12: number; - GL_DRAW_BUFFER13: number; - GL_DRAW_BUFFER14: number; - GL_DRAW_BUFFER15: number; - GL_POINT_SPRITE: number; - GL_COORD_REPLACE: number; - GL_POINT_SPRITE_COORD_ORIGIN: number; - GL_LOWER_LEFT: number; - GL_UPPER_LEFT: number; - GL_BLEND_EQUATION_RGB: number; - GL_BLEND_EQUATION_ALPHA: number; - GL_STENCIL_BACK_FUNC: number; - GL_STENCIL_BACK_FAIL: number; - GL_STENCIL_BACK_PASS_DEPTH_FAIL: number; - GL_STENCIL_BACK_PASS_DEPTH_PASS: number; - GL_STENCIL_BACK_REF: number; - GL_STENCIL_BACK_VALUE_MASK: number; - GL_STENCIL_BACK_WRITEMASK: number; - glCreateProgram(): number; - glDeleteProgram(p0: number): void; - glIsProgram(p0: number): boolean; - glCreateShader(p0: number): number; - glDeleteShader(p0: number): void; - glIsShader(p0: number): boolean; - glAttachShader(p0: number, p1: number): void; - glDetachShader(p0: number, p1: number): void; - nglShaderSource(p0: number, p1: number, p2: number, p3: number): void; - glShaderSource(p0: number, p1: org.lwjgl.PointerBuffer, p2: java.nio.IntBuffer | null | undefined): void; - glShaderSource(p0: number, p1: kotlin.CharSequence): void; - glShaderSource(p0: number, p1: kotlin.CharSequence): void; - glShaderSource(p0: number, p1: org.lwjgl.PointerBuffer, p2: Array): void; - glCompileShader(p0: number): void; - glLinkProgram(p0: number): void; - glUseProgram(p0: number): void; - glValidateProgram(p0: number): void; - glUniform1f(p0: number, p1: number): void; - glUniform2f(p0: number, p1: number, p2: number): void; - glUniform3f(p0: number, p1: number, p2: number, p3: number): void; - glUniform4f(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glUniform1i(p0: number, p1: number): void; - glUniform2i(p0: number, p1: number, p2: number): void; - glUniform3i(p0: number, p1: number, p2: number, p3: number): void; - glUniform4i(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglUniform1fv(p0: number, p1: number, p2: number): void; - glUniform1fv(p0: number, p1: java.nio.FloatBuffer): void; - glUniform1fv(p0: number, p1: kotlin.FloatArray): void; - nglUniform2fv(p0: number, p1: number, p2: number): void; - glUniform2fv(p0: number, p1: java.nio.FloatBuffer): void; - glUniform2fv(p0: number, p1: kotlin.FloatArray): void; - nglUniform3fv(p0: number, p1: number, p2: number): void; - glUniform3fv(p0: number, p1: java.nio.FloatBuffer): void; - glUniform3fv(p0: number, p1: kotlin.FloatArray): void; - nglUniform4fv(p0: number, p1: number, p2: number): void; - glUniform4fv(p0: number, p1: java.nio.FloatBuffer): void; - glUniform4fv(p0: number, p1: kotlin.FloatArray): void; - nglUniform1iv(p0: number, p1: number, p2: number): void; - glUniform1iv(p0: number, p1: java.nio.IntBuffer): void; - glUniform1iv(p0: number, p1: Array): void; - nglUniform2iv(p0: number, p1: number, p2: number): void; - glUniform2iv(p0: number, p1: java.nio.IntBuffer): void; - glUniform2iv(p0: number, p1: Array): void; - nglUniform3iv(p0: number, p1: number, p2: number): void; - glUniform3iv(p0: number, p1: java.nio.IntBuffer): void; - glUniform3iv(p0: number, p1: Array): void; - nglUniform4iv(p0: number, p1: number, p2: number): void; - glUniform4iv(p0: number, p1: java.nio.IntBuffer): void; - glUniform4iv(p0: number, p1: Array): void; - nglUniformMatrix2fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix2fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix2fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - nglUniformMatrix3fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix3fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix3fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - nglUniformMatrix4fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix4fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix4fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - nglGetShaderiv(p0: number, p1: number, p2: number): void; - glGetShaderiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetShaderiv(p0: number, p1: number, p2: Array): void; - glGetShaderi(p0: number, p1: number): number; - nglGetProgramiv(p0: number, p1: number, p2: number): void; - glGetProgramiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetProgramiv(p0: number, p1: number, p2: Array): void; - glGetProgrami(p0: number, p1: number): number; - nglGetShaderInfoLog(p0: number, p1: number, p2: number, p3: number): void; - glGetShaderInfoLog(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: java.nio.ByteBuffer): void; - glGetShaderInfoLog(p0: number, p1: number): string; - glGetShaderInfoLog(p0: number): string; - glGetShaderInfoLog(p0: number, p1: Array, p2: java.nio.ByteBuffer): void; - nglGetProgramInfoLog(p0: number, p1: number, p2: number, p3: number): void; - glGetProgramInfoLog(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: java.nio.ByteBuffer): void; - glGetProgramInfoLog(p0: number, p1: number): string; - glGetProgramInfoLog(p0: number): string; - glGetProgramInfoLog(p0: number, p1: Array, p2: java.nio.ByteBuffer): void; - nglGetAttachedShaders(p0: number, p1: number, p2: number, p3: number): void; - glGetAttachedShaders(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: java.nio.IntBuffer): void; - glGetAttachedShaders(p0: number, p1: Array, p2: Array): void; - nglGetUniformLocation(p0: number, p1: number): number; - glGetUniformLocation(p0: number, p1: java.nio.ByteBuffer): number; - glGetUniformLocation(p0: number, p1: kotlin.CharSequence): number; - nglGetActiveUniform(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glGetActiveUniform(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: java.nio.IntBuffer, p4: java.nio.IntBuffer, p5: java.nio.ByteBuffer): void; - glGetActiveUniform(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer, p4: java.nio.IntBuffer): string; - glGetActiveUniform(p0: number, p1: number, p2: java.nio.IntBuffer, p3: java.nio.IntBuffer): string; - glGetActiveUniform(p0: number, p1: number, p2: Array, p3: Array, p4: Array, p5: java.nio.ByteBuffer): void; - nglGetUniformfv(p0: number, p1: number, p2: number): void; - glGetUniformfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetUniformfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetUniformf(p0: number, p1: number): number; - nglGetUniformiv(p0: number, p1: number, p2: number): void; - glGetUniformiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetUniformiv(p0: number, p1: number, p2: Array): void; - glGetUniformi(p0: number, p1: number): number; - nglGetShaderSource(p0: number, p1: number, p2: number, p3: number): void; - glGetShaderSource(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: java.nio.ByteBuffer): void; - glGetShaderSource(p0: number, p1: number): string; - glGetShaderSource(p0: number): string; - glGetShaderSource(p0: number, p1: Array, p2: java.nio.ByteBuffer): void; - glVertexAttrib1f(p0: number, p1: number): void; - glVertexAttrib1s(p0: number, p1: number): void; - glVertexAttrib1d(p0: number, p1: number): void; - glVertexAttrib2f(p0: number, p1: number, p2: number): void; - glVertexAttrib2s(p0: number, p1: number, p2: number): void; - glVertexAttrib2d(p0: number, p1: number, p2: number): void; - glVertexAttrib3f(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttrib3s(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttrib3d(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttrib4f(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexAttrib4s(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexAttrib4d(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexAttrib4Nub(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglVertexAttrib1fv(p0: number, p1: number): void; - glVertexAttrib1fv(p0: number, p1: java.nio.FloatBuffer): void; - glVertexAttrib1fv(p0: number, p1: kotlin.FloatArray): void; - nglVertexAttrib1sv(p0: number, p1: number): void; - glVertexAttrib1sv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttrib1sv(p0: number, p1: Array): void; - nglVertexAttrib1dv(p0: number, p1: number): void; - glVertexAttrib1dv(p0: number, p1: java.nio.DoubleBuffer): void; - glVertexAttrib1dv(p0: number, p1: kotlin.DoubleArray): void; - nglVertexAttrib2fv(p0: number, p1: number): void; - glVertexAttrib2fv(p0: number, p1: java.nio.FloatBuffer): void; - glVertexAttrib2fv(p0: number, p1: kotlin.FloatArray): void; - nglVertexAttrib2sv(p0: number, p1: number): void; - glVertexAttrib2sv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttrib2sv(p0: number, p1: Array): void; - nglVertexAttrib2dv(p0: number, p1: number): void; - glVertexAttrib2dv(p0: number, p1: java.nio.DoubleBuffer): void; - glVertexAttrib2dv(p0: number, p1: kotlin.DoubleArray): void; - nglVertexAttrib3fv(p0: number, p1: number): void; - glVertexAttrib3fv(p0: number, p1: java.nio.FloatBuffer): void; - glVertexAttrib3fv(p0: number, p1: kotlin.FloatArray): void; - nglVertexAttrib3sv(p0: number, p1: number): void; - glVertexAttrib3sv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttrib3sv(p0: number, p1: Array): void; - nglVertexAttrib3dv(p0: number, p1: number): void; - glVertexAttrib3dv(p0: number, p1: java.nio.DoubleBuffer): void; - glVertexAttrib3dv(p0: number, p1: kotlin.DoubleArray): void; - nglVertexAttrib4fv(p0: number, p1: number): void; - glVertexAttrib4fv(p0: number, p1: java.nio.FloatBuffer): void; - glVertexAttrib4fv(p0: number, p1: kotlin.FloatArray): void; - nglVertexAttrib4sv(p0: number, p1: number): void; - glVertexAttrib4sv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttrib4sv(p0: number, p1: Array): void; - nglVertexAttrib4dv(p0: number, p1: number): void; - glVertexAttrib4dv(p0: number, p1: java.nio.DoubleBuffer): void; - glVertexAttrib4dv(p0: number, p1: kotlin.DoubleArray): void; - nglVertexAttrib4iv(p0: number, p1: number): void; - glVertexAttrib4iv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttrib4iv(p0: number, p1: Array): void; - nglVertexAttrib4bv(p0: number, p1: number): void; - glVertexAttrib4bv(p0: number, p1: java.nio.ByteBuffer): void; - nglVertexAttrib4ubv(p0: number, p1: number): void; - glVertexAttrib4ubv(p0: number, p1: java.nio.ByteBuffer): void; - nglVertexAttrib4usv(p0: number, p1: number): void; - glVertexAttrib4usv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttrib4usv(p0: number, p1: Array): void; - nglVertexAttrib4uiv(p0: number, p1: number): void; - glVertexAttrib4uiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttrib4uiv(p0: number, p1: Array): void; - nglVertexAttrib4Nbv(p0: number, p1: number): void; - glVertexAttrib4Nbv(p0: number, p1: java.nio.ByteBuffer): void; - nglVertexAttrib4Nsv(p0: number, p1: number): void; - glVertexAttrib4Nsv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttrib4Nsv(p0: number, p1: Array): void; - nglVertexAttrib4Niv(p0: number, p1: number): void; - glVertexAttrib4Niv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttrib4Niv(p0: number, p1: Array): void; - nglVertexAttrib4Nubv(p0: number, p1: number): void; - glVertexAttrib4Nubv(p0: number, p1: java.nio.ByteBuffer): void; - nglVertexAttrib4Nusv(p0: number, p1: number): void; - glVertexAttrib4Nusv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttrib4Nusv(p0: number, p1: Array): void; - nglVertexAttrib4Nuiv(p0: number, p1: number): void; - glVertexAttrib4Nuiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttrib4Nuiv(p0: number, p1: Array): void; - nglVertexAttribPointer(p0: number, p1: number, p2: number, p3: boolean, p4: number, p5: number): void; - glVertexAttribPointer(p0: number, p1: number, p2: number, p3: boolean, p4: number, p5: java.nio.ByteBuffer): void; - glVertexAttribPointer(p0: number, p1: number, p2: number, p3: boolean, p4: number, p5: number): void; - glVertexAttribPointer(p0: number, p1: number, p2: number, p3: boolean, p4: number, p5: java.nio.ShortBuffer): void; - glVertexAttribPointer(p0: number, p1: number, p2: number, p3: boolean, p4: number, p5: java.nio.IntBuffer): void; - glVertexAttribPointer(p0: number, p1: number, p2: number, p3: boolean, p4: number, p5: java.nio.FloatBuffer): void; - glEnableVertexAttribArray(p0: number): void; - glDisableVertexAttribArray(p0: number): void; - nglBindAttribLocation(p0: number, p1: number, p2: number): void; - glBindAttribLocation(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glBindAttribLocation(p0: number, p1: number, p2: kotlin.CharSequence): void; - nglGetActiveAttrib(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glGetActiveAttrib(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: java.nio.IntBuffer, p4: java.nio.IntBuffer, p5: java.nio.ByteBuffer): void; - glGetActiveAttrib(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer, p4: java.nio.IntBuffer): string; - glGetActiveAttrib(p0: number, p1: number, p2: java.nio.IntBuffer, p3: java.nio.IntBuffer): string; - glGetActiveAttrib(p0: number, p1: number, p2: Array, p3: Array, p4: Array, p5: java.nio.ByteBuffer): void; - nglGetAttribLocation(p0: number, p1: number): number; - glGetAttribLocation(p0: number, p1: java.nio.ByteBuffer): number; - glGetAttribLocation(p0: number, p1: kotlin.CharSequence): number; - nglGetVertexAttribiv(p0: number, p1: number, p2: number): void; - glGetVertexAttribiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetVertexAttribiv(p0: number, p1: number, p2: Array): void; - glGetVertexAttribi(p0: number, p1: number): number; - nglGetVertexAttribfv(p0: number, p1: number, p2: number): void; - glGetVertexAttribfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetVertexAttribfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - nglGetVertexAttribdv(p0: number, p1: number, p2: number): void; - glGetVertexAttribdv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetVertexAttribdv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglGetVertexAttribPointerv(p0: number, p1: number, p2: number): void; - glGetVertexAttribPointerv(p0: number, p1: number, p2: org.lwjgl.PointerBuffer): void; - glGetVertexAttribPointer(p0: number, p1: number): number; - nglDrawBuffers(p0: number, p1: number): void; - glDrawBuffers(p0: java.nio.IntBuffer): void; - glDrawBuffers(p0: number): void; - glDrawBuffers(p0: Array): void; - glBlendEquationSeparate(p0: number, p1: number): void; - glStencilOpSeparate(p0: number, p1: number, p2: number, p3: number): void; - glStencilFuncSeparate(p0: number, p1: number, p2: number, p3: number): void; - glStencilMaskSeparate(p0: number, p1: number): void; - } - interface GL20 extends org.lwjgl.opengl.GL15 { - } - const GL21: { - GL_CURRENT_RASTER_SECONDARY_COLOR: number; - GL_FLOAT_MAT2x3: number; - GL_FLOAT_MAT2x4: number; - GL_FLOAT_MAT3x2: number; - GL_FLOAT_MAT3x4: number; - GL_FLOAT_MAT4x2: number; - GL_FLOAT_MAT4x3: number; - GL_PIXEL_PACK_BUFFER: number; - GL_PIXEL_UNPACK_BUFFER: number; - GL_PIXEL_PACK_BUFFER_BINDING: number; - GL_PIXEL_UNPACK_BUFFER_BINDING: number; - GL_SRGB: number; - GL_SRGB8: number; - GL_SRGB_ALPHA: number; - GL_SRGB8_ALPHA8: number; - GL_SLUMINANCE_ALPHA: number; - GL_SLUMINANCE8_ALPHA8: number; - GL_SLUMINANCE: number; - GL_SLUMINANCE8: number; - GL_COMPRESSED_SRGB: number; - GL_COMPRESSED_SRGB_ALPHA: number; - GL_COMPRESSED_SLUMINANCE: number; - GL_COMPRESSED_SLUMINANCE_ALPHA: number; - nglUniformMatrix2x3fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix2x3fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix2x3fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - nglUniformMatrix3x2fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix3x2fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix3x2fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - nglUniformMatrix2x4fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix2x4fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix2x4fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - nglUniformMatrix4x2fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix4x2fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix4x2fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - nglUniformMatrix3x4fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix3x4fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix3x4fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - nglUniformMatrix4x3fv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix4x3fv(p0: number, p1: boolean, p2: java.nio.FloatBuffer): void; - glUniformMatrix4x3fv(p0: number, p1: boolean, p2: kotlin.FloatArray): void; - } - interface GL21 extends org.lwjgl.opengl.GL20 { - } - const GL30: { - GL_MAJOR_VERSION: number; - GL_MINOR_VERSION: number; - GL_NUM_EXTENSIONS: number; - GL_CONTEXT_FLAGS: number; - GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT: number; - GL_COMPARE_REF_TO_TEXTURE: number; - GL_CLIP_DISTANCE0: number; - GL_CLIP_DISTANCE1: number; - GL_CLIP_DISTANCE2: number; - GL_CLIP_DISTANCE3: number; - GL_CLIP_DISTANCE4: number; - GL_CLIP_DISTANCE5: number; - GL_CLIP_DISTANCE6: number; - GL_CLIP_DISTANCE7: number; - GL_MAX_CLIP_DISTANCES: number; - GL_MAX_VARYING_COMPONENTS: number; - GL_VERTEX_ATTRIB_ARRAY_INTEGER: number; - GL_SAMPLER_1D_ARRAY: number; - GL_SAMPLER_2D_ARRAY: number; - GL_SAMPLER_1D_ARRAY_SHADOW: number; - GL_SAMPLER_2D_ARRAY_SHADOW: number; - GL_SAMPLER_CUBE_SHADOW: number; - GL_UNSIGNED_INT_VEC2: number; - GL_UNSIGNED_INT_VEC3: number; - GL_UNSIGNED_INT_VEC4: number; - GL_INT_SAMPLER_1D: number; - GL_INT_SAMPLER_2D: number; - GL_INT_SAMPLER_3D: number; - GL_INT_SAMPLER_CUBE: number; - GL_INT_SAMPLER_1D_ARRAY: number; - GL_INT_SAMPLER_2D_ARRAY: number; - GL_UNSIGNED_INT_SAMPLER_1D: number; - GL_UNSIGNED_INT_SAMPLER_2D: number; - GL_UNSIGNED_INT_SAMPLER_3D: number; - GL_UNSIGNED_INT_SAMPLER_CUBE: number; - GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: number; - GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: number; - GL_MIN_PROGRAM_TEXEL_OFFSET: number; - GL_MAX_PROGRAM_TEXEL_OFFSET: number; - GL_QUERY_WAIT: number; - GL_QUERY_NO_WAIT: number; - GL_QUERY_BY_REGION_WAIT: number; - GL_QUERY_BY_REGION_NO_WAIT: number; - GL_MAP_READ_BIT: number; - GL_MAP_WRITE_BIT: number; - GL_MAP_INVALIDATE_RANGE_BIT: number; - GL_MAP_INVALIDATE_BUFFER_BIT: number; - GL_MAP_FLUSH_EXPLICIT_BIT: number; - GL_MAP_UNSYNCHRONIZED_BIT: number; - GL_BUFFER_ACCESS_FLAGS: number; - GL_BUFFER_MAP_LENGTH: number; - GL_BUFFER_MAP_OFFSET: number; - GL_CLAMP_VERTEX_COLOR: number; - GL_CLAMP_FRAGMENT_COLOR: number; - GL_CLAMP_READ_COLOR: number; - GL_FIXED_ONLY: number; - GL_DEPTH_COMPONENT32F: number; - GL_DEPTH32F_STENCIL8: number; - GL_FLOAT_32_UNSIGNED_INT_24_8_REV: number; - GL_TEXTURE_RED_TYPE: number; - GL_TEXTURE_GREEN_TYPE: number; - GL_TEXTURE_BLUE_TYPE: number; - GL_TEXTURE_ALPHA_TYPE: number; - GL_TEXTURE_LUMINANCE_TYPE: number; - GL_TEXTURE_INTENSITY_TYPE: number; - GL_TEXTURE_DEPTH_TYPE: number; - GL_UNSIGNED_NORMALIZED: number; - GL_RGBA32F: number; - GL_RGB32F: number; - GL_RGBA16F: number; - GL_RGB16F: number; - GL_R11F_G11F_B10F: number; - GL_UNSIGNED_INT_10F_11F_11F_REV: number; - GL_RGB9_E5: number; - GL_UNSIGNED_INT_5_9_9_9_REV: number; - GL_TEXTURE_SHARED_SIZE: number; - GL_FRAMEBUFFER: number; - GL_READ_FRAMEBUFFER: number; - GL_DRAW_FRAMEBUFFER: number; - GL_RENDERBUFFER: number; - GL_STENCIL_INDEX1: number; - GL_STENCIL_INDEX4: number; - GL_STENCIL_INDEX8: number; - GL_STENCIL_INDEX16: number; - GL_RENDERBUFFER_WIDTH: number; - GL_RENDERBUFFER_HEIGHT: number; - GL_RENDERBUFFER_INTERNAL_FORMAT: number; - GL_RENDERBUFFER_RED_SIZE: number; - GL_RENDERBUFFER_GREEN_SIZE: number; - GL_RENDERBUFFER_BLUE_SIZE: number; - GL_RENDERBUFFER_ALPHA_SIZE: number; - GL_RENDERBUFFER_DEPTH_SIZE: number; - GL_RENDERBUFFER_STENCIL_SIZE: number; - GL_RENDERBUFFER_SAMPLES: number; - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number; - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number; - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number; - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number; - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: number; - GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: number; - GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: number; - GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: number; - GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: number; - GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: number; - GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: number; - GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: number; - GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: number; - GL_FRAMEBUFFER_DEFAULT: number; - GL_INDEX: number; - GL_COLOR_ATTACHMENT0: number; - GL_COLOR_ATTACHMENT1: number; - GL_COLOR_ATTACHMENT2: number; - GL_COLOR_ATTACHMENT3: number; - GL_COLOR_ATTACHMENT4: number; - GL_COLOR_ATTACHMENT5: number; - GL_COLOR_ATTACHMENT6: number; - GL_COLOR_ATTACHMENT7: number; - GL_COLOR_ATTACHMENT8: number; - GL_COLOR_ATTACHMENT9: number; - GL_COLOR_ATTACHMENT10: number; - GL_COLOR_ATTACHMENT11: number; - GL_COLOR_ATTACHMENT12: number; - GL_COLOR_ATTACHMENT13: number; - GL_COLOR_ATTACHMENT14: number; - GL_COLOR_ATTACHMENT15: number; - GL_COLOR_ATTACHMENT16: number; - GL_COLOR_ATTACHMENT17: number; - GL_COLOR_ATTACHMENT18: number; - GL_COLOR_ATTACHMENT19: number; - GL_COLOR_ATTACHMENT20: number; - GL_COLOR_ATTACHMENT21: number; - GL_COLOR_ATTACHMENT22: number; - GL_COLOR_ATTACHMENT23: number; - GL_COLOR_ATTACHMENT24: number; - GL_COLOR_ATTACHMENT25: number; - GL_COLOR_ATTACHMENT26: number; - GL_COLOR_ATTACHMENT27: number; - GL_COLOR_ATTACHMENT28: number; - GL_COLOR_ATTACHMENT29: number; - GL_COLOR_ATTACHMENT30: number; - GL_COLOR_ATTACHMENT31: number; - GL_DEPTH_ATTACHMENT: number; - GL_STENCIL_ATTACHMENT: number; - GL_DEPTH_STENCIL_ATTACHMENT: number; - GL_MAX_SAMPLES: number; - GL_FRAMEBUFFER_COMPLETE: number; - GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number; - GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number; - GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: number; - GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: number; - GL_FRAMEBUFFER_UNSUPPORTED: number; - GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: number; - GL_FRAMEBUFFER_UNDEFINED: number; - GL_FRAMEBUFFER_BINDING: number; - GL_DRAW_FRAMEBUFFER_BINDING: number; - GL_READ_FRAMEBUFFER_BINDING: number; - GL_RENDERBUFFER_BINDING: number; - GL_MAX_COLOR_ATTACHMENTS: number; - GL_MAX_RENDERBUFFER_SIZE: number; - GL_INVALID_FRAMEBUFFER_OPERATION: number; - GL_DEPTH_STENCIL: number; - GL_UNSIGNED_INT_24_8: number; - GL_DEPTH24_STENCIL8: number; - GL_TEXTURE_STENCIL_SIZE: number; - GL_HALF_FLOAT: number; - GL_RGBA32UI: number; - GL_RGB32UI: number; - GL_RGBA16UI: number; - GL_RGB16UI: number; - GL_RGBA8UI: number; - GL_RGB8UI: number; - GL_RGBA32I: number; - GL_RGB32I: number; - GL_RGBA16I: number; - GL_RGB16I: number; - GL_RGBA8I: number; - GL_RGB8I: number; - GL_RED_INTEGER: number; - GL_GREEN_INTEGER: number; - GL_BLUE_INTEGER: number; - GL_ALPHA_INTEGER: number; - GL_RGB_INTEGER: number; - GL_RGBA_INTEGER: number; - GL_BGR_INTEGER: number; - GL_BGRA_INTEGER: number; - GL_TEXTURE_1D_ARRAY: number; - GL_TEXTURE_2D_ARRAY: number; - GL_PROXY_TEXTURE_2D_ARRAY: number; - GL_PROXY_TEXTURE_1D_ARRAY: number; - GL_TEXTURE_BINDING_1D_ARRAY: number; - GL_TEXTURE_BINDING_2D_ARRAY: number; - GL_MAX_ARRAY_TEXTURE_LAYERS: number; - GL_COMPRESSED_RED_RGTC1: number; - GL_COMPRESSED_SIGNED_RED_RGTC1: number; - GL_COMPRESSED_RG_RGTC2: number; - GL_COMPRESSED_SIGNED_RG_RGTC2: number; - GL_R8: number; - GL_R16: number; - GL_RG8: number; - GL_RG16: number; - GL_R16F: number; - GL_R32F: number; - GL_RG16F: number; - GL_RG32F: number; - GL_R8I: number; - GL_R8UI: number; - GL_R16I: number; - GL_R16UI: number; - GL_R32I: number; - GL_R32UI: number; - GL_RG8I: number; - GL_RG8UI: number; - GL_RG16I: number; - GL_RG16UI: number; - GL_RG32I: number; - GL_RG32UI: number; - GL_RG: number; - GL_COMPRESSED_RED: number; - GL_COMPRESSED_RG: number; - GL_RG_INTEGER: number; - GL_TRANSFORM_FEEDBACK_BUFFER: number; - GL_TRANSFORM_FEEDBACK_BUFFER_START: number; - GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: number; - GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: number; - GL_INTERLEAVED_ATTRIBS: number; - GL_SEPARATE_ATTRIBS: number; - GL_PRIMITIVES_GENERATED: number; - GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: number; - GL_RASTERIZER_DISCARD: number; - GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: number; - GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: number; - GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: number; - GL_TRANSFORM_FEEDBACK_VARYINGS: number; - GL_TRANSFORM_FEEDBACK_BUFFER_MODE: number; - GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: number; - GL_VERTEX_ARRAY_BINDING: number; - GL_FRAMEBUFFER_SRGB: number; - nglGetStringi(p0: number, p1: number): number; - glGetStringi(p0: number, p1: number): string | null | undefined; - nglClearBufferiv(p0: number, p1: number, p2: number): void; - glClearBufferiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glClearBufferiv(p0: number, p1: number, p2: Array): void; - nglClearBufferuiv(p0: number, p1: number, p2: number): void; - glClearBufferuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glClearBufferuiv(p0: number, p1: number, p2: Array): void; - nglClearBufferfv(p0: number, p1: number, p2: number): void; - glClearBufferfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glClearBufferfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glClearBufferfi(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttribI1i(p0: number, p1: number): void; - glVertexAttribI2i(p0: number, p1: number, p2: number): void; - glVertexAttribI3i(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttribI4i(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexAttribI1ui(p0: number, p1: number): void; - glVertexAttribI2ui(p0: number, p1: number, p2: number): void; - glVertexAttribI3ui(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttribI4ui(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglVertexAttribI1iv(p0: number, p1: number): void; - glVertexAttribI1iv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttribI1iv(p0: number, p1: Array): void; - nglVertexAttribI2iv(p0: number, p1: number): void; - glVertexAttribI2iv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttribI2iv(p0: number, p1: Array): void; - nglVertexAttribI3iv(p0: number, p1: number): void; - glVertexAttribI3iv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttribI3iv(p0: number, p1: Array): void; - nglVertexAttribI4iv(p0: number, p1: number): void; - glVertexAttribI4iv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttribI4iv(p0: number, p1: Array): void; - nglVertexAttribI1uiv(p0: number, p1: number): void; - glVertexAttribI1uiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttribI1uiv(p0: number, p1: Array): void; - nglVertexAttribI2uiv(p0: number, p1: number): void; - glVertexAttribI2uiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttribI2uiv(p0: number, p1: Array): void; - nglVertexAttribI3uiv(p0: number, p1: number): void; - glVertexAttribI3uiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttribI3uiv(p0: number, p1: Array): void; - nglVertexAttribI4uiv(p0: number, p1: number): void; - glVertexAttribI4uiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexAttribI4uiv(p0: number, p1: Array): void; - nglVertexAttribI4bv(p0: number, p1: number): void; - glVertexAttribI4bv(p0: number, p1: java.nio.ByteBuffer): void; - nglVertexAttribI4sv(p0: number, p1: number): void; - glVertexAttribI4sv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttribI4sv(p0: number, p1: Array): void; - nglVertexAttribI4ubv(p0: number, p1: number): void; - glVertexAttribI4ubv(p0: number, p1: java.nio.ByteBuffer): void; - nglVertexAttribI4usv(p0: number, p1: number): void; - glVertexAttribI4usv(p0: number, p1: java.nio.ShortBuffer): void; - glVertexAttribI4usv(p0: number, p1: Array): void; - nglVertexAttribIPointer(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexAttribIPointer(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - glVertexAttribIPointer(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexAttribIPointer(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ShortBuffer): void; - glVertexAttribIPointer(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer): void; - nglGetVertexAttribIiv(p0: number, p1: number, p2: number): void; - glGetVertexAttribIiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetVertexAttribIiv(p0: number, p1: number, p2: Array): void; - glGetVertexAttribIi(p0: number, p1: number): number; - nglGetVertexAttribIuiv(p0: number, p1: number, p2: number): void; - glGetVertexAttribIuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetVertexAttribIuiv(p0: number, p1: number, p2: Array): void; - glGetVertexAttribIui(p0: number, p1: number): number; - glUniform1ui(p0: number, p1: number): void; - glUniform2ui(p0: number, p1: number, p2: number): void; - glUniform3ui(p0: number, p1: number, p2: number, p3: number): void; - glUniform4ui(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglUniform1uiv(p0: number, p1: number, p2: number): void; - glUniform1uiv(p0: number, p1: java.nio.IntBuffer): void; - glUniform1uiv(p0: number, p1: Array): void; - nglUniform2uiv(p0: number, p1: number, p2: number): void; - glUniform2uiv(p0: number, p1: java.nio.IntBuffer): void; - glUniform2uiv(p0: number, p1: Array): void; - nglUniform3uiv(p0: number, p1: number, p2: number): void; - glUniform3uiv(p0: number, p1: java.nio.IntBuffer): void; - glUniform3uiv(p0: number, p1: Array): void; - nglUniform4uiv(p0: number, p1: number, p2: number): void; - glUniform4uiv(p0: number, p1: java.nio.IntBuffer): void; - glUniform4uiv(p0: number, p1: Array): void; - nglGetUniformuiv(p0: number, p1: number, p2: number): void; - glGetUniformuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetUniformuiv(p0: number, p1: number, p2: Array): void; - glGetUniformui(p0: number, p1: number): number; - nglBindFragDataLocation(p0: number, p1: number, p2: number): void; - glBindFragDataLocation(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glBindFragDataLocation(p0: number, p1: number, p2: kotlin.CharSequence): void; - nglGetFragDataLocation(p0: number, p1: number): number; - glGetFragDataLocation(p0: number, p1: java.nio.ByteBuffer): number; - glGetFragDataLocation(p0: number, p1: kotlin.CharSequence): number; - glBeginConditionalRender(p0: number, p1: number): void; - glEndConditionalRender(): void; - nglMapBufferRange(p0: number, p1: number, p2: number, p3: number): number; - glMapBufferRange(p0: number, p1: number, p2: number, p3: number): java.nio.ByteBuffer | null | undefined; - glMapBufferRange(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer | null | undefined): java.nio.ByteBuffer | null | undefined; - glFlushMappedBufferRange(p0: number, p1: number, p2: number): void; - glClampColor(p0: number, p1: number): void; - glIsRenderbuffer(p0: number): boolean; - glBindRenderbuffer(p0: number, p1: number): void; - nglDeleteRenderbuffers(p0: number, p1: number): void; - glDeleteRenderbuffers(p0: java.nio.IntBuffer): void; - glDeleteRenderbuffers(p0: number): void; - glDeleteRenderbuffers(p0: Array): void; - nglGenRenderbuffers(p0: number, p1: number): void; - glGenRenderbuffers(p0: java.nio.IntBuffer): void; - glGenRenderbuffers(): number; - glGenRenderbuffers(p0: Array): void; - glRenderbufferStorage(p0: number, p1: number, p2: number, p3: number): void; - glRenderbufferStorageMultisample(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglGetRenderbufferParameteriv(p0: number, p1: number, p2: number): void; - glGetRenderbufferParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetRenderbufferParameteriv(p0: number, p1: number, p2: Array): void; - glGetRenderbufferParameteri(p0: number, p1: number): number; - glIsFramebuffer(p0: number): boolean; - glBindFramebuffer(p0: number, p1: number): void; - nglDeleteFramebuffers(p0: number, p1: number): void; - glDeleteFramebuffers(p0: java.nio.IntBuffer): void; - glDeleteFramebuffers(p0: number): void; - glDeleteFramebuffers(p0: Array): void; - nglGenFramebuffers(p0: number, p1: number): void; - glGenFramebuffers(p0: java.nio.IntBuffer): void; - glGenFramebuffers(): number; - glGenFramebuffers(p0: Array): void; - glCheckFramebufferStatus(p0: number): number; - glFramebufferTexture1D(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glFramebufferTexture2D(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glFramebufferTexture3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glFramebufferTextureLayer(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glFramebufferRenderbuffer(p0: number, p1: number, p2: number, p3: number): void; - nglGetFramebufferAttachmentParameteriv(p0: number, p1: number, p2: number, p3: number): void; - glGetFramebufferAttachmentParameteriv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetFramebufferAttachmentParameteriv(p0: number, p1: number, p2: number, p3: Array): void; - glGetFramebufferAttachmentParameteri(p0: number, p1: number, p2: number): number; - glBlitFramebuffer(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): void; - glGenerateMipmap(p0: number): void; - nglTexParameterIiv(p0: number, p1: number, p2: number): void; - glTexParameterIiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glTexParameterIiv(p0: number, p1: number, p2: Array): void; - glTexParameterIi(p0: number, p1: number, p2: number): void; - nglTexParameterIuiv(p0: number, p1: number, p2: number): void; - glTexParameterIuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glTexParameterIuiv(p0: number, p1: number, p2: Array): void; - glTexParameterIui(p0: number, p1: number, p2: number): void; - nglGetTexParameterIiv(p0: number, p1: number, p2: number): void; - glGetTexParameterIiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTexParameterIiv(p0: number, p1: number, p2: Array): void; - glGetTexParameterIi(p0: number, p1: number): number; - nglGetTexParameterIuiv(p0: number, p1: number, p2: number): void; - glGetTexParameterIuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTexParameterIuiv(p0: number, p1: number, p2: Array): void; - glGetTexParameterIui(p0: number, p1: number): number; - glColorMaski(p0: number, p1: boolean, p2: boolean, p3: boolean, p4: boolean): void; - nglGetBooleani_v(p0: number, p1: number, p2: number): void; - glGetBooleani_v(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glGetBooleani(p0: number, p1: number): boolean; - nglGetIntegeri_v(p0: number, p1: number, p2: number): void; - glGetIntegeri_v(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetIntegeri_v(p0: number, p1: number, p2: Array): void; - glGetIntegeri(p0: number, p1: number): number; - glEnablei(p0: number, p1: number): void; - glDisablei(p0: number, p1: number): void; - glIsEnabledi(p0: number, p1: number): boolean; - glBindBufferRange(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glBindBufferBase(p0: number, p1: number, p2: number): void; - glBeginTransformFeedback(p0: number): void; - glEndTransformFeedback(): void; - nglTransformFeedbackVaryings(p0: number, p1: number, p2: number, p3: number): void; - glTransformFeedbackVaryings(p0: number, p1: org.lwjgl.PointerBuffer, p2: number): void; - glTransformFeedbackVaryings(p0: number, p1: Array, p2: number): void; - glTransformFeedbackVaryings(p0: number, p1: kotlin.CharSequence, p2: number): void; - nglGetTransformFeedbackVarying(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glGetTransformFeedbackVarying(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: java.nio.IntBuffer, p4: java.nio.IntBuffer, p5: java.nio.ByteBuffer): void; - glGetTransformFeedbackVarying(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer, p4: java.nio.IntBuffer): string; - glGetTransformFeedbackVarying(p0: number, p1: number, p2: java.nio.IntBuffer, p3: java.nio.IntBuffer): string; - glGetTransformFeedbackVarying(p0: number, p1: number, p2: Array, p3: Array, p4: Array, p5: java.nio.ByteBuffer): void; - glBindVertexArray(p0: number): void; - nglDeleteVertexArrays(p0: number, p1: number): void; - glDeleteVertexArrays(p0: java.nio.IntBuffer): void; - glDeleteVertexArrays(p0: number): void; - glDeleteVertexArrays(p0: Array): void; - nglGenVertexArrays(p0: number, p1: number): void; - glGenVertexArrays(p0: java.nio.IntBuffer): void; - glGenVertexArrays(): number; - glGenVertexArrays(p0: Array): void; - glIsVertexArray(p0: number): boolean; - } - interface GL30 extends org.lwjgl.opengl.GL21 { - } - const GL31: { - GL_R8_SNORM: number; - GL_RG8_SNORM: number; - GL_RGB8_SNORM: number; - GL_RGBA8_SNORM: number; - GL_R16_SNORM: number; - GL_RG16_SNORM: number; - GL_RGB16_SNORM: number; - GL_RGBA16_SNORM: number; - GL_SIGNED_NORMALIZED: number; - GL_SAMPLER_BUFFER: number; - GL_INT_SAMPLER_2D_RECT: number; - GL_INT_SAMPLER_BUFFER: number; - GL_UNSIGNED_INT_SAMPLER_2D_RECT: number; - GL_UNSIGNED_INT_SAMPLER_BUFFER: number; - GL_COPY_READ_BUFFER: number; - GL_COPY_WRITE_BUFFER: number; - GL_PRIMITIVE_RESTART: number; - GL_PRIMITIVE_RESTART_INDEX: number; - GL_TEXTURE_BUFFER: number; - GL_MAX_TEXTURE_BUFFER_SIZE: number; - GL_TEXTURE_BINDING_BUFFER: number; - GL_TEXTURE_BUFFER_DATA_STORE_BINDING: number; - GL_TEXTURE_RECTANGLE: number; - GL_TEXTURE_BINDING_RECTANGLE: number; - GL_PROXY_TEXTURE_RECTANGLE: number; - GL_MAX_RECTANGLE_TEXTURE_SIZE: number; - GL_SAMPLER_2D_RECT: number; - GL_SAMPLER_2D_RECT_SHADOW: number; - GL_UNIFORM_BUFFER: number; - GL_UNIFORM_BUFFER_BINDING: number; - GL_UNIFORM_BUFFER_START: number; - GL_UNIFORM_BUFFER_SIZE: number; - GL_MAX_VERTEX_UNIFORM_BLOCKS: number; - GL_MAX_GEOMETRY_UNIFORM_BLOCKS: number; - GL_MAX_FRAGMENT_UNIFORM_BLOCKS: number; - GL_MAX_COMBINED_UNIFORM_BLOCKS: number; - GL_MAX_UNIFORM_BUFFER_BINDINGS: number; - GL_MAX_UNIFORM_BLOCK_SIZE: number; - GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: number; - GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS: number; - GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: number; - GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: number; - GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: number; - GL_ACTIVE_UNIFORM_BLOCKS: number; - GL_UNIFORM_TYPE: number; - GL_UNIFORM_SIZE: number; - GL_UNIFORM_NAME_LENGTH: number; - GL_UNIFORM_BLOCK_INDEX: number; - GL_UNIFORM_OFFSET: number; - GL_UNIFORM_ARRAY_STRIDE: number; - GL_UNIFORM_MATRIX_STRIDE: number; - GL_UNIFORM_IS_ROW_MAJOR: number; - GL_UNIFORM_BLOCK_BINDING: number; - GL_UNIFORM_BLOCK_DATA_SIZE: number; - GL_UNIFORM_BLOCK_NAME_LENGTH: number; - GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS: number; - GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: number; - GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: number; - GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER: number; - GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: number; - GL_INVALID_INDEX: number; - glDrawArraysInstanced(p0: number, p1: number, p2: number, p3: number): void; - nglDrawElementsInstanced(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glDrawElementsInstanced(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glDrawElementsInstanced(p0: number, p1: number, p2: java.nio.ByteBuffer, p3: number): void; - glDrawElementsInstanced(p0: number, p1: java.nio.ByteBuffer, p2: number): void; - glDrawElementsInstanced(p0: number, p1: java.nio.ShortBuffer, p2: number): void; - glDrawElementsInstanced(p0: number, p1: java.nio.IntBuffer, p2: number): void; - glCopyBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glPrimitiveRestartIndex(p0: number): void; - glTexBuffer(p0: number, p1: number, p2: number): void; - nglGetUniformIndices(p0: number, p1: number, p2: number, p3: number): void; - glGetUniformIndices(p0: number, p1: org.lwjgl.PointerBuffer, p2: java.nio.IntBuffer): void; - glGetUniformIndices(p0: number, p1: Array, p2: java.nio.IntBuffer): void; - glGetUniformIndices(p0: number, p1: kotlin.CharSequence): number; - glGetUniformIndices(p0: number, p1: org.lwjgl.PointerBuffer, p2: Array): void; - nglGetActiveUniformsiv(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetActiveUniformsiv(p0: number, p1: java.nio.IntBuffer, p2: number, p3: java.nio.IntBuffer): void; - glGetActiveUniformsiv(p0: number, p1: Array, p2: number, p3: Array): void; - glGetActiveUniformsi(p0: number, p1: number, p2: number): number; - nglGetActiveUniformName(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetActiveUniformName(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: java.nio.ByteBuffer): void; - glGetActiveUniformName(p0: number, p1: number, p2: number): string; - glGetActiveUniformName(p0: number, p1: number): string; - glGetActiveUniformName(p0: number, p1: number, p2: Array, p3: java.nio.ByteBuffer): void; - nglGetUniformBlockIndex(p0: number, p1: number): number; - glGetUniformBlockIndex(p0: number, p1: java.nio.ByteBuffer): number; - glGetUniformBlockIndex(p0: number, p1: kotlin.CharSequence): number; - nglGetActiveUniformBlockiv(p0: number, p1: number, p2: number, p3: number): void; - glGetActiveUniformBlockiv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetActiveUniformBlockiv(p0: number, p1: number, p2: number, p3: Array): void; - glGetActiveUniformBlocki(p0: number, p1: number, p2: number): number; - nglGetActiveUniformBlockName(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetActiveUniformBlockName(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: java.nio.ByteBuffer): void; - glGetActiveUniformBlockName(p0: number, p1: number, p2: number): string; - glGetActiveUniformBlockName(p0: number, p1: number): string; - glGetActiveUniformBlockName(p0: number, p1: number, p2: Array, p3: java.nio.ByteBuffer): void; - glUniformBlockBinding(p0: number, p1: number, p2: number): void; - } - interface GL31 extends org.lwjgl.opengl.GL30 { - } - const GL32: { - GL_CONTEXT_PROFILE_MASK: number; - GL_CONTEXT_CORE_PROFILE_BIT: number; - GL_CONTEXT_COMPATIBILITY_PROFILE_BIT: number; - GL_MAX_VERTEX_OUTPUT_COMPONENTS: number; - GL_MAX_GEOMETRY_INPUT_COMPONENTS: number; - GL_MAX_GEOMETRY_OUTPUT_COMPONENTS: number; - GL_MAX_FRAGMENT_INPUT_COMPONENTS: number; - GL_FIRST_VERTEX_CONVENTION: number; - GL_LAST_VERTEX_CONVENTION: number; - GL_PROVOKING_VERTEX: number; - GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: number; - GL_TEXTURE_CUBE_MAP_SEAMLESS: number; - GL_SAMPLE_POSITION: number; - GL_SAMPLE_MASK: number; - GL_SAMPLE_MASK_VALUE: number; - GL_TEXTURE_2D_MULTISAMPLE: number; - GL_PROXY_TEXTURE_2D_MULTISAMPLE: number; - GL_TEXTURE_2D_MULTISAMPLE_ARRAY: number; - GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY: number; - GL_MAX_SAMPLE_MASK_WORDS: number; - GL_MAX_COLOR_TEXTURE_SAMPLES: number; - GL_MAX_DEPTH_TEXTURE_SAMPLES: number; - GL_MAX_INTEGER_SAMPLES: number; - GL_TEXTURE_BINDING_2D_MULTISAMPLE: number; - GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY: number; - GL_TEXTURE_SAMPLES: number; - GL_TEXTURE_FIXED_SAMPLE_LOCATIONS: number; - GL_SAMPLER_2D_MULTISAMPLE: number; - GL_INT_SAMPLER_2D_MULTISAMPLE: number; - GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: number; - GL_SAMPLER_2D_MULTISAMPLE_ARRAY: number; - GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: number; - GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: number; - GL_DEPTH_CLAMP: number; - GL_GEOMETRY_SHADER: number; - GL_GEOMETRY_VERTICES_OUT: number; - GL_GEOMETRY_INPUT_TYPE: number; - GL_GEOMETRY_OUTPUT_TYPE: number; - GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS: number; - GL_MAX_GEOMETRY_UNIFORM_COMPONENTS: number; - GL_MAX_GEOMETRY_OUTPUT_VERTICES: number; - GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: number; - GL_LINES_ADJACENCY: number; - GL_LINE_STRIP_ADJACENCY: number; - GL_TRIANGLES_ADJACENCY: number; - GL_TRIANGLE_STRIP_ADJACENCY: number; - GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: number; - GL_FRAMEBUFFER_ATTACHMENT_LAYERED: number; - GL_PROGRAM_POINT_SIZE: number; - GL_MAX_SERVER_WAIT_TIMEOUT: number; - GL_OBJECT_TYPE: number; - GL_SYNC_CONDITION: number; - GL_SYNC_STATUS: number; - GL_SYNC_FLAGS: number; - GL_SYNC_FENCE: number; - GL_SYNC_GPU_COMMANDS_COMPLETE: number; - GL_UNSIGNALED: number; - GL_SIGNALED: number; - GL_SYNC_FLUSH_COMMANDS_BIT: number; - GL_TIMEOUT_IGNORED: number; - GL_ALREADY_SIGNALED: number; - GL_TIMEOUT_EXPIRED: number; - GL_CONDITION_SATISFIED: number; - GL_WAIT_FAILED: number; - nglGetBufferParameteri64v(p0: number, p1: number, p2: number): void; - glGetBufferParameteri64v(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glGetBufferParameteri64v(p0: number, p1: number, p2: Array): void; - glGetBufferParameteri64(p0: number, p1: number): number; - nglDrawElementsBaseVertex(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glDrawElementsBaseVertex(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glDrawElementsBaseVertex(p0: number, p1: number, p2: java.nio.ByteBuffer, p3: number): void; - glDrawElementsBaseVertex(p0: number, p1: java.nio.ByteBuffer, p2: number): void; - glDrawElementsBaseVertex(p0: number, p1: java.nio.ShortBuffer, p2: number): void; - glDrawElementsBaseVertex(p0: number, p1: java.nio.IntBuffer, p2: number): void; - nglDrawRangeElementsBaseVertex(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glDrawRangeElementsBaseVertex(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glDrawRangeElementsBaseVertex(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer, p5: number): void; - glDrawRangeElementsBaseVertex(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer, p4: number): void; - glDrawRangeElementsBaseVertex(p0: number, p1: number, p2: number, p3: java.nio.ShortBuffer, p4: number): void; - glDrawRangeElementsBaseVertex(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer, p4: number): void; - nglDrawElementsInstancedBaseVertex(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glDrawElementsInstancedBaseVertex(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glDrawElementsInstancedBaseVertex(p0: number, p1: number, p2: java.nio.ByteBuffer, p3: number, p4: number): void; - glDrawElementsInstancedBaseVertex(p0: number, p1: java.nio.ByteBuffer, p2: number, p3: number): void; - glDrawElementsInstancedBaseVertex(p0: number, p1: java.nio.ShortBuffer, p2: number, p3: number): void; - glDrawElementsInstancedBaseVertex(p0: number, p1: java.nio.IntBuffer, p2: number, p3: number): void; - nglMultiDrawElementsBaseVertex(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glMultiDrawElementsBaseVertex(p0: number, p1: java.nio.IntBuffer, p2: number, p3: org.lwjgl.PointerBuffer, p4: java.nio.IntBuffer): void; - glMultiDrawElementsBaseVertex(p0: number, p1: Array, p2: number, p3: org.lwjgl.PointerBuffer, p4: Array): void; - glProvokingVertex(p0: number): void; - glTexImage2DMultisample(p0: number, p1: number, p2: number, p3: number, p4: number, p5: boolean): void; - glTexImage3DMultisample(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: boolean): void; - nglGetMultisamplefv(p0: number, p1: number, p2: number): void; - glGetMultisamplefv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetMultisamplefv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetMultisamplef(p0: number, p1: number): number; - glSampleMaski(p0: number, p1: number): void; - glFramebufferTexture(p0: number, p1: number, p2: number, p3: number): void; - glFenceSync(p0: number, p1: number): number; - nglIsSync(p0: number): boolean; - glIsSync(p0: number): boolean; - glDeleteSync(p0: number): void; - nglClientWaitSync(p0: number, p1: number, p2: number): number; - glClientWaitSync(p0: number, p1: number, p2: number): number; - nglWaitSync(p0: number, p1: number, p2: number): void; - glWaitSync(p0: number, p1: number, p2: number): void; - nglGetInteger64v(p0: number, p1: number): void; - glGetInteger64v(p0: number, p1: java.nio.LongBuffer): void; - glGetInteger64v(p0: number, p1: Array): void; - glGetInteger64(p0: number): number; - nglGetInteger64i_v(p0: number, p1: number, p2: number): void; - glGetInteger64i_v(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glGetInteger64i_v(p0: number, p1: number, p2: Array): void; - glGetInteger64i(p0: number, p1: number): number; - nglGetSynciv(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetSynciv(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: java.nio.IntBuffer): void; - glGetSynciv(p0: number, p1: number, p2: Array, p3: Array): void; - glGetSynci(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined): number; - } - interface GL32 extends org.lwjgl.opengl.GL31 { - } - const GL33: { - GL_SRC1_COLOR: number; - GL_ONE_MINUS_SRC1_COLOR: number; - GL_ONE_MINUS_SRC1_ALPHA: number; - GL_MAX_DUAL_SOURCE_DRAW_BUFFERS: number; - GL_ANY_SAMPLES_PASSED: number; - GL_SAMPLER_BINDING: number; - GL_RGB10_A2UI: number; - GL_TEXTURE_SWIZZLE_R: number; - GL_TEXTURE_SWIZZLE_G: number; - GL_TEXTURE_SWIZZLE_B: number; - GL_TEXTURE_SWIZZLE_A: number; - GL_TEXTURE_SWIZZLE_RGBA: number; - GL_TIME_ELAPSED: number; - GL_TIMESTAMP: number; - GL_VERTEX_ATTRIB_ARRAY_DIVISOR: number; - GL_INT_2_10_10_10_REV: number; - nglBindFragDataLocationIndexed(p0: number, p1: number, p2: number, p3: number): void; - glBindFragDataLocationIndexed(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer): void; - glBindFragDataLocationIndexed(p0: number, p1: number, p2: number, p3: kotlin.CharSequence): void; - nglGetFragDataIndex(p0: number, p1: number): number; - glGetFragDataIndex(p0: number, p1: java.nio.ByteBuffer): number; - glGetFragDataIndex(p0: number, p1: kotlin.CharSequence): number; - nglGenSamplers(p0: number, p1: number): void; - glGenSamplers(p0: java.nio.IntBuffer): void; - glGenSamplers(): number; - glGenSamplers(p0: Array): void; - nglDeleteSamplers(p0: number, p1: number): void; - glDeleteSamplers(p0: java.nio.IntBuffer): void; - glDeleteSamplers(p0: number): void; - glDeleteSamplers(p0: Array): void; - glIsSampler(p0: number): boolean; - glBindSampler(p0: number, p1: number): void; - glSamplerParameteri(p0: number, p1: number, p2: number): void; - glSamplerParameterf(p0: number, p1: number, p2: number): void; - nglSamplerParameteriv(p0: number, p1: number, p2: number): void; - glSamplerParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glSamplerParameteriv(p0: number, p1: number, p2: Array): void; - nglSamplerParameterfv(p0: number, p1: number, p2: number): void; - glSamplerParameterfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glSamplerParameterfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - nglSamplerParameterIiv(p0: number, p1: number, p2: number): void; - glSamplerParameterIiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glSamplerParameterIiv(p0: number, p1: number, p2: Array): void; - nglSamplerParameterIuiv(p0: number, p1: number, p2: number): void; - glSamplerParameterIuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glSamplerParameterIuiv(p0: number, p1: number, p2: Array): void; - nglGetSamplerParameteriv(p0: number, p1: number, p2: number): void; - glGetSamplerParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetSamplerParameteriv(p0: number, p1: number, p2: Array): void; - glGetSamplerParameteri(p0: number, p1: number): number; - nglGetSamplerParameterfv(p0: number, p1: number, p2: number): void; - glGetSamplerParameterfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetSamplerParameterfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetSamplerParameterf(p0: number, p1: number): number; - nglGetSamplerParameterIiv(p0: number, p1: number, p2: number): void; - glGetSamplerParameterIiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetSamplerParameterIiv(p0: number, p1: number, p2: Array): void; - glGetSamplerParameterIi(p0: number, p1: number): number; - nglGetSamplerParameterIuiv(p0: number, p1: number, p2: number): void; - glGetSamplerParameterIuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetSamplerParameterIuiv(p0: number, p1: number, p2: Array): void; - glGetSamplerParameterIui(p0: number, p1: number): number; - glQueryCounter(p0: number, p1: number): void; - nglGetQueryObjecti64v(p0: number, p1: number, p2: number): void; - glGetQueryObjecti64v(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glGetQueryObjecti64v(p0: number, p1: number, p2: number): void; - glGetQueryObjecti64v(p0: number, p1: number, p2: Array): void; - glGetQueryObjecti64(p0: number, p1: number): number; - nglGetQueryObjectui64v(p0: number, p1: number, p2: number): void; - glGetQueryObjectui64v(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glGetQueryObjectui64v(p0: number, p1: number, p2: number): void; - glGetQueryObjectui64v(p0: number, p1: number, p2: Array): void; - glGetQueryObjectui64(p0: number, p1: number): number; - glVertexAttribDivisor(p0: number, p1: number): void; - glVertexP2ui(p0: number, p1: number): void; - glVertexP3ui(p0: number, p1: number): void; - glVertexP4ui(p0: number, p1: number): void; - nglVertexP2uiv(p0: number, p1: number): void; - glVertexP2uiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexP2uiv(p0: number, p1: Array): void; - nglVertexP3uiv(p0: number, p1: number): void; - glVertexP3uiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexP3uiv(p0: number, p1: Array): void; - nglVertexP4uiv(p0: number, p1: number): void; - glVertexP4uiv(p0: number, p1: java.nio.IntBuffer): void; - glVertexP4uiv(p0: number, p1: Array): void; - glTexCoordP1ui(p0: number, p1: number): void; - glTexCoordP2ui(p0: number, p1: number): void; - glTexCoordP3ui(p0: number, p1: number): void; - glTexCoordP4ui(p0: number, p1: number): void; - nglTexCoordP1uiv(p0: number, p1: number): void; - glTexCoordP1uiv(p0: number, p1: java.nio.IntBuffer): void; - glTexCoordP1uiv(p0: number, p1: Array): void; - nglTexCoordP2uiv(p0: number, p1: number): void; - glTexCoordP2uiv(p0: number, p1: java.nio.IntBuffer): void; - glTexCoordP2uiv(p0: number, p1: Array): void; - nglTexCoordP3uiv(p0: number, p1: number): void; - glTexCoordP3uiv(p0: number, p1: java.nio.IntBuffer): void; - glTexCoordP3uiv(p0: number, p1: Array): void; - nglTexCoordP4uiv(p0: number, p1: number): void; - glTexCoordP4uiv(p0: number, p1: java.nio.IntBuffer): void; - glTexCoordP4uiv(p0: number, p1: Array): void; - glMultiTexCoordP1ui(p0: number, p1: number, p2: number): void; - glMultiTexCoordP2ui(p0: number, p1: number, p2: number): void; - glMultiTexCoordP3ui(p0: number, p1: number, p2: number): void; - glMultiTexCoordP4ui(p0: number, p1: number, p2: number): void; - nglMultiTexCoordP1uiv(p0: number, p1: number, p2: number): void; - glMultiTexCoordP1uiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glMultiTexCoordP1uiv(p0: number, p1: number, p2: Array): void; - nglMultiTexCoordP2uiv(p0: number, p1: number, p2: number): void; - glMultiTexCoordP2uiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glMultiTexCoordP2uiv(p0: number, p1: number, p2: Array): void; - nglMultiTexCoordP3uiv(p0: number, p1: number, p2: number): void; - glMultiTexCoordP3uiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glMultiTexCoordP3uiv(p0: number, p1: number, p2: Array): void; - nglMultiTexCoordP4uiv(p0: number, p1: number, p2: number): void; - glMultiTexCoordP4uiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glMultiTexCoordP4uiv(p0: number, p1: number, p2: Array): void; - glNormalP3ui(p0: number, p1: number): void; - nglNormalP3uiv(p0: number, p1: number): void; - glNormalP3uiv(p0: number, p1: java.nio.IntBuffer): void; - glNormalP3uiv(p0: number, p1: Array): void; - glColorP3ui(p0: number, p1: number): void; - glColorP4ui(p0: number, p1: number): void; - nglColorP3uiv(p0: number, p1: number): void; - glColorP3uiv(p0: number, p1: java.nio.IntBuffer): void; - glColorP3uiv(p0: number, p1: Array): void; - nglColorP4uiv(p0: number, p1: number): void; - glColorP4uiv(p0: number, p1: java.nio.IntBuffer): void; - glColorP4uiv(p0: number, p1: Array): void; - glSecondaryColorP3ui(p0: number, p1: number): void; - nglSecondaryColorP3uiv(p0: number, p1: number): void; - glSecondaryColorP3uiv(p0: number, p1: java.nio.IntBuffer): void; - glSecondaryColorP3uiv(p0: number, p1: Array): void; - glVertexAttribP1ui(p0: number, p1: number, p2: boolean, p3: number): void; - glVertexAttribP2ui(p0: number, p1: number, p2: boolean, p3: number): void; - glVertexAttribP3ui(p0: number, p1: number, p2: boolean, p3: number): void; - glVertexAttribP4ui(p0: number, p1: number, p2: boolean, p3: number): void; - nglVertexAttribP1uiv(p0: number, p1: number, p2: boolean, p3: number): void; - glVertexAttribP1uiv(p0: number, p1: number, p2: boolean, p3: java.nio.IntBuffer): void; - glVertexAttribP1uiv(p0: number, p1: number, p2: boolean, p3: Array): void; - nglVertexAttribP2uiv(p0: number, p1: number, p2: boolean, p3: number): void; - glVertexAttribP2uiv(p0: number, p1: number, p2: boolean, p3: java.nio.IntBuffer): void; - glVertexAttribP2uiv(p0: number, p1: number, p2: boolean, p3: Array): void; - nglVertexAttribP3uiv(p0: number, p1: number, p2: boolean, p3: number): void; - glVertexAttribP3uiv(p0: number, p1: number, p2: boolean, p3: java.nio.IntBuffer): void; - glVertexAttribP3uiv(p0: number, p1: number, p2: boolean, p3: Array): void; - nglVertexAttribP4uiv(p0: number, p1: number, p2: boolean, p3: number): void; - glVertexAttribP4uiv(p0: number, p1: number, p2: boolean, p3: java.nio.IntBuffer): void; - glVertexAttribP4uiv(p0: number, p1: number, p2: boolean, p3: Array): void; - } - interface GL33 extends org.lwjgl.opengl.GL32 { - } - const GL40: { - GL_DRAW_INDIRECT_BUFFER: number; - GL_DRAW_INDIRECT_BUFFER_BINDING: number; - GL_GEOMETRY_SHADER_INVOCATIONS: number; - GL_MAX_GEOMETRY_SHADER_INVOCATIONS: number; - GL_MIN_FRAGMENT_INTERPOLATION_OFFSET: number; - GL_MAX_FRAGMENT_INTERPOLATION_OFFSET: number; - GL_FRAGMENT_INTERPOLATION_OFFSET_BITS: number; - GL_DOUBLE_VEC2: number; - GL_DOUBLE_VEC3: number; - GL_DOUBLE_VEC4: number; - GL_DOUBLE_MAT2: number; - GL_DOUBLE_MAT3: number; - GL_DOUBLE_MAT4: number; - GL_DOUBLE_MAT2x3: number; - GL_DOUBLE_MAT2x4: number; - GL_DOUBLE_MAT3x2: number; - GL_DOUBLE_MAT3x4: number; - GL_DOUBLE_MAT4x2: number; - GL_DOUBLE_MAT4x3: number; - GL_SAMPLE_SHADING: number; - GL_MIN_SAMPLE_SHADING_VALUE: number; - GL_ACTIVE_SUBROUTINES: number; - GL_ACTIVE_SUBROUTINE_UNIFORMS: number; - GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS: number; - GL_ACTIVE_SUBROUTINE_MAX_LENGTH: number; - GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH: number; - GL_MAX_SUBROUTINES: number; - GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS: number; - GL_NUM_COMPATIBLE_SUBROUTINES: number; - GL_COMPATIBLE_SUBROUTINES: number; - GL_PATCHES: number; - GL_PATCH_VERTICES: number; - GL_PATCH_DEFAULT_INNER_LEVEL: number; - GL_PATCH_DEFAULT_OUTER_LEVEL: number; - GL_TESS_CONTROL_OUTPUT_VERTICES: number; - GL_TESS_GEN_MODE: number; - GL_TESS_GEN_SPACING: number; - GL_TESS_GEN_VERTEX_ORDER: number; - GL_TESS_GEN_POINT_MODE: number; - GL_ISOLINES: number; - GL_FRACTIONAL_ODD: number; - GL_FRACTIONAL_EVEN: number; - GL_MAX_PATCH_VERTICES: number; - GL_MAX_TESS_GEN_LEVEL: number; - GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS: number; - GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS: number; - GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS: number; - GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS: number; - GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS: number; - GL_MAX_TESS_PATCH_COMPONENTS: number; - GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS: number; - GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS: number; - GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS: number; - GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS: number; - GL_MAX_TESS_CONTROL_INPUT_COMPONENTS: number; - GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS: number; - GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS: number; - GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS: number; - GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER: number; - GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER: number; - GL_TESS_EVALUATION_SHADER: number; - GL_TESS_CONTROL_SHADER: number; - GL_TEXTURE_CUBE_MAP_ARRAY: number; - GL_TEXTURE_BINDING_CUBE_MAP_ARRAY: number; - GL_PROXY_TEXTURE_CUBE_MAP_ARRAY: number; - GL_SAMPLER_CUBE_MAP_ARRAY: number; - GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: number; - GL_INT_SAMPLER_CUBE_MAP_ARRAY: number; - GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: number; - GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET: number; - GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET: number; - GL_TRANSFORM_FEEDBACK: number; - GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED: number; - GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE: number; - GL_TRANSFORM_FEEDBACK_BINDING: number; - GL_MAX_TRANSFORM_FEEDBACK_BUFFERS: number; - GL_MAX_VERTEX_STREAMS: number; - glBlendEquationi(p0: number, p1: number): void; - glBlendEquationSeparatei(p0: number, p1: number, p2: number): void; - glBlendFunci(p0: number, p1: number, p2: number): void; - glBlendFuncSeparatei(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglDrawArraysIndirect(p0: number, p1: number): void; - glDrawArraysIndirect(p0: number, p1: java.nio.ByteBuffer): void; - glDrawArraysIndirect(p0: number, p1: number): void; - glDrawArraysIndirect(p0: number, p1: java.nio.IntBuffer): void; - glDrawArraysIndirect(p0: number, p1: Array): void; - nglDrawElementsIndirect(p0: number, p1: number, p2: number): void; - glDrawElementsIndirect(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glDrawElementsIndirect(p0: number, p1: number, p2: number): void; - glDrawElementsIndirect(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glDrawElementsIndirect(p0: number, p1: number, p2: Array): void; - glUniform1d(p0: number, p1: number): void; - glUniform2d(p0: number, p1: number, p2: number): void; - glUniform3d(p0: number, p1: number, p2: number, p3: number): void; - glUniform4d(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglUniform1dv(p0: number, p1: number, p2: number): void; - glUniform1dv(p0: number, p1: java.nio.DoubleBuffer): void; - glUniform1dv(p0: number, p1: kotlin.DoubleArray): void; - nglUniform2dv(p0: number, p1: number, p2: number): void; - glUniform2dv(p0: number, p1: java.nio.DoubleBuffer): void; - glUniform2dv(p0: number, p1: kotlin.DoubleArray): void; - nglUniform3dv(p0: number, p1: number, p2: number): void; - glUniform3dv(p0: number, p1: java.nio.DoubleBuffer): void; - glUniform3dv(p0: number, p1: kotlin.DoubleArray): void; - nglUniform4dv(p0: number, p1: number, p2: number): void; - glUniform4dv(p0: number, p1: java.nio.DoubleBuffer): void; - glUniform4dv(p0: number, p1: kotlin.DoubleArray): void; - nglUniformMatrix2dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix2dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix2dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglUniformMatrix3dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix3dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix3dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglUniformMatrix4dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix4dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix4dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglUniformMatrix2x3dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix2x3dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix2x3dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglUniformMatrix2x4dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix2x4dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix2x4dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglUniformMatrix3x2dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix3x2dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix3x2dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglUniformMatrix3x4dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix3x4dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix3x4dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglUniformMatrix4x2dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix4x2dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix4x2dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglUniformMatrix4x3dv(p0: number, p1: number, p2: boolean, p3: number): void; - glUniformMatrix4x3dv(p0: number, p1: boolean, p2: java.nio.DoubleBuffer): void; - glUniformMatrix4x3dv(p0: number, p1: boolean, p2: kotlin.DoubleArray): void; - nglGetUniformdv(p0: number, p1: number, p2: number): void; - glGetUniformdv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetUniformdv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - glGetUniformd(p0: number, p1: number): number; - glMinSampleShading(p0: number): void; - nglGetSubroutineUniformLocation(p0: number, p1: number, p2: number): number; - glGetSubroutineUniformLocation(p0: number, p1: number, p2: java.nio.ByteBuffer): number; - glGetSubroutineUniformLocation(p0: number, p1: number, p2: kotlin.CharSequence): number; - nglGetSubroutineIndex(p0: number, p1: number, p2: number): number; - glGetSubroutineIndex(p0: number, p1: number, p2: java.nio.ByteBuffer): number; - glGetSubroutineIndex(p0: number, p1: number, p2: kotlin.CharSequence): number; - nglGetActiveSubroutineUniformiv(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetActiveSubroutineUniformiv(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer): void; - glGetActiveSubroutineUniformiv(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glGetActiveSubroutineUniformi(p0: number, p1: number, p2: number, p3: number): number; - nglGetActiveSubroutineUniformName(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glGetActiveSubroutineUniformName(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer | null | undefined, p4: java.nio.ByteBuffer): void; - glGetActiveSubroutineUniformName(p0: number, p1: number, p2: number, p3: number): string; - glGetActiveSubroutineUniformName(p0: number, p1: number, p2: number): string; - glGetActiveSubroutineUniformName(p0: number, p1: number, p2: number, p3: Array, p4: java.nio.ByteBuffer): void; - nglGetActiveSubroutineName(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glGetActiveSubroutineName(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer | null | undefined, p4: java.nio.ByteBuffer): void; - glGetActiveSubroutineName(p0: number, p1: number, p2: number, p3: number): string; - glGetActiveSubroutineName(p0: number, p1: number, p2: number): string; - glGetActiveSubroutineName(p0: number, p1: number, p2: number, p3: Array, p4: java.nio.ByteBuffer): void; - nglUniformSubroutinesuiv(p0: number, p1: number, p2: number): void; - glUniformSubroutinesuiv(p0: number, p1: java.nio.IntBuffer): void; - glUniformSubroutinesuiv(p0: number, p1: Array): void; - glUniformSubroutinesui(p0: number, p1: number): void; - nglGetUniformSubroutineuiv(p0: number, p1: number, p2: number): void; - glGetUniformSubroutineuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetUniformSubroutineuiv(p0: number, p1: number, p2: Array): void; - glGetUniformSubroutineui(p0: number, p1: number): number; - nglGetProgramStageiv(p0: number, p1: number, p2: number, p3: number): void; - glGetProgramStageiv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetProgramStageiv(p0: number, p1: number, p2: number, p3: Array): void; - glGetProgramStagei(p0: number, p1: number, p2: number): number; - glPatchParameteri(p0: number, p1: number): void; - nglPatchParameterfv(p0: number, p1: number): void; - glPatchParameterfv(p0: number, p1: java.nio.FloatBuffer): void; - glPatchParameterfv(p0: number, p1: kotlin.FloatArray): void; - glBindTransformFeedback(p0: number, p1: number): void; - nglDeleteTransformFeedbacks(p0: number, p1: number): void; - glDeleteTransformFeedbacks(p0: java.nio.IntBuffer): void; - glDeleteTransformFeedbacks(p0: number): void; - glDeleteTransformFeedbacks(p0: Array): void; - nglGenTransformFeedbacks(p0: number, p1: number): void; - glGenTransformFeedbacks(p0: java.nio.IntBuffer): void; - glGenTransformFeedbacks(): number; - glGenTransformFeedbacks(p0: Array): void; - glIsTransformFeedback(p0: number): boolean; - glPauseTransformFeedback(): void; - glResumeTransformFeedback(): void; - glDrawTransformFeedback(p0: number, p1: number): void; - glDrawTransformFeedbackStream(p0: number, p1: number, p2: number): void; - glBeginQueryIndexed(p0: number, p1: number, p2: number): void; - glEndQueryIndexed(p0: number, p1: number): void; - nglGetQueryIndexediv(p0: number, p1: number, p2: number, p3: number): void; - glGetQueryIndexediv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetQueryIndexediv(p0: number, p1: number, p2: number, p3: Array): void; - glGetQueryIndexedi(p0: number, p1: number, p2: number): number; - } - interface GL40 extends org.lwjgl.opengl.GL33 { - } - const GL41: { - GL_SHADER_COMPILER: number; - GL_SHADER_BINARY_FORMATS: number; - GL_NUM_SHADER_BINARY_FORMATS: number; - GL_MAX_VERTEX_UNIFORM_VECTORS: number; - GL_MAX_VARYING_VECTORS: number; - GL_MAX_FRAGMENT_UNIFORM_VECTORS: number; - GL_IMPLEMENTATION_COLOR_READ_TYPE: number; - GL_IMPLEMENTATION_COLOR_READ_FORMAT: number; - GL_FIXED: number; - GL_LOW_FLOAT: number; - GL_MEDIUM_FLOAT: number; - GL_HIGH_FLOAT: number; - GL_LOW_INT: number; - GL_MEDIUM_INT: number; - GL_HIGH_INT: number; - GL_RGB565: number; - GL_PROGRAM_BINARY_RETRIEVABLE_HINT: number; - GL_PROGRAM_BINARY_LENGTH: number; - GL_NUM_PROGRAM_BINARY_FORMATS: number; - GL_PROGRAM_BINARY_FORMATS: number; - GL_VERTEX_SHADER_BIT: number; - GL_FRAGMENT_SHADER_BIT: number; - GL_GEOMETRY_SHADER_BIT: number; - GL_TESS_CONTROL_SHADER_BIT: number; - GL_TESS_EVALUATION_SHADER_BIT: number; - GL_ALL_SHADER_BITS: number; - GL_PROGRAM_SEPARABLE: number; - GL_ACTIVE_PROGRAM: number; - GL_PROGRAM_PIPELINE_BINDING: number; - GL_MAX_VIEWPORTS: number; - GL_VIEWPORT_SUBPIXEL_BITS: number; - GL_VIEWPORT_BOUNDS_RANGE: number; - GL_LAYER_PROVOKING_VERTEX: number; - GL_VIEWPORT_INDEX_PROVOKING_VERTEX: number; - GL_UNDEFINED_VERTEX: number; - glReleaseShaderCompiler(): void; - nglShaderBinary(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glShaderBinary(p0: java.nio.IntBuffer, p1: number, p2: java.nio.ByteBuffer): void; - glShaderBinary(p0: Array, p1: number, p2: java.nio.ByteBuffer): void; - nglGetShaderPrecisionFormat(p0: number, p1: number, p2: number, p3: number): void; - glGetShaderPrecisionFormat(p0: number, p1: number, p2: java.nio.IntBuffer, p3: java.nio.IntBuffer): void; - glGetShaderPrecisionFormat(p0: number, p1: number, p2: java.nio.IntBuffer): number; - glGetShaderPrecisionFormat(p0: number, p1: number, p2: Array, p3: Array): void; - glDepthRangef(p0: number, p1: number): void; - glClearDepthf(p0: number): void; - nglGetProgramBinary(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetProgramBinary(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: java.nio.IntBuffer, p3: java.nio.ByteBuffer): void; - glGetProgramBinary(p0: number, p1: Array, p2: Array, p3: java.nio.ByteBuffer): void; - nglProgramBinary(p0: number, p1: number, p2: number, p3: number): void; - glProgramBinary(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glProgramParameteri(p0: number, p1: number, p2: number): void; - glUseProgramStages(p0: number, p1: number, p2: number): void; - glActiveShaderProgram(p0: number, p1: number): void; - nglCreateShaderProgramv(p0: number, p1: number, p2: number): number; - glCreateShaderProgramv(p0: number, p1: org.lwjgl.PointerBuffer): number; - glCreateShaderProgramv(p0: number, p1: kotlin.CharSequence): number; - glCreateShaderProgramv(p0: number, p1: kotlin.CharSequence): number; - glBindProgramPipeline(p0: number): void; - nglDeleteProgramPipelines(p0: number, p1: number): void; - glDeleteProgramPipelines(p0: java.nio.IntBuffer): void; - glDeleteProgramPipelines(p0: number): void; - glDeleteProgramPipelines(p0: Array): void; - nglGenProgramPipelines(p0: number, p1: number): void; - glGenProgramPipelines(p0: java.nio.IntBuffer): void; - glGenProgramPipelines(): number; - glGenProgramPipelines(p0: Array): void; - glIsProgramPipeline(p0: number): boolean; - nglGetProgramPipelineiv(p0: number, p1: number, p2: number): void; - glGetProgramPipelineiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetProgramPipelineiv(p0: number, p1: number, p2: Array): void; - glGetProgramPipelinei(p0: number, p1: number): number; - glProgramUniform1i(p0: number, p1: number, p2: number): void; - glProgramUniform2i(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform3i(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glProgramUniform4i(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glProgramUniform1ui(p0: number, p1: number, p2: number): void; - glProgramUniform2ui(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform3ui(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glProgramUniform4ui(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glProgramUniform1f(p0: number, p1: number, p2: number): void; - glProgramUniform2f(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform3f(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glProgramUniform4f(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glProgramUniform1d(p0: number, p1: number, p2: number): void; - glProgramUniform2d(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform3d(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glProgramUniform4d(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - nglProgramUniform1iv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform1iv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glProgramUniform1iv(p0: number, p1: number, p2: Array): void; - nglProgramUniform2iv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform2iv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glProgramUniform2iv(p0: number, p1: number, p2: Array): void; - nglProgramUniform3iv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform3iv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glProgramUniform3iv(p0: number, p1: number, p2: Array): void; - nglProgramUniform4iv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform4iv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glProgramUniform4iv(p0: number, p1: number, p2: Array): void; - nglProgramUniform1uiv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform1uiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glProgramUniform1uiv(p0: number, p1: number, p2: Array): void; - nglProgramUniform2uiv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform2uiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glProgramUniform2uiv(p0: number, p1: number, p2: Array): void; - nglProgramUniform3uiv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform3uiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glProgramUniform3uiv(p0: number, p1: number, p2: Array): void; - nglProgramUniform4uiv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform4uiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glProgramUniform4uiv(p0: number, p1: number, p2: Array): void; - nglProgramUniform1fv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform1fv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glProgramUniform1fv(p0: number, p1: number, p2: kotlin.FloatArray): void; - nglProgramUniform2fv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform2fv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glProgramUniform2fv(p0: number, p1: number, p2: kotlin.FloatArray): void; - nglProgramUniform3fv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform3fv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glProgramUniform3fv(p0: number, p1: number, p2: kotlin.FloatArray): void; - nglProgramUniform4fv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform4fv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glProgramUniform4fv(p0: number, p1: number, p2: kotlin.FloatArray): void; - nglProgramUniform1dv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform1dv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glProgramUniform1dv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglProgramUniform2dv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform2dv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glProgramUniform2dv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglProgramUniform3dv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform3dv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glProgramUniform3dv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglProgramUniform4dv(p0: number, p1: number, p2: number, p3: number): void; - glProgramUniform4dv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glProgramUniform4dv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglProgramUniformMatrix2fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix2fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix2fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix3fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix3fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix3fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix4fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix4fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix4fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix2dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix2dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix2dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - nglProgramUniformMatrix3dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix3dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix3dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - nglProgramUniformMatrix4dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix4dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix4dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - nglProgramUniformMatrix2x3fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix2x3fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix2x3fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix3x2fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix3x2fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix3x2fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix2x4fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix2x4fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix2x4fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix4x2fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix4x2fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix4x2fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix3x4fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix3x4fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix3x4fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix4x3fv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix4x3fv(p0: number, p1: number, p2: boolean, p3: java.nio.FloatBuffer): void; - glProgramUniformMatrix4x3fv(p0: number, p1: number, p2: boolean, p3: kotlin.FloatArray): void; - nglProgramUniformMatrix2x3dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix2x3dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix2x3dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - nglProgramUniformMatrix3x2dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix3x2dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix3x2dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - nglProgramUniformMatrix2x4dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix2x4dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix2x4dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - nglProgramUniformMatrix4x2dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix4x2dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix4x2dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - nglProgramUniformMatrix3x4dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix3x4dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix3x4dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - nglProgramUniformMatrix4x3dv(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glProgramUniformMatrix4x3dv(p0: number, p1: number, p2: boolean, p3: java.nio.DoubleBuffer): void; - glProgramUniformMatrix4x3dv(p0: number, p1: number, p2: boolean, p3: kotlin.DoubleArray): void; - glValidateProgramPipeline(p0: number): void; - nglGetProgramPipelineInfoLog(p0: number, p1: number, p2: number, p3: number): void; - glGetProgramPipelineInfoLog(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: java.nio.ByteBuffer): void; - glGetProgramPipelineInfoLog(p0: number, p1: number): string; - glGetProgramPipelineInfoLog(p0: number): string; - glGetProgramPipelineInfoLog(p0: number, p1: Array, p2: java.nio.ByteBuffer): void; - glVertexAttribL1d(p0: number, p1: number): void; - glVertexAttribL2d(p0: number, p1: number, p2: number): void; - glVertexAttribL3d(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttribL4d(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglVertexAttribL1dv(p0: number, p1: number): void; - glVertexAttribL1dv(p0: number, p1: java.nio.DoubleBuffer): void; - glVertexAttribL1dv(p0: number, p1: kotlin.DoubleArray): void; - nglVertexAttribL2dv(p0: number, p1: number): void; - glVertexAttribL2dv(p0: number, p1: java.nio.DoubleBuffer): void; - glVertexAttribL2dv(p0: number, p1: kotlin.DoubleArray): void; - nglVertexAttribL3dv(p0: number, p1: number): void; - glVertexAttribL3dv(p0: number, p1: java.nio.DoubleBuffer): void; - glVertexAttribL3dv(p0: number, p1: kotlin.DoubleArray): void; - nglVertexAttribL4dv(p0: number, p1: number): void; - glVertexAttribL4dv(p0: number, p1: java.nio.DoubleBuffer): void; - glVertexAttribL4dv(p0: number, p1: kotlin.DoubleArray): void; - nglVertexAttribLPointer(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexAttribLPointer(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - glVertexAttribLPointer(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexAttribLPointer(p0: number, p1: number, p2: number, p3: java.nio.DoubleBuffer): void; - nglGetVertexAttribLdv(p0: number, p1: number, p2: number): void; - glGetVertexAttribLdv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetVertexAttribLdv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglViewportArrayv(p0: number, p1: number, p2: number): void; - glViewportArrayv(p0: number, p1: java.nio.FloatBuffer): void; - glViewportArrayv(p0: number, p1: kotlin.FloatArray): void; - glViewportIndexedf(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglViewportIndexedfv(p0: number, p1: number): void; - glViewportIndexedfv(p0: number, p1: java.nio.FloatBuffer): void; - glViewportIndexedfv(p0: number, p1: kotlin.FloatArray): void; - nglScissorArrayv(p0: number, p1: number, p2: number): void; - glScissorArrayv(p0: number, p1: java.nio.IntBuffer): void; - glScissorArrayv(p0: number, p1: Array): void; - glScissorIndexed(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglScissorIndexedv(p0: number, p1: number): void; - glScissorIndexedv(p0: number, p1: java.nio.IntBuffer): void; - glScissorIndexedv(p0: number, p1: Array): void; - nglDepthRangeArrayv(p0: number, p1: number, p2: number): void; - glDepthRangeArrayv(p0: number, p1: java.nio.DoubleBuffer): void; - glDepthRangeArrayv(p0: number, p1: kotlin.DoubleArray): void; - glDepthRangeIndexed(p0: number, p1: number, p2: number): void; - nglGetFloati_v(p0: number, p1: number, p2: number): void; - glGetFloati_v(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetFloati_v(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetFloati(p0: number, p1: number): number; - nglGetDoublei_v(p0: number, p1: number, p2: number): void; - glGetDoublei_v(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetDoublei_v(p0: number, p1: number, p2: kotlin.DoubleArray): void; - glGetDoublei(p0: number, p1: number): number; - } - interface GL41 extends org.lwjgl.opengl.GL40 { - } - const GL42: { - GL_COPY_READ_BUFFER_BINDING: number; - GL_COPY_WRITE_BUFFER_BINDING: number; - GL_TRANSFORM_FEEDBACK_ACTIVE: number; - GL_TRANSFORM_FEEDBACK_PAUSED: number; - GL_COMPRESSED_RGBA_BPTC_UNORM: number; - GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: number; - GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: number; - GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: number; - GL_UNPACK_COMPRESSED_BLOCK_WIDTH: number; - GL_UNPACK_COMPRESSED_BLOCK_HEIGHT: number; - GL_UNPACK_COMPRESSED_BLOCK_DEPTH: number; - GL_UNPACK_COMPRESSED_BLOCK_SIZE: number; - GL_PACK_COMPRESSED_BLOCK_WIDTH: number; - GL_PACK_COMPRESSED_BLOCK_HEIGHT: number; - GL_PACK_COMPRESSED_BLOCK_DEPTH: number; - GL_PACK_COMPRESSED_BLOCK_SIZE: number; - GL_ATOMIC_COUNTER_BUFFER: number; - GL_ATOMIC_COUNTER_BUFFER_BINDING: number; - GL_ATOMIC_COUNTER_BUFFER_START: number; - GL_ATOMIC_COUNTER_BUFFER_SIZE: number; - GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE: number; - GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS: number; - GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES: number; - GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER: number; - GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER: number; - GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER: number; - GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER: number; - GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER: number; - GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS: number; - GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS: number; - GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS: number; - GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS: number; - GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS: number; - GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS: number; - GL_MAX_VERTEX_ATOMIC_COUNTERS: number; - GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS: number; - GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS: number; - GL_MAX_GEOMETRY_ATOMIC_COUNTERS: number; - GL_MAX_FRAGMENT_ATOMIC_COUNTERS: number; - GL_MAX_COMBINED_ATOMIC_COUNTERS: number; - GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE: number; - GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS: number; - GL_ACTIVE_ATOMIC_COUNTER_BUFFERS: number; - GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX: number; - GL_UNSIGNED_INT_ATOMIC_COUNTER: number; - GL_TEXTURE_IMMUTABLE_FORMAT: number; - GL_MAX_IMAGE_UNITS: number; - GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS: number; - GL_MAX_IMAGE_SAMPLES: number; - GL_MAX_VERTEX_IMAGE_UNIFORMS: number; - GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS: number; - GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS: number; - GL_MAX_GEOMETRY_IMAGE_UNIFORMS: number; - GL_MAX_FRAGMENT_IMAGE_UNIFORMS: number; - GL_MAX_COMBINED_IMAGE_UNIFORMS: number; - GL_IMAGE_BINDING_NAME: number; - GL_IMAGE_BINDING_LEVEL: number; - GL_IMAGE_BINDING_LAYERED: number; - GL_IMAGE_BINDING_LAYER: number; - GL_IMAGE_BINDING_ACCESS: number; - GL_IMAGE_BINDING_FORMAT: number; - GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT: number; - GL_ELEMENT_ARRAY_BARRIER_BIT: number; - GL_UNIFORM_BARRIER_BIT: number; - GL_TEXTURE_FETCH_BARRIER_BIT: number; - GL_SHADER_IMAGE_ACCESS_BARRIER_BIT: number; - GL_COMMAND_BARRIER_BIT: number; - GL_PIXEL_BUFFER_BARRIER_BIT: number; - GL_TEXTURE_UPDATE_BARRIER_BIT: number; - GL_BUFFER_UPDATE_BARRIER_BIT: number; - GL_FRAMEBUFFER_BARRIER_BIT: number; - GL_TRANSFORM_FEEDBACK_BARRIER_BIT: number; - GL_ATOMIC_COUNTER_BARRIER_BIT: number; - GL_ALL_BARRIER_BITS: number; - GL_IMAGE_1D: number; - GL_IMAGE_2D: number; - GL_IMAGE_3D: number; - GL_IMAGE_2D_RECT: number; - GL_IMAGE_CUBE: number; - GL_IMAGE_BUFFER: number; - GL_IMAGE_1D_ARRAY: number; - GL_IMAGE_2D_ARRAY: number; - GL_IMAGE_CUBE_MAP_ARRAY: number; - GL_IMAGE_2D_MULTISAMPLE: number; - GL_IMAGE_2D_MULTISAMPLE_ARRAY: number; - GL_INT_IMAGE_1D: number; - GL_INT_IMAGE_2D: number; - GL_INT_IMAGE_3D: number; - GL_INT_IMAGE_2D_RECT: number; - GL_INT_IMAGE_CUBE: number; - GL_INT_IMAGE_BUFFER: number; - GL_INT_IMAGE_1D_ARRAY: number; - GL_INT_IMAGE_2D_ARRAY: number; - GL_INT_IMAGE_CUBE_MAP_ARRAY: number; - GL_INT_IMAGE_2D_MULTISAMPLE: number; - GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY: number; - GL_UNSIGNED_INT_IMAGE_1D: number; - GL_UNSIGNED_INT_IMAGE_2D: number; - GL_UNSIGNED_INT_IMAGE_3D: number; - GL_UNSIGNED_INT_IMAGE_2D_RECT: number; - GL_UNSIGNED_INT_IMAGE_CUBE: number; - GL_UNSIGNED_INT_IMAGE_BUFFER: number; - GL_UNSIGNED_INT_IMAGE_1D_ARRAY: number; - GL_UNSIGNED_INT_IMAGE_2D_ARRAY: number; - GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY: number; - GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE: number; - GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY: number; - GL_IMAGE_FORMAT_COMPATIBILITY_TYPE: number; - GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE: number; - GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS: number; - GL_NUM_SAMPLE_COUNTS: number; - GL_MIN_MAP_BUFFER_ALIGNMENT: number; - nglGetActiveAtomicCounterBufferiv(p0: number, p1: number, p2: number, p3: number): void; - glGetActiveAtomicCounterBufferiv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetActiveAtomicCounterBufferiv(p0: number, p1: number, p2: number, p3: Array): void; - glGetActiveAtomicCounterBufferi(p0: number, p1: number, p2: number): number; - glTexStorage1D(p0: number, p1: number, p2: number, p3: number): void; - glTexStorage2D(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glTexStorage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glDrawTransformFeedbackInstanced(p0: number, p1: number, p2: number): void; - glDrawTransformFeedbackStreamInstanced(p0: number, p1: number, p2: number, p3: number): void; - glDrawArraysInstancedBaseInstance(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglDrawElementsInstancedBaseInstance(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glDrawElementsInstancedBaseInstance(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glDrawElementsInstancedBaseInstance(p0: number, p1: number, p2: java.nio.ByteBuffer, p3: number, p4: number): void; - glDrawElementsInstancedBaseInstance(p0: number, p1: java.nio.ByteBuffer, p2: number, p3: number): void; - glDrawElementsInstancedBaseInstance(p0: number, p1: java.nio.ShortBuffer, p2: number, p3: number): void; - glDrawElementsInstancedBaseInstance(p0: number, p1: java.nio.IntBuffer, p2: number, p3: number): void; - nglDrawElementsInstancedBaseVertexBaseInstance(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glDrawElementsInstancedBaseVertexBaseInstance(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glDrawElementsInstancedBaseVertexBaseInstance(p0: number, p1: number, p2: java.nio.ByteBuffer, p3: number, p4: number, p5: number): void; - glDrawElementsInstancedBaseVertexBaseInstance(p0: number, p1: java.nio.ByteBuffer, p2: number, p3: number, p4: number): void; - glDrawElementsInstancedBaseVertexBaseInstance(p0: number, p1: java.nio.ShortBuffer, p2: number, p3: number, p4: number): void; - glDrawElementsInstancedBaseVertexBaseInstance(p0: number, p1: java.nio.IntBuffer, p2: number, p3: number, p4: number): void; - glBindImageTexture(p0: number, p1: number, p2: number, p3: boolean, p4: number, p5: number, p6: number): void; - glMemoryBarrier(p0: number): void; - nglGetInternalformativ(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetInternalformativ(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetInternalformativ(p0: number, p1: number, p2: number, p3: Array): void; - glGetInternalformati(p0: number, p1: number, p2: number): number; - } - interface GL42 extends org.lwjgl.opengl.GL41 { - } - const GL43: { - GL_NUM_SHADING_LANGUAGE_VERSIONS: number; - GL_VERTEX_ATTRIB_ARRAY_LONG: number; - GL_COMPRESSED_RGB8_ETC2: number; - GL_COMPRESSED_SRGB8_ETC2: number; - GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: number; - GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: number; - GL_COMPRESSED_RGBA8_ETC2_EAC: number; - GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: number; - GL_COMPRESSED_R11_EAC: number; - GL_COMPRESSED_SIGNED_R11_EAC: number; - GL_COMPRESSED_RG11_EAC: number; - GL_COMPRESSED_SIGNED_RG11_EAC: number; - GL_PRIMITIVE_RESTART_FIXED_INDEX: number; - GL_ANY_SAMPLES_PASSED_CONSERVATIVE: number; - GL_MAX_ELEMENT_INDEX: number; - GL_TEXTURE_IMMUTABLE_LEVELS: number; - GL_COMPUTE_SHADER: number; - GL_MAX_COMPUTE_UNIFORM_BLOCKS: number; - GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS: number; - GL_MAX_COMPUTE_IMAGE_UNIFORMS: number; - GL_MAX_COMPUTE_SHARED_MEMORY_SIZE: number; - GL_MAX_COMPUTE_UNIFORM_COMPONENTS: number; - GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS: number; - GL_MAX_COMPUTE_ATOMIC_COUNTERS: number; - GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS: number; - GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: number; - GL_MAX_COMPUTE_WORK_GROUP_COUNT: number; - GL_MAX_COMPUTE_WORK_GROUP_SIZE: number; - GL_COMPUTE_WORK_GROUP_SIZE: number; - GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER: number; - GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER: number; - GL_DISPATCH_INDIRECT_BUFFER: number; - GL_DISPATCH_INDIRECT_BUFFER_BINDING: number; - GL_COMPUTE_SHADER_BIT: number; - GL_DEBUG_OUTPUT: number; - GL_DEBUG_OUTPUT_SYNCHRONOUS: number; - GL_CONTEXT_FLAG_DEBUG_BIT: number; - GL_MAX_DEBUG_MESSAGE_LENGTH: number; - GL_MAX_DEBUG_LOGGED_MESSAGES: number; - GL_DEBUG_LOGGED_MESSAGES: number; - GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH: number; - GL_MAX_DEBUG_GROUP_STACK_DEPTH: number; - GL_DEBUG_GROUP_STACK_DEPTH: number; - GL_MAX_LABEL_LENGTH: number; - GL_DEBUG_CALLBACK_FUNCTION: number; - GL_DEBUG_CALLBACK_USER_PARAM: number; - GL_DEBUG_SOURCE_API: number; - GL_DEBUG_SOURCE_WINDOW_SYSTEM: number; - GL_DEBUG_SOURCE_SHADER_COMPILER: number; - GL_DEBUG_SOURCE_THIRD_PARTY: number; - GL_DEBUG_SOURCE_APPLICATION: number; - GL_DEBUG_SOURCE_OTHER: number; - GL_DEBUG_TYPE_ERROR: number; - GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: number; - GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: number; - GL_DEBUG_TYPE_PORTABILITY: number; - GL_DEBUG_TYPE_PERFORMANCE: number; - GL_DEBUG_TYPE_OTHER: number; - GL_DEBUG_TYPE_MARKER: number; - GL_DEBUG_TYPE_PUSH_GROUP: number; - GL_DEBUG_TYPE_POP_GROUP: number; - GL_DEBUG_SEVERITY_HIGH: number; - GL_DEBUG_SEVERITY_MEDIUM: number; - GL_DEBUG_SEVERITY_LOW: number; - GL_DEBUG_SEVERITY_NOTIFICATION: number; - GL_BUFFER: number; - GL_SHADER: number; - GL_PROGRAM: number; - GL_QUERY: number; - GL_PROGRAM_PIPELINE: number; - GL_SAMPLER: number; - GL_DISPLAY_LIST: number; - GL_MAX_UNIFORM_LOCATIONS: number; - GL_FRAMEBUFFER_DEFAULT_WIDTH: number; - GL_FRAMEBUFFER_DEFAULT_HEIGHT: number; - GL_FRAMEBUFFER_DEFAULT_LAYERS: number; - GL_FRAMEBUFFER_DEFAULT_SAMPLES: number; - GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS: number; - GL_MAX_FRAMEBUFFER_WIDTH: number; - GL_MAX_FRAMEBUFFER_HEIGHT: number; - GL_MAX_FRAMEBUFFER_LAYERS: number; - GL_MAX_FRAMEBUFFER_SAMPLES: number; - GL_INTERNALFORMAT_SUPPORTED: number; - GL_INTERNALFORMAT_PREFERRED: number; - GL_INTERNALFORMAT_RED_SIZE: number; - GL_INTERNALFORMAT_GREEN_SIZE: number; - GL_INTERNALFORMAT_BLUE_SIZE: number; - GL_INTERNALFORMAT_ALPHA_SIZE: number; - GL_INTERNALFORMAT_DEPTH_SIZE: number; - GL_INTERNALFORMAT_STENCIL_SIZE: number; - GL_INTERNALFORMAT_SHARED_SIZE: number; - GL_INTERNALFORMAT_RED_TYPE: number; - GL_INTERNALFORMAT_GREEN_TYPE: number; - GL_INTERNALFORMAT_BLUE_TYPE: number; - GL_INTERNALFORMAT_ALPHA_TYPE: number; - GL_INTERNALFORMAT_DEPTH_TYPE: number; - GL_INTERNALFORMAT_STENCIL_TYPE: number; - GL_MAX_WIDTH: number; - GL_MAX_HEIGHT: number; - GL_MAX_DEPTH: number; - GL_MAX_LAYERS: number; - GL_MAX_COMBINED_DIMENSIONS: number; - GL_COLOR_COMPONENTS: number; - GL_DEPTH_COMPONENTS: number; - GL_STENCIL_COMPONENTS: number; - GL_COLOR_RENDERABLE: number; - GL_DEPTH_RENDERABLE: number; - GL_STENCIL_RENDERABLE: number; - GL_FRAMEBUFFER_RENDERABLE: number; - GL_FRAMEBUFFER_RENDERABLE_LAYERED: number; - GL_FRAMEBUFFER_BLEND: number; - GL_READ_PIXELS: number; - GL_READ_PIXELS_FORMAT: number; - GL_READ_PIXELS_TYPE: number; - GL_TEXTURE_IMAGE_FORMAT: number; - GL_TEXTURE_IMAGE_TYPE: number; - GL_GET_TEXTURE_IMAGE_FORMAT: number; - GL_GET_TEXTURE_IMAGE_TYPE: number; - GL_MIPMAP: number; - GL_MANUAL_GENERATE_MIPMAP: number; - GL_AUTO_GENERATE_MIPMAP: number; - GL_COLOR_ENCODING: number; - GL_SRGB_READ: number; - GL_SRGB_WRITE: number; - GL_FILTER: number; - GL_VERTEX_TEXTURE: number; - GL_TESS_CONTROL_TEXTURE: number; - GL_TESS_EVALUATION_TEXTURE: number; - GL_GEOMETRY_TEXTURE: number; - GL_FRAGMENT_TEXTURE: number; - GL_COMPUTE_TEXTURE: number; - GL_TEXTURE_SHADOW: number; - GL_TEXTURE_GATHER: number; - GL_TEXTURE_GATHER_SHADOW: number; - GL_SHADER_IMAGE_LOAD: number; - GL_SHADER_IMAGE_STORE: number; - GL_SHADER_IMAGE_ATOMIC: number; - GL_IMAGE_TEXEL_SIZE: number; - GL_IMAGE_COMPATIBILITY_CLASS: number; - GL_IMAGE_PIXEL_FORMAT: number; - GL_IMAGE_PIXEL_TYPE: number; - GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST: number; - GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST: number; - GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE: number; - GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE: number; - GL_TEXTURE_COMPRESSED_BLOCK_WIDTH: number; - GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT: number; - GL_TEXTURE_COMPRESSED_BLOCK_SIZE: number; - GL_CLEAR_BUFFER: number; - GL_TEXTURE_VIEW: number; - GL_VIEW_COMPATIBILITY_CLASS: number; - GL_FULL_SUPPORT: number; - GL_CAVEAT_SUPPORT: number; - GL_IMAGE_CLASS_4_X_32: number; - GL_IMAGE_CLASS_2_X_32: number; - GL_IMAGE_CLASS_1_X_32: number; - GL_IMAGE_CLASS_4_X_16: number; - GL_IMAGE_CLASS_2_X_16: number; - GL_IMAGE_CLASS_1_X_16: number; - GL_IMAGE_CLASS_4_X_8: number; - GL_IMAGE_CLASS_2_X_8: number; - GL_IMAGE_CLASS_1_X_8: number; - GL_IMAGE_CLASS_11_11_10: number; - GL_IMAGE_CLASS_10_10_10_2: number; - GL_VIEW_CLASS_128_BITS: number; - GL_VIEW_CLASS_96_BITS: number; - GL_VIEW_CLASS_64_BITS: number; - GL_VIEW_CLASS_48_BITS: number; - GL_VIEW_CLASS_32_BITS: number; - GL_VIEW_CLASS_24_BITS: number; - GL_VIEW_CLASS_16_BITS: number; - GL_VIEW_CLASS_8_BITS: number; - GL_VIEW_CLASS_S3TC_DXT1_RGB: number; - GL_VIEW_CLASS_S3TC_DXT1_RGBA: number; - GL_VIEW_CLASS_S3TC_DXT3_RGBA: number; - GL_VIEW_CLASS_S3TC_DXT5_RGBA: number; - GL_VIEW_CLASS_RGTC1_RED: number; - GL_VIEW_CLASS_RGTC2_RG: number; - GL_VIEW_CLASS_BPTC_UNORM: number; - GL_VIEW_CLASS_BPTC_FLOAT: number; - GL_UNIFORM: number; - GL_UNIFORM_BLOCK: number; - GL_PROGRAM_INPUT: number; - GL_PROGRAM_OUTPUT: number; - GL_BUFFER_VARIABLE: number; - GL_SHADER_STORAGE_BLOCK: number; - GL_VERTEX_SUBROUTINE: number; - GL_TESS_CONTROL_SUBROUTINE: number; - GL_TESS_EVALUATION_SUBROUTINE: number; - GL_GEOMETRY_SUBROUTINE: number; - GL_FRAGMENT_SUBROUTINE: number; - GL_COMPUTE_SUBROUTINE: number; - GL_VERTEX_SUBROUTINE_UNIFORM: number; - GL_TESS_CONTROL_SUBROUTINE_UNIFORM: number; - GL_TESS_EVALUATION_SUBROUTINE_UNIFORM: number; - GL_GEOMETRY_SUBROUTINE_UNIFORM: number; - GL_FRAGMENT_SUBROUTINE_UNIFORM: number; - GL_COMPUTE_SUBROUTINE_UNIFORM: number; - GL_TRANSFORM_FEEDBACK_VARYING: number; - GL_ACTIVE_RESOURCES: number; - GL_MAX_NAME_LENGTH: number; - GL_MAX_NUM_ACTIVE_VARIABLES: number; - GL_MAX_NUM_COMPATIBLE_SUBROUTINES: number; - GL_NAME_LENGTH: number; - GL_TYPE: number; - GL_ARRAY_SIZE: number; - GL_OFFSET: number; - GL_BLOCK_INDEX: number; - GL_ARRAY_STRIDE: number; - GL_MATRIX_STRIDE: number; - GL_IS_ROW_MAJOR: number; - GL_ATOMIC_COUNTER_BUFFER_INDEX: number; - GL_BUFFER_BINDING: number; - GL_BUFFER_DATA_SIZE: number; - GL_NUM_ACTIVE_VARIABLES: number; - GL_ACTIVE_VARIABLES: number; - GL_REFERENCED_BY_VERTEX_SHADER: number; - GL_REFERENCED_BY_TESS_CONTROL_SHADER: number; - GL_REFERENCED_BY_TESS_EVALUATION_SHADER: number; - GL_REFERENCED_BY_GEOMETRY_SHADER: number; - GL_REFERENCED_BY_FRAGMENT_SHADER: number; - GL_REFERENCED_BY_COMPUTE_SHADER: number; - GL_TOP_LEVEL_ARRAY_SIZE: number; - GL_TOP_LEVEL_ARRAY_STRIDE: number; - GL_LOCATION: number; - GL_LOCATION_INDEX: number; - GL_IS_PER_PATCH: number; - GL_SHADER_STORAGE_BUFFER: number; - GL_SHADER_STORAGE_BUFFER_BINDING: number; - GL_SHADER_STORAGE_BUFFER_START: number; - GL_SHADER_STORAGE_BUFFER_SIZE: number; - GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS: number; - GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS: number; - GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS: number; - GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS: number; - GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS: number; - GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS: number; - GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS: number; - GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS: number; - GL_MAX_SHADER_STORAGE_BLOCK_SIZE: number; - GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT: number; - GL_SHADER_STORAGE_BARRIER_BIT: number; - GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES: number; - GL_DEPTH_STENCIL_TEXTURE_MODE: number; - GL_TEXTURE_BUFFER_OFFSET: number; - GL_TEXTURE_BUFFER_SIZE: number; - GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT: number; - GL_TEXTURE_VIEW_MIN_LEVEL: number; - GL_TEXTURE_VIEW_NUM_LEVELS: number; - GL_TEXTURE_VIEW_MIN_LAYER: number; - GL_TEXTURE_VIEW_NUM_LAYERS: number; - GL_VERTEX_ATTRIB_BINDING: number; - GL_VERTEX_ATTRIB_RELATIVE_OFFSET: number; - GL_VERTEX_BINDING_DIVISOR: number; - GL_VERTEX_BINDING_OFFSET: number; - GL_VERTEX_BINDING_STRIDE: number; - GL_VERTEX_BINDING_BUFFER: number; - GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET: number; - GL_MAX_VERTEX_ATTRIB_BINDINGS: number; - nglClearBufferData(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glClearBufferData(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer | null | undefined): void; - glClearBufferData(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ShortBuffer | null | undefined): void; - glClearBufferData(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer | null | undefined): void; - glClearBufferData(p0: number, p1: number, p2: number, p3: number, p4: java.nio.FloatBuffer | null | undefined): void; - glClearBufferData(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glClearBufferData(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glClearBufferData(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray | null | undefined): void; - nglClearBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glClearBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ByteBuffer | null | undefined): void; - glClearBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ShortBuffer | null | undefined): void; - glClearBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.IntBuffer | null | undefined): void; - glClearBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.FloatBuffer | null | undefined): void; - glClearBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glClearBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glClearBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.FloatArray | null | undefined): void; - glDispatchCompute(p0: number, p1: number, p2: number): void; - glDispatchComputeIndirect(p0: number): void; - glCopyImageSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number, p12: number, p13: number, p14: number): void; - nglDebugMessageControl(p0: number, p1: number, p2: number, p3: number, p4: number, p5: boolean): void; - glDebugMessageControl(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer | null | undefined, p4: boolean): void; - glDebugMessageControl(p0: number, p1: number, p2: number, p3: number, p4: boolean): void; - glDebugMessageControl(p0: number, p1: number, p2: number, p3: Array, p4: boolean): void; - nglDebugMessageInsert(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glDebugMessageInsert(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - glDebugMessageInsert(p0: number, p1: number, p2: number, p3: number, p4: kotlin.CharSequence): void; - nglDebugMessageCallback(p0: number, p1: number): void; - glDebugMessageCallback(p0: org.lwjgl.opengl.GLDebugMessageCallbackI | null | undefined, p1: number): void; - nglGetDebugMessageLog(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): number; - glGetDebugMessageLog(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: java.nio.IntBuffer | null | undefined, p3: java.nio.IntBuffer | null | undefined, p4: java.nio.IntBuffer | null | undefined, p5: java.nio.IntBuffer | null | undefined, p6: java.nio.ByteBuffer | null | undefined): number; - glGetDebugMessageLog(p0: number, p1: Array, p2: Array, p3: Array, p4: Array, p5: Array, p6: java.nio.ByteBuffer | null | undefined): number; - nglPushDebugGroup(p0: number, p1: number, p2: number, p3: number): void; - glPushDebugGroup(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glPushDebugGroup(p0: number, p1: number, p2: kotlin.CharSequence): void; - glPopDebugGroup(): void; - nglObjectLabel(p0: number, p1: number, p2: number, p3: number): void; - glObjectLabel(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glObjectLabel(p0: number, p1: number, p2: kotlin.CharSequence): void; - nglGetObjectLabel(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetObjectLabel(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: java.nio.ByteBuffer): void; - glGetObjectLabel(p0: number, p1: number, p2: number): string; - glGetObjectLabel(p0: number, p1: number): string; - glGetObjectLabel(p0: number, p1: number, p2: Array, p3: java.nio.ByteBuffer): void; - nglObjectPtrLabel(p0: number, p1: number, p2: number): void; - glObjectPtrLabel(p0: number, p1: java.nio.ByteBuffer): void; - glObjectPtrLabel(p0: number, p1: kotlin.CharSequence): void; - nglGetObjectPtrLabel(p0: number, p1: number, p2: number, p3: number): void; - glGetObjectPtrLabel(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: java.nio.ByteBuffer): void; - glGetObjectPtrLabel(p0: number, p1: number): string; - glGetObjectPtrLabel(p0: number): string; - glGetObjectPtrLabel(p0: number, p1: Array, p2: java.nio.ByteBuffer): void; - glFramebufferParameteri(p0: number, p1: number, p2: number): void; - nglGetFramebufferParameteriv(p0: number, p1: number, p2: number): void; - glGetFramebufferParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetFramebufferParameteriv(p0: number, p1: number, p2: Array): void; - glGetFramebufferParameteri(p0: number, p1: number): number; - nglGetInternalformati64v(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetInternalformati64v(p0: number, p1: number, p2: number, p3: java.nio.LongBuffer): void; - glGetInternalformati64v(p0: number, p1: number, p2: number, p3: Array): void; - glGetInternalformati64(p0: number, p1: number, p2: number): number; - glInvalidateTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glInvalidateTexImage(p0: number, p1: number): void; - glInvalidateBufferSubData(p0: number, p1: number, p2: number): void; - glInvalidateBufferData(p0: number): void; - nglInvalidateFramebuffer(p0: number, p1: number, p2: number): void; - glInvalidateFramebuffer(p0: number, p1: java.nio.IntBuffer): void; - glInvalidateFramebuffer(p0: number, p1: number): void; - glInvalidateFramebuffer(p0: number, p1: Array): void; - nglInvalidateSubFramebuffer(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glInvalidateSubFramebuffer(p0: number, p1: java.nio.IntBuffer, p2: number, p3: number, p4: number, p5: number): void; - glInvalidateSubFramebuffer(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glInvalidateSubFramebuffer(p0: number, p1: Array, p2: number, p3: number, p4: number, p5: number): void; - nglMultiDrawArraysIndirect(p0: number, p1: number, p2: number, p3: number): void; - glMultiDrawArraysIndirect(p0: number, p1: java.nio.ByteBuffer, p2: number, p3: number): void; - glMultiDrawArraysIndirect(p0: number, p1: number, p2: number, p3: number): void; - glMultiDrawArraysIndirect(p0: number, p1: java.nio.IntBuffer, p2: number, p3: number): void; - glMultiDrawArraysIndirect(p0: number, p1: Array, p2: number, p3: number): void; - nglMultiDrawElementsIndirect(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glMultiDrawElementsIndirect(p0: number, p1: number, p2: java.nio.ByteBuffer, p3: number, p4: number): void; - glMultiDrawElementsIndirect(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glMultiDrawElementsIndirect(p0: number, p1: number, p2: java.nio.IntBuffer, p3: number, p4: number): void; - glMultiDrawElementsIndirect(p0: number, p1: number, p2: Array, p3: number, p4: number): void; - nglGetProgramInterfaceiv(p0: number, p1: number, p2: number, p3: number): void; - glGetProgramInterfaceiv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetProgramInterfaceiv(p0: number, p1: number, p2: number, p3: Array): void; - glGetProgramInterfacei(p0: number, p1: number, p2: number): number; - nglGetProgramResourceIndex(p0: number, p1: number, p2: number): number; - glGetProgramResourceIndex(p0: number, p1: number, p2: java.nio.ByteBuffer): number; - glGetProgramResourceIndex(p0: number, p1: number, p2: kotlin.CharSequence): number; - nglGetProgramResourceName(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glGetProgramResourceName(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer | null | undefined, p4: java.nio.ByteBuffer): void; - glGetProgramResourceName(p0: number, p1: number, p2: number, p3: number): string; - glGetProgramResourceName(p0: number, p1: number, p2: number): string; - glGetProgramResourceName(p0: number, p1: number, p2: number, p3: Array, p4: java.nio.ByteBuffer): void; - nglGetProgramResourceiv(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glGetProgramResourceiv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer, p4: java.nio.IntBuffer | null | undefined, p5: java.nio.IntBuffer): void; - glGetProgramResourceiv(p0: number, p1: number, p2: number, p3: Array, p4: Array, p5: Array): void; - nglGetProgramResourceLocation(p0: number, p1: number, p2: number): number; - glGetProgramResourceLocation(p0: number, p1: number, p2: java.nio.ByteBuffer): number; - glGetProgramResourceLocation(p0: number, p1: number, p2: kotlin.CharSequence): number; - nglGetProgramResourceLocationIndex(p0: number, p1: number, p2: number): number; - glGetProgramResourceLocationIndex(p0: number, p1: number, p2: java.nio.ByteBuffer): number; - glGetProgramResourceLocationIndex(p0: number, p1: number, p2: kotlin.CharSequence): number; - glShaderStorageBlockBinding(p0: number, p1: number, p2: number): void; - glTexBufferRange(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glTexStorage2DMultisample(p0: number, p1: number, p2: number, p3: number, p4: number, p5: boolean): void; - glTexStorage3DMultisample(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: boolean): void; - glTextureView(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glBindVertexBuffer(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttribFormat(p0: number, p1: number, p2: number, p3: boolean, p4: number): void; - glVertexAttribIFormat(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttribLFormat(p0: number, p1: number, p2: number, p3: number): void; - glVertexAttribBinding(p0: number, p1: number): void; - glVertexBindingDivisor(p0: number, p1: number): void; - } - interface GL43 extends org.lwjgl.opengl.GL42 { - } - const GLDebugMessageCallbackI: { - DESCRIPTOR: org.lwjgl.system.Callback$Descriptor; - } - interface GLDebugMessageCallbackI extends org.lwjgl.system.CallbackI { - invoke(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - (p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - } - const GL44: { - GL_MAX_VERTEX_ATTRIB_STRIDE: number; - GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED: number; - GL_TEXTURE_BUFFER_BINDING: number; - GL_MAP_PERSISTENT_BIT: number; - GL_MAP_COHERENT_BIT: number; - GL_DYNAMIC_STORAGE_BIT: number; - GL_CLIENT_STORAGE_BIT: number; - GL_BUFFER_IMMUTABLE_STORAGE: number; - GL_BUFFER_STORAGE_FLAGS: number; - GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT: number; - GL_CLEAR_TEXTURE: number; - GL_LOCATION_COMPONENT: number; - GL_TRANSFORM_FEEDBACK_BUFFER_INDEX: number; - GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE: number; - GL_QUERY_RESULT_NO_WAIT: number; - GL_QUERY_BUFFER: number; - GL_QUERY_BUFFER_BINDING: number; - GL_QUERY_BUFFER_BARRIER_BIT: number; - GL_MIRROR_CLAMP_TO_EDGE: number; - nglBufferStorage(p0: number, p1: number, p2: number, p3: number): void; - glBufferStorage(p0: number, p1: number, p2: number): void; - glBufferStorage(p0: number, p1: java.nio.ByteBuffer, p2: number): void; - glBufferStorage(p0: number, p1: java.nio.ShortBuffer, p2: number): void; - glBufferStorage(p0: number, p1: java.nio.IntBuffer, p2: number): void; - glBufferStorage(p0: number, p1: java.nio.FloatBuffer, p2: number): void; - glBufferStorage(p0: number, p1: java.nio.DoubleBuffer, p2: number): void; - glBufferStorage(p0: number, p1: Array, p2: number): void; - glBufferStorage(p0: number, p1: Array, p2: number): void; - glBufferStorage(p0: number, p1: kotlin.FloatArray, p2: number): void; - glBufferStorage(p0: number, p1: kotlin.DoubleArray, p2: number): void; - nglClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.ByteBuffer | null | undefined): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.ShortBuffer | null | undefined): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.IntBuffer | null | undefined): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.FloatBuffer | null | undefined): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.DoubleBuffer | null | undefined): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: Array): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: Array): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: kotlin.FloatArray | null | undefined): void; - glClearTexSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: kotlin.DoubleArray | null | undefined): void; - nglClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer | null | undefined): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ShortBuffer | null | undefined): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer | null | undefined): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.FloatBuffer | null | undefined): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.DoubleBuffer | null | undefined): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray | null | undefined): void; - glClearTexImage(p0: number, p1: number, p2: number, p3: number, p4: kotlin.DoubleArray | null | undefined): void; - nglBindBuffersBase(p0: number, p1: number, p2: number, p3: number): void; - glBindBuffersBase(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined): void; - glBindBuffersBase(p0: number, p1: number, p2: Array): void; - nglBindBuffersRange(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glBindBuffersRange(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: org.lwjgl.PointerBuffer | null | undefined, p4: org.lwjgl.PointerBuffer | null | undefined): void; - glBindBuffersRange(p0: number, p1: number, p2: Array, p3: org.lwjgl.PointerBuffer | null | undefined, p4: org.lwjgl.PointerBuffer | null | undefined): void; - nglBindTextures(p0: number, p1: number, p2: number): void; - glBindTextures(p0: number, p1: java.nio.IntBuffer | null | undefined): void; - glBindTextures(p0: number, p1: Array): void; - nglBindSamplers(p0: number, p1: number, p2: number): void; - glBindSamplers(p0: number, p1: java.nio.IntBuffer | null | undefined): void; - glBindSamplers(p0: number, p1: Array): void; - nglBindImageTextures(p0: number, p1: number, p2: number): void; - glBindImageTextures(p0: number, p1: java.nio.IntBuffer | null | undefined): void; - glBindImageTextures(p0: number, p1: Array): void; - nglBindVertexBuffers(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glBindVertexBuffers(p0: number, p1: java.nio.IntBuffer | null | undefined, p2: org.lwjgl.PointerBuffer | null | undefined, p3: java.nio.IntBuffer | null | undefined): void; - glBindVertexBuffers(p0: number, p1: Array, p2: org.lwjgl.PointerBuffer | null | undefined, p3: Array): void; - } - interface GL44 extends org.lwjgl.opengl.GL43 { - } - const GL45: { - GL_NEGATIVE_ONE_TO_ONE: number; - GL_ZERO_TO_ONE: number; - GL_CLIP_ORIGIN: number; - GL_CLIP_DEPTH_MODE: number; - GL_QUERY_WAIT_INVERTED: number; - GL_QUERY_NO_WAIT_INVERTED: number; - GL_QUERY_BY_REGION_WAIT_INVERTED: number; - GL_QUERY_BY_REGION_NO_WAIT_INVERTED: number; - GL_MAX_CULL_DISTANCES: number; - GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES: number; - GL_TEXTURE_TARGET: number; - GL_QUERY_TARGET: number; - GL_CONTEXT_RELEASE_BEHAVIOR: number; - GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH: number; - GL_GUILTY_CONTEXT_RESET: number; - GL_INNOCENT_CONTEXT_RESET: number; - GL_UNKNOWN_CONTEXT_RESET: number; - GL_RESET_NOTIFICATION_STRATEGY: number; - GL_LOSE_CONTEXT_ON_RESET: number; - GL_NO_RESET_NOTIFICATION: number; - GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT: number; - GL_CONTEXT_LOST: number; - glClipControl(p0: number, p1: number): void; - nglCreateTransformFeedbacks(p0: number, p1: number): void; - glCreateTransformFeedbacks(p0: java.nio.IntBuffer): void; - glCreateTransformFeedbacks(): number; - glCreateTransformFeedbacks(p0: Array): void; - glTransformFeedbackBufferBase(p0: number, p1: number, p2: number): void; - glTransformFeedbackBufferRange(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglGetTransformFeedbackiv(p0: number, p1: number, p2: number): void; - glGetTransformFeedbackiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTransformFeedbackiv(p0: number, p1: number, p2: Array): void; - glGetTransformFeedbacki(p0: number, p1: number): number; - glGetTransformFeedbacki(p0: number, p1: number, p2: number): number; - nglGetTransformFeedbacki_v(p0: number, p1: number, p2: number, p3: number): void; - glGetTransformFeedbacki_v(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetTransformFeedbacki_v(p0: number, p1: number, p2: number, p3: Array): void; - nglGetTransformFeedbacki64_v(p0: number, p1: number, p2: number, p3: number): void; - glGetTransformFeedbacki64_v(p0: number, p1: number, p2: number, p3: java.nio.LongBuffer): void; - glGetTransformFeedbacki64_v(p0: number, p1: number, p2: number, p3: Array): void; - glGetTransformFeedbacki64(p0: number, p1: number, p2: number): number; - nglCreateBuffers(p0: number, p1: number): void; - glCreateBuffers(p0: java.nio.IntBuffer): void; - glCreateBuffers(): number; - glCreateBuffers(p0: Array): void; - nglNamedBufferStorage(p0: number, p1: number, p2: number, p3: number): void; - glNamedBufferStorage(p0: number, p1: number, p2: number): void; - glNamedBufferStorage(p0: number, p1: java.nio.ByteBuffer, p2: number): void; - glNamedBufferStorage(p0: number, p1: java.nio.ShortBuffer, p2: number): void; - glNamedBufferStorage(p0: number, p1: java.nio.IntBuffer, p2: number): void; - glNamedBufferStorage(p0: number, p1: java.nio.FloatBuffer, p2: number): void; - glNamedBufferStorage(p0: number, p1: java.nio.DoubleBuffer, p2: number): void; - glNamedBufferStorage(p0: number, p1: Array, p2: number): void; - glNamedBufferStorage(p0: number, p1: Array, p2: number): void; - glNamedBufferStorage(p0: number, p1: kotlin.FloatArray, p2: number): void; - glNamedBufferStorage(p0: number, p1: kotlin.DoubleArray, p2: number): void; - nglNamedBufferData(p0: number, p1: number, p2: number, p3: number): void; - glNamedBufferData(p0: number, p1: number, p2: number): void; - glNamedBufferData(p0: number, p1: java.nio.ByteBuffer, p2: number): void; - glNamedBufferData(p0: number, p1: java.nio.ShortBuffer, p2: number): void; - glNamedBufferData(p0: number, p1: java.nio.IntBuffer, p2: number): void; - glNamedBufferData(p0: number, p1: java.nio.LongBuffer, p2: number): void; - glNamedBufferData(p0: number, p1: java.nio.FloatBuffer, p2: number): void; - glNamedBufferData(p0: number, p1: java.nio.DoubleBuffer, p2: number): void; - glNamedBufferData(p0: number, p1: Array, p2: number): void; - glNamedBufferData(p0: number, p1: Array, p2: number): void; - glNamedBufferData(p0: number, p1: Array, p2: number): void; - glNamedBufferData(p0: number, p1: kotlin.FloatArray, p2: number): void; - glNamedBufferData(p0: number, p1: kotlin.DoubleArray, p2: number): void; - nglNamedBufferSubData(p0: number, p1: number, p2: number, p3: number): void; - glNamedBufferSubData(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glNamedBufferSubData(p0: number, p1: number, p2: java.nio.ShortBuffer): void; - glNamedBufferSubData(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glNamedBufferSubData(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glNamedBufferSubData(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glNamedBufferSubData(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glNamedBufferSubData(p0: number, p1: number, p2: Array): void; - glNamedBufferSubData(p0: number, p1: number, p2: Array): void; - glNamedBufferSubData(p0: number, p1: number, p2: Array): void; - glNamedBufferSubData(p0: number, p1: number, p2: kotlin.FloatArray): void; - glNamedBufferSubData(p0: number, p1: number, p2: kotlin.DoubleArray): void; - glCopyNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglClearNamedBufferData(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glClearNamedBufferData(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer | null | undefined): void; - glClearNamedBufferData(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ShortBuffer | null | undefined): void; - glClearNamedBufferData(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer | null | undefined): void; - glClearNamedBufferData(p0: number, p1: number, p2: number, p3: number, p4: java.nio.FloatBuffer | null | undefined): void; - glClearNamedBufferData(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glClearNamedBufferData(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glClearNamedBufferData(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray | null | undefined): void; - nglClearNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glClearNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ByteBuffer | null | undefined): void; - glClearNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ShortBuffer | null | undefined): void; - glClearNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.IntBuffer | null | undefined): void; - glClearNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.FloatBuffer | null | undefined): void; - glClearNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glClearNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glClearNamedBufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.FloatArray | null | undefined): void; - nglMapNamedBuffer(p0: number, p1: number): number; - glMapNamedBuffer(p0: number, p1: number): java.nio.ByteBuffer | null | undefined; - glMapNamedBuffer(p0: number, p1: number, p2: java.nio.ByteBuffer | null | undefined): java.nio.ByteBuffer | null | undefined; - glMapNamedBuffer(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer | null | undefined): java.nio.ByteBuffer | null | undefined; - nglMapNamedBufferRange(p0: number, p1: number, p2: number, p3: number): number; - glMapNamedBufferRange(p0: number, p1: number, p2: number, p3: number): java.nio.ByteBuffer | null | undefined; - glMapNamedBufferRange(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer | null | undefined): java.nio.ByteBuffer | null | undefined; - glUnmapNamedBuffer(p0: number): boolean; - glFlushMappedNamedBufferRange(p0: number, p1: number, p2: number): void; - nglGetNamedBufferParameteriv(p0: number, p1: number, p2: number): void; - glGetNamedBufferParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetNamedBufferParameteriv(p0: number, p1: number, p2: Array): void; - glGetNamedBufferParameteri(p0: number, p1: number): number; - nglGetNamedBufferParameteri64v(p0: number, p1: number, p2: number): void; - glGetNamedBufferParameteri64v(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glGetNamedBufferParameteri64v(p0: number, p1: number, p2: Array): void; - glGetNamedBufferParameteri64(p0: number, p1: number): number; - nglGetNamedBufferPointerv(p0: number, p1: number, p2: number): void; - glGetNamedBufferPointerv(p0: number, p1: number, p2: org.lwjgl.PointerBuffer): void; - glGetNamedBufferPointer(p0: number, p1: number): number; - nglGetNamedBufferSubData(p0: number, p1: number, p2: number, p3: number): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: java.nio.ShortBuffer): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: java.nio.LongBuffer): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: Array): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: Array): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: Array): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetNamedBufferSubData(p0: number, p1: number, p2: kotlin.DoubleArray): void; - nglCreateFramebuffers(p0: number, p1: number): void; - glCreateFramebuffers(p0: java.nio.IntBuffer): void; - glCreateFramebuffers(): number; - glCreateFramebuffers(p0: Array): void; - glNamedFramebufferRenderbuffer(p0: number, p1: number, p2: number, p3: number): void; - glNamedFramebufferParameteri(p0: number, p1: number, p2: number): void; - glNamedFramebufferTexture(p0: number, p1: number, p2: number, p3: number): void; - glNamedFramebufferTextureLayer(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glNamedFramebufferDrawBuffer(p0: number, p1: number): void; - nglNamedFramebufferDrawBuffers(p0: number, p1: number, p2: number): void; - glNamedFramebufferDrawBuffers(p0: number, p1: java.nio.IntBuffer): void; - glNamedFramebufferDrawBuffers(p0: number, p1: number): void; - glNamedFramebufferDrawBuffers(p0: number, p1: Array): void; - glNamedFramebufferReadBuffer(p0: number, p1: number): void; - nglInvalidateNamedFramebufferData(p0: number, p1: number, p2: number): void; - glInvalidateNamedFramebufferData(p0: number, p1: java.nio.IntBuffer): void; - glInvalidateNamedFramebufferData(p0: number, p1: number): void; - glInvalidateNamedFramebufferData(p0: number, p1: Array): void; - nglInvalidateNamedFramebufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glInvalidateNamedFramebufferSubData(p0: number, p1: java.nio.IntBuffer, p2: number, p3: number, p4: number, p5: number): void; - glInvalidateNamedFramebufferSubData(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glInvalidateNamedFramebufferSubData(p0: number, p1: Array, p2: number, p3: number, p4: number, p5: number): void; - nglClearNamedFramebufferiv(p0: number, p1: number, p2: number, p3: number): void; - glClearNamedFramebufferiv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glClearNamedFramebufferiv(p0: number, p1: number, p2: number, p3: Array): void; - nglClearNamedFramebufferuiv(p0: number, p1: number, p2: number, p3: number): void; - glClearNamedFramebufferuiv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glClearNamedFramebufferuiv(p0: number, p1: number, p2: number, p3: Array): void; - nglClearNamedFramebufferfv(p0: number, p1: number, p2: number, p3: number): void; - glClearNamedFramebufferfv(p0: number, p1: number, p2: number, p3: java.nio.FloatBuffer): void; - glClearNamedFramebufferfv(p0: number, p1: number, p2: number, p3: kotlin.FloatArray): void; - glClearNamedFramebufferfi(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glBlitNamedFramebuffer(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number): void; - glCheckNamedFramebufferStatus(p0: number, p1: number): number; - nglGetNamedFramebufferParameteriv(p0: number, p1: number, p2: number): void; - glGetNamedFramebufferParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetNamedFramebufferParameteriv(p0: number, p1: number, p2: Array): void; - glGetNamedFramebufferParameteri(p0: number, p1: number): number; - nglGetNamedFramebufferAttachmentParameteriv(p0: number, p1: number, p2: number, p3: number): void; - glGetNamedFramebufferAttachmentParameteriv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetNamedFramebufferAttachmentParameteriv(p0: number, p1: number, p2: number, p3: Array): void; - glGetNamedFramebufferAttachmentParameteri(p0: number, p1: number, p2: number): number; - nglCreateRenderbuffers(p0: number, p1: number): void; - glCreateRenderbuffers(p0: java.nio.IntBuffer): void; - glCreateRenderbuffers(): number; - glCreateRenderbuffers(p0: Array): void; - glNamedRenderbufferStorage(p0: number, p1: number, p2: number, p3: number): void; - glNamedRenderbufferStorageMultisample(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglGetNamedRenderbufferParameteriv(p0: number, p1: number, p2: number): void; - glGetNamedRenderbufferParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetNamedRenderbufferParameteriv(p0: number, p1: number, p2: Array): void; - glGetNamedRenderbufferParameteri(p0: number, p1: number): number; - nglCreateTextures(p0: number, p1: number, p2: number): void; - glCreateTextures(p0: number, p1: java.nio.IntBuffer): void; - glCreateTextures(p0: number): number; - glCreateTextures(p0: number, p1: Array): void; - glTextureBuffer(p0: number, p1: number, p2: number): void; - glTextureBufferRange(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glTextureStorage1D(p0: number, p1: number, p2: number, p3: number): void; - glTextureStorage2D(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glTextureStorage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glTextureStorage2DMultisample(p0: number, p1: number, p2: number, p3: number, p4: number, p5: boolean): void; - glTextureStorage3DMultisample(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: boolean): void; - nglTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ByteBuffer): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ShortBuffer): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.IntBuffer): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.FloatBuffer): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.DoubleBuffer): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.FloatArray): void; - glTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.DoubleArray): void; - nglTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.ByteBuffer): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.ShortBuffer): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.IntBuffer): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.FloatBuffer): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.DoubleBuffer): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: Array): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: Array): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: kotlin.FloatArray): void; - glTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: kotlin.DoubleArray): void; - nglTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.ByteBuffer): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.ShortBuffer): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.IntBuffer): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.FloatBuffer): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.DoubleBuffer): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: Array): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: Array): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: kotlin.FloatArray): void; - glTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: kotlin.DoubleArray): void; - nglCompressedTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glCompressedTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void; - glCompressedTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: java.nio.ByteBuffer): void; - nglCompressedTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glCompressedTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glCompressedTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.ByteBuffer): void; - nglCompressedTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glCompressedTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number): void; - glCompressedTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: java.nio.ByteBuffer): void; - glCopyTextureSubImage1D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glCopyTextureSubImage2D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glCopyTextureSubImage3D(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number): void; - glTextureParameterf(p0: number, p1: number, p2: number): void; - nglTextureParameterfv(p0: number, p1: number, p2: number): void; - glTextureParameterfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glTextureParameterfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glTextureParameteri(p0: number, p1: number, p2: number): void; - nglTextureParameterIiv(p0: number, p1: number, p2: number): void; - glTextureParameterIiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glTextureParameterIiv(p0: number, p1: number, p2: Array): void; - glTextureParameterIi(p0: number, p1: number, p2: number): void; - nglTextureParameterIuiv(p0: number, p1: number, p2: number): void; - glTextureParameterIuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glTextureParameterIuiv(p0: number, p1: number, p2: Array): void; - glTextureParameterIui(p0: number, p1: number, p2: number): void; - nglTextureParameteriv(p0: number, p1: number, p2: number): void; - glTextureParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glTextureParameteriv(p0: number, p1: number, p2: Array): void; - glGenerateTextureMipmap(p0: number): void; - glBindTextureUnit(p0: number, p1: number): void; - nglGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ShortBuffer): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.FloatBuffer): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.DoubleBuffer): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): void; - glGetTextureImage(p0: number, p1: number, p2: number, p3: number, p4: kotlin.DoubleArray): void; - nglGetCompressedTextureImage(p0: number, p1: number, p2: number, p3: number): void; - glGetCompressedTextureImage(p0: number, p1: number, p2: number, p3: number): void; - glGetCompressedTextureImage(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - nglGetTextureLevelParameterfv(p0: number, p1: number, p2: number, p3: number): void; - glGetTextureLevelParameterfv(p0: number, p1: number, p2: number, p3: java.nio.FloatBuffer): void; - glGetTextureLevelParameterfv(p0: number, p1: number, p2: number, p3: kotlin.FloatArray): void; - glGetTextureLevelParameterf(p0: number, p1: number, p2: number): number; - nglGetTextureLevelParameteriv(p0: number, p1: number, p2: number, p3: number): void; - glGetTextureLevelParameteriv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetTextureLevelParameteriv(p0: number, p1: number, p2: number, p3: Array): void; - glGetTextureLevelParameteri(p0: number, p1: number, p2: number): number; - nglGetTextureParameterfv(p0: number, p1: number, p2: number): void; - glGetTextureParameterfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetTextureParameterfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetTextureParameterf(p0: number, p1: number): number; - nglGetTextureParameterIiv(p0: number, p1: number, p2: number): void; - glGetTextureParameterIiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTextureParameterIiv(p0: number, p1: number, p2: Array): void; - glGetTextureParameterIi(p0: number, p1: number): number; - nglGetTextureParameterIuiv(p0: number, p1: number, p2: number): void; - glGetTextureParameterIuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTextureParameterIuiv(p0: number, p1: number, p2: Array): void; - glGetTextureParameterIui(p0: number, p1: number): number; - nglGetTextureParameteriv(p0: number, p1: number, p2: number): void; - glGetTextureParameteriv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetTextureParameteriv(p0: number, p1: number, p2: Array): void; - glGetTextureParameteri(p0: number, p1: number): number; - nglCreateVertexArrays(p0: number, p1: number): void; - glCreateVertexArrays(p0: java.nio.IntBuffer): void; - glCreateVertexArrays(): number; - glCreateVertexArrays(p0: Array): void; - glDisableVertexArrayAttrib(p0: number, p1: number): void; - glEnableVertexArrayAttrib(p0: number, p1: number): void; - glVertexArrayElementBuffer(p0: number, p1: number): void; - glVertexArrayVertexBuffer(p0: number, p1: number, p2: number, p3: number, p4: number): void; - nglVertexArrayVertexBuffers(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glVertexArrayVertexBuffers(p0: number, p1: number, p2: java.nio.IntBuffer | null | undefined, p3: org.lwjgl.PointerBuffer | null | undefined, p4: java.nio.IntBuffer | null | undefined): void; - glVertexArrayVertexBuffers(p0: number, p1: number, p2: Array, p3: org.lwjgl.PointerBuffer | null | undefined, p4: Array): void; - glVertexArrayAttribFormat(p0: number, p1: number, p2: number, p3: number, p4: boolean, p5: number): void; - glVertexArrayAttribIFormat(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexArrayAttribLFormat(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glVertexArrayAttribBinding(p0: number, p1: number, p2: number): void; - glVertexArrayBindingDivisor(p0: number, p1: number, p2: number): void; - nglGetVertexArrayiv(p0: number, p1: number, p2: number): void; - glGetVertexArrayiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetVertexArrayiv(p0: number, p1: number, p2: Array): void; - glGetVertexArrayi(p0: number, p1: number): number; - nglGetVertexArrayIndexediv(p0: number, p1: number, p2: number, p3: number): void; - glGetVertexArrayIndexediv(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetVertexArrayIndexediv(p0: number, p1: number, p2: number, p3: Array): void; - glGetVertexArrayIndexedi(p0: number, p1: number, p2: number): number; - nglGetVertexArrayIndexed64iv(p0: number, p1: number, p2: number, p3: number): void; - glGetVertexArrayIndexed64iv(p0: number, p1: number, p2: number, p3: java.nio.LongBuffer): void; - glGetVertexArrayIndexed64iv(p0: number, p1: number, p2: number, p3: Array): void; - glGetVertexArrayIndexed64i(p0: number, p1: number, p2: number): number; - nglCreateSamplers(p0: number, p1: number): void; - glCreateSamplers(p0: java.nio.IntBuffer): void; - glCreateSamplers(): number; - glCreateSamplers(p0: Array): void; - nglCreateProgramPipelines(p0: number, p1: number): void; - glCreateProgramPipelines(p0: java.nio.IntBuffer): void; - glCreateProgramPipelines(): number; - glCreateProgramPipelines(p0: Array): void; - nglCreateQueries(p0: number, p1: number, p2: number): void; - glCreateQueries(p0: number, p1: java.nio.IntBuffer): void; - glCreateQueries(p0: number): number; - glCreateQueries(p0: number, p1: Array): void; - glGetQueryBufferObjectiv(p0: number, p1: number, p2: number, p3: number): void; - glGetQueryBufferObjectuiv(p0: number, p1: number, p2: number, p3: number): void; - glGetQueryBufferObjecti64v(p0: number, p1: number, p2: number, p3: number): void; - glGetQueryBufferObjectui64v(p0: number, p1: number, p2: number, p3: number): void; - glMemoryBarrierByRegion(p0: number): void; - nglGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: number, p11: number): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.ByteBuffer): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.ShortBuffer): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.IntBuffer): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.FloatBuffer): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: java.nio.DoubleBuffer): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: Array): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: Array): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: kotlin.FloatArray): void; - glGetTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number, p10: kotlin.DoubleArray): void; - nglGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: number, p9: number): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.ByteBuffer): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.ShortBuffer): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.IntBuffer): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.FloatBuffer): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: java.nio.DoubleBuffer): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: Array): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: Array): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: kotlin.FloatArray): void; - glGetCompressedTextureSubImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number, p8: kotlin.DoubleArray): void; - glTextureBarrier(): void; - glGetGraphicsResetStatus(): number; - nglGetnMapdv(p0: number, p1: number, p2: number, p3: number): void; - glGetnMapdv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetnMapdv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - glGetnMapd(p0: number, p1: number): number; - nglGetnMapfv(p0: number, p1: number, p2: number, p3: number): void; - glGetnMapfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetnMapfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetnMapf(p0: number, p1: number): number; - nglGetnMapiv(p0: number, p1: number, p2: number, p3: number): void; - glGetnMapiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetnMapiv(p0: number, p1: number, p2: Array): void; - glGetnMapi(p0: number, p1: number): number; - nglGetnPixelMapfv(p0: number, p1: number, p2: number): void; - glGetnPixelMapfv(p0: number, p1: java.nio.FloatBuffer): void; - glGetnPixelMapfv(p0: number, p1: kotlin.FloatArray): void; - nglGetnPixelMapuiv(p0: number, p1: number, p2: number): void; - glGetnPixelMapuiv(p0: number, p1: java.nio.IntBuffer): void; - glGetnPixelMapuiv(p0: number, p1: Array): void; - nglGetnPixelMapusv(p0: number, p1: number, p2: number): void; - glGetnPixelMapusv(p0: number, p1: java.nio.ShortBuffer): void; - glGetnPixelMapusv(p0: number, p1: Array): void; - nglGetnPolygonStipple(p0: number, p1: number): void; - glGetnPolygonStipple(p0: number, p1: number): void; - glGetnPolygonStipple(p0: java.nio.ByteBuffer): void; - nglGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.ShortBuffer): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.IntBuffer): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.FloatBuffer): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: java.nio.DoubleBuffer): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: Array): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: kotlin.FloatArray): void; - glGetnTexImage(p0: number, p1: number, p2: number, p3: number, p4: kotlin.DoubleArray): void; - nglReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ByteBuffer): void; - glReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.ShortBuffer): void; - glReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.IntBuffer): void; - glReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: java.nio.FloatBuffer): void; - glReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: Array): void; - glReadnPixels(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: kotlin.FloatArray): void; - nglGetnColorTable(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetnColorTable(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetnColorTable(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer): void; - glGetnColorTable(p0: number, p1: number, p2: number, p3: java.nio.ShortBuffer): void; - glGetnColorTable(p0: number, p1: number, p2: number, p3: java.nio.IntBuffer): void; - glGetnColorTable(p0: number, p1: number, p2: number, p3: java.nio.FloatBuffer): void; - glGetnColorTable(p0: number, p1: number, p2: number, p3: Array): void; - glGetnColorTable(p0: number, p1: number, p2: number, p3: Array): void; - glGetnColorTable(p0: number, p1: number, p2: number, p3: kotlin.FloatArray): void; - nglGetnConvolutionFilter(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetnConvolutionFilter(p0: number, p1: number, p2: number, p3: number, p4: number): void; - glGetnConvolutionFilter(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer): void; - nglGetnSeparableFilter(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: number): void; - glGetnSeparableFilter(p0: number, p1: number, p2: number, p3: number, p4: number, p5: number, p6: number, p7: java.nio.ByteBuffer | null | undefined): void; - glGetnSeparableFilter(p0: number, p1: number, p2: number, p3: java.nio.ByteBuffer, p4: java.nio.ByteBuffer, p5: java.nio.ByteBuffer | null | undefined): void; - nglGetnHistogram(p0: number, p1: boolean, p2: number, p3: number, p4: number, p5: number): void; - glGetnHistogram(p0: number, p1: boolean, p2: number, p3: number, p4: number, p5: number): void; - glGetnHistogram(p0: number, p1: boolean, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - nglGetnMinmax(p0: number, p1: boolean, p2: number, p3: number, p4: number, p5: number): void; - glGetnMinmax(p0: number, p1: boolean, p2: number, p3: number, p4: number, p5: number): void; - glGetnMinmax(p0: number, p1: boolean, p2: number, p3: number, p4: java.nio.ByteBuffer): void; - nglGetnCompressedTexImage(p0: number, p1: number, p2: number, p3: number): void; - glGetnCompressedTexImage(p0: number, p1: number, p2: number, p3: number): void; - glGetnCompressedTexImage(p0: number, p1: number, p2: java.nio.ByteBuffer): void; - nglGetnUniformfv(p0: number, p1: number, p2: number, p3: number): void; - glGetnUniformfv(p0: number, p1: number, p2: java.nio.FloatBuffer): void; - glGetnUniformfv(p0: number, p1: number, p2: kotlin.FloatArray): void; - glGetnUniformf(p0: number, p1: number): number; - nglGetnUniformdv(p0: number, p1: number, p2: number, p3: number): void; - glGetnUniformdv(p0: number, p1: number, p2: java.nio.DoubleBuffer): void; - glGetnUniformdv(p0: number, p1: number, p2: kotlin.DoubleArray): void; - glGetnUniformd(p0: number, p1: number): number; - nglGetnUniformiv(p0: number, p1: number, p2: number, p3: number): void; - glGetnUniformiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetnUniformiv(p0: number, p1: number, p2: Array): void; - glGetnUniformi(p0: number, p1: number): number; - nglGetnUniformuiv(p0: number, p1: number, p2: number, p3: number): void; - glGetnUniformuiv(p0: number, p1: number, p2: java.nio.IntBuffer): void; - glGetnUniformuiv(p0: number, p1: number, p2: Array): void; - glGetnUniformui(p0: number, p1: number): number; - } - interface GL45 extends org.lwjgl.opengl.GL44 { - } - } - namespace system { - namespace libffi { - const FFICIF: { - Buffer: typeof org.lwjgl.system.libffi.FFICIF$Buffer; - SIZEOF: number; - ALIGNOF: number; - ABI: number; - NARGS: number; - ARG_TYPES: number; - RTYPE: number; - BYTES: number; - FLAGS: number; - new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFICIF; - create(): org.lwjgl.system.libffi.FFICIF; - create(p0: number): org.lwjgl.system.libffi.FFICIF; - create(p0: number): org.lwjgl.system.libffi.FFICIF$Buffer; - create(p0: number, p1: number): org.lwjgl.system.libffi.FFICIF$Buffer; - malloc(): org.lwjgl.system.libffi.FFICIF; - malloc(p0: number): org.lwjgl.system.libffi.FFICIF$Buffer; - malloc(p0: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFICIF; - malloc(p0: number, p1: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFICIF$Buffer; - calloc(): org.lwjgl.system.libffi.FFICIF; - calloc(p0: number): org.lwjgl.system.libffi.FFICIF$Buffer; - calloc(p0: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFICIF; - calloc(p0: number, p1: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFICIF$Buffer; - createSafe(p0: number): org.lwjgl.system.libffi.FFICIF | null | undefined; - createSafe(p0: number, p1: number): org.lwjgl.system.libffi.FFICIF$Buffer | null | undefined; - nabi(p0: number): number; - nnargs(p0: number): number; - narg_types(p0: number): org.lwjgl.PointerBuffer; - nrtype(p0: number): org.lwjgl.system.libffi.FFIType; - nbytes(p0: number): number; - nflags(p0: number): number; - } - interface FFICIF extends org.lwjgl.system.Struct, org.lwjgl.system.NativeResource { - abi(): number; - nargs(): number; - arg_types(): org.lwjgl.PointerBuffer; - rtype(): org.lwjgl.system.libffi.FFIType; - bytes(): number; - flags(): number; - } - const FFIType: { - Buffer: typeof org.lwjgl.system.libffi.FFIType$Buffer; - SIZEOF: number; - ALIGNOF: number; - SIZE: number; - ALIGNMENT: number; - TYPE: number; - ELEMENTS: number; - new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFIType; - create(): org.lwjgl.system.libffi.FFIType; - create(p0: number): org.lwjgl.system.libffi.FFIType; - create(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; - create(p0: number, p1: number): org.lwjgl.system.libffi.FFIType$Buffer; - malloc(): org.lwjgl.system.libffi.FFIType; - malloc(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; - malloc(p0: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFIType; - malloc(p0: number, p1: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFIType$Buffer; - calloc(): org.lwjgl.system.libffi.FFIType; - calloc(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; - calloc(p0: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFIType; - calloc(p0: number, p1: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFIType$Buffer; - createSafe(p0: number): org.lwjgl.system.libffi.FFIType | null | undefined; - createSafe(p0: number, p1: number): org.lwjgl.system.libffi.FFIType$Buffer | null | undefined; - nsize(p0: number): number; - nsize(p0: number, p1: number): void; - nalignment(p0: number): number; - nalignment(p0: number, p1: number): void; - ntype(p0: number): number; - ntype(p0: number, p1: number): void; - nelements(p0: number, p1: number): org.lwjgl.PointerBuffer | null | undefined; - nelements(p0: number, p1: org.lwjgl.PointerBuffer | null | undefined): void; - } - interface FFIType extends org.lwjgl.system.Struct, org.lwjgl.system.NativeResource { - size(): number; - size(p0: number): org.lwjgl.system.libffi.FFIType; - alignment(): number; - alignment(p0: number): org.lwjgl.system.libffi.FFIType; - type(): number; - type(p0: number): org.lwjgl.system.libffi.FFIType; - elements(p0: number): org.lwjgl.PointerBuffer | null | undefined; - elements(p0: org.lwjgl.PointerBuffer | null | undefined): org.lwjgl.system.libffi.FFIType; - set(p0: number, p1: number, p2: number, p3: org.lwjgl.PointerBuffer | null | undefined): org.lwjgl.system.libffi.FFIType; - set(p0: org.lwjgl.system.libffi.FFIType): org.lwjgl.system.libffi.FFIType; - } - const FFIType$Buffer: { - new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFIType$Buffer; - new(p0: number, p1: number): org.lwjgl.system.libffi.FFIType$Buffer; - } - interface FFIType$Buffer extends org.lwjgl.system.StructBuffer, org.lwjgl.system.NativeResource { - size(): number; - size(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; - alignment(): number; - alignment(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; - type(): number; - type(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; - elements(p0: number): org.lwjgl.PointerBuffer | null | undefined; - elements(p0: org.lwjgl.PointerBuffer | null | undefined): org.lwjgl.system.libffi.FFIType$Buffer; - } - const FFICIF$Buffer: { - new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFICIF$Buffer; - new(p0: number, p1: number): org.lwjgl.system.libffi.FFICIF$Buffer; - } - interface FFICIF$Buffer extends org.lwjgl.system.StructBuffer, org.lwjgl.system.NativeResource { - abi(): number; - nargs(): number; - arg_types(): org.lwjgl.PointerBuffer; - rtype(): org.lwjgl.system.libffi.FFIType; - bytes(): number; - flags(): number; + namespace spongepowered { + namespace asm { + namespace mixin { + namespace injection { + namespace callback { + const CallbackInfo: { + new(p0: string, p1: boolean): org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + getCallInfoClassName(p0: org.objectweb.asm.Type): string; + } + interface CallbackInfo extends org.spongepowered.asm.mixin.injection.callback.Cancellable { + getId(): string; + } + interface Cancellable { + isCancellable(): boolean; + isCancelled(): boolean; + cancel(): void; + } + } } } - interface CustomBuffer extends org.lwjgl.system.Pointer$Default { - mark(): SELF; - position(): number; - position(p0: number): SELF; - limit(): number; - limit(p0: number): SELF; - capacity(): number; - sizeof(): number; - address0(): number; - address(p0: number): number; - free(): void; - reset(): SELF; - clear(): SELF; - flip(): SELF; - rewind(): SELF; - remaining(): number; - hasRemaining(): boolean; - slice(): SELF; - slice(p0: number, p1: number): SELF; - duplicate(): SELF; - put(p0: SELF): SELF; - compact(): SELF; - } - interface Pointer$Default extends org.lwjgl.system.Pointer { - } - const Pointer: { - Default: typeof org.lwjgl.system.Pointer$Default; - POINTER_SIZE: number; - POINTER_SHIFT: number; - CLONG_SIZE: number; - CLONG_SHIFT: number; - BITS32: boolean; - BITS64: boolean; - } - interface Pointer { - address(): number; - } - interface CallbackI extends org.lwjgl.system.Pointer { - getDescriptor(): org.lwjgl.system.Callback$Descriptor; - callback(p0: number, p1: number): void; - } - const Callback$Descriptor: { - new(p0: java.lang.invoke.MethodHandles$Lookup, p1: org.lwjgl.system.libffi.FFICIF): org.lwjgl.system.Callback$Descriptor; - } - interface Callback$Descriptor { - } - const Struct: { - validate(p0: number, p1: number, p2: number, p3: org.lwjgl.system.Struct$StructValidation): void; - validate(p0: number, p1: number, p2: number, p3: org.lwjgl.system.Struct$StructValidation): void; - } - interface Struct extends org.lwjgl.system.Pointer$Default { - sizeof(): number; - clear(): void; - free(): void; - isNull(p0: number): boolean; - } - interface StructBuffer extends org.lwjgl.system.CustomBuffer, kotlin.collections.MutableIterable { - get(): T; - get(p0: T): SELF; - get(p0: number): T; - get(p0: number, p1: T): SELF; - put(p0: T): SELF; - put(p0: number, p1: T): SELF; - apply(p0: unknown): SELF; - apply(p0: number, p1: unknown): SELF; - stream(): java.util.stream.Stream; - parallelStream(): java.util.stream.Stream; - } - interface Struct$StructValidation { - validate(p0: number): void; - (p0: number): void; - } - interface NativeResource extends java.lang.AutoCloseable { - free(): void; - } - const MemoryStack: { - create(): org.lwjgl.system.MemoryStack; - create(p0: number): org.lwjgl.system.MemoryStack; - create(p0: java.nio.ByteBuffer): org.lwjgl.system.MemoryStack; - ncreate(p0: number, p1: number): org.lwjgl.system.MemoryStack; - stackGet(): org.lwjgl.system.MemoryStack; - stackPush(): org.lwjgl.system.MemoryStack; - stackPop(): org.lwjgl.system.MemoryStack; - nstackMalloc(p0: number): number; - nstackMalloc(p0: number, p1: number): number; - nstackCalloc(p0: number, p1: number, p2: number): number; - stackMalloc(p0: number): java.nio.ByteBuffer; - stackCalloc(p0: number): java.nio.ByteBuffer; - stackBytes(p0: number): java.nio.ByteBuffer; - stackBytes(p0: number, p1: number): java.nio.ByteBuffer; - stackBytes(p0: number, p1: number, p2: number): java.nio.ByteBuffer; - stackBytes(p0: number, p1: number, p2: number, p3: number): java.nio.ByteBuffer; - stackBytes(p0: number): java.nio.ByteBuffer; - stackMallocShort(p0: number): java.nio.ShortBuffer; - stackCallocShort(p0: number): java.nio.ShortBuffer; - stackShorts(p0: number): java.nio.ShortBuffer; - stackShorts(p0: number, p1: number): java.nio.ShortBuffer; - stackShorts(p0: number, p1: number, p2: number): java.nio.ShortBuffer; - stackShorts(p0: number, p1: number, p2: number, p3: number): java.nio.ShortBuffer; - stackShorts(p0: number): java.nio.ShortBuffer; - stackMallocInt(p0: number): java.nio.IntBuffer; - stackCallocInt(p0: number): java.nio.IntBuffer; - stackInts(p0: number): java.nio.IntBuffer; - stackInts(p0: number, p1: number): java.nio.IntBuffer; - stackInts(p0: number, p1: number, p2: number): java.nio.IntBuffer; - stackInts(p0: number, p1: number, p2: number, p3: number): java.nio.IntBuffer; - stackInts(p0: number): java.nio.IntBuffer; - stackMallocLong(p0: number): java.nio.LongBuffer; - stackCallocLong(p0: number): java.nio.LongBuffer; - stackLongs(p0: number): java.nio.LongBuffer; - stackLongs(p0: number, p1: number): java.nio.LongBuffer; - stackLongs(p0: number, p1: number, p2: number): java.nio.LongBuffer; - stackLongs(p0: number, p1: number, p2: number, p3: number): java.nio.LongBuffer; - stackLongs(p0: number): java.nio.LongBuffer; - stackMallocCLong(p0: number): org.lwjgl.CLongBuffer; - stackCallocCLong(p0: number): org.lwjgl.CLongBuffer; - stackCLongs(p0: number): org.lwjgl.CLongBuffer; - stackCLongs(p0: number, p1: number): org.lwjgl.CLongBuffer; - stackCLongs(p0: number, p1: number, p2: number): org.lwjgl.CLongBuffer; - stackCLongs(p0: number, p1: number, p2: number, p3: number): org.lwjgl.CLongBuffer; - stackCLongs(p0: number): org.lwjgl.CLongBuffer; - stackMallocFloat(p0: number): java.nio.FloatBuffer; - stackCallocFloat(p0: number): java.nio.FloatBuffer; - stackFloats(p0: number): java.nio.FloatBuffer; - stackFloats(p0: number, p1: number): java.nio.FloatBuffer; - stackFloats(p0: number, p1: number, p2: number): java.nio.FloatBuffer; - stackFloats(p0: number, p1: number, p2: number, p3: number): java.nio.FloatBuffer; - stackFloats(p0: number): java.nio.FloatBuffer; - stackMallocDouble(p0: number): java.nio.DoubleBuffer; - stackCallocDouble(p0: number): java.nio.DoubleBuffer; - stackDoubles(p0: number): java.nio.DoubleBuffer; - stackDoubles(p0: number, p1: number): java.nio.DoubleBuffer; - stackDoubles(p0: number, p1: number, p2: number): java.nio.DoubleBuffer; - stackDoubles(p0: number, p1: number, p2: number, p3: number): java.nio.DoubleBuffer; - stackDoubles(p0: number): java.nio.DoubleBuffer; - stackMallocPointer(p0: number): org.lwjgl.PointerBuffer; - stackCallocPointer(p0: number): org.lwjgl.PointerBuffer; - stackPointers(p0: number): org.lwjgl.PointerBuffer; - stackPointers(p0: number, p1: number): org.lwjgl.PointerBuffer; - stackPointers(p0: number, p1: number, p2: number): org.lwjgl.PointerBuffer; - stackPointers(p0: number, p1: number, p2: number, p3: number): org.lwjgl.PointerBuffer; - stackPointers(p0: number): org.lwjgl.PointerBuffer; - stackPointers(p0: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - stackPointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - stackPointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer, p2: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - stackPointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer, p2: org.lwjgl.system.Pointer, p3: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - stackPointers(p0: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - stackASCII(p0: kotlin.CharSequence): java.nio.ByteBuffer; - stackASCII(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; - stackUTF8(p0: kotlin.CharSequence): java.nio.ByteBuffer; - stackUTF8(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; - stackUTF16(p0: kotlin.CharSequence): java.nio.ByteBuffer; - stackUTF16(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; - stackASCIISafe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; - stackASCIISafe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; - stackUTF8Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; - stackUTF8Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; - stackUTF16Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; - stackUTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; + } + } + namespace objectweb { + namespace asm { + const Type: { + VOID: number; + BOOLEAN: number; + CHAR: number; + BYTE: number; + SHORT: number; + INT: number; + FLOAT: number; + LONG: number; + DOUBLE: number; + ARRAY: number; + OBJECT: number; + METHOD: number; + VOID_TYPE: org.objectweb.asm.Type; + BOOLEAN_TYPE: org.objectweb.asm.Type; + CHAR_TYPE: org.objectweb.asm.Type; + BYTE_TYPE: org.objectweb.asm.Type; + SHORT_TYPE: org.objectweb.asm.Type; + INT_TYPE: org.objectweb.asm.Type; + FLOAT_TYPE: org.objectweb.asm.Type; + LONG_TYPE: org.objectweb.asm.Type; + DOUBLE_TYPE: org.objectweb.asm.Type; + getType(p0: string): org.objectweb.asm.Type; + getType(p0: java.lang.Class): org.objectweb.asm.Type; + getType(p0: java.lang.reflect.Constructor): org.objectweb.asm.Type; + getType(p0: java.lang.reflect.Method): org.objectweb.asm.Type; + getObjectType(p0: string): org.objectweb.asm.Type; + getMethodType(p0: string): org.objectweb.asm.Type; + getMethodType(p0: org.objectweb.asm.Type, p1: org.objectweb.asm.Type): org.objectweb.asm.Type; + getArgumentTypes(p0: string): Array; + getArgumentTypes(p0: java.lang.reflect.Method): Array; + getReturnType(p0: string): org.objectweb.asm.Type; + getReturnType(p0: java.lang.reflect.Method): org.objectweb.asm.Type; + getInternalName(p0: java.lang.Class): string; + getDescriptor(p0: java.lang.Class): string; + getConstructorDescriptor(p0: java.lang.reflect.Constructor): string; + getMethodDescriptor(p0: org.objectweb.asm.Type, p1: org.objectweb.asm.Type): string; + getMethodDescriptor(p0: java.lang.reflect.Method): string; + getArgumentCount(p0: string): number; + getArgumentsAndReturnSizes(p0: string): number; } - interface MemoryStack extends org.lwjgl.system.Pointer$Default, java.lang.AutoCloseable { - push(): org.lwjgl.system.MemoryStack; - pop(): org.lwjgl.system.MemoryStack; - getAddress(): number; + interface Type { + getElementType(): org.objectweb.asm.Type; + getArgumentTypes(): Array; + getReturnType(): org.objectweb.asm.Type; + getClassName(): string; + getInternalName(): string; + getDescriptor(): string; + getSort(): number; + getDimensions(): number; getSize(): number; - getFrameIndex(): number; - getPointerAddress(): number; - getPointer(): number; - setPointer(p0: number): void; - nmalloc(p0: number): number; - nmalloc(p0: number, p1: number): number; - ncalloc(p0: number, p1: number, p2: number): number; - malloc(p0: number, p1: number): java.nio.ByteBuffer; - malloc(p0: number): java.nio.ByteBuffer; - calloc(p0: number, p1: number): java.nio.ByteBuffer; - calloc(p0: number): java.nio.ByteBuffer; - nbyte(p0: number): number; - bytes(p0: number): java.nio.ByteBuffer; - bytes(p0: number, p1: number): java.nio.ByteBuffer; - bytes(p0: number, p1: number, p2: number): java.nio.ByteBuffer; - bytes(p0: number, p1: number, p2: number, p3: number): java.nio.ByteBuffer; - bytes(p0: number): java.nio.ByteBuffer; - mallocShort(p0: number): java.nio.ShortBuffer; - callocShort(p0: number): java.nio.ShortBuffer; - nshort(p0: number): number; - shorts(p0: number): java.nio.ShortBuffer; - shorts(p0: number, p1: number): java.nio.ShortBuffer; - shorts(p0: number, p1: number, p2: number): java.nio.ShortBuffer; - shorts(p0: number, p1: number, p2: number, p3: number): java.nio.ShortBuffer; - shorts(p0: number): java.nio.ShortBuffer; - mallocInt(p0: number): java.nio.IntBuffer; - callocInt(p0: number): java.nio.IntBuffer; - nint(p0: number): number; - ints(p0: number): java.nio.IntBuffer; - ints(p0: number, p1: number): java.nio.IntBuffer; - ints(p0: number, p1: number, p2: number): java.nio.IntBuffer; - ints(p0: number, p1: number, p2: number, p3: number): java.nio.IntBuffer; - ints(p0: number): java.nio.IntBuffer; - mallocLong(p0: number): java.nio.LongBuffer; - callocLong(p0: number): java.nio.LongBuffer; - nlong(p0: number): number; - longs(p0: number): java.nio.LongBuffer; - longs(p0: number, p1: number): java.nio.LongBuffer; - longs(p0: number, p1: number, p2: number): java.nio.LongBuffer; - longs(p0: number, p1: number, p2: number, p3: number): java.nio.LongBuffer; - longs(p0: number): java.nio.LongBuffer; - mallocCLong(p0: number): org.lwjgl.CLongBuffer; - callocCLong(p0: number): org.lwjgl.CLongBuffer; - nclong(p0: number): number; - clongs(p0: number): org.lwjgl.CLongBuffer; - clongs(p0: number, p1: number): org.lwjgl.CLongBuffer; - clongs(p0: number, p1: number, p2: number): org.lwjgl.CLongBuffer; - clongs(p0: number, p1: number, p2: number, p3: number): org.lwjgl.CLongBuffer; - clongs(p0: number): org.lwjgl.CLongBuffer; - mallocFloat(p0: number): java.nio.FloatBuffer; - callocFloat(p0: number): java.nio.FloatBuffer; - nfloat(p0: number): number; - floats(p0: number): java.nio.FloatBuffer; - floats(p0: number, p1: number): java.nio.FloatBuffer; - floats(p0: number, p1: number, p2: number): java.nio.FloatBuffer; - floats(p0: number, p1: number, p2: number, p3: number): java.nio.FloatBuffer; - floats(p0: number): java.nio.FloatBuffer; - mallocDouble(p0: number): java.nio.DoubleBuffer; - callocDouble(p0: number): java.nio.DoubleBuffer; - ndouble(p0: number): number; - doubles(p0: number): java.nio.DoubleBuffer; - doubles(p0: number, p1: number): java.nio.DoubleBuffer; - doubles(p0: number, p1: number, p2: number): java.nio.DoubleBuffer; - doubles(p0: number, p1: number, p2: number, p3: number): java.nio.DoubleBuffer; - doubles(p0: number): java.nio.DoubleBuffer; - mallocPointer(p0: number): org.lwjgl.PointerBuffer; - callocPointer(p0: number): org.lwjgl.PointerBuffer; - npointer(p0: number): number; - npointer(p0: org.lwjgl.system.Pointer): number; - npointer(p0: java.nio.Buffer): number; - pointers(p0: number): org.lwjgl.PointerBuffer; - pointers(p0: number, p1: number): org.lwjgl.PointerBuffer; - pointers(p0: number, p1: number, p2: number): org.lwjgl.PointerBuffer; - pointers(p0: number, p1: number, p2: number, p3: number): org.lwjgl.PointerBuffer; - pointers(p0: number): org.lwjgl.PointerBuffer; - pointers(p0: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - pointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - pointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer, p2: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - pointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer, p2: org.lwjgl.system.Pointer, p3: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - pointers(p0: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; - pointers(p0: java.nio.Buffer): org.lwjgl.PointerBuffer; - pointers(p0: java.nio.Buffer, p1: java.nio.Buffer): org.lwjgl.PointerBuffer; - pointers(p0: java.nio.Buffer, p1: java.nio.Buffer, p2: java.nio.Buffer): org.lwjgl.PointerBuffer; - pointers(p0: java.nio.Buffer, p1: java.nio.Buffer, p2: java.nio.Buffer, p3: java.nio.Buffer): org.lwjgl.PointerBuffer; - pointers(p0: java.nio.Buffer): org.lwjgl.PointerBuffer; - pointersOfElements(p0: org.lwjgl.system.CustomBuffer): org.lwjgl.PointerBuffer; - ASCII(p0: kotlin.CharSequence): java.nio.ByteBuffer; - ASCII(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; - nASCII(p0: kotlin.CharSequence, p1: boolean): number; - ASCIISafe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; - ASCIISafe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; - nASCIISafe(p0: kotlin.CharSequence | null | undefined, p1: boolean): number; - UTF8(p0: kotlin.CharSequence): java.nio.ByteBuffer; - UTF8(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; - nUTF8(p0: kotlin.CharSequence, p1: boolean): number; - UTF8Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; - UTF8Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; - nUTF8Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): number; - UTF16(p0: kotlin.CharSequence): java.nio.ByteBuffer; - UTF16(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; - nUTF16(p0: kotlin.CharSequence, p1: boolean): number; - UTF16Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; - UTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; - nUTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): number; - } - const Callback: { - Descriptor: typeof org.lwjgl.system.Callback$Descriptor; - free(p0: number): void; - get(p0: number): T; - getSafe(p0: number): T; - } - interface Callback extends org.lwjgl.system.Pointer, org.lwjgl.system.NativeResource { + getArgumentCount(): number; + getArgumentsAndReturnSizes(): number; + getOpcode(p0: number): number; } } + } + namespace lwjgl { namespace util { namespace freetype { const FT_Face: { @@ -65211,6 +59311,398 @@ declare global { } } } + namespace system { + namespace libffi { + const FFICIF: { + Buffer: typeof org.lwjgl.system.libffi.FFICIF$Buffer; + SIZEOF: number; + ALIGNOF: number; + ABI: number; + NARGS: number; + ARG_TYPES: number; + RTYPE: number; + BYTES: number; + FLAGS: number; + new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFICIF; + create(): org.lwjgl.system.libffi.FFICIF; + create(p0: number): org.lwjgl.system.libffi.FFICIF; + create(p0: number): org.lwjgl.system.libffi.FFICIF$Buffer; + create(p0: number, p1: number): org.lwjgl.system.libffi.FFICIF$Buffer; + malloc(): org.lwjgl.system.libffi.FFICIF; + malloc(p0: number): org.lwjgl.system.libffi.FFICIF$Buffer; + malloc(p0: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFICIF; + malloc(p0: number, p1: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFICIF$Buffer; + calloc(): org.lwjgl.system.libffi.FFICIF; + calloc(p0: number): org.lwjgl.system.libffi.FFICIF$Buffer; + calloc(p0: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFICIF; + calloc(p0: number, p1: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFICIF$Buffer; + createSafe(p0: number): org.lwjgl.system.libffi.FFICIF | null | undefined; + createSafe(p0: number, p1: number): org.lwjgl.system.libffi.FFICIF$Buffer | null | undefined; + nabi(p0: number): number; + nnargs(p0: number): number; + narg_types(p0: number): org.lwjgl.PointerBuffer; + nrtype(p0: number): org.lwjgl.system.libffi.FFIType; + nbytes(p0: number): number; + nflags(p0: number): number; + } + interface FFICIF extends org.lwjgl.system.Struct, org.lwjgl.system.NativeResource { + abi(): number; + nargs(): number; + arg_types(): org.lwjgl.PointerBuffer; + rtype(): org.lwjgl.system.libffi.FFIType; + bytes(): number; + flags(): number; + } + const FFIType: { + Buffer: typeof org.lwjgl.system.libffi.FFIType$Buffer; + SIZEOF: number; + ALIGNOF: number; + SIZE: number; + ALIGNMENT: number; + TYPE: number; + ELEMENTS: number; + new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFIType; + create(): org.lwjgl.system.libffi.FFIType; + create(p0: number): org.lwjgl.system.libffi.FFIType; + create(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; + create(p0: number, p1: number): org.lwjgl.system.libffi.FFIType$Buffer; + malloc(): org.lwjgl.system.libffi.FFIType; + malloc(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; + malloc(p0: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFIType; + malloc(p0: number, p1: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFIType$Buffer; + calloc(): org.lwjgl.system.libffi.FFIType; + calloc(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; + calloc(p0: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFIType; + calloc(p0: number, p1: org.lwjgl.system.MemoryStack): org.lwjgl.system.libffi.FFIType$Buffer; + createSafe(p0: number): org.lwjgl.system.libffi.FFIType | null | undefined; + createSafe(p0: number, p1: number): org.lwjgl.system.libffi.FFIType$Buffer | null | undefined; + nsize(p0: number): number; + nsize(p0: number, p1: number): void; + nalignment(p0: number): number; + nalignment(p0: number, p1: number): void; + ntype(p0: number): number; + ntype(p0: number, p1: number): void; + nelements(p0: number, p1: number): org.lwjgl.PointerBuffer | null | undefined; + nelements(p0: number, p1: org.lwjgl.PointerBuffer | null | undefined): void; + } + interface FFIType extends org.lwjgl.system.Struct, org.lwjgl.system.NativeResource { + size(): number; + size(p0: number): org.lwjgl.system.libffi.FFIType; + alignment(): number; + alignment(p0: number): org.lwjgl.system.libffi.FFIType; + type(): number; + type(p0: number): org.lwjgl.system.libffi.FFIType; + elements(p0: number): org.lwjgl.PointerBuffer | null | undefined; + elements(p0: org.lwjgl.PointerBuffer | null | undefined): org.lwjgl.system.libffi.FFIType; + set(p0: number, p1: number, p2: number, p3: org.lwjgl.PointerBuffer | null | undefined): org.lwjgl.system.libffi.FFIType; + set(p0: org.lwjgl.system.libffi.FFIType): org.lwjgl.system.libffi.FFIType; + } + const FFIType$Buffer: { + new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFIType$Buffer; + new(p0: number, p1: number): org.lwjgl.system.libffi.FFIType$Buffer; + } + interface FFIType$Buffer extends org.lwjgl.system.StructBuffer, org.lwjgl.system.NativeResource { + size(): number; + size(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; + alignment(): number; + alignment(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; + type(): number; + type(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; + elements(p0: number): org.lwjgl.PointerBuffer | null | undefined; + elements(p0: org.lwjgl.PointerBuffer | null | undefined): org.lwjgl.system.libffi.FFIType$Buffer; + } + const FFICIF$Buffer: { + new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFICIF$Buffer; + new(p0: number, p1: number): org.lwjgl.system.libffi.FFICIF$Buffer; + } + interface FFICIF$Buffer extends org.lwjgl.system.StructBuffer, org.lwjgl.system.NativeResource { + abi(): number; + nargs(): number; + arg_types(): org.lwjgl.PointerBuffer; + rtype(): org.lwjgl.system.libffi.FFIType; + bytes(): number; + flags(): number; + } + } + const Struct: { + validate(p0: number, p1: number, p2: number, p3: org.lwjgl.system.Struct$StructValidation): void; + validate(p0: number, p1: number, p2: number, p3: org.lwjgl.system.Struct$StructValidation): void; + } + interface Struct extends org.lwjgl.system.Pointer$Default { + sizeof(): number; + clear(): void; + free(): void; + isNull(p0: number): boolean; + } + interface Pointer$Default extends org.lwjgl.system.Pointer { + } + const Pointer: { + Default: typeof org.lwjgl.system.Pointer$Default; + POINTER_SIZE: number; + POINTER_SHIFT: number; + CLONG_SIZE: number; + CLONG_SHIFT: number; + BITS32: boolean; + BITS64: boolean; + } + interface Pointer { + address(): number; + } + interface StructBuffer extends org.lwjgl.system.CustomBuffer, kotlin.collections.MutableIterable { + get(): T; + get(p0: T): SELF; + get(p0: number): T; + get(p0: number, p1: T): SELF; + put(p0: T): SELF; + put(p0: number, p1: T): SELF; + apply(p0: unknown): SELF; + apply(p0: number, p1: unknown): SELF; + stream(): java.util.stream.Stream; + parallelStream(): java.util.stream.Stream; + } + interface CustomBuffer extends org.lwjgl.system.Pointer$Default { + mark(): SELF; + position(): number; + position(p0: number): SELF; + limit(): number; + limit(p0: number): SELF; + capacity(): number; + sizeof(): number; + address0(): number; + address(p0: number): number; + free(): void; + reset(): SELF; + clear(): SELF; + flip(): SELF; + rewind(): SELF; + remaining(): number; + hasRemaining(): boolean; + slice(): SELF; + slice(p0: number, p1: number): SELF; + duplicate(): SELF; + put(p0: SELF): SELF; + compact(): SELF; + } + interface Struct$StructValidation { + validate(p0: number): void; + (p0: number): void; + } + interface NativeResource extends java.lang.AutoCloseable { + free(): void; + } + const Callback: { + Descriptor: typeof org.lwjgl.system.Callback$Descriptor; + free(p0: number): void; + get(p0: number): T; + getSafe(p0: number): T; + } + interface Callback extends org.lwjgl.system.Pointer, org.lwjgl.system.NativeResource { + } + const Callback$Descriptor: { + new(p0: java.lang.invoke.MethodHandles$Lookup, p1: org.lwjgl.system.libffi.FFICIF): org.lwjgl.system.Callback$Descriptor; + } + interface Callback$Descriptor { + } + const MemoryStack: { + create(): org.lwjgl.system.MemoryStack; + create(p0: number): org.lwjgl.system.MemoryStack; + create(p0: java.nio.ByteBuffer): org.lwjgl.system.MemoryStack; + ncreate(p0: number, p1: number): org.lwjgl.system.MemoryStack; + stackGet(): org.lwjgl.system.MemoryStack; + stackPush(): org.lwjgl.system.MemoryStack; + stackPop(): org.lwjgl.system.MemoryStack; + nstackMalloc(p0: number): number; + nstackMalloc(p0: number, p1: number): number; + nstackCalloc(p0: number, p1: number, p2: number): number; + stackMalloc(p0: number): java.nio.ByteBuffer; + stackCalloc(p0: number): java.nio.ByteBuffer; + stackBytes(p0: number): java.nio.ByteBuffer; + stackBytes(p0: number, p1: number): java.nio.ByteBuffer; + stackBytes(p0: number, p1: number, p2: number): java.nio.ByteBuffer; + stackBytes(p0: number, p1: number, p2: number, p3: number): java.nio.ByteBuffer; + stackBytes(p0: number): java.nio.ByteBuffer; + stackMallocShort(p0: number): java.nio.ShortBuffer; + stackCallocShort(p0: number): java.nio.ShortBuffer; + stackShorts(p0: number): java.nio.ShortBuffer; + stackShorts(p0: number, p1: number): java.nio.ShortBuffer; + stackShorts(p0: number, p1: number, p2: number): java.nio.ShortBuffer; + stackShorts(p0: number, p1: number, p2: number, p3: number): java.nio.ShortBuffer; + stackShorts(p0: number): java.nio.ShortBuffer; + stackMallocInt(p0: number): java.nio.IntBuffer; + stackCallocInt(p0: number): java.nio.IntBuffer; + stackInts(p0: number): java.nio.IntBuffer; + stackInts(p0: number, p1: number): java.nio.IntBuffer; + stackInts(p0: number, p1: number, p2: number): java.nio.IntBuffer; + stackInts(p0: number, p1: number, p2: number, p3: number): java.nio.IntBuffer; + stackInts(p0: number): java.nio.IntBuffer; + stackMallocLong(p0: number): java.nio.LongBuffer; + stackCallocLong(p0: number): java.nio.LongBuffer; + stackLongs(p0: number): java.nio.LongBuffer; + stackLongs(p0: number, p1: number): java.nio.LongBuffer; + stackLongs(p0: number, p1: number, p2: number): java.nio.LongBuffer; + stackLongs(p0: number, p1: number, p2: number, p3: number): java.nio.LongBuffer; + stackLongs(p0: number): java.nio.LongBuffer; + stackMallocCLong(p0: number): org.lwjgl.CLongBuffer; + stackCallocCLong(p0: number): org.lwjgl.CLongBuffer; + stackCLongs(p0: number): org.lwjgl.CLongBuffer; + stackCLongs(p0: number, p1: number): org.lwjgl.CLongBuffer; + stackCLongs(p0: number, p1: number, p2: number): org.lwjgl.CLongBuffer; + stackCLongs(p0: number, p1: number, p2: number, p3: number): org.lwjgl.CLongBuffer; + stackCLongs(p0: number): org.lwjgl.CLongBuffer; + stackMallocFloat(p0: number): java.nio.FloatBuffer; + stackCallocFloat(p0: number): java.nio.FloatBuffer; + stackFloats(p0: number): java.nio.FloatBuffer; + stackFloats(p0: number, p1: number): java.nio.FloatBuffer; + stackFloats(p0: number, p1: number, p2: number): java.nio.FloatBuffer; + stackFloats(p0: number, p1: number, p2: number, p3: number): java.nio.FloatBuffer; + stackFloats(p0: number): java.nio.FloatBuffer; + stackMallocDouble(p0: number): java.nio.DoubleBuffer; + stackCallocDouble(p0: number): java.nio.DoubleBuffer; + stackDoubles(p0: number): java.nio.DoubleBuffer; + stackDoubles(p0: number, p1: number): java.nio.DoubleBuffer; + stackDoubles(p0: number, p1: number, p2: number): java.nio.DoubleBuffer; + stackDoubles(p0: number, p1: number, p2: number, p3: number): java.nio.DoubleBuffer; + stackDoubles(p0: number): java.nio.DoubleBuffer; + stackMallocPointer(p0: number): org.lwjgl.PointerBuffer; + stackCallocPointer(p0: number): org.lwjgl.PointerBuffer; + stackPointers(p0: number): org.lwjgl.PointerBuffer; + stackPointers(p0: number, p1: number): org.lwjgl.PointerBuffer; + stackPointers(p0: number, p1: number, p2: number): org.lwjgl.PointerBuffer; + stackPointers(p0: number, p1: number, p2: number, p3: number): org.lwjgl.PointerBuffer; + stackPointers(p0: number): org.lwjgl.PointerBuffer; + stackPointers(p0: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + stackPointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + stackPointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer, p2: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + stackPointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer, p2: org.lwjgl.system.Pointer, p3: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + stackPointers(p0: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + stackASCII(p0: kotlin.CharSequence): java.nio.ByteBuffer; + stackASCII(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; + stackUTF8(p0: kotlin.CharSequence): java.nio.ByteBuffer; + stackUTF8(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; + stackUTF16(p0: kotlin.CharSequence): java.nio.ByteBuffer; + stackUTF16(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; + stackASCIISafe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; + stackASCIISafe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; + stackUTF8Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; + stackUTF8Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; + stackUTF16Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; + stackUTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; + } + interface MemoryStack extends org.lwjgl.system.Pointer$Default, java.lang.AutoCloseable { + push(): org.lwjgl.system.MemoryStack; + pop(): org.lwjgl.system.MemoryStack; + getAddress(): number; + getSize(): number; + getFrameIndex(): number; + getPointerAddress(): number; + getPointer(): number; + setPointer(p0: number): void; + nmalloc(p0: number): number; + nmalloc(p0: number, p1: number): number; + ncalloc(p0: number, p1: number, p2: number): number; + malloc(p0: number, p1: number): java.nio.ByteBuffer; + malloc(p0: number): java.nio.ByteBuffer; + calloc(p0: number, p1: number): java.nio.ByteBuffer; + calloc(p0: number): java.nio.ByteBuffer; + nbyte(p0: number): number; + bytes(p0: number): java.nio.ByteBuffer; + bytes(p0: number, p1: number): java.nio.ByteBuffer; + bytes(p0: number, p1: number, p2: number): java.nio.ByteBuffer; + bytes(p0: number, p1: number, p2: number, p3: number): java.nio.ByteBuffer; + bytes(p0: number): java.nio.ByteBuffer; + mallocShort(p0: number): java.nio.ShortBuffer; + callocShort(p0: number): java.nio.ShortBuffer; + nshort(p0: number): number; + shorts(p0: number): java.nio.ShortBuffer; + shorts(p0: number, p1: number): java.nio.ShortBuffer; + shorts(p0: number, p1: number, p2: number): java.nio.ShortBuffer; + shorts(p0: number, p1: number, p2: number, p3: number): java.nio.ShortBuffer; + shorts(p0: number): java.nio.ShortBuffer; + mallocInt(p0: number): java.nio.IntBuffer; + callocInt(p0: number): java.nio.IntBuffer; + nint(p0: number): number; + ints(p0: number): java.nio.IntBuffer; + ints(p0: number, p1: number): java.nio.IntBuffer; + ints(p0: number, p1: number, p2: number): java.nio.IntBuffer; + ints(p0: number, p1: number, p2: number, p3: number): java.nio.IntBuffer; + ints(p0: number): java.nio.IntBuffer; + mallocLong(p0: number): java.nio.LongBuffer; + callocLong(p0: number): java.nio.LongBuffer; + nlong(p0: number): number; + longs(p0: number): java.nio.LongBuffer; + longs(p0: number, p1: number): java.nio.LongBuffer; + longs(p0: number, p1: number, p2: number): java.nio.LongBuffer; + longs(p0: number, p1: number, p2: number, p3: number): java.nio.LongBuffer; + longs(p0: number): java.nio.LongBuffer; + mallocCLong(p0: number): org.lwjgl.CLongBuffer; + callocCLong(p0: number): org.lwjgl.CLongBuffer; + nclong(p0: number): number; + clongs(p0: number): org.lwjgl.CLongBuffer; + clongs(p0: number, p1: number): org.lwjgl.CLongBuffer; + clongs(p0: number, p1: number, p2: number): org.lwjgl.CLongBuffer; + clongs(p0: number, p1: number, p2: number, p3: number): org.lwjgl.CLongBuffer; + clongs(p0: number): org.lwjgl.CLongBuffer; + mallocFloat(p0: number): java.nio.FloatBuffer; + callocFloat(p0: number): java.nio.FloatBuffer; + nfloat(p0: number): number; + floats(p0: number): java.nio.FloatBuffer; + floats(p0: number, p1: number): java.nio.FloatBuffer; + floats(p0: number, p1: number, p2: number): java.nio.FloatBuffer; + floats(p0: number, p1: number, p2: number, p3: number): java.nio.FloatBuffer; + floats(p0: number): java.nio.FloatBuffer; + mallocDouble(p0: number): java.nio.DoubleBuffer; + callocDouble(p0: number): java.nio.DoubleBuffer; + ndouble(p0: number): number; + doubles(p0: number): java.nio.DoubleBuffer; + doubles(p0: number, p1: number): java.nio.DoubleBuffer; + doubles(p0: number, p1: number, p2: number): java.nio.DoubleBuffer; + doubles(p0: number, p1: number, p2: number, p3: number): java.nio.DoubleBuffer; + doubles(p0: number): java.nio.DoubleBuffer; + mallocPointer(p0: number): org.lwjgl.PointerBuffer; + callocPointer(p0: number): org.lwjgl.PointerBuffer; + npointer(p0: number): number; + npointer(p0: org.lwjgl.system.Pointer): number; + npointer(p0: java.nio.Buffer): number; + pointers(p0: number): org.lwjgl.PointerBuffer; + pointers(p0: number, p1: number): org.lwjgl.PointerBuffer; + pointers(p0: number, p1: number, p2: number): org.lwjgl.PointerBuffer; + pointers(p0: number, p1: number, p2: number, p3: number): org.lwjgl.PointerBuffer; + pointers(p0: number): org.lwjgl.PointerBuffer; + pointers(p0: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + pointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + pointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer, p2: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + pointers(p0: org.lwjgl.system.Pointer, p1: org.lwjgl.system.Pointer, p2: org.lwjgl.system.Pointer, p3: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + pointers(p0: org.lwjgl.system.Pointer): org.lwjgl.PointerBuffer; + pointers(p0: java.nio.Buffer): org.lwjgl.PointerBuffer; + pointers(p0: java.nio.Buffer, p1: java.nio.Buffer): org.lwjgl.PointerBuffer; + pointers(p0: java.nio.Buffer, p1: java.nio.Buffer, p2: java.nio.Buffer): org.lwjgl.PointerBuffer; + pointers(p0: java.nio.Buffer, p1: java.nio.Buffer, p2: java.nio.Buffer, p3: java.nio.Buffer): org.lwjgl.PointerBuffer; + pointers(p0: java.nio.Buffer): org.lwjgl.PointerBuffer; + pointersOfElements(p0: org.lwjgl.system.CustomBuffer): org.lwjgl.PointerBuffer; + ASCII(p0: kotlin.CharSequence): java.nio.ByteBuffer; + ASCII(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; + nASCII(p0: kotlin.CharSequence, p1: boolean): number; + ASCIISafe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; + ASCIISafe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; + nASCIISafe(p0: kotlin.CharSequence | null | undefined, p1: boolean): number; + UTF8(p0: kotlin.CharSequence): java.nio.ByteBuffer; + UTF8(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; + nUTF8(p0: kotlin.CharSequence, p1: boolean): number; + UTF8Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; + UTF8Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; + nUTF8Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): number; + UTF16(p0: kotlin.CharSequence): java.nio.ByteBuffer; + UTF16(p0: kotlin.CharSequence, p1: boolean): java.nio.ByteBuffer; + nUTF16(p0: kotlin.CharSequence, p1: boolean): number; + UTF16Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; + UTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; + nUTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): number; + } + interface CallbackI extends org.lwjgl.system.Pointer { + getDescriptor(): org.lwjgl.system.Callback$Descriptor; + callback(p0: number, p1: number): void; + } + } namespace glfw { const GLFWVidMode$Buffer: { new(p0: java.nio.ByteBuffer): org.lwjgl.glfw.GLFWVidMode$Buffer; @@ -65330,87 +59822,6 @@ declare global { put(p0: Array, p1: number, p2: number): org.lwjgl.CLongBuffer; } } - namespace spongepowered { - namespace asm { - namespace mixin { - namespace injection { - namespace callback { - const CallbackInfo: { - new(p0: string, p1: boolean): org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - getCallInfoClassName(p0: org.objectweb.asm.Type): string; - } - interface CallbackInfo extends org.spongepowered.asm.mixin.injection.callback.Cancellable { - getId(): string; - } - interface Cancellable { - isCancellable(): boolean; - isCancelled(): boolean; - cancel(): void; - } - } - } - } - } - } - namespace objectweb { - namespace asm { - const Type: { - VOID: number; - BOOLEAN: number; - CHAR: number; - BYTE: number; - SHORT: number; - INT: number; - FLOAT: number; - LONG: number; - DOUBLE: number; - ARRAY: number; - OBJECT: number; - METHOD: number; - VOID_TYPE: org.objectweb.asm.Type; - BOOLEAN_TYPE: org.objectweb.asm.Type; - CHAR_TYPE: org.objectweb.asm.Type; - BYTE_TYPE: org.objectweb.asm.Type; - SHORT_TYPE: org.objectweb.asm.Type; - INT_TYPE: org.objectweb.asm.Type; - FLOAT_TYPE: org.objectweb.asm.Type; - LONG_TYPE: org.objectweb.asm.Type; - DOUBLE_TYPE: org.objectweb.asm.Type; - getType(p0: string): org.objectweb.asm.Type; - getType(p0: java.lang.Class): org.objectweb.asm.Type; - getType(p0: java.lang.reflect.Constructor): org.objectweb.asm.Type; - getType(p0: java.lang.reflect.Method): org.objectweb.asm.Type; - getObjectType(p0: string): org.objectweb.asm.Type; - getMethodType(p0: string): org.objectweb.asm.Type; - getMethodType(p0: org.objectweb.asm.Type, p1: org.objectweb.asm.Type): org.objectweb.asm.Type; - getArgumentTypes(p0: string): Array; - getArgumentTypes(p0: java.lang.reflect.Method): Array; - getReturnType(p0: string): org.objectweb.asm.Type; - getReturnType(p0: java.lang.reflect.Method): org.objectweb.asm.Type; - getInternalName(p0: java.lang.Class): string; - getDescriptor(p0: java.lang.Class): string; - getConstructorDescriptor(p0: java.lang.reflect.Constructor): string; - getMethodDescriptor(p0: org.objectweb.asm.Type, p1: org.objectweb.asm.Type): string; - getMethodDescriptor(p0: java.lang.reflect.Method): string; - getArgumentCount(p0: string): number; - getArgumentsAndReturnSizes(p0: string): number; - } - interface Type { - getElementType(): org.objectweb.asm.Type; - getArgumentTypes(): Array; - getReturnType(): org.objectweb.asm.Type; - getClassName(): string; - getInternalName(): string; - getDescriptor(): string; - getSort(): number; - getDimensions(): number; - getSize(): number; - getArgumentCount(): number; - getArgumentsAndReturnSizes(): number; - getOpcode(p0: number): number; - } - } - } namespace mozilla { namespace javascript { namespace debug { From b69404417b4e1dac12e732dca59ca508fb376852 Mon Sep 17 00:00:00 2001 From: rdbtCVS <87152661+rdbtCVS@users.noreply.github.com> Date: Tue, 4 Aug 2026 00:11:27 +0100 Subject: [PATCH 05/61] typings --- .../src/main/resources/typings.d.ts | 1448 ++++++++--------- 1 file changed, 724 insertions(+), 724 deletions(-) diff --git a/typing-generator/src/main/resources/typings.d.ts b/typing-generator/src/main/resources/typings.d.ts index 2b62956d..3a37c67e 100644 --- a/typing-generator/src/main/resources/typings.d.ts +++ b/typing-generator/src/main/resources/typings.d.ts @@ -4250,7 +4250,7 @@ declare global { new(p0: Array): java.util.concurrent.CopyOnWriteArrayList; new(p0: Array): java.util.concurrent.CopyOnWriteArrayList; } - interface CopyOnWriteArrayList extends Array, java.util.RandomAccess, kotlin.Cloneable, java.io.Serializable { + interface CopyOnWriteArrayList extends Array, java.util.RandomAccess, kotlin.Cloneable, java.io.Serializable { indexOf(p0: E, p1: number): number; lastIndexOf(p0: E, p1: number): number; toArray(): Array; @@ -9070,7 +9070,7 @@ declare global { } } namespace reflect { - interface KClass extends kotlin.reflect.KDeclarationContainer, kotlin.reflect.KAnnotatedElement, kotlin.reflect.KClassifier { + interface KClass extends kotlin.reflect.KDeclarationContainer, kotlin.reflect.KAnnotatedElement, kotlin.reflect.KClassifier { getSimpleName(): string | null | undefined; getQualifiedName(): string | null | undefined; getConstructors(): Array>; @@ -9091,13 +9091,13 @@ declare global { isValue(): boolean; isInstance(value: any | null | undefined): boolean; } - interface KDeclarationContainer { + interface KDeclarationContainer { getMembers(): Array>; } - interface KAnnotatedElement { + interface KAnnotatedElement { getAnnotations(): Array; } - interface KClassifier { + interface KClassifier { } const KVisibility: { PUBLIC: kotlin.reflect.KVisibility; @@ -9108,7 +9108,7 @@ declare global { values(): Array; valueOf(value: string): kotlin.reflect.KVisibility; } - interface KVisibility extends kotlin.Enum { + interface KVisibility extends kotlin.Enum { } interface KProperty extends kotlin.reflect.KCallable { isLateinit(): boolean; @@ -38630,7 +38630,7 @@ declare global { } } namespace api { - interface ClientModInitializer { + interface ClientModInitializer { onInitializeClient(): void; (): void; } @@ -43443,7 +43443,7 @@ declare global { const V5PreLaunch: { new(): com.v5.loader.V5PreLaunch; } - interface V5PreLaunch extends net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint { + interface V5PreLaunch extends net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint { } } } @@ -43453,7 +43453,7 @@ declare global { const WrappedThread: { new(task: java.lang.Runnable): com.chattriggers.ctjs.engine.WrappedThread; } - interface WrappedThread { + interface WrappedThread { start(): void; run(): void; stop(): void; @@ -44501,115 +44501,115 @@ declare global { registerGuiMouseDrag(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** * Registers a new trigger that runs whenever a packet is sent from the client to the server - * + * * Passes through two arguments: * - The packet * - The event, which can be cancelled - * + * * Available modifications: * - [Trigger.setPriority] Sets the priority * - [ClassFilterTrigger.setFilteredClasses] Sets the packet classes which this trigger * gets fired for - * + * * @param method The method to call when the event is fired * @return The trigger for additional modification */ registerPacketSent(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** * Registers a new trigger that runs whenever a packet is sent to the client from the server - * + * * Passes through two arguments: * - The packet * - The event, which can be cancelled - * + * * Available modifications: * - [Trigger.setPriority] Sets the priority * - [ClassFilterTrigger.setFilteredClasses] Sets the packet classes which this trigger * gets fired for - * + * * @param method The method to call when the event is fired * @return The trigger for additional modification */ registerPacketReceived(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** * Registers a new trigger that runs whenever the player connects to a server - * + * * Available modifications: * - [Trigger.setPriority] Sets the priority - * + * * @param method The method to call when the event is fired * @return The trigger for additional modification */ registerServerConnect(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** * Registers a new trigger that runs whenever the player disconnects from a server - * + * * Available modifications: * - [Trigger.setPriority] Sets the priority - * + * * @param method The method to call when the event is fired * @return The trigger for additional modification */ registerServerDisconnect(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** * Registers a new trigger that runs whenever an entity is rendered - * + * * Passes through three arguments: * - The [com.chattriggers.ctjs.api.entity.Entity] * - The partial ticks * - The event, which can be cancelled - * + * * Available modifications: * - [Trigger.setPriority] Sets the priority * - [ClassFilterTrigger.setFilteredClasses] Sets the entity classes which this trigger * gets fired for - * + * * @param method The method to call when the event is fired * @return The trigger for additional modification */ registerRenderEntity(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** * Registers a new trigger that runs whenever a block entity is rendered - * + * * Passes through three arguments: * - The [com.chattriggers.ctjs.api.entity.BlockEntity] * - The partial ticks * - The event, which can be cancelled - * + * * Available modifications: * - [Trigger.setPriority] Sets the priority * - [ClassFilterTrigger.setFilteredClasses] Sets the tile entity classes which this trigger * gets fired for - * + * * @param method The method to call when the event is fired * @return The trigger for additional modification */ registerRenderBlockEntity(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** * Registers a new trigger that runs after the current screen is rendered - * + * * Passes through three arguments: * - The mouseX * - The mouseY * - The GuiScreen - * + * * Available modifications: * - [Trigger.setPriority] Sets the priority - * + * * @param method The method to call when the event is fired * @return The trigger for additional modification */ registerPostGuiRender(method: any): com.chattriggers.ctjs.api.triggers.Trigger; /** * Registers a new trigger that runs whenever a particle is spawned - * + * * Passes through two arguments: * - The [com.chattriggers.ctjs.api.entity.Particle] * - The event, which can be cancelled - * + * * Available modifications: * - [Trigger.setPriority] Sets the priority - * + * * @param method The method to call when the event is fired * @return The trigger for additional modification */ @@ -44619,7 +44619,7 @@ declare global { const MixinCallback: { new(id: number, injector: com.chattriggers.ctjs.internal.launch.IInjector): com.chattriggers.ctjs.engine.MixinCallback; } - interface MixinCallback { + interface MixinCallback { attach(method: any): void; component1(): number; component2(): com.chattriggers.ctjs.internal.launch.IInjector; @@ -44628,7 +44628,7 @@ declare global { const Console: { new(): com.chattriggers.ctjs.engine.Console; } - interface Console { + interface Console { new(): com.chattriggers.ctjs.engine.Console; clear(): void; println(obj: any, logType: com.chattriggers.ctjs.engine.LogType, end: string, customColor: java.awt.Color | null | undefined): void; @@ -44648,7 +44648,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.engine.LogType; } - interface LogType extends kotlin.Enum { + interface LogType extends kotlin.Enum { } } namespace api { @@ -44656,7 +44656,7 @@ declare global { const Trigger: { Priority: typeof com.chattriggers.ctjs.api.triggers.Trigger$Priority; } - interface Trigger extends kotlin.Comparable { + interface Trigger extends kotlin.Comparable { getMethod(): any; setMethod(value: any): void; getType(): com.chattriggers.ctjs.api.triggers.ITriggerType; @@ -44681,7 +44681,7 @@ declare global { */ unregister(): com.chattriggers.ctjs.api.triggers.Trigger; } - interface ITriggerType { + interface ITriggerType { getName(): string; triggerAll(): void; triggerAll(arg0: any | null | undefined): void; @@ -44701,13 +44701,13 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.triggers.Trigger$Priority; } - interface Trigger$Priority extends kotlin.Enum { + interface Trigger$Priority extends kotlin.Enum { } const ChatTrigger: { Event: typeof com.chattriggers.ctjs.api.triggers.ChatTrigger$Event; new(method: any, type: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.ChatTrigger; } - interface ChatTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + interface ChatTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { /** * Sets if the chat trigger should run if the chat event has already been canceled. * True by default. @@ -44798,12 +44798,12 @@ declare global { message: com.chattriggers.ctjs.api.message.TextComponent; new(message: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.triggers.ChatTrigger$Event; } - interface ChatTrigger$Event extends com.chattriggers.ctjs.api.triggers.CancellableEvent { + interface ChatTrigger$Event extends com.chattriggers.ctjs.api.triggers.CancellableEvent { } const CancellableEvent: { new(): com.chattriggers.ctjs.api.triggers.CancellableEvent; } - interface CancellableEvent { + interface CancellableEvent { setCanceled(): void; setCanceled(newVal: boolean): void; setCancelled(): void; @@ -44816,17 +44816,17 @@ declare global { const ClassFilterTrigger: { new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType, wrappedClass: java.lang.Class): com.chattriggers.ctjs.api.triggers.ClassFilterTrigger; } - interface ClassFilterTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + interface ClassFilterTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { /** * Alias for `setFilteredClasses([A.class])` - * + * * @param clazz The class for which this trigger should run for */ setFilteredClass(clazz: java.lang.Class): com.chattriggers.ctjs.api.triggers.ClassFilterTrigger; /** * Sets which classes this trigger should run for. If the list is empty, it runs * for every class. - * + * * @param classes The classes for which this trigger should run for * @return This trigger object for chaining */ @@ -44835,25 +44835,25 @@ declare global { const RenderEntityTrigger: { new(method: any): com.chattriggers.ctjs.api.triggers.RenderEntityTrigger; } - interface RenderEntityTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger { + interface RenderEntityTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger { } const RenderBlockEntityTrigger: { new(method: any): com.chattriggers.ctjs.api.triggers.RenderBlockEntityTrigger; } - interface RenderBlockEntityTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger { + interface RenderBlockEntityTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger { } const PacketTrigger: { new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.PacketTrigger; } - interface PacketTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger, net.minecraft.network.protocol.Packet> { + interface PacketTrigger extends com.chattriggers.ctjs.api.triggers.ClassFilterTrigger, net.minecraft.network.protocol.Packet> { } const SoundPlayTrigger: { new(method: any): com.chattriggers.ctjs.api.triggers.SoundPlayTrigger; } - interface SoundPlayTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + interface SoundPlayTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { /** * Sets the sound name criteria. - * + * * @param soundNameCriteria the sound name * @return the trigger for method chaining */ @@ -44903,23 +44903,23 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.triggers.TriggerType; } - interface TriggerType extends kotlin.Enum, com.chattriggers.ctjs.api.triggers.ITriggerType { + interface TriggerType extends kotlin.Enum, com.chattriggers.ctjs.api.triggers.ITriggerType { } const CustomTriggerType: { new(name: string): com.chattriggers.ctjs.api.triggers.CustomTriggerType; } - interface CustomTriggerType extends com.chattriggers.ctjs.api.triggers.ITriggerType { + interface CustomTriggerType extends com.chattriggers.ctjs.api.triggers.ITriggerType { component1(): string; copy(name: string): com.chattriggers.ctjs.api.triggers.CustomTriggerType; } const EventTrigger: { new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.EventTrigger; } - interface EventTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + interface EventTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { /** * Sets if this trigger should run if the event has already been canceled. * True by default. - * + * * @param bool Boolean to set * @return the trigger object for method chaining */ @@ -44928,24 +44928,24 @@ declare global { const CommandTrigger: { new(method: any): com.chattriggers.ctjs.api.triggers.CommandTrigger; } - interface CommandTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + interface CommandTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { /** * Sets the tab completion options for the command. * This method must be used before setting the command name, otherwise, the tab completions will not be set. - * + * * @param args all the tab completion options. */ setTabCompletions(args: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; /** * This sets the possible tab completions for the command. * This method must be used before setting the command name, otherwise, the tab completions will not be set. - * + * * @param callback the callback that returns the tab completion options. - * + * * For example: * ```js * register("command", () => { - * + * * }).setTabCompletions((args) => { * return ["option1", "option2"]; * }).setName("test"); @@ -44953,14 +44953,14 @@ declare global { * The `args` parameter of the callback are the arguments currently passed to the command. * For instance, if you want to not show the options after the user tabs the first time, just add a check * for the length of the arguments and return an empty array. - * + * * The return value of the callback **must be an array of strings**, and in this case will always return the 2 * options in the array. */ setTabCompletions(callback: kotlin.Function1, Array>): com.chattriggers.ctjs.api.triggers.CommandTrigger; /** * Sets the aliases for the command. - * + * * @param args all the aliases. */ setAliases(args: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; @@ -44969,7 +44969,7 @@ declare global { * Example: * setCommandName("test") * would result in the command being /test - * + * * @param commandName The command name * @param overrideExisting Whether existing commands with the same name should be overridden * @return the trigger for additional modification @@ -44980,7 +44980,7 @@ declare global { * Example: * setCommandName("test") * would result in the command being /test - * + * * @param commandName The command name * @param overrideExisting Whether existing commands with the same name should be overridden * @return the trigger for additional modification @@ -44988,7 +44988,7 @@ declare global { setCommandName(commandName: string, overrideExisting: boolean): com.chattriggers.ctjs.api.triggers.CommandTrigger; /** * Alias for [setCommandName] - * + * * @param commandName The command name * @param overrideExisting Whether existing commands with the same name should be overridden * @return the trigger for additional modification @@ -44996,7 +44996,7 @@ declare global { setName(commandName: string): com.chattriggers.ctjs.api.triggers.CommandTrigger; /** * Alias for [setCommandName] - * + * * @param commandName The command name * @param overrideExisting Whether existing commands with the same name should be overridden * @return the trigger for additional modification @@ -45006,12 +45006,12 @@ declare global { const RegularTrigger: { new(method: any, triggerType: com.chattriggers.ctjs.api.triggers.ITriggerType): com.chattriggers.ctjs.api.triggers.RegularTrigger; } - interface RegularTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + interface RegularTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { } const StepTrigger: { new(method: any): com.chattriggers.ctjs.api.triggers.StepTrigger; } - interface StepTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { + interface StepTrigger extends com.chattriggers.ctjs.api.triggers.Trigger { /** * Sets the frames per second that the trigger activates. * This has a maximum one step per second. @@ -45030,18 +45030,18 @@ declare global { const StepTrigger$Companion: { new(): com.chattriggers.ctjs.api.triggers.StepTrigger$Companion; } - interface StepTrigger$Companion { + interface StepTrigger$Companion { new(): com.chattriggers.ctjs.api.triggers.StepTrigger$Companion; } const PacketEvent: { RECEIVE: net.fabricmc.fabric.api.event.Event; new(): com.chattriggers.ctjs.api.triggers.PacketEvent; } - interface PacketEvent { + interface PacketEvent { RECEIVE: net.fabricmc.fabric.api.event.Event; new(): com.chattriggers.ctjs.api.triggers.PacketEvent; } - interface PacketEvent$ReceiveEvent { + interface PacketEvent$ReceiveEvent { trigger(packet: net.minecraft.network.protocol.Packet): void; } } @@ -45051,18 +45051,18 @@ declare global { ClickType: typeof com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.ClickAction; } - interface ClickAction extends com.chattriggers.ctjs.api.inventory.action.Action { + interface ClickAction extends com.chattriggers.ctjs.api.inventory.action.Action { getClickType(): com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; /** * The type of click (REQUIRED) - * + * * @param clickType the new click type */ setClickType(clickType: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType): com.chattriggers.ctjs.api.inventory.action.ClickAction; getHoldingShift(): boolean; /** * Whether the click should act as if shift is being held (defaults to false) - * + * * @param holdingShift to hold shift or not */ setHoldingShift(holdingShift: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; @@ -45070,7 +45070,7 @@ declare global { /** * Whether the click should act as if an item is being held * (defaults to whether there actually is an item in the hand) - * + * * @param itemInHand to be holding an item or not */ setItemInHand(itemInHand: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; @@ -45078,14 +45078,14 @@ declare global { /** * Whether the click should try to pick up all items of said type in the inventory (essentially double clicking) * (defaults to whether there actually is an item in the hand) - * + * * @param pickupAll to pick up all items of the same type */ setPickupAll(pickupAll: boolean): com.chattriggers.ctjs.api.inventory.action.ClickAction; /** * Sets the type of click. * Possible values are: LEFT, RIGHT, MIDDLE - * + * * @param clickType the click type * @return the current Action for method chaining */ @@ -45095,7 +45095,7 @@ declare global { Type: typeof com.chattriggers.ctjs.api.inventory.action.Action$Type; new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.Action; } - interface Action { + interface Action { getSlot(): number; setSlot(value: number): void; getWindowId(): number; @@ -45108,7 +45108,7 @@ declare global { * Creates a new action. * The Inventory must be a container, see [Inventory.isContainer]. * The slot can be -999 for outside of the gui - * + * * @param inventory the inventory to complete the action on * @param slot the slot to complete the action on * @param typeString the type of action to do (CLICK, DRAG, DROP, KEY) @@ -45117,12 +45117,12 @@ declare global { of(inventory: com.chattriggers.ctjs.api.inventory.Inventory, slot: number, typeString: string): com.chattriggers.ctjs.api.inventory.action.Action; new(): com.chattriggers.ctjs.api.inventory.action.Action$Companion; } - interface Action$Companion { + interface Action$Companion { /** * Creates a new action. * The Inventory must be a container, see [Inventory.isContainer]. * The slot can be -999 for outside of the gui - * + * * @param inventory the inventory to complete the action on * @param slot the slot to complete the action on * @param typeString the type of action to do (CLICK, DRAG, DROP, KEY) @@ -45140,7 +45140,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.Action$Type; } - interface Action$Type extends kotlin.Enum { + interface Action$Type extends kotlin.Enum { } const ClickAction$ClickType: { LEFT: com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; @@ -45150,7 +45150,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.ClickAction$ClickType; } - interface ClickAction$ClickType extends kotlin.Enum { + interface ClickAction$ClickType extends kotlin.Enum { getButton(): number; } const DragAction: { @@ -45158,11 +45158,11 @@ declare global { Stage: typeof com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.DragAction; } - interface DragAction extends com.chattriggers.ctjs.api.inventory.action.Action { + interface DragAction extends com.chattriggers.ctjs.api.inventory.action.Action { getClickType(): com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; /** * The type of click (REQUIRED) - * + * * @param clickType the new click type */ setClickType(clickType: com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType): com.chattriggers.ctjs.api.inventory.action.DragAction; @@ -45172,14 +45172,14 @@ declare global { * BEGIN is when beginning the drag * SLOT is for each slot being dragged into * END is for ending the drag - * + * * @param stage the stage */ setStage(stage: com.chattriggers.ctjs.api.inventory.action.DragAction$Stage): com.chattriggers.ctjs.api.inventory.action.DragAction; /** * Sets the type of click. * Possible values are: LEFT, RIGHT, MIDDLE - * + * * @param clickType the click type * @return the current Action for method chaining */ @@ -45187,7 +45187,7 @@ declare global { /** * Sets the stage of this drag. * Possible values are: BEGIN, SLOT, END [stage] - * + * * @param stage the stage * @return the current Action for method chaining */ @@ -45201,7 +45201,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.DragAction$ClickType; } - interface DragAction$ClickType extends kotlin.Enum { + interface DragAction$ClickType extends kotlin.Enum { getButton(): number; } const DragAction$Stage: { @@ -45212,17 +45212,17 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.inventory.action.DragAction$Stage; } - interface DragAction$Stage extends kotlin.Enum { + interface DragAction$Stage extends kotlin.Enum { getStage(): number; } const DropAction: { new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.DropAction; } - interface DropAction extends com.chattriggers.ctjs.api.inventory.action.Action { + interface DropAction extends com.chattriggers.ctjs.api.inventory.action.Action { getHoldingCtrl(): boolean; /** * Whether the click should act as if control is being held (defaults to false) - * + * * @param holdingCtrl to hold ctrl or not */ setHoldingCtrl(holdingCtrl: boolean): com.chattriggers.ctjs.api.inventory.action.DropAction; @@ -45230,12 +45230,12 @@ declare global { const KeyAction: { new(slot: number, windowId: number): com.chattriggers.ctjs.api.inventory.action.KeyAction; } - interface KeyAction extends com.chattriggers.ctjs.api.inventory.action.Action { + interface KeyAction extends com.chattriggers.ctjs.api.inventory.action.Action { getKey(): number; /** * Which key to act as if has been clicked (REQUIRED). * Options currently are 0-8, representing the hotbar keys - * + * * @param key which key to "click" */ setKey(key: number): com.chattriggers.ctjs.api.inventory.action.KeyAction; @@ -45245,7 +45245,7 @@ declare global { const NBTBase: { new(mcValue: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; } - interface NBTBase extends com.chattriggers.ctjs.api.CTWrapper { + interface NBTBase extends com.chattriggers.ctjs.api.CTWrapper { /** * Gets the type byte for the tag. */ @@ -45264,7 +45264,7 @@ declare global { fromMC(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; new(): com.chattriggers.ctjs.api.inventory.nbt.NBTBase$Companion; } - interface NBTBase$Companion { + interface NBTBase$Companion { fromMC(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; new(): com.chattriggers.ctjs.api.inventory.nbt.NBTBase$Companion; toObject(): any | null | undefined; @@ -45275,7 +45275,7 @@ declare global { NBTDataType: typeof com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; new(mcValue: net.minecraft.nbt.CompoundTag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound; } - interface NBTTagCompound extends com.chattriggers.ctjs.api.inventory.nbt.NBTBase { + interface NBTTagCompound extends com.chattriggers.ctjs.api.inventory.nbt.NBTBase { getTagMap(): Map; getKeySet(): Set; getTag(key: string): com.chattriggers.ctjs.api.inventory.nbt.NBTBase | null | undefined; @@ -45314,7 +45314,7 @@ declare global { const NBTTagList: { new(mcValue: net.minecraft.nbt.ListTag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; } - interface NBTTagList extends com.chattriggers.ctjs.api.inventory.nbt.NBTBase { + interface NBTTagList extends com.chattriggers.ctjs.api.inventory.nbt.NBTBase { getTagCount(): number; appendTag(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; appendTag(nbt: net.minecraft.nbt.Tag): com.chattriggers.ctjs.api.inventory.nbt.NBTTagList; @@ -45354,12 +45354,12 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.inventory.nbt.NBTTagCompound$NBTDataType; } - interface NBTTagCompound$NBTDataType extends kotlin.Enum { + interface NBTTagCompound$NBTDataType extends kotlin.Enum { } const NBT: { /** * Creates a new [NBTBase] from the given [nbt] - * + * * @param nbt the value to convert to NBT * @param options optional argument to allow refinement of the NBT data. * Possible options include: @@ -45369,14 +45369,14 @@ declare global { * - preferArraysOverLists: Boolean, default false * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or * NBTTagIntArray accordingly - * + * * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. */ parse(nbt: any): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; /** * Creates a new [NBTBase] from the given [nbt] - * + * * @param nbt the value to convert to NBT * @param options optional argument to allow refinement of the NBT data. * Possible options include: @@ -45386,7 +45386,7 @@ declare global { * - preferArraysOverLists: Boolean, default false * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or * NBTTagIntArray accordingly - * + * * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. */ @@ -45395,10 +45395,10 @@ declare global { toArray(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTTagList): org.mozilla.javascript.NativeArray; new(): com.chattriggers.ctjs.api.inventory.nbt.NBT; } - interface NBT { + interface NBT { /** * Creates a new [NBTBase] from the given [nbt] - * + * * @param nbt the value to convert to NBT * @param options optional argument to allow refinement of the NBT data. * Possible options include: @@ -45408,14 +45408,14 @@ declare global { * - preferArraysOverLists: Boolean, default false * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or * NBTTagIntArray accordingly - * + * * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. */ parse(nbt: any): com.chattriggers.ctjs.api.inventory.nbt.NBTBase; /** * Creates a new [NBTBase] from the given [nbt] - * + * * @param nbt the value to convert to NBT * @param options optional argument to allow refinement of the NBT data. * Possible options include: @@ -45425,7 +45425,7 @@ declare global { * - preferArraysOverLists: Boolean, default false * E.g. a list with all bytes or integers will be converted to an NBTTagByteArray or * NBTTagIntArray accordingly - * + * * @return [NBTTagCompound] if [nbt] is an object, [NBTTagList] if [nbt] * is an array and preferArraysOverLists is false, or [NBTBase] otherwise. */ @@ -45438,7 +45438,7 @@ declare global { const Slot: { new(mcValue: net.minecraft.world.inventory.Slot): com.chattriggers.ctjs.api.inventory.Slot; } - interface Slot extends com.chattriggers.ctjs.api.CTWrapper { + interface Slot extends com.chattriggers.ctjs.api.CTWrapper { getIndex(): number; getDisplayX(): number; getDisplayY(): number; @@ -45450,20 +45450,20 @@ declare global { new(inventory: net.minecraft.world.Container): com.chattriggers.ctjs.api.inventory.Inventory; new(container: net.minecraft.client.gui.screens.inventory.AbstractContainerScreen): com.chattriggers.ctjs.api.inventory.Inventory; } - interface Inventory { + interface Inventory { getInventory(): net.minecraft.world.Container; getScreen(): net.minecraft.client.gui.screens.inventory.AbstractContainerScreen | null | undefined; /** * Gets the total size of the Inventory. * The player's inventory size is 36, 27 for the main inventory, plus 9 for the hotbar. * A single chest's size would be 63, because it also counts the player's inventory. - * + * * @return the size of the Inventory */ getSize(): number; /** * Gets the item in any slot, starting from 0. - * + * * @param slot the slot index * @return the [Item] in that slot, or null if there is no item */ @@ -45471,13 +45471,13 @@ declare global { /** * Returns the window identifier number of this Inventory. * This Inventory must be backed by a HandledScreen [isScreen] - * + * * @return the window id */ getWindowId(): number; /** * Checks if an item can be shift clicked into a certain slot, i.e. coal into the bottom of a furnace. - * + * * @param slot the slot index * @param item the item for checking * @return whether it can be shift clicked in @@ -45489,14 +45489,14 @@ declare global { getItems(): Array; /** * Checks whether the inventory contains the given item. - * + * * @param item the item to check for * @return whether the inventory contains the item */ contains(item: com.chattriggers.ctjs.api.inventory.Item): boolean; /** * Checks whether the inventory contains an item with ID. - * + * * @param id the ID of the item to match * @return whether the inventory contains an item with ID */ @@ -45504,7 +45504,7 @@ declare global { /** * Gets the index of any item in the inventory, and returns the slot number. * Returns -1 if the inventory does not contain the item. - * + * * @param item the item to check for * @return the index of the given item */ @@ -45512,7 +45512,7 @@ declare global { /** * Gets the index of any item in the inventory with matching ID, and returns the slot number. * Returns -1 if the inventory does not contain the item. - * + * * @param id the item ID to check for * @return the index of the given item with ID */ @@ -45520,13 +45520,13 @@ declare global { /** * Returns true if this Inventory wraps a [HandledScreen] object * rather than an [MCInventory] object - * + * * @return if this is a container */ isScreen(): boolean; /** * Shorthand for [ClickAction] - * + * * @param slot the slot to click on * @param button the mouse button to use. "LEFT" by default. * @param shift whether shift is being held. False by default @@ -45535,7 +45535,7 @@ declare global { click(slot: number): com.chattriggers.ctjs.api.inventory.Inventory; /** * Shorthand for [ClickAction] - * + * * @param slot the slot to click on * @param button the mouse button to use. "LEFT" by default. * @param shift whether shift is being held. False by default @@ -45544,7 +45544,7 @@ declare global { click(slot: number, shift: boolean): com.chattriggers.ctjs.api.inventory.Inventory; /** * Shorthand for [ClickAction] - * + * * @param slot the slot to click on * @param button the mouse button to use. "LEFT" by default. * @param shift whether shift is being held. False by default @@ -45553,7 +45553,7 @@ declare global { click(slot: number, shift: boolean, button: string): com.chattriggers.ctjs.api.inventory.Inventory; /** * Shorthand for [DropAction] - * + * * @param slot the slot to drop * @param ctrl whether control should be held (drops whole stack) * @return this inventory for method chaining @@ -45561,7 +45561,7 @@ declare global { drop(slot: number, ctrl: boolean): com.chattriggers.ctjs.api.inventory.Inventory; /** * Shorthand for [DragAction] - * + * * @param type what click type this should be: LEFT, MIDDLE, RIGHT * @param slots all of the slots to drag onto * @return this inventory for method chaining @@ -45569,7 +45569,7 @@ declare global { drag(type: string, slots: number): com.chattriggers.ctjs.api.inventory.Inventory; /** * Gets the name of the inventory, simply "container" for most chest-like blocks. - * + * * @return the name of the inventory */ getName(): com.chattriggers.ctjs.api.message.TextComponent; @@ -45579,7 +45579,7 @@ declare global { new(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item; new(type: com.chattriggers.ctjs.api.inventory.ItemType): com.chattriggers.ctjs.api.inventory.Item; } - interface Item extends com.chattriggers.ctjs.api.CTWrapper { + interface Item extends com.chattriggers.ctjs.api.CTWrapper { getType(): com.chattriggers.ctjs.api.inventory.ItemType; getStackSize(): number; setStackSize(size: number): com.chattriggers.ctjs.api.inventory.Item; @@ -45613,7 +45613,7 @@ declare global { new(id: number): com.chattriggers.ctjs.api.inventory.ItemType; new(blockType: com.chattriggers.ctjs.api.world.block.BlockType): com.chattriggers.ctjs.api.inventory.ItemType; } - interface ItemType extends com.chattriggers.ctjs.api.CTWrapper { + interface ItemType extends com.chattriggers.ctjs.api.CTWrapper { getName(): string; getNameComponent(): com.chattriggers.ctjs.api.message.TextComponent; getId(): number; @@ -45625,7 +45625,7 @@ declare global { fromMC(mcValue: net.minecraft.world.item.Item): com.chattriggers.ctjs.api.inventory.ItemType | null | undefined; new(): com.chattriggers.ctjs.api.inventory.ItemType$Companion; } - interface ItemType$Companion { + interface ItemType$Companion { fromMC(mcValue: net.minecraft.world.item.Item): com.chattriggers.ctjs.api.inventory.ItemType | null | undefined; new(): com.chattriggers.ctjs.api.inventory.ItemType$Companion; } @@ -45633,7 +45633,7 @@ declare global { fromMC(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item | null | undefined; new(): com.chattriggers.ctjs.api.inventory.Item$Companion; } - interface Item$Companion { + interface Item$Companion { fromMC(mcValue: net.minecraft.world.item.ItemStack): com.chattriggers.ctjs.api.inventory.Item | null | undefined; new(): com.chattriggers.ctjs.api.inventory.Item$Companion; } @@ -45664,12 +45664,12 @@ declare global { * - hoverEvent: object with { action: [HoverEvent.Action], string format of a [HoverEvent.Action], or null, value: string or null } * - insertion: string or null * - font: string format of an [net.minecraft.util.Identifier] - * + * * @see Style */ new(parts: any): com.chattriggers.ctjs.api.message.TextComponent; } - interface TextComponent extends net.minecraft.network.chat.Component, kotlin.collections.Iterable { + interface TextComponent extends net.minecraft.network.chat.Component, kotlin.collections.Iterable { /** * Returns the text of all parts concatenated without formatting codes. */ @@ -45683,7 +45683,7 @@ declare global { * If this [TextComponent] is recursive, sending this instance (via [chat] or * [actionBar]) may trigger other `chat` triggers as if it had been received by * the server. [TextComponent]s are non-recursive by default. - * + * * @return true if the message can trigger other triggers. */ isRecursive(): boolean; @@ -45691,7 +45691,7 @@ declare global { * Get the chat line ID of this message, if it exists. The chat line can be used * to easily edit or delete a message later via [ChatLib.editChat] and * [ChatLib.deleteChat]. - * + * * @return the chat line ID of the message, or -1 if this [TextComponent] does * not have an associated chat line ID. */ @@ -45706,13 +45706,13 @@ declare global { withChatLineId(id: number): com.chattriggers.ctjs.api.message.TextComponent; /** * Sets whether the message can trigger other triggers. - * + * * @param recursive true if message can trigger other triggers. */ withRecursive(): com.chattriggers.ctjs.api.message.TextComponent; /** * Sets whether the message can trigger other triggers. - * + * * @param recursive true if message can trigger other triggers. */ withRecursive(recursive: boolean): com.chattriggers.ctjs.api.message.TextComponent; @@ -45745,19 +45745,19 @@ declare global { edit(parts: any): com.chattriggers.ctjs.api.message.TextComponent; /** * Sends this [TextComponent] to the players chat. - * + * * Note that this is purely client-side, and will not be sent to the server. If [isRecursive], * will trigger any matching `chat` triggers - * + * * @see ChatLib.chat * @see ChatLib.say */ chat(): com.chattriggers.ctjs.api.message.TextComponent; /** * Sends this [TextComponent] to the players action bar. - * + * * If [isRecursive], will trigger any matching `actionBar` triggers - * + * * @see ChatLib.actionBar */ actionBar(): com.chattriggers.ctjs.api.message.TextComponent; @@ -45771,27 +45771,27 @@ declare global { /** * Prints text in the chat. * The text can be a String or a [TextComponent] - * + * * @param text the text to be printed */ chat(text: any | null | undefined): void; /** * Shows text in the action bar. * The text can be a String or a [TextComponent] - * + * * @param text the text to show */ actionBar(text: any | null | undefined): void; /** * Simulates a chat message to be caught by other triggers for testing. * The text can be a String or a [TextComponent] - * + * * @param text The message to simulate */ simulateChat(text: any | null | undefined): void; /** * Replaces the easier to type '&' color codes with proper color codes in a string. - * + * * @param message The string to add color codes to * @return the formatted message */ @@ -45799,20 +45799,20 @@ declare global { /** * Says chat message. * This message is actually sent to the server. - * + * * @param text the message to be sent */ say(text: string): void; /** * Runs a command. - * + * * @param text the command to run, without the leading slash (Ex. "help") * @param clientSide should the command be run as a client side command */ command(text: string): void; /** * Runs a command. - * + * * @param text the command to run, without the leading slash (Ex. "help") * @param clientSide should the command be run as a client side command */ @@ -45825,7 +45825,7 @@ declare global { * Get a message that will be perfectly one line of chat, * the separator repeated as many times as necessary. * The separator defaults to "-" - * + * * @param separator the message to split chat with * @return the message that would split chat */ @@ -45834,68 +45834,68 @@ declare global { * Get a message that will be perfectly one line of chat, * the separator repeated as many times as necessary. * The separator defaults to "-" - * + * * @param separator the message to split chat with * @return the message that would split chat */ getChatBreak(separator: string): string; /** * Gets the width of Minecraft's chat - * + * * @return the width of chat */ getChatWidth(): number; /** * Remove all formatting - * + * * @param text the string to un-format * @return the unformatted string */ removeFormatting(text: string): string; /** * Replaces Minecraft formatted text with normal formatted text - * + * * @param text the formatted string * @return the unformatted string */ replaceFormatting(text: string): string; /** * Get a message that will be perfectly centered in chat. - * + * * @param text the text to be centered * @return the centered message */ getCenteredText(text: string): string; /** * Copies the given String to the user's clipboard - * + * * @param text the text to copy */ copyToClipboard(text: string): void; /** * Edits an already sent chat message matched by [regexp]. - * + * * @param regexp the regex object to match to the message * @param replacements the new message(s) to be put in replace of the old one */ editChat(regexp: org.mozilla.javascript.regexp.NativeRegExp, replacements: any): void; /** * Edits an already sent chat message by the text of the chat - * + * * @param toReplace the unformatted text of the message to be replaced * @param replacements the new message(s) to be put in place of the old one */ editChat(toReplace: string, replacements: any): void; /** * Edits an already sent chat message by the [TextComponent] - * + * * @param toReplace the message to be replaced * @param replacements the new message(s) to be put in place of the old one */ editChat(toReplace: com.chattriggers.ctjs.api.message.TextComponent, replacements: any): void; /** * Edits an already sent chat message by its chat line id - * + * * @param chatLineId the chat line id of the message to be replaced * @param replacements the new message(s) to be put in place of the old one */ @@ -45903,52 +45903,52 @@ declare global { /** * Edits an already sent chat message by given a callback that receives * [TextComponent] instances - * + * * @param matcher a function that accepts a [TextComponent] and returns a boolean * @param replacements the new message(s) to be put in place of the old one */ editChat(matcher: kotlin.Function1, replacements: any): void; /** * Deletes an already sent chat message matching [regexp]. - * + * * @param regexp the regex object to match to the message */ deleteChat(regexp: org.mozilla.javascript.regexp.NativeRegExp): void; /** * Deletes an already sent chat message by the text of the chat - * + * * @param toDelete the unformatted text of the message to be deleted */ deleteChat(toDelete: string): void; /** * Deletes an already sent chat message by the [TextComponent] - * + * * @param toDelete the message to be deleted */ deleteChat(toDelete: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Deletes an already sent chat message by its chat line id - * + * * @param chatLineId the chat line id of the message to be deleted */ deleteChat(chatLineId: number): void; /** * Deletes an already sent chat message given a callback that receives * [TextComponent] instances - * + * * @param matcher a function that accepts a [TextComponent] and returns a boolean */ deleteChat(matcher: kotlin.Function1): void; /** * Gets the previous 1000 lines of chat - * + * * @return A list of the last 1000 chat lines */ getChatLines(): Array; /** * Adds a message to the player's chat history. This allows the message to * show up for the player when pressing the up/down keys while in the chat gui - * + * * @param index the index to insert the message * @param message the message to add to chat history */ @@ -45956,38 +45956,38 @@ declare global { /** * Adds a message to the player's chat history. This allows the message to * show up for the player when pressing the up/down keys while in the chat gui - * + * * @param index the index to insert the message * @param message the message to add to chat history */ addToSentMessageHistory(index: number, message: string): void; new(): com.chattriggers.ctjs.api.message.ChatLib; } - interface ChatLib { + interface ChatLib { /** * Prints text in the chat. * The text can be a String or a [TextComponent] - * + * * @param text the text to be printed */ chat(text: any | null | undefined): void; /** * Shows text in the action bar. * The text can be a String or a [TextComponent] - * + * * @param text the text to show */ actionBar(text: any | null | undefined): void; /** * Simulates a chat message to be caught by other triggers for testing. * The text can be a String or a [TextComponent] - * + * * @param text The message to simulate */ simulateChat(text: any | null | undefined): void; /** * Replaces the easier to type '&' color codes with proper color codes in a string. - * + * * @param message The string to add color codes to * @return the formatted message */ @@ -45995,20 +45995,20 @@ declare global { /** * Says chat message. * This message is actually sent to the server. - * + * * @param text the message to be sent */ say(text: string): void; /** * Runs a command. - * + * * @param text the command to run, without the leading slash (Ex. "help") * @param clientSide should the command be run as a client side command */ command(text: string): void; /** * Runs a command. - * + * * @param text the command to run, without the leading slash (Ex. "help") * @param clientSide should the command be run as a client side command */ @@ -46021,7 +46021,7 @@ declare global { * Get a message that will be perfectly one line of chat, * the separator repeated as many times as necessary. * The separator defaults to "-" - * + * * @param separator the message to split chat with * @return the message that would split chat */ @@ -46030,68 +46030,68 @@ declare global { * Get a message that will be perfectly one line of chat, * the separator repeated as many times as necessary. * The separator defaults to "-" - * + * * @param separator the message to split chat with * @return the message that would split chat */ getChatBreak(separator: string): string; /** * Gets the width of Minecraft's chat - * + * * @return the width of chat */ getChatWidth(): number; /** * Remove all formatting - * + * * @param text the string to un-format * @return the unformatted string */ removeFormatting(text: string): string; /** * Replaces Minecraft formatted text with normal formatted text - * + * * @param text the formatted string * @return the unformatted string */ replaceFormatting(text: string): string; /** * Get a message that will be perfectly centered in chat. - * + * * @param text the text to be centered * @return the centered message */ getCenteredText(text: string): string; /** * Copies the given String to the user's clipboard - * + * * @param text the text to copy */ copyToClipboard(text: string): void; /** * Edits an already sent chat message matched by [regexp]. - * + * * @param regexp the regex object to match to the message * @param replacements the new message(s) to be put in replace of the old one */ editChat(regexp: org.mozilla.javascript.regexp.NativeRegExp, replacements: any): void; /** * Edits an already sent chat message by the text of the chat - * + * * @param toReplace the unformatted text of the message to be replaced * @param replacements the new message(s) to be put in place of the old one */ editChat(toReplace: string, replacements: any): void; /** * Edits an already sent chat message by the [TextComponent] - * + * * @param toReplace the message to be replaced * @param replacements the new message(s) to be put in place of the old one */ editChat(toReplace: com.chattriggers.ctjs.api.message.TextComponent, replacements: any): void; /** * Edits an already sent chat message by its chat line id - * + * * @param chatLineId the chat line id of the message to be replaced * @param replacements the new message(s) to be put in place of the old one */ @@ -46099,52 +46099,52 @@ declare global { /** * Edits an already sent chat message by given a callback that receives * [TextComponent] instances - * + * * @param matcher a function that accepts a [TextComponent] and returns a boolean * @param replacements the new message(s) to be put in place of the old one */ editChat(matcher: kotlin.Function1, replacements: any): void; /** * Deletes an already sent chat message matching [regexp]. - * + * * @param regexp the regex object to match to the message */ deleteChat(regexp: org.mozilla.javascript.regexp.NativeRegExp): void; /** * Deletes an already sent chat message by the text of the chat - * + * * @param toDelete the unformatted text of the message to be deleted */ deleteChat(toDelete: string): void; /** * Deletes an already sent chat message by the [TextComponent] - * + * * @param toDelete the message to be deleted */ deleteChat(toDelete: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Deletes an already sent chat message by its chat line id - * + * * @param chatLineId the chat line id of the message to be deleted */ deleteChat(chatLineId: number): void; /** * Deletes an already sent chat message given a callback that receives * [TextComponent] instances - * + * * @param matcher a function that accepts a [TextComponent] and returns a boolean */ deleteChat(matcher: kotlin.Function1): void; /** * Gets the previous 1000 lines of chat - * + * * @return A list of the last 1000 chat lines */ getChatLines(): Array; /** * Adds a message to the player's chat history. This allows the message to * show up for the player when pressing the up/down keys while in the chat gui - * + * * @param index the index to insert the message * @param message the message to add to chat history */ @@ -46152,7 +46152,7 @@ declare global { /** * Adds a message to the player's chat history. This allows the message to * show up for the player when pressing the up/down keys while in the chat gui - * + * * @param index the index to insert the message * @param message the message to add to chat history */ @@ -46163,7 +46163,7 @@ declare global { sendGradientMsg(prefix: string, startRgb: number, endRgb: number, messages: any): void; new(): com.chattriggers.ctjs.api.message.Chat; } - interface Chat { + interface Chat { sendGradientMsg(prefix: string, startRgb: number, endRgb: number, messages: any): void; new(): com.chattriggers.ctjs.api.message.Chat; } @@ -46177,11 +46177,11 @@ declare global { new(blockID: number): com.chattriggers.ctjs.api.world.block.BlockType; new(item: com.chattriggers.ctjs.api.inventory.Item): com.chattriggers.ctjs.api.world.block.BlockType; } - interface BlockType extends com.chattriggers.ctjs.api.CTWrapper { + interface BlockType extends com.chattriggers.ctjs.api.CTWrapper { /** * Returns a [Block] based on this block and the * provided BlockPos - * + * * @param blockPos the block position * @return a [Block] object */ @@ -46190,21 +46190,21 @@ declare global { /** * Gets the block's registry name. * Example: minecraft:oak_planks - * + * * @return the block's registry name */ getRegistryName(): string; /** * Gets the block's translation key. * Example: block.minecraft.oak_planks - * + * * @return the block's translation key */ getTranslationKey(): string; /** * Gets the block's localized name. * Example: Wooden Planks - * + * * @return the block's localized name */ getName(): string; @@ -46220,7 +46220,7 @@ declare global { new(pos: net.minecraft.core.BlockPos): com.chattriggers.ctjs.api.world.block.BlockPos; new(source: com.chattriggers.ctjs.api.entity.Entity): com.chattriggers.ctjs.api.world.block.BlockPos; } - interface BlockPos extends com.chattriggers.ctjs.api.vec.Vec3i, com.chattriggers.ctjs.api.CTWrapper { + interface BlockPos extends com.chattriggers.ctjs.api.vec.Vec3i, com.chattriggers.ctjs.api.CTWrapper { up(): com.chattriggers.ctjs.api.world.block.BlockPos; up(n: number): com.chattriggers.ctjs.api.world.block.BlockPos; down(): com.chattriggers.ctjs.api.world.block.BlockPos; @@ -46252,7 +46252,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace; } - interface BlockFace extends kotlin.Enum, net.minecraft.util.StringRepresentable, com.chattriggers.ctjs.api.CTWrapper { + interface BlockFace extends kotlin.Enum, net.minecraft.util.StringRepresentable, com.chattriggers.ctjs.api.CTWrapper { getAxisDirection(): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; getAxis(): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; getDirectionVec(): com.chattriggers.ctjs.api.vec.Vec3i; @@ -46272,14 +46272,14 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; } - interface BlockFace$AxisDirection extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + interface BlockFace$AxisDirection extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { getOffset(): number; } const BlockFace$AxisDirection$Companion: { fromMC(axisDirection: net.minecraft.core.Direction$AxisDirection): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; new(): unknown; } - interface BlockFace$AxisDirection$Companion { + interface BlockFace$AxisDirection$Companion { fromMC(axisDirection: net.minecraft.core.Direction$AxisDirection): com.chattriggers.ctjs.api.world.block.BlockFace$AxisDirection; new(): unknown; } @@ -46291,7 +46291,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; } - interface BlockFace$Axis extends kotlin.Enum, net.minecraft.util.StringRepresentable, com.chattriggers.ctjs.api.CTWrapper { + interface BlockFace$Axis extends kotlin.Enum, net.minecraft.util.StringRepresentable, com.chattriggers.ctjs.api.CTWrapper { getPlane(): com.chattriggers.ctjs.api.world.block.BlockFace$Plane; isHorizontal(): boolean; isVertical(): boolean; @@ -46303,14 +46303,14 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.world.block.BlockFace$Plane; } - interface BlockFace$Plane extends kotlin.Enum, kotlin.collections.Iterable { + interface BlockFace$Plane extends kotlin.Enum, kotlin.collections.Iterable { facings(): Array; } const BlockFace$Axis$Companion: { fromMC(axis: net.minecraft.core.Direction$Axis): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; new(): unknown; } - interface BlockFace$Axis$Companion { + interface BlockFace$Axis$Companion { fromMC(axis: net.minecraft.core.Direction$Axis): com.chattriggers.ctjs.api.world.block.BlockFace$Axis; new(): unknown; } @@ -46318,14 +46318,14 @@ declare global { fromMC(facing: net.minecraft.core.Direction): com.chattriggers.ctjs.api.world.block.BlockFace; new(): com.chattriggers.ctjs.api.world.block.BlockFace$Companion; } - interface BlockFace$Companion { + interface BlockFace$Companion { fromMC(facing: net.minecraft.core.Direction): com.chattriggers.ctjs.api.world.block.BlockFace; new(): com.chattriggers.ctjs.api.world.block.BlockFace$Companion; } const Block: { new(type: com.chattriggers.ctjs.api.world.block.BlockType, pos: com.chattriggers.ctjs.api.world.block.BlockPos, face: com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined): com.chattriggers.ctjs.api.world.block.Block; } - interface Block { + interface Block { getType(): com.chattriggers.ctjs.api.world.block.BlockType; getPos(): com.chattriggers.ctjs.api.world.block.BlockPos; getFace(): com.chattriggers.ctjs.api.world.block.BlockFace | null | undefined; @@ -46349,7 +46349,7 @@ declare global { getReceivingPower(): number; /** * Checks whether the block can be mined with the tool in the player's hand - * + * * @return whether the block can be mined */ canBeHarvested(): boolean; @@ -46360,7 +46360,7 @@ declare global { const HypixelManager: { new(): com.chattriggers.ctjs.api.world.pathfinding.HypixelManager; } - interface HypixelManager { + interface HypixelManager { new(): com.chattriggers.ctjs.api.world.pathfinding.HypixelManager; init(): void; onDisconnect(): void; @@ -46372,7 +46372,7 @@ declare global { flagsShortForStateId(stateId: number): number; new(): com.chattriggers.ctjs.api.world.pathfinding.NativeStateEncoder; } - interface NativeStateEncoder { + interface NativeStateEncoder { flagsForStateId(stateId: number): number; flagsForState(state: net.minecraft.world.level.block.state.BlockState): number; flagsShortForState(state: net.minecraft.world.level.block.state.BlockState): number; @@ -46382,7 +46382,7 @@ declare global { const NativeVoxelFlags: { new(): com.chattriggers.ctjs.api.world.pathfinding.NativeVoxelFlags; } - interface NativeVoxelFlags { + interface NativeVoxelFlags { new(): com.chattriggers.ctjs.api.world.pathfinding.NativeVoxelFlags; getPASSABLE(): number; getSOLID(): number; @@ -46401,7 +46401,7 @@ declare global { const WorldSerializer: { new(): com.chattriggers.ctjs.api.world.pathfinding.WorldSerializer; } - interface WorldSerializer { + interface WorldSerializer { new(): com.chattriggers.ctjs.api.world.pathfinding.WorldSerializer; save(name: string, chunks: Map): void; load(name: string): java.util.concurrent.ConcurrentHashMap | null | undefined; @@ -46412,7 +46412,7 @@ declare global { ready: boolean; new(minY: number, maxY: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk; } - interface CachedChunk { + interface CachedChunk { getFlags(localX: number, y: number, localZ: number): number; setFlags(localX: number, y: number, localZ: number, flags: number): void; hasSection(index: number): boolean; @@ -46423,7 +46423,7 @@ declare global { AIR_FLAGS: number; new(): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk$Companion; } - interface CachedChunk$Companion { + interface CachedChunk$Companion { AIR_FLAGS: number; new(): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk$Companion; } @@ -46432,7 +46432,7 @@ declare global { centers: kotlin.DoubleArray; new(goals: Array, centers: kotlin.DoubleArray): com.chattriggers.ctjs.api.world.pathfinding.EtherwarpLandingCandidatesResult; } - interface EtherwarpLandingCandidatesResult { + interface EtherwarpLandingCandidatesResult { } const NativeEtherwarpResult: { path: Array; @@ -46442,7 +46442,7 @@ declare global { nanosecondsPerNode: number; new(path: Array, angles: kotlin.FloatArray, timeMs: number, nodesExplored: number, nanosecondsPerNode: number): com.chattriggers.ctjs.api.world.pathfinding.NativeEtherwarpResult; } - interface NativeEtherwarpResult { + interface NativeEtherwarpResult { } const NativePathfinderBridge: { NativePathSearchRequest: typeof com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest; @@ -46458,7 +46458,7 @@ declare global { cancelSearch(): void; new(): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge; } - interface NativePathfinderBridge { + interface NativePathfinderBridge { isAvailable(): boolean; getLastError(): string | null | undefined; setWorld(worldKey: string, minY: number, maxY: number): void; @@ -46473,7 +46473,7 @@ declare global { const NativePathfinderBridge$NativePathSearchRequest: { new(startPoints: Array, endPoints: Array, isFly: boolean, maxIterations: number, heuristicWeight: number, nonPrimaryStartPenalty: number, moveOrderOffset: number, avoidMeta: Array, avoidPenalty: kotlin.DoubleArray): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativePathSearchRequest; } - interface NativePathfinderBridge$NativePathSearchRequest { + interface NativePathfinderBridge$NativePathSearchRequest { getStartPoints(): Array; getEndPoints(): Array; isFly(): boolean; @@ -46507,12 +46507,12 @@ declare global { pathSignature: string; new(path: Array, keyPath: Array, timeMs: number, nodesExplored: number, nanosecondsPerNode: number, selectedStartIndex: number, pathFlags: Array, keyNodeFlags: Array, keyNodeMetrics: Array, pathSignature: string): com.chattriggers.ctjs.api.world.pathfinding.NativePathResult; } - interface NativePathResult { + interface NativePathResult { } const NativePathfinderBridge$NativeEtherwarpSearchRequest: { new(goalX: number, goalY: number, goalZ: number, startEyeX: number, startEyeY: number, startEyeZ: number, maxIterations: number, threadCount: number, yawStep: number, pitchStep: number, newNodeCost: number, heuristicWeight: number, rayLength: number, rewireEpsilon: number, eyeHeight: number): com.chattriggers.ctjs.api.world.pathfinding.NativePathfinderBridge$NativeEtherwarpSearchRequest; } - interface NativePathfinderBridge$NativeEtherwarpSearchRequest { + interface NativePathfinderBridge$NativeEtherwarpSearchRequest { getGoalX(): number; getGoalY(): number; getGoalZ(): number; @@ -46614,7 +46614,7 @@ declare global { clear(): void; new(): com.chattriggers.ctjs.api.world.pathfinding.PathManager; } - interface PathManager { + interface PathManager { isSearching(): boolean; findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number): boolean; findPath(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, maxIterations: number): boolean; @@ -46698,13 +46698,13 @@ declare global { const Swift: { new(): com.chattriggers.ctjs.api.world.pathfinding.Swift; } - interface Swift extends net.fabricmc.api.ClientModInitializer { + interface Swift extends net.fabricmc.api.ClientModInitializer { } const Swift$Companion: { executor: java.util.concurrent.ExecutorService; new(): com.chattriggers.ctjs.api.world.pathfinding.Swift$Companion; } - interface Swift$Companion { + interface Swift$Companion { executor: java.util.concurrent.ExecutorService; new(): com.chattriggers.ctjs.api.world.pathfinding.Swift$Companion; getCHUNKS_PER_TICK(): number; @@ -46713,7 +46713,7 @@ declare global { const WynncraftManager: { new(): com.chattriggers.ctjs.api.world.pathfinding.WynncraftManager; } - interface WynncraftManager { + interface WynncraftManager { new(): com.chattriggers.ctjs.api.world.pathfinding.WynncraftManager; init(): void; onDisconnect(): void; @@ -46723,7 +46723,7 @@ declare global { getChunk(x: number, z: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk | null | undefined; new(): com.chattriggers.ctjs.api.world.pathfinding.CachedWorld; } - interface CachedWorld { + interface CachedWorld { getBlockFlags(x: number, y: number, z: number): number | null | undefined; getChunk(x: number, z: number): com.chattriggers.ctjs.api.world.pathfinding.CachedChunk | null | undefined; new(): com.chattriggers.ctjs.api.world.pathfinding.CachedWorld; @@ -46741,7 +46741,7 @@ declare global { const Chunk: { new(mcValue: net.minecraft.world.level.chunk.ChunkAccess): com.chattriggers.ctjs.api.world.Chunk; } - interface Chunk extends com.chattriggers.ctjs.api.CTWrapper { + interface Chunk extends com.chattriggers.ctjs.api.CTWrapper { /** * Gets the x position of the chunk */ @@ -46752,38 +46752,38 @@ declare global { getZ(): number; /** * Gets the minimum x coordinate of a block in the chunk - * + * * @return the minimum x coordinate */ getMinBlockX(): number; /** * Gets the minimum z coordinate of a block in the chunk - * + * * @return the minimum z coordinate */ getMinBlockZ(): number; /** * Gets every entity in this chunk - * + * * @return the entity list */ getAllEntities(): Array; /** * Gets every entity in this chunk of a certain class - * + * * @param clazz the class to filter for (Use `Java.type().class` to get this) * @return the entity list */ getAllEntitiesOfType(clazz: java.lang.Class): Array; /** * Gets every block entity in this chunk - * + * * @return the block entity list */ getAllBlockEntities(): Array; /** * Gets every block entity in this chunk of a certain class - * + * * @param clazz the class to filter for (Use `Java.type().class` to get this) * @return the block entity list */ @@ -46792,7 +46792,7 @@ declare global { const PotionEffectType: { new(type: net.minecraft.world.effect.MobEffect): com.chattriggers.ctjs.api.world.PotionEffectType; } - interface PotionEffectType { + interface PotionEffectType { getType(): net.minecraft.world.effect.MobEffect; /** * The Int associated with this type @@ -46822,7 +46822,7 @@ declare global { const PotionEffect: { new(effect: net.minecraft.world.effect.MobEffectInstance): com.chattriggers.ctjs.api.world.PotionEffect; } - interface PotionEffect { + interface PotionEffect { getEffect(): net.minecraft.world.effect.MobEffectInstance; /** * The type of this potion @@ -46853,20 +46853,20 @@ declare global { toMC(): net.minecraft.client.gui.components.BossHealthOverlay; /** * Gets the list of currently shown [BossBar]s - * + * * @return the currently displayed [BossBar]s */ getBossBars(): Array; /** * Gets all [BossBar]s with a given name - * + * * @param name the name to match * @return the [BossBar]s */ getBossBarsByName(name: string): Array; /** * Adds a new [BossBar] to be displayed - * + * * Takes a parameter with the following options: * - name: The name to appear above the BossBar. Defaults to an empty string * - percent: The percent full the BossBar is. Defaults to 1 (full health) @@ -46876,9 +46876,9 @@ declare global { * - darkenSky: Whether the BossBar should darken the screen of the player. Defaults to false * - dragonMusic: Whether the BossBar should play dragon music while in the End. Defaults to false * - thickenFog: Whether the BossBar should thicken the fog around the player. Defaults to false - * + * * @param obj An options bag - * + * * @return the [BossBar] for further modification */ addBossBar(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.world.BossBars$BossBar; @@ -46888,36 +46888,36 @@ declare global { clearBossBars(): void; /** * Removes all [BossBar]s with the given name - * + * * @param name the name to match */ removeBossBarsByName(name: string): void; /** * Removes the given [BossBar] - * + * * @param bossBar the BossBar to remove */ removeBossBar(bossBar: com.chattriggers.ctjs.api.world.BossBars$BossBar): void; new(): com.chattriggers.ctjs.api.world.BossBars; } - interface BossBars { + interface BossBars { toMC(): net.minecraft.client.gui.components.BossHealthOverlay; /** * Gets the list of currently shown [BossBar]s - * + * * @return the currently displayed [BossBar]s */ getBossBars(): Array; /** * Gets all [BossBar]s with a given name - * + * * @param name the name to match * @return the [BossBar]s */ getBossBarsByName(name: string): Array; /** * Adds a new [BossBar] to be displayed - * + * * Takes a parameter with the following options: * - name: The name to appear above the BossBar. Defaults to an empty string * - percent: The percent full the BossBar is. Defaults to 1 (full health) @@ -46927,9 +46927,9 @@ declare global { * - darkenSky: Whether the BossBar should darken the screen of the player. Defaults to false * - dragonMusic: Whether the BossBar should play dragon music while in the End. Defaults to false * - thickenFog: Whether the BossBar should thicken the fog around the player. Defaults to false - * + * * @param obj An options bag - * + * * @return the [BossBar] for further modification */ addBossBar(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.world.BossBars$BossBar; @@ -46939,13 +46939,13 @@ declare global { clearBossBars(): void; /** * Removes all [BossBar]s with the given name - * + * * @param name the name to match */ removeBossBarsByName(name: string): void; /** * Removes the given [BossBar] - * + * * @param bossBar the BossBar to remove */ removeBossBar(bossBar: com.chattriggers.ctjs.api.world.BossBars$BossBar): void; @@ -46954,34 +46954,34 @@ declare global { const BossBars$BossBar: { new(mcValue: net.minecraft.client.gui.components.LerpingBossEvent): com.chattriggers.ctjs.api.world.BossBars$BossBar; } - interface BossBars$BossBar extends com.chattriggers.ctjs.api.CTWrapper { + interface BossBars$BossBar extends com.chattriggers.ctjs.api.CTWrapper { /** * Gets the UUID of this BossBar - * + * * @return the uuid */ getUUID(): java.util.UUID; /** * Gets the name of this BossBar - * + * * @return the name */ getName(): string; /** * Sets the name of this BossBar - * + * * @param name the name to set */ setName(name: string): com.chattriggers.ctjs.api.world.BossBars$BossBar; /** * Gets how full this BossBar is - * + * * @return how full the BossBar is */ getPercent(): number; /** * Sets how full this BossBar is - * + * * @param percent how full to set this BossBar. Must be between 0 and 1 */ setPercent(percent: number): com.chattriggers.ctjs.api.world.BossBars$BossBar; @@ -46991,7 +46991,7 @@ declare global { getColor(): com.chattriggers.ctjs.api.world.BossBars$Color; /** * Sets the [Color] of this BossBar - * + * * @param color the color to set. Can be [Color], [MCBossBarColor], or a string */ setColor(color: any): com.chattriggers.ctjs.api.world.BossBars$BossBar; @@ -47001,7 +47001,7 @@ declare global { getStyle(): com.chattriggers.ctjs.api.world.BossBars$Style; /** * Sets the style of this BossBar - * + * * @param style the style to set. Can be [Style], [MCBossBarStyle], a string, * or a number of how many notches to put */ @@ -47012,7 +47012,7 @@ declare global { shouldDarkenSky(): boolean; /** * Sets whether this BossBar should darken the sky - * + * * @param darken whether to darken the sky */ setShouldDarkenSky(darken: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; @@ -47023,7 +47023,7 @@ declare global { hasDragonMusic(): boolean; /** * Sets whether this BossBar will play dragon music - * + * * @param music whether to play dragon music */ setHasDragonMusic(music: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; @@ -47033,7 +47033,7 @@ declare global { shouldThickenFog(): boolean; /** * Sets whether this BossBar should thicken the fog around the player - * + * * @param fog whether to thicken the fog */ setShouldThickenFog(fog: boolean): com.chattriggers.ctjs.api.world.BossBars$BossBar; @@ -47050,14 +47050,14 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.world.BossBars$Color; } - interface BossBars$Color extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + interface BossBars$Color extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { } const BossBars$Color$Companion: { fromMC(mcValue: net.minecraft.world.BossEvent$BossBarColor): com.chattriggers.ctjs.api.world.BossBars$Color; from(value: any): com.chattriggers.ctjs.api.world.BossBars$Color; new(): unknown; } - interface BossBars$Color$Companion { + interface BossBars$Color$Companion { fromMC(mcValue: net.minecraft.world.BossEvent$BossBarColor): com.chattriggers.ctjs.api.world.BossBars$Color; from(value: any): com.chattriggers.ctjs.api.world.BossBars$Color; new(): unknown; @@ -47072,7 +47072,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.world.BossBars$Style; } - interface BossBars$Style extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + interface BossBars$Style extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { getSections(): number; } const BossBars$Style$Companion: { @@ -47080,7 +47080,7 @@ declare global { from(value: any): com.chattriggers.ctjs.api.world.BossBars$Style; new(): unknown; } - interface BossBars$Style$Companion { + interface BossBars$Style$Companion { fromMC(mcValue: net.minecraft.world.BossEvent$BossBarOverlay): com.chattriggers.ctjs.api.world.BossBars$Style; from(value: any): com.chattriggers.ctjs.api.world.BossBars$Style; new(): unknown; @@ -47091,61 +47091,61 @@ declare global { /** * Gets the current server's IP, or "localhost" if the player * is in a single-player world. - * + * * @return The IP of the current server */ getIP(): string; /** * Gets the current server's name, or "SinglePlayer" if the player * is in a single-player world. - * + * * @return The name of the current server */ getName(): string; /** * Gets the current server's MOTD, or "SinglePlayer" if the player * is in a single-player world. - * + * * @return The MOTD of the current server */ getMOTD(): string; /** * Gets the ping to the current server, or 5 if the player * is in a single-player world. Returns -1 if not in a world - * + * * @return The ping to the current server */ getPing(): number; new(): com.chattriggers.ctjs.api.world.Server; } - interface Server { + interface Server { toMC(): net.minecraft.client.multiplayer.ServerData | null | undefined; isSingleplayer(): boolean; /** * Gets the current server's IP, or "localhost" if the player * is in a single-player world. - * + * * @return The IP of the current server */ getIP(): string; /** * Gets the current server's name, or "SinglePlayer" if the player * is in a single-player world. - * + * * @return The name of the current server */ getName(): string; /** * Gets the current server's MOTD, or "SinglePlayer" if the player * is in a single-player world. - * + * * @return The MOTD of the current server */ getMOTD(): string; /** * Gets the ping to the current server, or 5 if the player * is in a single-player world. Returns -1 if not in a world - * + * * @return The ping to the current server */ getPing(): number; @@ -47165,7 +47165,7 @@ declare global { getTime(): number; /** * Gets the [Block] at a location in the world. - * + * * @param x the x position * @param y the y position * @param z the z position @@ -47174,7 +47174,7 @@ declare global { getBlockAt(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.Block; /** * Gets the [Block] at a location in the world. - * + * * @param pos The block position * @return the [Block] at the location */ @@ -47183,14 +47183,14 @@ declare global { getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number, types: Array): Array; /** * Gets the [BlockState] at a location in the world. - * + * * @param pos The block position * @return the [BlockState] at the location */ getBlockStateAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): net.minecraft.world.level.block.state.BlockState; /** * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu - * + * * @param x the x coordinate * @param y the y coordinate * @param z the z coordinate @@ -47199,14 +47199,14 @@ declare global { getSkyLightLevel(x: number, y: number, z: number): number; /** * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu - * + * * @param pos The block position * @return the skylight level at the location */ getSkyLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; /** * Gets the block light level at the given position. This is the value seen in the debug (F3) menu - * + * * @param x the x coordinate * @param y the y coordinate * @param z the z coordinate @@ -47215,20 +47215,20 @@ declare global { getBlockLightLevel(x: number, y: number, z: number): number; /** * Gets the block light level at the given position. This is the value seen in the debug (F3) menu - * + * * @param pos The block position * @return the block light level at the location */ getBlockLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; /** * Gets all of the players in the world, and returns their wrapped versions. - * + * * @return the players */ getAllPlayers(): Array; /** * Gets a player by their username, must be in the currently loaded chunks! - * + * * @param name the username * @return the player with said username, or null if they don't exist. */ @@ -47237,7 +47237,7 @@ declare global { getAllEntities(): Array; /** * Gets every entity loaded in the world of a certain class - * + * * @param clazz the class to filter for (Use `Java.type().class` to get this) * @return the entity list */ @@ -47246,14 +47246,14 @@ declare global { getAllBlockEntitiesOfType(clazz: java.lang.Class): Array; /** * Returns the TPS of the current world. - * + * * On modern version (1.20.3+), this is variable. On earlier versions, * it is always 20. */ getTicksPerSecond(): number; new(): com.chattriggers.ctjs.api.world.World; } - interface World { + interface World { spawn: com.chattriggers.ctjs.api.world.World$SpawnWrapper; particle: com.chattriggers.ctjs.api.world.World$ParticleWrapper; border: com.chattriggers.ctjs.api.world.World$BorderWrapper; @@ -47264,7 +47264,7 @@ declare global { getTime(): number; /** * Gets the [Block] at a location in the world. - * + * * @param x the x position * @param y the y position * @param z the z position @@ -47273,7 +47273,7 @@ declare global { getBlockAt(x: number, y: number, z: number): com.chattriggers.ctjs.api.world.block.Block; /** * Gets the [Block] at a location in the world. - * + * * @param pos The block position * @return the [Block] at the location */ @@ -47282,14 +47282,14 @@ declare global { getBlocksInBox(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number, types: Array): Array; /** * Gets the [BlockState] at a location in the world. - * + * * @param pos The block position * @return the [BlockState] at the location */ getBlockStateAt(pos: com.chattriggers.ctjs.api.world.block.BlockPos): net.minecraft.world.level.block.state.BlockState; /** * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu - * + * * @param x the x coordinate * @param y the y coordinate * @param z the z coordinate @@ -47298,14 +47298,14 @@ declare global { getSkyLightLevel(x: number, y: number, z: number): number; /** * Gets the skylight level at the given position. This is the value seen in the debug (F3) menu - * + * * @param pos The block position * @return the skylight level at the location */ getSkyLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; /** * Gets the block light level at the given position. This is the value seen in the debug (F3) menu - * + * * @param x the x coordinate * @param y the y coordinate * @param z the z coordinate @@ -47314,20 +47314,20 @@ declare global { getBlockLightLevel(x: number, y: number, z: number): number; /** * Gets the block light level at the given position. This is the value seen in the debug (F3) menu - * + * * @param pos The block position * @return the block light level at the location */ getBlockLightLevel(pos: com.chattriggers.ctjs.api.world.block.BlockPos): number; /** * Gets all of the players in the world, and returns their wrapped versions. - * + * * @return the players */ getAllPlayers(): Array; /** * Gets a player by their username, must be in the currently loaded chunks! - * + * * @param name the username * @return the player with said username, or null if they don't exist. */ @@ -47336,7 +47336,7 @@ declare global { getAllEntities(): Array; /** * Gets every entity loaded in the world of a certain class - * + * * @param clazz the class to filter for (Use `Java.type().class` to get this) * @return the entity list */ @@ -47345,7 +47345,7 @@ declare global { getAllBlockEntitiesOfType(clazz: java.lang.Class): Array; /** * Returns the TPS of the current world. - * + * * On modern version (1.20.3+), this is variable. On earlier versions, * it is always 20. */ @@ -47358,22 +47358,22 @@ declare global { */ new(): com.chattriggers.ctjs.api.world.World$SpawnWrapper; } - interface World$SpawnWrapper { + interface World$SpawnWrapper { /** * Gets the spawn x location. - * + * * @return the spawn x location. */ getX(): number; /** * Gets the spawn y location. - * + * * @return the spawn y location. */ getY(): number; /** * Gets the spawn z location. - * + * * @return the spawn z location. */ getZ(): number; @@ -47381,18 +47381,18 @@ declare global { const World$ParticleWrapper: { new(): com.chattriggers.ctjs.api.world.World$ParticleWrapper; } - interface World$ParticleWrapper { + interface World$ParticleWrapper { /** * Gets an array of all the different particle names you can pass * to [spawnParticle] - * + * * @return the array of name strings */ getParticleNames(): Array; /** * Spawns a particle into the world with the given attributes, * which can be configured further with the returned [com.chattriggers.ctjs.api.entity.Particle] - * + * * @param particle the name of the particle to spawn, see [getParticleNames] * @param x the x coordinate to spawn the particle at * @param y the y coordinate to spawn the particle at @@ -47411,22 +47411,22 @@ declare global { */ new(): com.chattriggers.ctjs.api.world.World$BorderWrapper; } - interface World$BorderWrapper { + interface World$BorderWrapper { /** * Gets the border center x location. - * + * * @return the border center x location */ getCenterX(): number; /** * Gets the border center z location. - * + * * @return the border center z location */ getCenterZ(): number; /** * Gets the border size. - * + * * @return the border size */ getSize(): number; @@ -47440,7 +47440,7 @@ declare global { shutdown(): void; new(): com.chattriggers.ctjs.api.world.StructureFinder; } - interface StructureFinder { + interface StructureFinder { submitChunkScan(chunkX: number, chunkZ: number): void; submitBlockUpdate(blockX: number, blockY: number, blockZ: number): void; getRenderBlocksArray(): Array; @@ -47458,66 +47458,66 @@ declare global { getObjective(): net.minecraft.world.scores.Objective | null | undefined; /** * Gets the tab list header as a [TextComponent] - * + * * @return the header */ getHeaderComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; /** * Gets the tab list header as a formatted string. - * + * * @return the header */ getHeader(): string | null | undefined; /** * Sets the header text for the TabList. * If [header] is null, it will remove the header entirely - * + * * @param header the header to set, or null to clear */ setHeader(header: any | null | undefined): void; clearHeader(): void; /** * Gets the tab list footer as a [TextComponent] - * + * * @return the footer */ getFooterComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; /** * Gets the tab list footer as a string. * Be aware that this can contain color codes. - * + * * @return the footer */ getFooter(): string | null | undefined; /** * Sets the footer text for the TabList. * If [footer] is null, it will remove the footer entirely - * + * * @param footer the footer to set, or null to clear */ setFooter(footer: any | null | undefined): void; clearFooter(): void; /** * Gets names set in scoreboard objectives - * + * * @return The formatted names */ getNamesByObjectives(): Array; /** * Get all names on the tab list - * + * * @return the list of names */ getNames(): Array; /** * Gets all names in tabs without formatting - * + * * @return the unformatted names */ getUnformattedNames(): Array; /** * Adds a new name to the tab list - * + * * @param name the formatted name to add * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. * If false, will use a random default skin (Steve, Alex, etc) @@ -47525,7 +47525,7 @@ declare global { addName(name: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Adds a new name to the tab list - * + * * @param name the formatted name to add * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. * If false, will use a random default skin (Steve, Alex, etc) @@ -47535,14 +47535,14 @@ declare global { addName(name: string, useExistingSkin: boolean): void; /** * Removes all names from the tab list with a certain name - * + * * @param name the name of the entry to remove */ removeNames(name: com.chattriggers.ctjs.api.message.TextComponent): void; removeNames(name: string): void; new(): com.chattriggers.ctjs.api.world.TabList; } - interface TabList { + interface TabList { toMC(): net.minecraft.client.gui.components.PlayerTabOverlay | null | undefined; /** * Gets the scoreboard objective corresponding to the tab list, or null if it doesn't exist @@ -47550,66 +47550,66 @@ declare global { getObjective(): net.minecraft.world.scores.Objective | null | undefined; /** * Gets the tab list header as a [TextComponent] - * + * * @return the header */ getHeaderComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; /** * Gets the tab list header as a formatted string. - * + * * @return the header */ getHeader(): string | null | undefined; /** * Sets the header text for the TabList. * If [header] is null, it will remove the header entirely - * + * * @param header the header to set, or null to clear */ setHeader(header: any | null | undefined): void; clearHeader(): void; /** * Gets the tab list footer as a [TextComponent] - * + * * @return the footer */ getFooterComponent(): com.chattriggers.ctjs.api.message.TextComponent | null | undefined; /** * Gets the tab list footer as a string. * Be aware that this can contain color codes. - * + * * @return the footer */ getFooter(): string | null | undefined; /** * Sets the footer text for the TabList. * If [footer] is null, it will remove the footer entirely - * + * * @param footer the footer to set, or null to clear */ setFooter(footer: any | null | undefined): void; clearFooter(): void; /** * Gets names set in scoreboard objectives - * + * * @return The formatted names */ getNamesByObjectives(): Array; /** * Get all names on the tab list - * + * * @return the list of names */ getNames(): Array; /** * Gets all names in tabs without formatting - * + * * @return the unformatted names */ getUnformattedNames(): Array; /** * Adds a new name to the tab list - * + * * @param name the formatted name to add * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. * If false, will use a random default skin (Steve, Alex, etc) @@ -47617,7 +47617,7 @@ declare global { addName(name: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Adds a new name to the tab list - * + * * @param name the formatted name to add * @param useExistingSkin whether to use the skin of the associated Minecraft account using [name]. * If false, will use a random default skin (Steve, Alex, etc) @@ -47627,7 +47627,7 @@ declare global { addName(name: string, useExistingSkin: boolean): void; /** * Removes all names from the tab list with a certain name - * + * * @param name the name of the entry to remove */ removeNames(name: com.chattriggers.ctjs.api.message.TextComponent): void; @@ -47637,10 +47637,10 @@ declare global { const TabList$Name: { new(mcValue: net.minecraft.client.multiplayer.PlayerInfo): com.chattriggers.ctjs.api.world.TabList$Name; } - interface TabList$Name extends com.chattriggers.ctjs.api.CTWrapper { + interface TabList$Name extends com.chattriggers.ctjs.api.CTWrapper { /** * Gets the latency associated with this name - * + * * @return the latency */ getLatency(): number; @@ -47651,20 +47651,20 @@ declare global { * - latency between 300 and 599 represents 3 bars * - latency between 600 and 999 represents 2 bars * - latency between 1000 and more represents 1 bar - * + * * @param latency the latency to set * @return the name to allow for method chaining */ setLatency(latency: number): com.chattriggers.ctjs.api.world.TabList$Name; /** * Gets the team associated with this name, if it exists - * + * * @return the team, or null if it does not exist */ getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; /** * Sets the team associated with this name - * + * * @param team the new team to set for this name. Custom teams can be created * using [Scoreboard.createTeam] * @return the score to allow for method chaining @@ -47672,13 +47672,13 @@ declare global { setTeam(team: com.chattriggers.ctjs.api.entity.Team | null | undefined): com.chattriggers.ctjs.api.world.TabList$Name; /** * Gets the display text of this name - * + * * @return the display name */ getName(): com.chattriggers.ctjs.api.message.TextComponent; /** * Sets the display name of this name - * + * * @param name the new name * @return the name to allow for method chaining */ @@ -47695,13 +47695,13 @@ declare global { /** * Gets the top-most string which is displayed on the scoreboard. (doesn't have a score on the side). * Be aware that this can contain color codes. - * + * * @return the scoreboard title */ getTitle(): com.chattriggers.ctjs.api.message.TextComponent; /** * Sets the scoreboard title. - * + * * @param title the new title * @return the scoreboard title */ @@ -47710,21 +47710,21 @@ declare global { /** * Get all currently visible strings on the scoreboard. (excluding title) * Be aware that this can contain color codes. - * + * * @return the list of lines */ getLines(): Array; /** * Get all currently visible strings on the scoreboard. (excluding title) * Be aware that this can contain color codes. - * + * * @return the list of lines */ getLines(descending: boolean): Array; /** * Gets the line at the specified index (0 based) * Equivalent to Scoreboard.getLines().get(index) - * + * * @param index the line index * @return the score object at the index */ @@ -47732,14 +47732,14 @@ declare global { /** * Gets a list of lines that have a certain score, * i.e. the numbers shown on the right - * + * * @param score the score to look for * @return a list of actual score objects */ getLinesByScore(score: number): Array; /** * Sets a line in the scoreboard to the specified name and score. - * + * * @param score the score value for this item * @param line the [TextComponent] to display on said line * @param override whether to remove old lines with the same score @@ -47747,7 +47747,7 @@ declare global { setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Sets a line in the scoreboard to the specified name and score. - * + * * @param score the score value for this item * @param line the [TextComponent] to display on said line * @param override whether to remove old lines with the same score @@ -47757,7 +47757,7 @@ declare global { setLine(score: number, line: string, override: boolean): void; /** * Adds a line to the scoreboard - * + * * @param score the score value for this item * @param line the [TextComponent] to display on said line */ @@ -47765,19 +47765,19 @@ declare global { addLine(score: number, line: string): void; /** * Removes all lines from the scoreboard matching with a certain score - * + * * @param score the score of the lines to remove */ removeScores(score: number): void; /** * Removes the line at a certain index - * + * * @param index the index of the line to remove */ removeIndex(index: number): void; /** * Removes the line at a certain index - * + * * @param index the index of the line to remove */ removeIndex(index: number, descending: boolean): void; @@ -47785,25 +47785,25 @@ declare global { getShouldRender(): boolean; /** * Creates or gets a [Team] with a given name - * + * * @param name the name of the team */ createTeam(name: string): com.chattriggers.ctjs.api.entity.Team; new(): com.chattriggers.ctjs.api.world.Scoreboard; } - interface Scoreboard { + interface Scoreboard { toMC(): net.minecraft.world.scores.Scoreboard | null | undefined; getSidebar(): net.minecraft.world.scores.Objective | null | undefined; /** * Gets the top-most string which is displayed on the scoreboard. (doesn't have a score on the side). * Be aware that this can contain color codes. - * + * * @return the scoreboard title */ getTitle(): com.chattriggers.ctjs.api.message.TextComponent; /** * Sets the scoreboard title. - * + * * @param title the new title * @return the scoreboard title */ @@ -47812,21 +47812,21 @@ declare global { /** * Get all currently visible strings on the scoreboard. (excluding title) * Be aware that this can contain color codes. - * + * * @return the list of lines */ getLines(): Array; /** * Get all currently visible strings on the scoreboard. (excluding title) * Be aware that this can contain color codes. - * + * * @return the list of lines */ getLines(descending: boolean): Array; /** * Gets the line at the specified index (0 based) * Equivalent to Scoreboard.getLines().get(index) - * + * * @param index the line index * @return the score object at the index */ @@ -47834,14 +47834,14 @@ declare global { /** * Gets a list of lines that have a certain score, * i.e. the numbers shown on the right - * + * * @param score the score to look for * @return a list of actual score objects */ getLinesByScore(score: number): Array; /** * Sets a line in the scoreboard to the specified name and score. - * + * * @param score the score value for this item * @param line the [TextComponent] to display on said line * @param override whether to remove old lines with the same score @@ -47849,7 +47849,7 @@ declare global { setLine(score: number, line: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Sets a line in the scoreboard to the specified name and score. - * + * * @param score the score value for this item * @param line the [TextComponent] to display on said line * @param override whether to remove old lines with the same score @@ -47859,7 +47859,7 @@ declare global { setLine(score: number, line: string, override: boolean): void; /** * Adds a line to the scoreboard - * + * * @param score the score value for this item * @param line the [TextComponent] to display on said line */ @@ -47867,19 +47867,19 @@ declare global { addLine(score: number, line: string): void; /** * Removes all lines from the scoreboard matching with a certain score - * + * * @param score the score of the lines to remove */ removeScores(score: number): void; /** * Removes the line at a certain index - * + * * @param index the index of the line to remove */ removeIndex(index: number): void; /** * Removes the line at a certain index - * + * * @param index the index of the line to remove */ removeIndex(index: number, descending: boolean): void; @@ -47887,7 +47887,7 @@ declare global { getShouldRender(): boolean; /** * Creates or gets a [Team] with a given name - * + * * @param name the name of the team */ createTeam(name: string): com.chattriggers.ctjs.api.entity.Team; @@ -47896,16 +47896,16 @@ declare global { const Scoreboard$Score: { new(mcValue: net.minecraft.world.scores.ScoreAccess): com.chattriggers.ctjs.api.world.Scoreboard$Score; } - interface Scoreboard$Score extends com.chattriggers.ctjs.api.CTWrapper { + interface Scoreboard$Score extends com.chattriggers.ctjs.api.CTWrapper { /** * Gets the team associated with this score, if it exists - * + * * @return the team, or null if it does not exist */ getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; /** * Sets the team associated with this score - * + * * @param team the new team to set for this line. Custom teams can be created using [createTeam] * @return the score to allow for method chaining */ @@ -47913,43 +47913,43 @@ declare global { /** * Gets the score value for this score, * i.e. the number on the right of the board - * + * * @return the actual point value */ getScore(): number; /** * Sets the score value for this score - * + * * @param score the new point value * @return the score to allow for method chaining */ setScore(score: number): com.chattriggers.ctjs.api.world.Scoreboard$Score; /** * Gets the display text of this score - * + * * @return the display name */ getName(): com.chattriggers.ctjs.api.message.TextComponent; /** * Sets the name of this score - * + * * @param name the new name * @return the score to allow for method chaining */ setName(name: com.chattriggers.ctjs.api.message.TextComponent | null | undefined): com.chattriggers.ctjs.api.world.Scoreboard$Score; /** * Gets the number format of this score - * + * * @return the number format */ getNumberFormat(): net.minecraft.network.chat.numbers.NumberFormat | null | undefined; /** * Sets the number format of this score - * + * * @param format either a formatting string, i.e. "&6", style in the form of an object, see [TextComponent], a * [NumberFormat], or hex value * @return the score to allow for method chaining - * + * * @see [TextComponent] */ setNumberFormat(format: any | null | undefined): com.chattriggers.ctjs.api.world.Scoreboard$Score; @@ -47966,7 +47966,7 @@ declare global { new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec3i; new(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3i; } - interface Vec3i { + interface Vec3i { getX(): number; getY(): number; getZ(): number; @@ -47989,7 +47989,7 @@ declare global { new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec3f; new(x: number, y: number, z: number): com.chattriggers.ctjs.api.vec.Vec3f; } - interface Vec3f { + interface Vec3f { getX(): number; getY(): number; getZ(): number; @@ -48015,7 +48015,7 @@ declare global { new(x: number): com.chattriggers.ctjs.api.vec.Vec2f; new(x: number, y: number): com.chattriggers.ctjs.api.vec.Vec2f; } - interface Vec2f { + interface Vec2f { getX(): number; getY(): number; magnitudeSquared(): number; @@ -48039,7 +48039,7 @@ declare global { DimensionType: typeof com.chattriggers.ctjs.api.entity.Entity$DimensionType; new(mcValue: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; } - interface Entity extends com.chattriggers.ctjs.api.CTWrapper { + interface Entity extends com.chattriggers.ctjs.api.CTWrapper { getX(): number; getY(): number; getZ(): number; @@ -48054,47 +48054,47 @@ declare global { /** * Gets the pitch, the horizontal direction the entity is facing towards. * This has a range of -180 to 180. - * + * * @return the entity's pitch */ getPitch(): number; /** * Gets the yaw, the vertical direction the entity is facing towards. * This has a range of -180 to 180. - * + * * @return the entity's yaw */ getYaw(): number; /** * Gets the entity's x motion. * This is the amount the entity will move in the x direction next tick. - * + * * @return the entity's x motion */ getMotionX(): number; /** * Gets the entity's y motion. * This is the amount the entity will move in the y direction next tick. - * + * * @return the entity's y motion */ getMotionY(): number; /** * Gets the entity's z motion. * This is the amount the entity will move in the z direction next tick. - * + * * @return the entity's z motion */ getMotionZ(): number; /** * Returns the entity this entity is riding, if one exists - * + * * @return an Entity or null */ getRiding(): com.chattriggers.ctjs.api.entity.Entity | null | undefined; /** * Returns a list of all entity riding this entity - * + * * @return List of entities, empty if there are no riders */ getRiders(): Array; @@ -48102,19 +48102,19 @@ declare global { * Checks whether the entity is dead. * This is a fairly loose term, dead for a particle could mean it has faded, * while dead for an entity means it has no health. - * + * * @return whether an entity is dead */ isDead(): boolean; /** * Gets the entire width of the entity's hitbox - * + * * @return the entity's width */ getWidth(): number; /** * Gets the entire height of the entity's hitbox - * + * * @return the entity's height */ getHeight(): number; @@ -48122,44 +48122,44 @@ declare global { * Gets the height of the eyes on the entity, * can be added to its Y coordinate to get the actual Y location of the eyes. * This value defaults to 85% of an entity's height, however is different for some entities. - * + * * @return the height of the entity's eyes */ getEyeHeight(): number; /** * Gets the name of the entity, could be "Villager", * or, if the entity has a custom name, it returns that. - * + * * @return the (custom) name of the entity as a String */ getName(): string; /** * Gets the name of the entity, could be "Villager", * or, if the entity has a custom name, it returns that. - * + * * @return the (custom) name of the entity as a [TextComponent] */ getNameComponent(): com.chattriggers.ctjs.api.message.TextComponent; /** * Gets the Java class name of the entity, for example "EntityVillager" - * + * * @return the entity's class name */ getClassName(): string; /** * Gets the Java UUID object of this entity. * Use of [UUID.toString] in conjunction is recommended. - * + * * @return the entity's uuid */ getUUID(): java.util.UUID; /** * Gets the entity's air level. - * + * * The returned value will be an integer. If the player is not taking damage, it * will be between 300 (not in water) and 0. If the player is taking damage, it * will be between -20 and 0, getting reset to 0 every time the player takes damage. - * + * * @return the entity's air level */ getAir(): number; @@ -48204,13 +48204,13 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.entity.Entity$DimensionType; } - interface Entity$DimensionType extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper> { + interface Entity$DimensionType extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper> { } const Entity$Companion: { fromMC(entity: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; new(): com.chattriggers.ctjs.api.entity.Entity$Companion; } - interface Entity$Companion { + interface Entity$Companion { fromMC(entity: net.minecraft.world.entity.Entity): com.chattriggers.ctjs.api.entity.Entity; new(): com.chattriggers.ctjs.api.entity.Entity$Companion; } @@ -48220,54 +48220,54 @@ declare global { UseItem: typeof com.chattriggers.ctjs.api.entity.PlayerInteraction$UseItem; new(name: string, mainHand: boolean): com.chattriggers.ctjs.api.entity.PlayerInteraction; } - interface PlayerInteraction { + interface PlayerInteraction { getName(): string; getMainHand(): boolean; } const PlayerInteraction$AttackBlock: { new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackBlock; } - interface PlayerInteraction$AttackBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + interface PlayerInteraction$AttackBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackBlock; } const PlayerInteraction$AttackEntity: { new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackEntity; } - interface PlayerInteraction$AttackEntity extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + interface PlayerInteraction$AttackEntity extends com.chattriggers.ctjs.api.entity.PlayerInteraction { new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$AttackEntity; } const PlayerInteraction$BreakBlock: { new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$BreakBlock; } - interface PlayerInteraction$BreakBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + interface PlayerInteraction$BreakBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { new(): com.chattriggers.ctjs.api.entity.PlayerInteraction$BreakBlock; } const PlayerInteraction$UseBlock: { new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseBlock; } - interface PlayerInteraction$UseBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + interface PlayerInteraction$UseBlock extends com.chattriggers.ctjs.api.entity.PlayerInteraction { } const PlayerInteraction$UseEntity: { new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseEntity; } - interface PlayerInteraction$UseEntity extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + interface PlayerInteraction$UseEntity extends com.chattriggers.ctjs.api.entity.PlayerInteraction { } const PlayerInteraction$UseItem: { new(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.entity.PlayerInteraction$UseItem; } - interface PlayerInteraction$UseItem extends com.chattriggers.ctjs.api.entity.PlayerInteraction { + interface PlayerInteraction$UseItem extends com.chattriggers.ctjs.api.entity.PlayerInteraction { } const LivingEntity: { new(mcValue: net.minecraft.world.entity.LivingEntity): com.chattriggers.ctjs.api.entity.LivingEntity; } - interface LivingEntity extends com.chattriggers.ctjs.api.entity.Entity { + interface LivingEntity extends com.chattriggers.ctjs.api.entity.Entity { getActivePotionEffects(): Array; canSeeEntity(other: net.minecraft.world.entity.Entity): boolean; canSeeEntity(other: com.chattriggers.ctjs.api.entity.Entity): boolean; /** * Gets the item currently in the entity's specified inventory slot. * 0 for main hand, 1 for offhand, 2-5 for armor - * + * * @param slot the slot to access * @return the item in said slot */ @@ -48284,7 +48284,7 @@ declare global { const BlockEntity: { new(mcValue: net.minecraft.world.level.block.entity.BlockEntity): com.chattriggers.ctjs.api.entity.BlockEntity; } - interface BlockEntity extends com.chattriggers.ctjs.api.CTWrapper { + interface BlockEntity extends com.chattriggers.ctjs.api.CTWrapper { getX(): number; getY(): number; getZ(): number; @@ -48295,7 +48295,7 @@ declare global { const Particle: { new(mcValue: net.minecraft.client.particle.Particle): com.chattriggers.ctjs.api.entity.Particle; } - interface Particle extends com.chattriggers.ctjs.api.CTWrapper { + interface Particle extends com.chattriggers.ctjs.api.CTWrapper { getX(): number; setX(value: number): void; getY(): number; @@ -48324,7 +48324,7 @@ declare global { scale(scale: number): com.chattriggers.ctjs.api.entity.Particle; /** * Sets the amount of ticks this particle will live for - * + * * @param maxAge the particle's max age (in ticks) */ setMaxAge(maxAge: number): com.chattriggers.ctjs.api.entity.Particle; @@ -48333,7 +48333,7 @@ declare global { const PlayerMP: { new(mcValue: net.minecraft.world.entity.player.Player): com.chattriggers.ctjs.api.entity.PlayerMP; } - interface PlayerMP extends com.chattriggers.ctjs.api.entity.LivingEntity { + interface PlayerMP extends com.chattriggers.ctjs.api.entity.LivingEntity { isSpectator(): boolean; getPing(): number; getTeam(): com.chattriggers.ctjs.api.entity.Team | null | undefined; @@ -48347,14 +48347,14 @@ declare global { /** * Sets the name for this player shown above their head, * in their name tag - * + * * @param textComponent the new name to display */ setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] * minus `player`. - * + * * @see Renderer.drawPlayer */ draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.entity.PlayerMP; @@ -48363,7 +48363,7 @@ declare global { Visibility: typeof com.chattriggers.ctjs.api.entity.Team$Visibility; new(mcValue: net.minecraft.world.scores.PlayerTeam): com.chattriggers.ctjs.api.entity.Team; } - interface Team extends com.chattriggers.ctjs.api.CTWrapper { + interface Team extends com.chattriggers.ctjs.api.CTWrapper { /** * Gets the registered name of the team */ @@ -48453,19 +48453,19 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.entity.Team$Visibility; } - interface Team$Visibility extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + interface Team$Visibility extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { } const Team$Visibility$Companion: { fromMC(mcValue: net.minecraft.world.scores.Team$Visibility): com.chattriggers.ctjs.api.entity.Team$Visibility; new(): unknown; } - interface Team$Visibility$Companion { + interface Team$Visibility$Companion { fromMC(mcValue: net.minecraft.world.scores.Team$Visibility): com.chattriggers.ctjs.api.entity.Team$Visibility; new(): unknown; } } namespace commands { - interface RootCommand { + interface RootCommand { register(): void; } const DynamicCommands: { @@ -48489,7 +48489,7 @@ declare global { /** * A helper method for getting Fabric's client CommandDispatcher root node. This allows user * commands to be redirected to the root node in the same way that "/execute run ..." does. - * + * * As the result is a CommandNode, `.getChild(name)` can be used to access sub-command nodes * to, for example, redirect to just `/advancement` instead of `/`. */ @@ -48694,15 +48694,15 @@ declare global { /** * Allows easy creation of a custom ArgumentType without needing to use * JavaAdapter. Example: - * + * * ```js * const HEADS = 0; * const TAILS = 1; - * + * * const coinFlipArgType = Commands.custom({ * parse(reader) { * // `reader` is a com.mojang.brigadier.StringReader - * + * * const savedCursor = reader.getCursor(); * const str = reader.readString(); * if (str === 'heads') @@ -48723,7 +48723,7 @@ declare global { * } * }); * ``` - * + * * @see StringReader * @see CommandContext * @see SuggestionsBuilder @@ -48740,13 +48740,13 @@ declare global { /** * An alternative to the command register that allows full use of the * functionality provided by Brigadier. - * + * * For more information about Brigadier, see * their GitHub page. * Also see [CTCommand] for an example Brigadier command. - * + * * ## General - * + * * This API works similarly to Brigadier, however much of the annoyance * of using the Brigadier API has been eliminated, mainly the excessive * use of nested function calls. It works via a global context, so function @@ -48754,29 +48754,29 @@ declare global { * built at once. This means that commands should only ever be built on the * main thread. If two commands are built at the same time, an error will be * thrown. - * + * * ## Argument Types - * + * * The [ArgumentType] interface is a fundamental part of Brigadier, and * most of the MC argument types have been exposed via helper function * in this class. It is also possible to build new instances of * [ArgumentType] via [custom]. - * + * * When possible, the argument types returned from the helper function on * this class resolve in a way that their Minecraft variants do. For example, * the [message] type will replace selectors with their target entity, if * possible. - * + * * ## Basic Example - * + * * Here is an example command that recreates the `/advancement` command * (without any of the actual functionality, of course): - * + * * ```js * // The `Commands` object supports destructuring, which makes assembling long * // commands much nicer * const { argument, choices, exec, greedyString, literal, registerCommand, resource, players } = Commands; - * + * * registerCommand('ctadvancement', () => { * // Note the use of choices to avoid having to copy-paste two separate literal() trees * argument('kind', choices('grant', 'revoke'), () => { @@ -48789,7 +48789,7 @@ declare global { * ChatLib.chat(`${kind} everything from ${targets}`); * }); * }); - * + * * literal('only', () => { * argument('advancement', resource(), () => { * argument('criterion', greedyString(), () => { @@ -48799,7 +48799,7 @@ declare global { * }); * }); * }); - * + * * argument('subkind', choices('from', 'through', 'until'), () => { * argument('advancement', resource(), () => { * exec(({ kind, subkind, targets, advancement }) => { @@ -48811,19 +48811,19 @@ declare global { * }); * }); * ``` - * + * * ## Redirect - * + * * Like Brigadier, this API supports assembling partial command nodes for use * in redirection. To do this, use [buildCommand], which returns the command node * (well, an internal representation of it). This object can then be passed to * further calls to [redirect] inside of a [literal] or [argument] block. - * + * * Examples: - * + * * ```js * // destructuring omitted - * + * * const testCmdNode = buildCommand('testcmd', () => { * exec(({ arg }) => { * if (arg) { @@ -48833,10 +48833,10 @@ declare global { * } * }); * }); - * + * * // Manually register it since we used buildCommand() instead of registerCommand() * testCmdNode.register() - * + * * registerCommand('testcmd', () => { * argument('arg', greedyString(), () => { * redirect(testCmdNode); @@ -48846,7 +48846,7 @@ declare global { */ new(): com.chattriggers.ctjs.api.commands.DynamicCommands; } - interface DynamicCommands extends com.chattriggers.ctjs.internal.commands.CommandCollection { + interface DynamicCommands extends com.chattriggers.ctjs.internal.commands.CommandCollection { registerCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; registerCommand(name: string, builder: org.mozilla.javascript.Function | null | undefined): com.chattriggers.ctjs.api.commands.RootCommand; buildCommand(name: string): com.chattriggers.ctjs.api.commands.RootCommand; @@ -48859,7 +48859,7 @@ declare global { /** * A helper method for getting Fabric's client CommandDispatcher root node. This allows user * commands to be redirected to the root node in the same way that "/execute run ..." does. - * + * * As the result is a CommandNode, `.getChild(name)` can be used to access sub-command nodes * to, for example, redirect to just `/advancement` instead of `/`. */ @@ -49064,15 +49064,15 @@ declare global { /** * Allows easy creation of a custom ArgumentType without needing to use * JavaAdapter. Example: - * + * * ```js * const HEADS = 0; * const TAILS = 1; - * + * * const coinFlipArgType = Commands.custom({ * parse(reader) { * // `reader` is a com.mojang.brigadier.StringReader - * + * * const savedCursor = reader.getCursor(); * const str = reader.readString(); * if (str === 'heads') @@ -49093,7 +49093,7 @@ declare global { * } * }); * ``` - * + * * @see StringReader * @see CommandContext * @see SuggestionsBuilder @@ -49110,13 +49110,13 @@ declare global { /** * An alternative to the command register that allows full use of the * functionality provided by Brigadier. - * + * * For more information about Brigadier, see * their GitHub page. * Also see [CTCommand] for an example Brigadier command. - * + * * ## General - * + * * This API works similarly to Brigadier, however much of the annoyance * of using the Brigadier API has been eliminated, mainly the excessive * use of nested function calls. It works via a global context, so function @@ -49124,29 +49124,29 @@ declare global { * built at once. This means that commands should only ever be built on the * main thread. If two commands are built at the same time, an error will be * thrown. - * + * * ## Argument Types - * + * * The [ArgumentType] interface is a fundamental part of Brigadier, and * most of the MC argument types have been exposed via helper function * in this class. It is also possible to build new instances of * [ArgumentType] via [custom]. - * + * * When possible, the argument types returned from the helper function on * this class resolve in a way that their Minecraft variants do. For example, * the [message] type will replace selectors with their target entity, if * possible. - * + * * ## Basic Example - * + * * Here is an example command that recreates the `/advancement` command * (without any of the actual functionality, of course): - * + * * ```js * // The `Commands` object supports destructuring, which makes assembling long * // commands much nicer * const { argument, choices, exec, greedyString, literal, registerCommand, resource, players } = Commands; - * + * * registerCommand('ctadvancement', () => { * // Note the use of choices to avoid having to copy-paste two separate literal() trees * argument('kind', choices('grant', 'revoke'), () => { @@ -49159,7 +49159,7 @@ declare global { * ChatLib.chat(`${kind} everything from ${targets}`); * }); * }); - * + * * literal('only', () => { * argument('advancement', resource(), () => { * argument('criterion', greedyString(), () => { @@ -49169,7 +49169,7 @@ declare global { * }); * }); * }); - * + * * argument('subkind', choices('from', 'through', 'until'), () => { * argument('advancement', resource(), () => { * exec(({ kind, subkind, targets, advancement }) => { @@ -49181,19 +49181,19 @@ declare global { * }); * }); * ``` - * + * * ## Redirect - * + * * Like Brigadier, this API supports assembling partial command nodes for use * in redirection. To do this, use [buildCommand], which returns the command node * (well, an internal representation of it). This object can then be passed to * further calls to [redirect] inside of a [literal] or [argument] block. - * + * * Examples: - * + * * ```js * // destructuring omitted - * + * * const testCmdNode = buildCommand('testcmd', () => { * exec(({ arg }) => { * if (arg) { @@ -49203,10 +49203,10 @@ declare global { * } * }); * }); - * + * * // Manually register it since we used buildCommand() instead of registerCommand() * testCmdNode.register() - * + * * registerCommand('testcmd', () => { * argument('arg', greedyString(), () => { * redirect(testCmdNode); @@ -49219,7 +49219,7 @@ declare global { const DynamicCommands$AngleArgumentWrapper: { new(angle: net.minecraft.commands.arguments.AngleArgument$SingleAngle): com.chattriggers.ctjs.api.commands.DynamicCommands$AngleArgumentWrapper; } - interface DynamicCommands$AngleArgumentWrapper { + interface DynamicCommands$AngleArgumentWrapper { getAngle(): net.minecraft.commands.arguments.AngleArgument$SingleAngle; getAngle(): number; getAngle(entity: com.chattriggers.ctjs.api.entity.Entity): number; @@ -49229,7 +49229,7 @@ declare global { const DynamicCommands$PosArgumentWrapper: { new(impl: net.minecraft.commands.arguments.coordinates.Coordinates): com.chattriggers.ctjs.api.commands.DynamicCommands$PosArgumentWrapper; } - interface DynamicCommands$PosArgumentWrapper extends net.minecraft.commands.arguments.coordinates.Coordinates { + interface DynamicCommands$PosArgumentWrapper extends net.minecraft.commands.arguments.coordinates.Coordinates { getImpl(): net.minecraft.commands.arguments.coordinates.Coordinates; toAbsolutePos(): net.minecraft.world.phys.Vec3; toAbsoluteBlockPos(): com.chattriggers.ctjs.api.world.block.BlockPos; @@ -49240,7 +49240,7 @@ declare global { const DynamicCommands$BlockPredicateWrapper: { new(impl: net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockPredicateWrapper; } - interface DynamicCommands$BlockPredicateWrapper { + interface DynamicCommands$BlockPredicateWrapper { getImpl(): net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result; test(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; component1(): net.minecraft.commands.arguments.blocks.BlockPredicateArgument$Result; @@ -49249,7 +49249,7 @@ declare global { const DynamicCommands$BlockStateArgumentWrapper: { new(impl: net.minecraft.commands.arguments.blocks.BlockInput): com.chattriggers.ctjs.api.commands.DynamicCommands$BlockStateArgumentWrapper; } - interface DynamicCommands$BlockStateArgumentWrapper { + interface DynamicCommands$BlockStateArgumentWrapper { getImpl(): net.minecraft.commands.arguments.blocks.BlockInput; test(blockPos: com.chattriggers.ctjs.api.world.block.BlockPos): boolean; component1(): net.minecraft.commands.arguments.blocks.BlockInput; @@ -49258,7 +49258,7 @@ declare global { const DynamicCommands$EntitySelectorWrapper: { new(impl: net.minecraft.commands.arguments.selector.EntitySelector): com.chattriggers.ctjs.api.commands.DynamicCommands$EntitySelectorWrapper; } - interface DynamicCommands$EntitySelectorWrapper { + interface DynamicCommands$EntitySelectorWrapper { getEntity(): com.chattriggers.ctjs.api.entity.Entity; getEntities(): Array; getPlayers(): Array; @@ -49266,7 +49266,7 @@ declare global { const DynamicCommands$ItemStackArgumentWrapper: { new(impl: net.minecraft.commands.arguments.item.ItemInput): com.chattriggers.ctjs.api.commands.DynamicCommands$ItemStackArgumentWrapper; } - interface DynamicCommands$ItemStackArgumentWrapper { + interface DynamicCommands$ItemStackArgumentWrapper { getItemType(): com.chattriggers.ctjs.api.inventory.ItemType; test(type: com.chattriggers.ctjs.api.inventory.ItemType): boolean; component1(): net.minecraft.commands.arguments.item.ItemInput; @@ -49275,7 +49275,7 @@ declare global { const DynamicCommands$MessageFormatArgumentWrapper: { new(impl: net.minecraft.commands.arguments.MessageArgument$Message): com.chattriggers.ctjs.api.commands.DynamicCommands$MessageFormatArgumentWrapper; } - interface DynamicCommands$MessageFormatArgumentWrapper { + interface DynamicCommands$MessageFormatArgumentWrapper { getText(): string; setText(value: string): void; format(): com.chattriggers.ctjs.api.message.TextComponent; @@ -49285,7 +49285,7 @@ declare global { const DynamicCommands$NbtPathWrapper: { new(impl: net.minecraft.commands.arguments.NbtPathArgument$NbtPath): com.chattriggers.ctjs.api.commands.DynamicCommands$NbtPathWrapper; } - interface DynamicCommands$NbtPathWrapper { + interface DynamicCommands$NbtPathWrapper { get(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): Array; count(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase): number; getOrInit(nbt: com.chattriggers.ctjs.api.inventory.nbt.NBTBase, supplier: kotlin.Function0): Array; @@ -49300,7 +49300,7 @@ declare global { const KeyBind: { /** * Creates a new keybind, editable in the user's controls. - * + * * @param description what the keybind does * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A * @param category the keybind category the keybind will be in @@ -49309,7 +49309,7 @@ declare global { new(description: string, keyCode: number): com.chattriggers.ctjs.api.client.KeyBind; /** * Creates a new keybind, editable in the user's controls. - * + * * @param description what the keybind does * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A * @param category the keybind category the keybind will be in @@ -49318,7 +49318,7 @@ declare global { new(description: string, keyCode: number, category: string): com.chattriggers.ctjs.api.client.KeyBind; new(keyBinding: net.minecraft.client.KeyMapping): com.chattriggers.ctjs.api.client.KeyBind; } - interface KeyBind { + interface KeyBind { registerKeyPress(method: any): com.chattriggers.ctjs.api.client.KeyBind; registerKeyRelease(method: any): com.chattriggers.ctjs.api.client.KeyBind; registerKeyDown(method: any): com.chattriggers.ctjs.api.client.KeyBind; @@ -49327,37 +49327,37 @@ declare global { unregisterKeyDown(): com.chattriggers.ctjs.api.client.KeyBind; /** * Returns true if the key is pressed (used for continuous querying). - * + * * @return whether the key is pressed */ isKeyDown(): boolean; /** * Returns true on the initial key press. For continuous querying use [isKeyDown]. - * + * * @return whether the key has just been pressed */ isPressed(): boolean; /** * Gets the description of the key. - * + * * @return the description */ getDescription(): string; /** * Gets the key code of the key. - * + * * @return the integer key code */ getKeyCode(): number; /** * Gets the category of the key. - * + * * @return the category */ getCategory(): string; /** * Sets the state of the key. - * + * * @param pressed True to press, False to release */ setState(pressed: boolean): void; @@ -49365,7 +49365,7 @@ declare global { const KeyBind$Companion: { new(): com.chattriggers.ctjs.api.client.KeyBind$Companion; } - interface KeyBind$Companion { + interface KeyBind$Companion { new(): com.chattriggers.ctjs.api.client.KeyBind$Companion; } const ScreenHelper: { @@ -49376,7 +49376,7 @@ declare global { argb(a: number, r: number, g: number, b: number): number; new(): com.chattriggers.ctjs.api.client.ScreenHelper; } - interface ScreenHelper { + interface ScreenHelper { titleFont: com.chattriggers.ctjs.api.render.Font; smallerFont: com.chattriggers.ctjs.api.render.Font; drawMenuButton(label: string, x: number, y: number, width: number, height: number, hovered: boolean, textColorOverride: number | null | undefined): void; @@ -49386,7 +49386,7 @@ declare global { const ScreenHelper$MenuButton: { new(label: string, x: number, y: number, width: number, height: number, onClick: kotlin.Function0): com.chattriggers.ctjs.api.client.ScreenHelper$MenuButton; } - interface ScreenHelper$MenuButton { + interface ScreenHelper$MenuButton { getLabel(): string; getX(): number; getY(): number; @@ -49405,20 +49405,20 @@ declare global { const WelcomeScreen: { new(): com.chattriggers.ctjs.api.client.WelcomeScreen; } - interface WelcomeScreen extends net.minecraft.client.gui.screens.Screen { + interface WelcomeScreen extends net.minecraft.client.gui.screens.Screen { } const WelcomeScreen$Companion: { open(): void; new(): com.chattriggers.ctjs.api.client.WelcomeScreen$Companion; } - interface WelcomeScreen$Companion { + interface WelcomeScreen$Companion { open(): void; new(): com.chattriggers.ctjs.api.client.WelcomeScreen$Companion; } const FileLib: { /** * Writes a file to folder in modules. - * + * * @param importName name of the import * @param fileName name of the file * @param toWrite string to write in file @@ -49427,7 +49427,7 @@ declare global { write(importName: string, fileName: string, toWrite: string): void; /** * Writes a file to folder in modules. - * + * * @param importName name of the import * @param fileName name of the file * @param toWrite string to write in file @@ -49437,7 +49437,7 @@ declare global { /** * Writes a file to anywhere on the system. * Use "./" for the ".minecraft" folder. - * + * * @param fileLocation the location and file name * @param toWrite string to write in file * @param recursive whether to create folders to the file location if they don't exist @@ -49446,7 +49446,7 @@ declare global { /** * Writes a file to anywhere on the system. * Use "./" for the ".minecraft" folder. - * + * * @param fileLocation the location and file name * @param toWrite string to write in file * @param recursive whether to create folders to the file location if they don't exist @@ -49454,7 +49454,7 @@ declare global { write(fileLocation: string, toWrite: string, recursive: boolean): void; /** * Writes a file to folder in modules. - * + * * @param importName name of the import * @param fileName name of the file * @param toAppend string to append in file @@ -49463,7 +49463,7 @@ declare global { /** * Writes a file to anywhere on the system. * Use "./" for the ".minecraft" folder. - * + * * @param fileLocation the location and file name * @param toAppend string to append in file */ @@ -49471,7 +49471,7 @@ declare global { /** * Reads a file from folder in modules. * Returns null if file is not found. - * + * * @param importName name of the import * @param fileName name of the file * @return the string in the file, or null if not found @@ -49481,21 +49481,21 @@ declare global { * Reads a file from anywhere on the system. * Use "./" for the ".minecraft" folder. * Returns null if file is not found. - * + * * @param fileLocation the location and file name * @return the string in the file, or null if not found */ read(fileLocation: string): string | null | undefined; /** * Reads a file from anywhere on the system using java.io.File. - * + * * @param file the java.io.File to read * @return the string in the file, or null if not found */ read(file: java.io.File): string | null | undefined; /** * Determines if a file or directory exists at the specified location - * + * * @param importName name of the import * @param fileName name of the file * @return if the file exists @@ -49503,14 +49503,14 @@ declare global { exists(importName: string, fileName: string): boolean; /** * Determines if a file or directory exists at the specified location - * + * * @param fileLocation the path of the file * @return if the file exists */ exists(fileLocation: string): boolean; /** * Determines if a file or directory exists at the specified location - * + * * @param importName name of the import * @param fileName name of the file * @return if the location is a directory @@ -49518,14 +49518,14 @@ declare global { isDirectory(importName: string, fileName: string): boolean; /** * Determines if a file or directory exists at the specified location - * + * * @param fileLocation the path of the file * @return if the location is a directory */ isDirectory(fileLocation: string): boolean; /** * Gets the contents of a url as a string. - * + * * @param theUrl the url to get the data from * @param userAgent the user agent to use in the connection * @return the string stored in the url content @@ -49533,7 +49533,7 @@ declare global { getUrlContent(theUrl: string): string; /** * Gets the contents of a url as a string. - * + * * @param theUrl the url to get the data from * @param userAgent the user agent to use in the connection * @return the string stored in the url content @@ -49541,14 +49541,14 @@ declare global { getUrlContent(theUrl: string, userAgent: string | null | undefined): string; /** * Deletes a directory at the specified location - * + * * @param dir the directory to delete * @return if the directory was deleted */ deleteDirectory(dir: string): boolean; /** * Deletes a directory at the specified location - * + * * @param dir the directory to delete * @return if the directory was deleted */ @@ -49563,36 +49563,36 @@ declare global { unzip(zipFilePath: string, destDirectory: string): void; /** * Encodes a string to a base64 string - * + * * @param toEncode string to encode * @return base64 encoded string */ encodeBase64(toEncode: string): string; /** * Decodes a base64 string to a string - * + * * @param toDecode base64 encoded string to decode * @return decoded string */ decodeBase64(toDecode: string): string; /** * Opens a url in the default browser - * + * * @param url the url to open */ open(url: string): void; /** * Opens a path in the file explorer - * + * * @param path the path to open */ open(path: java.io.File): void; new(): com.chattriggers.ctjs.api.client.FileLib; } - interface FileLib { + interface FileLib { /** * Writes a file to folder in modules. - * + * * @param importName name of the import * @param fileName name of the file * @param toWrite string to write in file @@ -49601,7 +49601,7 @@ declare global { write(importName: string, fileName: string, toWrite: string): void; /** * Writes a file to folder in modules. - * + * * @param importName name of the import * @param fileName name of the file * @param toWrite string to write in file @@ -49611,7 +49611,7 @@ declare global { /** * Writes a file to anywhere on the system. * Use "./" for the ".minecraft" folder. - * + * * @param fileLocation the location and file name * @param toWrite string to write in file * @param recursive whether to create folders to the file location if they don't exist @@ -49620,7 +49620,7 @@ declare global { /** * Writes a file to anywhere on the system. * Use "./" for the ".minecraft" folder. - * + * * @param fileLocation the location and file name * @param toWrite string to write in file * @param recursive whether to create folders to the file location if they don't exist @@ -49628,7 +49628,7 @@ declare global { write(fileLocation: string, toWrite: string, recursive: boolean): void; /** * Writes a file to folder in modules. - * + * * @param importName name of the import * @param fileName name of the file * @param toAppend string to append in file @@ -49637,7 +49637,7 @@ declare global { /** * Writes a file to anywhere on the system. * Use "./" for the ".minecraft" folder. - * + * * @param fileLocation the location and file name * @param toAppend string to append in file */ @@ -49645,7 +49645,7 @@ declare global { /** * Reads a file from folder in modules. * Returns null if file is not found. - * + * * @param importName name of the import * @param fileName name of the file * @return the string in the file, or null if not found @@ -49655,21 +49655,21 @@ declare global { * Reads a file from anywhere on the system. * Use "./" for the ".minecraft" folder. * Returns null if file is not found. - * + * * @param fileLocation the location and file name * @return the string in the file, or null if not found */ read(fileLocation: string): string | null | undefined; /** * Reads a file from anywhere on the system using java.io.File. - * + * * @param file the java.io.File to read * @return the string in the file, or null if not found */ read(file: java.io.File): string | null | undefined; /** * Determines if a file or directory exists at the specified location - * + * * @param importName name of the import * @param fileName name of the file * @return if the file exists @@ -49677,14 +49677,14 @@ declare global { exists(importName: string, fileName: string): boolean; /** * Determines if a file or directory exists at the specified location - * + * * @param fileLocation the path of the file * @return if the file exists */ exists(fileLocation: string): boolean; /** * Determines if a file or directory exists at the specified location - * + * * @param importName name of the import * @param fileName name of the file * @return if the location is a directory @@ -49692,14 +49692,14 @@ declare global { isDirectory(importName: string, fileName: string): boolean; /** * Determines if a file or directory exists at the specified location - * + * * @param fileLocation the path of the file * @return if the location is a directory */ isDirectory(fileLocation: string): boolean; /** * Gets the contents of a url as a string. - * + * * @param theUrl the url to get the data from * @param userAgent the user agent to use in the connection * @return the string stored in the url content @@ -49707,7 +49707,7 @@ declare global { getUrlContent(theUrl: string): string; /** * Gets the contents of a url as a string. - * + * * @param theUrl the url to get the data from * @param userAgent the user agent to use in the connection * @return the string stored in the url content @@ -49715,14 +49715,14 @@ declare global { getUrlContent(theUrl: string, userAgent: string | null | undefined): string; /** * Deletes a directory at the specified location - * + * * @param dir the directory to delete * @return if the directory was deleted */ deleteDirectory(dir: string): boolean; /** * Deletes a directory at the specified location - * + * * @param dir the directory to delete * @return if the directory was deleted */ @@ -49737,27 +49737,27 @@ declare global { unzip(zipFilePath: string, destDirectory: string): void; /** * Encodes a string to a base64 string - * + * * @param toEncode string to encode * @return base64 encoded string */ encodeBase64(toEncode: string): string; /** * Decodes a base64 string to a string - * + * * @param toDecode base64 encoded string to decode * @return decoded string */ decodeBase64(toDecode: string): string; /** * Opens a url in the default browser - * + * * @param url the url to open */ open(url: string): void; /** * Opens a path in the file explorer - * + * * @param path the path to open */ open(path: java.io.File): void; @@ -49766,7 +49766,7 @@ declare global { const MathLib: { /** * Maps a number from one range to another. - * + * * @param number the number to map * @param in_min the original range min * @param in_max the original range max @@ -49777,7 +49777,7 @@ declare global { map(number: number, in_min: number, in_max: number, out_min: number, out_max: number): number; /** * Clamps a floating number between two values. - * + * * @param number the number to clamp * @param min the minimum * @param max the maximum @@ -49786,7 +49786,7 @@ declare global { clampFloat(number: number, min: number, max: number): number; /** * Clamps an integer number between two values. - * + * * @param number the number to clamp * @param min the minimum * @param max the maximum @@ -49795,10 +49795,10 @@ declare global { clamp(number: number, min: number, max: number): number; new(): com.chattriggers.ctjs.api.client.MathLib; } - interface MathLib { + interface MathLib { /** * Maps a number from one range to another. - * + * * @param number the number to map * @param in_min the original range min * @param in_max the original range max @@ -49809,7 +49809,7 @@ declare global { map(number: number, in_min: number, in_max: number, out_min: number, out_max: number): number; /** * Clamps a floating number between two values. - * + * * @param number the number to clamp * @param min the minimum * @param max the maximum @@ -49818,7 +49818,7 @@ declare global { clampFloat(number: number, min: number, max: number): number; /** * Clamps an integer number between two values. - * + * * @param number the number to clamp * @param min the minimum * @param max the maximum @@ -49836,7 +49836,7 @@ declare global { getEnabledProxies(): Array; new(): com.chattriggers.ctjs.api.client.ProxyInfo; } - interface ProxyInfo { + interface ProxyInfo { getProxies(): Array; addProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; removeProxy(proxy: com.chattriggers.ctjs.api.client.Proxy): void; @@ -49848,7 +49848,7 @@ declare global { const Proxy: { new(ip: string, port: number, name: string, username: string, password: string, isEnabled: boolean): com.chattriggers.ctjs.api.client.Proxy; } - interface Proxy { + interface Proxy { getIp(): string; setIp(value: string): void; getPort(): number; @@ -49877,7 +49877,7 @@ declare global { revertToIdle(): void; new(): com.chattriggers.ctjs.api.client.DiscordRPC; } - interface DiscordRPC { + interface DiscordRPC { stayOn(): void; turnOff(): void; updatePresence(details: string, state: string): void; @@ -49888,13 +49888,13 @@ declare global { const ProxyManagerScreen: { new(parent: net.minecraft.client.gui.screens.Screen): com.chattriggers.ctjs.api.client.ProxyManagerScreen; } - interface ProxyManagerScreen extends net.minecraft.client.gui.screens.Screen { + interface ProxyManagerScreen extends net.minecraft.client.gui.screens.Screen { refreshList(): void; } const ProxyEditScreen: { new(parent: com.chattriggers.ctjs.api.client.ProxyManagerScreen, existingProxy: com.chattriggers.ctjs.api.client.Proxy | null | undefined): com.chattriggers.ctjs.api.client.ProxyEditScreen; } - interface ProxyEditScreen extends net.minecraft.client.gui.screens.Screen { + interface ProxyEditScreen extends net.minecraft.client.gui.screens.Screen { } const Client: { RenderLimiter: typeof com.chattriggers.ctjs.api.client.Client$RenderLimiter; @@ -49934,13 +49934,13 @@ declare global { processName(original: net.minecraft.network.chat.Component): net.minecraft.network.chat.Component; /** * Gets Minecraft's Minecraft object - * + * * @return The Minecraft object */ getMinecraft(): net.minecraft.client.Minecraft; /** * Gets Minecraft's NetHandlerPlayClient object - * + * * @return The NetHandlerPlayClient object */ getConnection(): net.minecraft.client.multiplayer.ClientPacketListener | null | undefined; @@ -49975,7 +49975,7 @@ declare global { connect(ip: string, port: number): void; /** * Gets the Minecraft ChatHud object for the chat gui - * + * * @return The GuiNewChat object for the chat gui */ getChatGui(): net.minecraft.client.gui.components.ChatComponent | null | undefined; @@ -49985,7 +49985,7 @@ declare global { /** * Gets whether the Minecraft window is active * and in the foreground of the user's screen. - * + * * @return true if the game is active, false otherwise */ isTabbedIn(): boolean; @@ -50000,13 +50000,13 @@ declare global { isInGui(): boolean; /** * Gets the chat message currently typed into the chat gui. - * + * * @return A blank string if the gui isn't open, otherwise, the message */ getCurrentChatMessage(): string; /** * Sets the current chat message, if the chat gui is not open, one will be opened. - * + * * @param message the message to put in the chat text box. */ setCurrentChatMessage(message: string): void; @@ -50024,7 +50024,7 @@ declare global { sendSequencedPacket(packetFactory: kotlin.Function1>): void; /** * Display a title. - * + * * @param title title text * @param subtitle subtitle text * @param fadeIn time to fade in @@ -50034,13 +50034,13 @@ declare global { showTitle(title: string | null | undefined, subtitle: string | null | undefined, fadeIn: number, time: number, fadeOut: number): void; /** * Copies a string to the clipboard - * + * * @param text The text to copy */ copy(): void; /** * Copies a string to the clipboard - * + * * @param text The text to copy */ copy(text: string): void; @@ -50050,7 +50050,7 @@ declare global { paste(): string; /** * Get the [KeyBinding] from an already existing Minecraft KeyBinding, otherwise, returns null. - * + * * @param keyCode the keycode to search for, see Keyboard below. Ex. Keyboard.KEY_A * @return the [KeyBinding] from a Minecraft KeyBinding, or null if one doesn't exist * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) @@ -50058,7 +50058,7 @@ declare global { getKeyBindFromKey(keyCode: number): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; /** * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. - * + * * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A * @param description the description of the keybind * @param category the keybind category the keybind will be in @@ -50068,7 +50068,7 @@ declare global { getKeyBindFromKey(keyCode: number, description: string): com.chattriggers.ctjs.api.client.KeyBind; /** * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. - * + * * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A * @param description the description of the keybind * @param category the keybind category the keybind will be in @@ -50079,14 +50079,14 @@ declare global { /** * Get the [KeyBinding] from an already existing * Minecraft KeyBinding, otherwise, returns null. - * + * * @param description the description of the keybind * @return the [KeyBinding], or null if one doesn't exist */ getKeyBindFromDescription(description: string): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; new(): com.chattriggers.ctjs.api.client.Client; } - interface Client { + interface Client { isFreecam(): boolean; setFreecam(value: boolean): void; isFreelook(): boolean; @@ -50121,13 +50121,13 @@ declare global { processName(original: net.minecraft.network.chat.Component): net.minecraft.network.chat.Component; /** * Gets Minecraft's Minecraft object - * + * * @return The Minecraft object */ getMinecraft(): net.minecraft.client.Minecraft; /** * Gets Minecraft's NetHandlerPlayClient object - * + * * @return The NetHandlerPlayClient object */ getConnection(): net.minecraft.client.multiplayer.ClientPacketListener | null | undefined; @@ -50162,7 +50162,7 @@ declare global { connect(ip: string, port: number): void; /** * Gets the Minecraft ChatHud object for the chat gui - * + * * @return The GuiNewChat object for the chat gui */ getChatGui(): net.minecraft.client.gui.components.ChatComponent | null | undefined; @@ -50172,7 +50172,7 @@ declare global { /** * Gets whether the Minecraft window is active * and in the foreground of the user's screen. - * + * * @return true if the game is active, false otherwise */ isTabbedIn(): boolean; @@ -50187,13 +50187,13 @@ declare global { isInGui(): boolean; /** * Gets the chat message currently typed into the chat gui. - * + * * @return A blank string if the gui isn't open, otherwise, the message */ getCurrentChatMessage(): string; /** * Sets the current chat message, if the chat gui is not open, one will be opened. - * + * * @param message the message to put in the chat text box. */ setCurrentChatMessage(message: string): void; @@ -50211,7 +50211,7 @@ declare global { sendSequencedPacket(packetFactory: kotlin.Function1>): void; /** * Display a title. - * + * * @param title title text * @param subtitle subtitle text * @param fadeIn time to fade in @@ -50221,13 +50221,13 @@ declare global { showTitle(title: string | null | undefined, subtitle: string | null | undefined, fadeIn: number, time: number, fadeOut: number): void; /** * Copies a string to the clipboard - * + * * @param text The text to copy */ copy(): void; /** * Copies a string to the clipboard - * + * * @param text The text to copy */ copy(text: string): void; @@ -50237,7 +50237,7 @@ declare global { paste(): string; /** * Get the [KeyBinding] from an already existing Minecraft KeyBinding, otherwise, returns null. - * + * * @param keyCode the keycode to search for, see Keyboard below. Ex. Keyboard.KEY_A * @return the [KeyBinding] from a Minecraft KeyBinding, or null if one doesn't exist * @see [org.lwjgl.input.Keyboard](http://legacy.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html) @@ -50245,7 +50245,7 @@ declare global { getKeyBindFromKey(keyCode: number): com.chattriggers.ctjs.api.client.KeyBind | null | undefined; /** * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. - * + * * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A * @param description the description of the keybind * @param category the keybind category the keybind will be in @@ -50255,7 +50255,7 @@ declare global { getKeyBindFromKey(keyCode: number, description: string): com.chattriggers.ctjs.api.client.KeyBind; /** * Get the [KeyBinding] from an already existing Minecraft KeyBinding, else, return a new one. - * + * * @param keyCode the keycode which the keybind will respond to, see Keyboard below. Ex. Keyboard.KEY_A * @param description the description of the keybind * @param category the keybind category the keybind will be in @@ -50266,7 +50266,7 @@ declare global { /** * Get the [KeyBinding] from an already existing * Minecraft KeyBinding, otherwise, returns null. - * + * * @param description the description of the keybind * @return the [KeyBinding], or null if one doesn't exist */ @@ -50281,28 +50281,28 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.client.Client$RenderLimiter; } - interface Client$RenderLimiter extends kotlin.Enum { + interface Client$RenderLimiter extends kotlin.Enum { } const Client$CurrentGuiWrapper: { new(): com.chattriggers.ctjs.api.client.Client$CurrentGuiWrapper; } - interface Client$CurrentGuiWrapper { + interface Client$CurrentGuiWrapper { /** * Gets the Java class name of the currently open gui, for example, "GuiChest" - * + * * @return the class name of the current gui */ getClassName(): string; /** * Gets the Minecraft gui class that is currently open - * + * * @return the Minecraft gui */ get(): net.minecraft.client.gui.screens.Screen | null | undefined; set(screen: net.minecraft.client.gui.screens.Screen | null | undefined): void; /** * Gets the slot under the mouse in the current gui, if one exists. - * + * * @return the [Slot] under the mouse */ getSlotUnderMouse(): com.chattriggers.ctjs.api.inventory.Slot | null | undefined; @@ -50314,7 +50314,7 @@ declare global { const Client$CameraWrapper: { new(): com.chattriggers.ctjs.api.client.Client$CameraWrapper; } - interface Client$CameraWrapper { + interface Client$CameraWrapper { getX(): number; getY(): number; getZ(): number; @@ -50325,7 +50325,7 @@ declare global { toMC(): net.minecraft.client.player.LocalPlayer | null | undefined; /** * Gets Minecraft's EntityPlayerSP object representing the user - * + * * @return The Minecraft EntityPlayerSP object representing the user */ getPlayer(): net.minecraft.client.player.LocalPlayer | null | undefined; @@ -50345,57 +50345,57 @@ declare global { /** * Gets the player's x motion. * This is the amount the player will move in the x direction next tick. - * + * * @return the player's x motion */ getMotionX(): number; /** * Gets the player's y motion. * This is the amount the player will move in the y direction next tick. - * + * * @return the player's y motion */ getMotionY(): number; /** * Gets the player's z motion. * This is the amount the player will move in the z direction next tick. - * + * * @return the player's z motion */ getMotionZ(): number; /** * Gets the player's camera pitch. - * + * * @return the player's camera pitch */ getPitch(): number; /** * Gets the player's camera yaw. - * + * * @return the player's camera yaw */ getYaw(): number; /** * Gets the player's username. - * + * * @return the player's username */ getName(): string; /** * Gets the Java UUID object of the player. * Use of [UUID.toString] in conjunction is recommended. - * + * * @return the player's uuid */ getUUID(): java.util.UUID; getHP(): number; /** * Gets the player's air level. - * + * * The returned value will be an integer. If the player is not taking damage, it * will be between 300 (not in water) and 0. If the player is taking damage, it * will be between -20 and 0, getting reset to 0 every time the player takes damage. - * + * * @return the player's air level */ getAirLevel(): number; @@ -50405,7 +50405,7 @@ declare global { isSprinting(): boolean; /** * Checks if player can be pushed by water. - * + * * @return true if the player is flying, false otherwise */ isFlying(): boolean; @@ -50413,14 +50413,14 @@ declare global { /** * Gets the direction the player is facing. * Example: "South West" - * + * * @return The direction the player is facing, one of the four cardinal directions */ facing(): string; /** * Gets the current active potion effects. Returns an empty list * if the player has no active potion effects. - * + * * @return a list of the active [PotionEffect]s */ getActivePotionEffects(): Array; @@ -50428,39 +50428,39 @@ declare global { * Gets the current object that the player is looking at, * whether that be a block or an entity. Returns null when not looking * at anything. - * + * * @return the [Block] or [Entity] being looked at, or null if air */ lookingAt(): any | null | undefined; /** * Gets the current item in the player's hand. - * + * * @param hand the hand of the item * @return the current held [Item] */ getHeldItem(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; /** * Gets the current item in the player's hand. - * + * * @param hand the hand of the item * @return the current held [Item] */ getHeldItem(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.inventory.Item | null | undefined; /** * Sets the current held item based on the provided index. - * + * * @param index the new held item index */ setHeldItemIndex(index: number): void; /** * Gets the current index of the held item. - * + * * @return the current index */ getHeldItemIndex(): number; /** * Gets the inventory of the player, i.e. the inventory accessed by 'e'. - * + * * @return the player's inventory */ getInventory(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; @@ -50472,38 +50472,38 @@ declare global { getDisplayName(): com.chattriggers.ctjs.api.message.TextComponent; /** * Sets the name for this player shown in tab list - * + * * @param textComponent the new name to display */ setTabDisplayName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Sets the name for this player shown above their head, * in their name tag - * + * * @param textComponent the new name to display */ setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Gets the container the user currently has open, i.e. a chest. - * + * * @return the currently opened container */ getContainer(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; /** * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] * minus `player`. - * + * * @see Renderer.drawPlayer */ draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Player; new(): com.chattriggers.ctjs.api.client.Player; } - interface Player { + interface Player { armor: com.chattriggers.ctjs.api.client.Player$ArmorWrapper; toMC(): net.minecraft.client.player.LocalPlayer | null | undefined; /** * Gets Minecraft's EntityPlayerSP object representing the user - * + * * @return The Minecraft EntityPlayerSP object representing the user */ getPlayer(): net.minecraft.client.player.LocalPlayer | null | undefined; @@ -50523,57 +50523,57 @@ declare global { /** * Gets the player's x motion. * This is the amount the player will move in the x direction next tick. - * + * * @return the player's x motion */ getMotionX(): number; /** * Gets the player's y motion. * This is the amount the player will move in the y direction next tick. - * + * * @return the player's y motion */ getMotionY(): number; /** * Gets the player's z motion. * This is the amount the player will move in the z direction next tick. - * + * * @return the player's z motion */ getMotionZ(): number; /** * Gets the player's camera pitch. - * + * * @return the player's camera pitch */ getPitch(): number; /** * Gets the player's camera yaw. - * + * * @return the player's camera yaw */ getYaw(): number; /** * Gets the player's username. - * + * * @return the player's username */ getName(): string; /** * Gets the Java UUID object of the player. * Use of [UUID.toString] in conjunction is recommended. - * + * * @return the player's uuid */ getUUID(): java.util.UUID; getHP(): number; /** * Gets the player's air level. - * + * * The returned value will be an integer. If the player is not taking damage, it * will be between 300 (not in water) and 0. If the player is taking damage, it * will be between -20 and 0, getting reset to 0 every time the player takes damage. - * + * * @return the player's air level */ getAirLevel(): number; @@ -50583,7 +50583,7 @@ declare global { isSprinting(): boolean; /** * Checks if player can be pushed by water. - * + * * @return true if the player is flying, false otherwise */ isFlying(): boolean; @@ -50591,14 +50591,14 @@ declare global { /** * Gets the direction the player is facing. * Example: "South West" - * + * * @return The direction the player is facing, one of the four cardinal directions */ facing(): string; /** * Gets the current active potion effects. Returns an empty list * if the player has no active potion effects. - * + * * @return a list of the active [PotionEffect]s */ getActivePotionEffects(): Array; @@ -50606,39 +50606,39 @@ declare global { * Gets the current object that the player is looking at, * whether that be a block or an entity. Returns null when not looking * at anything. - * + * * @return the [Block] or [Entity] being looked at, or null if air */ lookingAt(): any | null | undefined; /** * Gets the current item in the player's hand. - * + * * @param hand the hand of the item * @return the current held [Item] */ getHeldItem(): com.chattriggers.ctjs.api.inventory.Item | null | undefined; /** * Gets the current item in the player's hand. - * + * * @param hand the hand of the item * @return the current held [Item] */ getHeldItem(hand: net.minecraft.world.InteractionHand): com.chattriggers.ctjs.api.inventory.Item | null | undefined; /** * Sets the current held item based on the provided index. - * + * * @param index the new held item index */ setHeldItemIndex(index: number): void; /** * Gets the current index of the held item. - * + * * @return the current index */ getHeldItemIndex(): number; /** * Gets the inventory of the player, i.e. the inventory accessed by 'e'. - * + * * @return the player's inventory */ getInventory(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; @@ -50650,27 +50650,27 @@ declare global { getDisplayName(): com.chattriggers.ctjs.api.message.TextComponent; /** * Sets the name for this player shown in tab list - * + * * @param textComponent the new name to display */ setTabDisplayName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Sets the name for this player shown above their head, * in their name tag - * + * * @param textComponent the new name to display */ setNametagName(textComponent: com.chattriggers.ctjs.api.message.TextComponent): void; /** * Gets the container the user currently has open, i.e. a chest. - * + * * @return the currently opened container */ getContainer(): com.chattriggers.ctjs.api.inventory.Inventory | null | undefined; /** * Draws the player in the GUI. Takes the same parameters as [Renderer.drawPlayer] * minus `player`. - * + * * @see Renderer.drawPlayer */ draw(obj: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Player; @@ -50679,7 +50679,7 @@ declare global { const Player$ArmorWrapper: { new(): com.chattriggers.ctjs.api.client.Player$ArmorWrapper; } - interface Player$ArmorWrapper { + interface Player$ArmorWrapper { /** * @return the [Item] in the player's helmet slot or null if the slot is empty */ @@ -50702,29 +50702,29 @@ declare global { AttenuationType: typeof com.chattriggers.ctjs.api.client.Sound$AttenuationType; new(config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.client.Sound; } - interface Sound { + interface Sound { destroy(): void; /** * Gets the category of this sound, making it respect the Player's sound volume sliders. - * + * * @return the category */ getCategory(): com.chattriggers.ctjs.api.client.Sound$Category; /** * Sets the category of this sound, making it respect the Player's sound volume sliders. - * + * * @param category the category */ setCategory(category: com.chattriggers.ctjs.api.client.Sound$Category): com.chattriggers.ctjs.api.client.Sound; /** * Gets this sound's volume. - * + * * @return A float value (0.0f - 1.0f). */ getVolume(): number; /** * Sets this sound's volume. - * + * * @param volume A float value (0.0f - 1.0f). */ setVolume(volume: number): com.chattriggers.ctjs.api.client.Sound; @@ -50738,25 +50738,25 @@ declare global { setPosition(x: number, y: number, z: number): com.chattriggers.ctjs.api.client.Sound; /** * Gets this sound's pitch. - * + * * @return A float value (0.5f - 2.0f). */ getPitch(): number; /** * Sets this sound's pitch. - * + * * @param pitch A float value (0.5f - 2.0f). */ setPitch(pitch: number): com.chattriggers.ctjs.api.client.Sound; /** * Gets the attenuation type (fade out over space) of the sound - * + * * @return The type of Attenuation */ getAttenuationType(): com.chattriggers.ctjs.api.client.Sound$AttenuationType; /** * Sets the attenuation type (fade out over space) of the sound - * + * * @param attenuationType The type of Attenuation */ setAttenuationType(attenuationType: com.chattriggers.ctjs.api.client.Sound$AttenuationType): com.chattriggers.ctjs.api.client.Sound; @@ -50820,14 +50820,14 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.client.Sound$Category; } - interface Sound$Category extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + interface Sound$Category extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { } const Sound$Category$Companion: { fromMC(mcValue: net.minecraft.sounds.SoundSource): com.chattriggers.ctjs.api.client.Sound$Category; from(value: any): com.chattriggers.ctjs.api.client.Sound$Category; new(): unknown; } - interface Sound$Category$Companion { + interface Sound$Category$Companion { fromMC(mcValue: net.minecraft.sounds.SoundSource): com.chattriggers.ctjs.api.client.Sound$Category; from(value: any): com.chattriggers.ctjs.api.client.Sound$Category; new(): unknown; @@ -50839,14 +50839,14 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.client.Sound$AttenuationType; } - interface Sound$AttenuationType extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { + interface Sound$AttenuationType extends kotlin.Enum, com.chattriggers.ctjs.api.CTWrapper { } const Sound$AttenuationType$Companion: { fromMC(mcValue: net.minecraft.client.resources.sounds.SoundInstance$Attenuation): com.chattriggers.ctjs.api.client.Sound$AttenuationType; from(value: any): com.chattriggers.ctjs.api.client.Sound$AttenuationType; new(): unknown; } - interface Sound$AttenuationType$Companion { + interface Sound$AttenuationType$Companion { fromMC(mcValue: net.minecraft.client.resources.sounds.SoundInstance$Attenuation): com.chattriggers.ctjs.api.client.Sound$AttenuationType; from(value: any): com.chattriggers.ctjs.api.client.Sound$AttenuationType; new(): unknown; @@ -50857,7 +50857,7 @@ declare global { new(name: string, resourcePath: string): com.chattriggers.ctjs.api.render.Font; new(name: string, inputStream: java.io.InputStream): com.chattriggers.ctjs.api.render.Font; } - interface Font { + interface Font { getName(): string; buffer(): java.nio.ByteBuffer; } @@ -50867,18 +50867,18 @@ declare global { new(): com.chattriggers.ctjs.api.render.Display; new(config: org.mozilla.javascript.NativeObject | null | undefined): com.chattriggers.ctjs.api.render.Display; } - interface Display { + interface Display { getTextColor(): number; /** * Sets the color of the texts - * + * * Overrides the color of the individual texts */ setTextColor(textColor: number): com.chattriggers.ctjs.api.render.Display; getAlign(): com.chattriggers.ctjs.api.render.Text$Align; /** * Set the alignment of the texts in the display - * + * * Overrides alignment of the individual texts */ setAlign(align: any): com.chattriggers.ctjs.api.render.Display; @@ -50914,7 +50914,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.render.Text$Align; } - interface Text$Align extends kotlin.Enum { + interface Text$Align extends kotlin.Enum { } const Display$Order: { REVERSED: com.chattriggers.ctjs.api.render.Display$Order; @@ -50923,7 +50923,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Order; } - interface Display$Order extends kotlin.Enum { + interface Display$Order extends kotlin.Enum { } const Display$Background: { NONE: com.chattriggers.ctjs.api.render.Display$Background; @@ -50933,7 +50933,7 @@ declare global { values(): Array; valueOf(value: string): com.chattriggers.ctjs.api.render.Display$Background; } - interface Display$Background extends kotlin.Enum { + interface Display$Background extends kotlin.Enum { } const Text: { Align: typeof com.chattriggers.ctjs.api.render.Text$Align; @@ -50942,7 +50942,7 @@ declare global { new(string: string, x: number, y: number): com.chattriggers.ctjs.api.render.Text; new(string: string, config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.render.Text; } - interface Text { + interface Text { getString(): string; setString(string: string): com.chattriggers.ctjs.api.render.Text; getColor(): number; @@ -50956,7 +50956,7 @@ declare global { getBackground(): boolean; /** * Set the background - * + * * true: Background is enabled * false: Background is disabled */ @@ -50970,7 +50970,7 @@ declare global { /** * Gets the width of the text * This is automatically updated when the text is drawn. - * + * * @return the width of the text */ getWidth(): number; @@ -50981,7 +50981,7 @@ declare global { setScale(scale: number): com.chattriggers.ctjs.api.render.Text; /** * Sets the maximum width of the text, splitting it into multiple lines if necessary. - * + * * @param maxWidth the maximum width of the text * @return the Text object for method chaining */ @@ -50997,7 +50997,7 @@ declare global { currentContext: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; new(): com.chattriggers.ctjs.api.render.DrawContextHolder; } - interface DrawContextHolder { + interface DrawContextHolder { currentContext: net.minecraft.client.gui.GuiGraphicsExtractor | null | undefined; new(): com.chattriggers.ctjs.api.render.DrawContextHolder; withContext(context: net.minecraft.client.gui.GuiGraphicsExtractor, block: kotlin.Function0): T; @@ -51012,7 +51012,7 @@ declare global { */ new(): com.chattriggers.ctjs.api.render.RenderPipelines; } - interface RenderPipelines { + interface RenderPipelines { LINE_LIST: com.mojang.blaze3d.pipeline.RenderPipeline; TRIANGLE_STRIP: com.mojang.blaze3d.pipeline.RenderPipeline; LINE_LIST_ESP: com.mojang.blaze3d.pipeline.RenderPipeline; @@ -51029,7 +51029,7 @@ declare global { TRIANGLE_STRIP_ESP: net.minecraft.client.renderer.rendertype.RenderType; new(): com.chattriggers.ctjs.api.render.RenderLayers; } - interface RenderLayers { + interface RenderLayers { LINE_LIST: net.minecraft.client.renderer.rendertype.RenderType; LINE_LIST_ESP: net.minecraft.client.renderer.rendertype.RenderType; TRIANGLE_STRIP: net.minecraft.client.renderer.rendertype.RenderType; @@ -51039,7 +51039,7 @@ declare global { const Rectangle: { new(color: number, x: number, y: number, width: number, height: number): com.chattriggers.ctjs.api.render.Rectangle; } - interface Rectangle { + interface Rectangle { getColor(): number; setColor(color: number): com.chattriggers.ctjs.api.render.Rectangle; getX(): number; @@ -51131,7 +51131,7 @@ declare global { drawImage(image: com.chattriggers.ctjs.api.render.Image, x: number, y: number, width: number, height: number): void; /** * Draws a player entity to the screen, similar to the one displayed in the inventory screen. - * + * * Takes a parameter with the following options: * - player: The player entity to draw. Can be a [PlayerMP] or [AbstractClientPlayerEntity]. * Defaults to Player.toMC() @@ -51149,13 +51149,13 @@ declare global { * - showElytra: Whether the player's Elytra should be rendered * - showParrot: Whether a perched parrot should be rendered * - showBeeStinger: Whether any stuck bee stingers should be rendered - * + * * @param obj An options bag */ drawPlayer(obj: org.mozilla.javascript.NativeObject): void; new(): com.chattriggers.ctjs.api.render.Renderer; } - interface Renderer extends com.chattriggers.ctjs.api.render.GuiRendererBackend { + interface Renderer extends com.chattriggers.ctjs.api.render.GuiRendererBackend { screen: com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; getPartialTicks(): number; BLACK: number; @@ -51215,7 +51215,7 @@ declare global { drawImage(image: com.chattriggers.ctjs.api.render.Image, x: number, y: number, width: number, height: number): void; /** * Draws a player entity to the screen, similar to the one displayed in the inventory screen. - * + * * Takes a parameter with the following options: * - player: The player entity to draw. Can be a [PlayerMP] or [AbstractClientPlayerEntity]. * Defaults to Player.toMC() @@ -51233,7 +51233,7 @@ declare global { * - showElytra: Whether the player's Elytra should be rendered * - showParrot: Whether a perched parrot should be rendered * - showBeeStinger: Whether any stuck bee stingers should be rendered - * + * * @param obj An options bag */ drawPlayer(obj: org.mozilla.javascript.NativeObject): void; @@ -51249,7 +51249,7 @@ declare global { */ new(): com.chattriggers.ctjs.api.render.GuiRendererBackend; } - interface GuiRendererBackend { + interface GuiRendererBackend { registerV5Render(runnable: java.lang.Runnable): void; unregisterV5Render(runnable: java.lang.Runnable): void; registerV5PreRender(runnable: java.lang.Runnable): void; @@ -51295,7 +51295,7 @@ declare global { drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number): void; drawImageFromUrl(url: string, x: number, y: number, w: number, h: number, radius: number, alpha: number): void; loadGif(path: string): com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData | null | undefined; - unloadGif(path: string): void; + unloadGif(path: string): void | null | undefined; drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number): void; drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number): void; drawGif(path: string, x: number, y: number, w: number, h: number, frameIndex: number, radius: number, alpha: number): void; @@ -51306,7 +51306,7 @@ declare global { const GuiRendererBackend$GifData: { new(width: number, height: number, frameCount: number, delays: Array): com.chattriggers.ctjs.api.render.GuiRendererBackend$GifData; } - interface GuiRendererBackend$GifData { + interface GuiRendererBackend$GifData { getWidth(): number; getHeight(): number; getFrameCount(): number; @@ -51320,7 +51320,7 @@ declare global { const Renderer$ScreenWrapper: { new(): com.chattriggers.ctjs.api.render.Renderer$ScreenWrapper; } - interface Renderer$ScreenWrapper { + interface Renderer$ScreenWrapper { getWidth(): number; getHeight(): number; getScale(): number; @@ -51328,7 +51328,7 @@ declare global { const Image: { new(image: java.awt.image.BufferedImage | null | undefined): com.chattriggers.ctjs.api.render.Image; } - interface Image { + interface Image { getImage(): java.awt.image.BufferedImage | null | undefined; setImage(value: java.awt.image.BufferedImage | null | undefined): void; getTextureWidth(): number; @@ -51371,7 +51371,7 @@ declare global { fromUrl(url: string, cachedImageName: string | null | undefined): com.chattriggers.ctjs.api.render.Image; new(): com.chattriggers.ctjs.api.render.Image$Companion; } - interface Image$Companion { + interface Image$Companion { /** * Create an image object from a java.io.File object. Throws an exception * if the file cannot be found. @@ -51402,24 +51402,24 @@ declare global { const Book: { new(): com.chattriggers.ctjs.api.render.Book; } - interface Book { + interface Book { /** * Add a page to the book. - * + * * @param contents the entire message for what the page should be * @return the current book to allow method chaining */ addPage(contents: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Book; /** * Overloaded method for adding a simple page to the book. - * + * * @param message a simple string to make the page * @return the current book to allow method chaining */ addPage(message: string): com.chattriggers.ctjs.api.render.Book; /** * Inserts a page at the specified index of the book - * + * * @param pageIndex the index of the page to set * @param message the message to set the page to * @return the current book to allow method chaining @@ -51428,7 +51428,7 @@ declare global { insertPage(pageIndex: number, message: string): com.chattriggers.ctjs.api.render.Book; /** * Sets a page of the book to the specified message. - * + * * @param pageIndex the index of the page to set * @param message the message to set the page to * @return the current book to allow method chaining @@ -51444,7 +51444,7 @@ declare global { new(): com.chattriggers.ctjs.api.render.Gui; new(title: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; } - interface Gui extends gg.essential.universal.UScreen { + interface Gui extends gg.essential.universal.UScreen { open(): void; isOpen(): boolean; /** @@ -51454,7 +51454,7 @@ declare global { * - int mouseX * - int mouseY * - float partialTicks - * + * * @param method the method to run * @return the trigger */ @@ -51466,7 +51466,7 @@ declare global { * - int mouseX * - int mouseY * - int button - * + * * @param method the method to run * @return the trigger */ @@ -51486,7 +51486,7 @@ declare global { * Arguments passed through to method: * - char typed character * - int key code - * + * * @param method the method to run * @return the trigger */ @@ -51499,7 +51499,7 @@ declare global { * - int mouseY * - int clickedMouseButton * - long timeSinceLastClick - * + * * @param method the method to run * @return the trigger */ @@ -51511,7 +51511,7 @@ declare global { * - int mouseX * - int mouseY * - int button - * + * * @param method the method to run * @return the trigger */ @@ -51521,7 +51521,7 @@ declare global { * Registered method runs when an action is performed (clicking a button) * Arguments passed through to method: * - the button that is clicked - * + * * @param method the method to run * @return the trigger */ @@ -51530,7 +51530,7 @@ declare global { * Registers a method to be run when the gui is opened. * Arguments passed through to method: * - the gui that is opened - * + * * @param method the method to run * @return the trigger */ @@ -51539,7 +51539,7 @@ declare global { * Registers a method to be run when the gui is closed. * Arguments passed through to method: * - the gui that is closed - * + * * @param method the method to run * @return the trigger */ @@ -51556,14 +51556,14 @@ declare global { setDoesPauseGame(doesPauseGame: boolean): com.chattriggers.ctjs.api.render.Gui; /** * Add a base Minecraft button to the gui - * + * * @param button the button to add * @return the button ID for use in actionPerformed */ addButton(button: net.minecraft.client.gui.components.Button): number; /** * Add a base Minecraft button to the gui - * + * * @param x the x position of the button * @param y the y position of the button * @param width the width of the button @@ -51574,7 +51574,7 @@ declare global { addButton(x: number, y: number, buttonText: com.chattriggers.ctjs.api.message.TextComponent): number; /** * Add a base Minecraft button to the gui - * + * * @param x the x position of the button * @param y the y position of the button * @param width the width of the button @@ -51585,7 +51585,7 @@ declare global { addButton(x: number, y: number, width: number, buttonText: com.chattriggers.ctjs.api.message.TextComponent): number; /** * Add a base Minecraft button to the gui - * + * * @param x the x position of the button * @param y the y position of the button * @param width the width of the button @@ -51597,7 +51597,7 @@ declare global { addButton(x: number, y: number, width: number, height: number, buttonText: string): number; /** * Removes a button from the gui with the given id - * + * * @param buttonId the id of the button to remove * @return the Gui for method chaining */ @@ -51606,7 +51606,7 @@ declare global { getButtonVisibility(buttonId: number): boolean; /** * Sets the visibility of a button - * + * * @param buttonId the id of the button to change * @param visible the new visibility of the button * @return the Gui for method chaining @@ -51615,7 +51615,7 @@ declare global { getButtonEnabled(buttonId: number): boolean; /** * Sets the enabled state of a button - * + * * @param buttonId the id of the button to set * @param enabled the enabled state of the button * @return the Gui for method chaining @@ -51624,7 +51624,7 @@ declare global { getButtonWidth(buttonId: number): number; /** * Sets the button's width. Button textures break if the width is greater than 200 - * + * * @param buttonId id of the button * @param width the new width * @return the Gui for method chaining @@ -51633,7 +51633,7 @@ declare global { getButtonHeight(buttonId: number): number; /** * Sets the button's height. Button textures break if the height is not 20 - * + * * @param buttonId id of the button * @param height the new height * @return the Gui for method chaining @@ -51642,7 +51642,7 @@ declare global { getButtonX(buttonId: number): number; /** * Sets the button's x position - * + * * @param buttonId id of the button * @param x the new x position * @return the Gui for method chaining @@ -51651,7 +51651,7 @@ declare global { getButtonY(buttonId: number): number; /** * Sets the button's y position - * + * * @param buttonId id of the button * @param y the new y position * @return the Gui for method chaining @@ -51659,7 +51659,7 @@ declare global { setButtonY(buttonId: number, y: number): com.chattriggers.ctjs.api.render.Gui; /** * Sets the button's position - * + * * @param buttonId id of the button * @param x the new x position * @param y the new y position @@ -51668,14 +51668,14 @@ declare global { setButtonLoc(buttonId: number, x: number, y: number): com.chattriggers.ctjs.api.render.Gui; /** * Sets the button's text - * + * * @param buttonId id of the button * @param text the new text */ setButtonText(buttonId: number, text: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; /** * Sets the button's text - * + * * @param buttonId id of the button * @param text the new text */ @@ -51683,14 +51683,14 @@ declare global { /** * Sets the gui's tooltip, this will be visible on top of the cursor * when the gui is open. - * + * * @param text the contents of the tooltip */ setTooltip(text: com.chattriggers.ctjs.api.message.TextComponent): com.chattriggers.ctjs.api.render.Gui; /** * Sets the gui's tooltip, this will be visible on top of the cursor * when the gui is open. - * + * * @param text the contents of the tooltip */ setTooltip(text: string): com.chattriggers.ctjs.api.render.Gui; @@ -51698,7 +51698,7 @@ declare global { const Toast: { new(config: org.mozilla.javascript.NativeObject): com.chattriggers.ctjs.api.render.Toast; } - interface Toast extends net.minecraft.client.gui.components.toasts.Toast { + interface Toast extends net.minecraft.client.gui.components.toasts.Toast { getTitle(): any | null | undefined; setTitle(value: any | null | undefined): void; getDescription(): any | null | undefined; @@ -51750,7 +51750,7 @@ declare global { drawText(text: string, pos: net.minecraft.world.phys.Vec3, scale: number, backgroundBox: boolean, increase: boolean, seeThrough: boolean, translate: boolean): void; new(): com.chattriggers.ctjs.api.render.RenderUtils; } - interface RenderUtils { + interface RenderUtils { drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; drawFilledBox(pos: net.minecraft.world.phys.Vec3, color: com.chattriggers.ctjs.api.render.RenderUtils$Color, depth: boolean): void; drawFilledBox(box: net.minecraft.world.phys.AABB, color: com.chattriggers.ctjs.api.render.RenderUtils$Color): void; @@ -51791,7 +51791,7 @@ declare global { const RenderUtils$Color: { new(r: number, g: number, b: number, a: number): com.chattriggers.ctjs.api.render.RenderUtils$Color; } - interface RenderUtils$Color { + interface RenderUtils$Color { getR(): number; getG(): number; getB(): number; @@ -51811,7 +51811,7 @@ declare global { const Config$ConsoleSettings: { new(clearConsoleOnLoad: boolean, openConsoleOnError: boolean, consoleFiraCodeFont: boolean, consoleFontSize: number, customTheme: boolean, consoleTheme: number, consoleTextColor: java.awt.Color, consoleBackgroundColor: java.awt.Color, consoleErrorColor: java.awt.Color, consoleWarningColor: java.awt.Color): com.chattriggers.ctjs.api.Config$ConsoleSettings; } - interface Config$ConsoleSettings { + interface Config$ConsoleSettings { getClearConsoleOnLoad(): boolean; setClearConsoleOnLoad(value: boolean): void; getOpenConsoleOnError(): boolean; @@ -51847,11 +51847,11 @@ declare global { const Config$ConsoleSettings$Companion: { new(): unknown; } - interface Config$ConsoleSettings$Companion { + interface Config$ConsoleSettings$Companion { new(): unknown; make(): com.chattriggers.ctjs.api.Config$ConsoleSettings; } - interface CTWrapper { + interface CTWrapper { getMcValue(): MCClass; toMC(): MCClass; } @@ -51891,7 +51891,7 @@ declare global { markWelcomeShown(): void; new(): com.chattriggers.ctjs.api.Config; } - interface Config extends gg.essential.vigilance.Vigilant { + interface Config extends gg.essential.vigilance.Vigilant { getModuleImportHelp(): boolean; setModuleImportHelp(value: boolean): void; getModuleChangelog(): boolean; @@ -51933,7 +51933,7 @@ declare global { shutDownHard(): java.lang.Void; new(): com.chattriggers.ctjs.api.V5Auth; } - interface V5Auth { + interface V5Auth { getJwtToken(): string | null | undefined; getFreshJwtToken(): string | null | undefined; setJwtToken(token: string | null | undefined): void; @@ -51961,7 +51961,7 @@ declare global { */ new(): com.chattriggers.ctjs.api.Mappings; } - interface Mappings { + interface Mappings { /** * Gets a classes unmapped class name, or throws an error if it is not mapped */ @@ -51985,20 +51985,20 @@ declare global { } namespace internal { namespace launch { - interface IInjector { + interface IInjector { } } namespace commands { const CommandCollection: { new(): com.chattriggers.ctjs.internal.commands.CommandCollection; } - interface CommandCollection { + interface CommandCollection { register(command: com.chattriggers.ctjs.internal.commands.Command): void; unregister(command: com.chattriggers.ctjs.internal.commands.Command): void; unregisterAll(): void; onExecute(block: kotlin.Function1, void>): T; } - interface Command { + interface Command { getOverrideExisting(): boolean; getName(): string; registerImpl(dispatcher: com.mojang.brigadier.CommandDispatcher): void; @@ -58155,10 +58155,10 @@ declare global { new(p0: string, p1: boolean): org.spongepowered.asm.mixin.injection.callback.CallbackInfo; getCallInfoClassName(p0: org.objectweb.asm.Type): string; } - interface CallbackInfo extends org.spongepowered.asm.mixin.injection.callback.Cancellable { + interface CallbackInfo extends org.spongepowered.asm.mixin.injection.callback.Cancellable { getId(): string; } - interface Cancellable { + interface Cancellable { isCancellable(): boolean; isCancelled(): boolean; cancel(): void; @@ -58211,7 +58211,7 @@ declare global { getArgumentCount(p0: string): number; getArgumentsAndReturnSizes(p0: string): number; } - interface Type { + interface Type { getElementType(): org.objectweb.asm.Type; getArgumentTypes(): Array; getReturnType(): org.objectweb.asm.Type; @@ -59345,7 +59345,7 @@ declare global { nbytes(p0: number): number; nflags(p0: number): number; } - interface FFICIF extends org.lwjgl.system.Struct, org.lwjgl.system.NativeResource { + interface FFICIF extends org.lwjgl.system.Struct, org.lwjgl.system.NativeResource { abi(): number; nargs(): number; arg_types(): org.lwjgl.PointerBuffer; @@ -59385,7 +59385,7 @@ declare global { nelements(p0: number, p1: number): org.lwjgl.PointerBuffer | null | undefined; nelements(p0: number, p1: org.lwjgl.PointerBuffer | null | undefined): void; } - interface FFIType extends org.lwjgl.system.Struct, org.lwjgl.system.NativeResource { + interface FFIType extends org.lwjgl.system.Struct, org.lwjgl.system.NativeResource { size(): number; size(p0: number): org.lwjgl.system.libffi.FFIType; alignment(): number; @@ -59401,7 +59401,7 @@ declare global { new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFIType$Buffer; new(p0: number, p1: number): org.lwjgl.system.libffi.FFIType$Buffer; } - interface FFIType$Buffer extends org.lwjgl.system.StructBuffer, org.lwjgl.system.NativeResource { + interface FFIType$Buffer extends org.lwjgl.system.StructBuffer, org.lwjgl.system.NativeResource { size(): number; size(p0: number): org.lwjgl.system.libffi.FFIType$Buffer; alignment(): number; @@ -59415,7 +59415,7 @@ declare global { new(p0: java.nio.ByteBuffer): org.lwjgl.system.libffi.FFICIF$Buffer; new(p0: number, p1: number): org.lwjgl.system.libffi.FFICIF$Buffer; } - interface FFICIF$Buffer extends org.lwjgl.system.StructBuffer, org.lwjgl.system.NativeResource { + interface FFICIF$Buffer extends org.lwjgl.system.StructBuffer, org.lwjgl.system.NativeResource { abi(): number; nargs(): number; arg_types(): org.lwjgl.PointerBuffer; @@ -59428,13 +59428,13 @@ declare global { validate(p0: number, p1: number, p2: number, p3: org.lwjgl.system.Struct$StructValidation): void; validate(p0: number, p1: number, p2: number, p3: org.lwjgl.system.Struct$StructValidation): void; } - interface Struct extends org.lwjgl.system.Pointer$Default { + interface Struct extends org.lwjgl.system.Pointer$Default { sizeof(): number; clear(): void; free(): void; isNull(p0: number): boolean; } - interface Pointer$Default extends org.lwjgl.system.Pointer { + interface Pointer$Default extends org.lwjgl.system.Pointer { } const Pointer: { Default: typeof org.lwjgl.system.Pointer$Default; @@ -59445,10 +59445,10 @@ declare global { BITS32: boolean; BITS64: boolean; } - interface Pointer { + interface Pointer { address(): number; } - interface StructBuffer extends org.lwjgl.system.CustomBuffer, kotlin.collections.MutableIterable { + interface StructBuffer extends org.lwjgl.system.CustomBuffer, kotlin.collections.MutableIterable { get(): T; get(p0: T): SELF; get(p0: number): T; @@ -59460,7 +59460,7 @@ declare global { stream(): java.util.stream.Stream; parallelStream(): java.util.stream.Stream; } - interface CustomBuffer extends org.lwjgl.system.Pointer$Default { + interface CustomBuffer extends org.lwjgl.system.Pointer$Default { mark(): SELF; position(): number; position(p0: number): SELF; @@ -59483,11 +59483,11 @@ declare global { put(p0: SELF): SELF; compact(): SELF; } - interface Struct$StructValidation { + interface Struct$StructValidation { validate(p0: number): void; (p0: number): void; } - interface NativeResource extends java.lang.AutoCloseable { + interface NativeResource extends java.lang.AutoCloseable { free(): void; } const Callback: { @@ -59496,12 +59496,12 @@ declare global { get(p0: number): T; getSafe(p0: number): T; } - interface Callback extends org.lwjgl.system.Pointer, org.lwjgl.system.NativeResource { + interface Callback extends org.lwjgl.system.Pointer, org.lwjgl.system.NativeResource { } const Callback$Descriptor: { new(p0: java.lang.invoke.MethodHandles$Lookup, p1: org.lwjgl.system.libffi.FFICIF): org.lwjgl.system.Callback$Descriptor; } - interface Callback$Descriptor { + interface Callback$Descriptor { } const MemoryStack: { create(): org.lwjgl.system.MemoryStack; @@ -59588,7 +59588,7 @@ declare global { stackUTF16Safe(p0: kotlin.CharSequence | null | undefined): java.nio.ByteBuffer | null | undefined; stackUTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; } - interface MemoryStack extends org.lwjgl.system.Pointer$Default, java.lang.AutoCloseable { + interface MemoryStack extends org.lwjgl.system.Pointer$Default, java.lang.AutoCloseable { push(): org.lwjgl.system.MemoryStack; pop(): org.lwjgl.system.MemoryStack; getAddress(): number; @@ -59698,7 +59698,7 @@ declare global { UTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): java.nio.ByteBuffer | null | undefined; nUTF16Safe(p0: kotlin.CharSequence | null | undefined, p1: boolean): number; } - interface CallbackI extends org.lwjgl.system.Pointer { + interface CallbackI extends org.lwjgl.system.Pointer { getDescriptor(): org.lwjgl.system.Callback$Descriptor; callback(p0: number, p1: number): void; } From 916ad5d7d659b35b2ae6c64cdd02e47b45da0980 Mon Sep 17 00:00:00 2001 From: EpsilonPhoenix <129551402+EpsilonPhoenix@users.noreply.github.com> Date: Mon, 3 Aug 2026 22:20:38 -0400 Subject: [PATCH 06/61] fix: delete rdbt-slop; use skija&gizmo not the absurdity he pushed --- build.gradle.kts | 9 +- gradle/libs.versions.toml | 5 +- .../mixins/GuiGraphicsExtractorAccessor.java | 12 - .../internal/mixins/LevelRendererMixin.java | 7 +- src/main/kotlin/com/chattriggers/ctjs/CTJS.kt | 5 + .../ctjs/api/render/FreeTypeTextRenderer.kt | 326 ------ .../ctjs/api/render/GuiRendererBackend.kt | 1038 +++++------------ .../ctjs/api/render/RenderLayers.kt | 67 -- .../ctjs/api/render/RenderUtils.kt | 212 +--- .../chattriggers/ctjs/api/render/Renderer.kt | 3 + .../ctjs/api/render/skia/SkijaBootstrap.kt | 38 + .../ctjs/api/render/skia/SkijaPIP.kt | 89 ++ .../ctjs/api/render/skia/SkijaSurface.kt | 193 +++ .../resources/assets/v5/font/default.json | 11 - src/main/resources/assets/v5/font/font.ttf | Bin 528296 -> 0 bytes .../resources/assets/v5/font/segoe_bold.json | 11 - .../resources/assets/v5/font/segoe_bold.ttf | Bin 53488 -> 0 bytes .../assets/v5/font/segoe_regular.json | 11 - .../assets/v5/font/segoe_regular.ttf | Bin 50028 -> 0 bytes src/main/resources/ctjs.mixins.json | 1 - src/main/resources/fabric.mod.json | 1 + 21 files changed, 675 insertions(+), 1364 deletions(-) delete mode 100644 src/main/java/com/chattriggers/ctjs/internal/mixins/GuiGraphicsExtractorAccessor.java delete mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/FreeTypeTextRenderer.kt delete mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/RenderLayers.kt create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaBootstrap.kt create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt create mode 100644 src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt delete mode 100644 src/main/resources/assets/v5/font/default.json delete mode 100644 src/main/resources/assets/v5/font/font.ttf delete mode 100644 src/main/resources/assets/v5/font/segoe_bold.json delete mode 100644 src/main/resources/assets/v5/font/segoe_bold.ttf delete mode 100644 src/main/resources/assets/v5/font/segoe_regular.json delete mode 100644 src/main/resources/assets/v5/font/segoe_regular.ttf diff --git a/build.gradle.kts b/build.gradle.kts index bae395de..400f6553 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -50,13 +50,8 @@ dependencies { implementation("meteordevelopment:discord-ipc:1.1") include("meteordevelopment:discord-ipc:1.1") - // CPU-only NanoSVG rasterization (no NanoVG renderer or GL backend) - implementation(libs.lwjgl.nanovg) { include(this) } - listOf("windows", "linux", "macos", "macos-arm64").forEach { - implementation(variantOf(libs.lwjgl.nanovg) { classifier("natives-$it") }) { - include(this) - } - } + implementation(libs.skija.shared) { include(this) } + implementation(libs.skija.types) { include(this) } // Mixin Extras implementation(libs.mixinextras) { include(this) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e8e7d181..0b733d1e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] # Library versions minecraft = "26.1.2" -lwjgl = "3.4.1" +skija = "0.143.11" loader = "0.19.3" fabric-api = "0.153.0+26.1.2" @@ -32,7 +32,8 @@ fabric-kotlin = { module = "net.fabricmc:fabric-language-kotlin", version.ref = sponge-mixin = { module = "net.fabricmc:sponge-mixin", version.ref = "sponge-mixin" } mixinextras = { module = "io.github.llamalad7:mixinextras-fabric", version.ref = "mixinextras" } -lwjgl-nanovg = { module = "org.lwjgl:lwjgl-nanovg", version.ref = "lwjgl" } +skija-shared = { module = "io.github.humbleui:skija-shared", version.ref = "skija" } +skija-types = { module = "io.github.humbleui:types", version = "0.1.1" } rhino = { module = "com.github.ChatTriggers:rhino", version.ref = "rhino" } koffee = { module = "com.github.ChatTriggers:koffee", version.ref = "koffee" } diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiGraphicsExtractorAccessor.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiGraphicsExtractorAccessor.java deleted file mode 100644 index 2388f657..00000000 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/GuiGraphicsExtractorAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.chattriggers.ctjs.internal.mixins; - -import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.client.renderer.state.gui.GuiRenderState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(GuiGraphicsExtractor.class) -public interface GuiGraphicsExtractorAccessor { - @Accessor("guiRenderState") - GuiRenderState getCtjsGuiRenderState(); -} diff --git a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java index 3bffe511..a058b9e7 100644 --- a/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java +++ b/src/main/java/com/chattriggers/ctjs/internal/mixins/LevelRendererMixin.java @@ -71,8 +71,11 @@ private void beforeRender(GraphicsResourceAllocator allocator, DeltaTracker tick ctjs$tickDelta = tickCounter.getGameTimeDeltaTicks(); } - @Inject(method = "lambda$addMainPass$0", at = @At("RETURN")) - private void afterRender(GpuBufferSlice gpuBufferSlice, LevelRenderState worldRenderState, ProfilerFiller profiler, ChunkSectionsToRender chunkSectionsToRender, ResourceHandle handle, ResourceHandle handle2, ResourceHandle handle3, ResourceHandle handle4, ResourceHandle handle5, boolean bl, Matrix4fc matrix4f, CallbackInfo ci) { + @Inject( + method = "lambda$addMainPass$0", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;finalizeGizmoCollection()V") + ) + private void beforeGizmos(GpuBufferSlice gpuBufferSlice, LevelRenderState worldRenderState, ProfilerFiller profiler, ChunkSectionsToRender chunkSectionsToRender, ResourceHandle handle, ResourceHandle handle2, ResourceHandle handle3, ResourceHandle handle4, ResourceHandle handle5, boolean bl, Matrix4fc matrix4f, CallbackInfo ci) { WorldListener.INSTANCE.triggerRenderLast(); } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt index 83ebe549..10b50f0a 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/CTJS.kt @@ -9,6 +9,8 @@ import com.chattriggers.ctjs.api.commands.DynamicCommands import com.chattriggers.ctjs.api.message.ChatLib import com.chattriggers.ctjs.api.render.Image import com.chattriggers.ctjs.api.render.Renderer +import com.chattriggers.ctjs.api.render.skia.SkijaPIP +import com.chattriggers.ctjs.api.render.skia.SkijaPrePIP import com.chattriggers.ctjs.api.triggers.TriggerType import com.chattriggers.ctjs.api.world.Scoreboard import com.chattriggers.ctjs.api.world.World @@ -22,6 +24,7 @@ import kotlinx.serialization.json.Json import net.fabricmc.api.ClientModInitializer import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents +import net.fabricmc.fabric.api.client.rendering.v1.PictureInPictureRendererRegistry import net.fabricmc.loader.api.FabricLoader import net.minecraft.client.gui.screens.TitleScreen import java.io.File @@ -31,6 +34,8 @@ import kotlin.concurrent.thread class CTJS : ClientModInitializer { override fun onInitializeClient() { + PictureInPictureRendererRegistry.register { SkijaPIP(it.bufferSource()) } + PictureInPictureRendererRegistry.register { SkijaPrePIP(it.bufferSource()) } Client.referenceSystemTime = System.nanoTime() Initializer.initializers.forEach(Initializer::init) Config.loadData() diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/FreeTypeTextRenderer.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/FreeTypeTextRenderer.kt deleted file mode 100644 index f478ab3b..00000000 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/FreeTypeTextRenderer.kt +++ /dev/null @@ -1,326 +0,0 @@ -package com.chattriggers.ctjs.api.render - -import com.mojang.blaze3d.platform.NativeImage -import com.mojang.blaze3d.systems.RenderSystem -import com.mojang.blaze3d.textures.AddressMode -import com.mojang.blaze3d.textures.FilterMode -import com.mojang.blaze3d.textures.GpuTexture -import com.mojang.blaze3d.textures.GpuTextureView -import com.mojang.blaze3d.textures.TextureFormat -import net.minecraft.client.gui.render.TextureSetup -import org.lwjgl.system.MemoryStack -import org.lwjgl.system.MemoryUtil -import org.lwjgl.util.freetype.FT_Face -import org.lwjgl.util.freetype.FT_Vector -import org.lwjgl.util.freetype.FreeType.FT_Done_Face -import org.lwjgl.util.freetype.FreeType.FT_Done_FreeType -import org.lwjgl.util.freetype.FreeType.FT_Get_Char_Index -import org.lwjgl.util.freetype.FreeType.FT_Get_Kerning -import org.lwjgl.util.freetype.FreeType.FT_Init_FreeType -import org.lwjgl.util.freetype.FreeType.FT_KERNING_UNSCALED -import org.lwjgl.util.freetype.FreeType.FT_LOAD_DEFAULT -import org.lwjgl.util.freetype.FreeType.FT_Load_Glyph -import org.lwjgl.util.freetype.FreeType.FT_New_Memory_Face -import org.lwjgl.util.freetype.FreeType.FT_RENDER_MODE_NORMAL -import org.lwjgl.util.freetype.FreeType.FT_Render_Glyph -import org.lwjgl.util.freetype.FreeType.FT_Set_Pixel_Sizes -import java.nio.ByteBuffer -import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.ConcurrentLinkedQueue -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executors -import java.util.concurrent.atomic.AtomicBoolean -import kotlin.math.max - -/** FreeType layout/raster work plus render-thread-owned grayscale atlas pages. */ -internal class FreeTypeTextRenderer { - data class Layout( - val codePoints: IntArray, - val xs: FloatArray, - val lines: IntArray, - val lineWidths: FloatArray, - val width: Float, - val ascender: Float, - val lineHeight: Float, - ) { - val height get() = lineHeight * lineWidths.size - internal val glyphRuns = HashMap() - } - - internal class GlyphRun(size: Int) { - val glyphs = arrayOfNulls(size) - val resolved = BooleanArray(size) - var complete = false - } - - data class Glyph( - val page: AtlasPage, - val u0: Float, - val v0: Float, - val u1: Float, - val v1: Float, - val width: Int, - val height: Int, - val left: Int, - val top: Int, - ) - - internal class AtlasPage( - val texture: GpuTexture, - val view: GpuTextureView, - val setup: TextureSetup, - ) : AutoCloseable { - var x = PADDING - var y = PADDING - var rowHeight = 0 - override fun close() { view.close(); texture.close() } - } - - private data class LayoutKey(val font: Font, val text: String) - private data class GlyphKey(val font: Font, val codePoint: Int, val pixelSize: Int) - private data class BitmapGlyph(val key: GlyphKey, val pixels: ByteArray, val width: Int, val height: Int, val left: Int, val top: Int) - private data class FaceData(val face: FT_Face, val bytes: ByteBuffer, var pixelSize: Int = 0) { - val units = (face.units_per_EM().toInt() and 0xffff).coerceAtLeast(1) - private val verticalUnits = (face.ascender() - face.descender()).coerceAtLeast(1) - val ascender = face.ascender().toFloat() * BASE_SIZE / verticalUnits - val lineHeight = max(face.height().toInt(), verticalUnits).toFloat() * BASE_SIZE / verticalUnits - val kernings = HashMap() - } - - private val executor = Executors.newSingleThreadExecutor { task -> Thread(task, "V5 FreeType").apply { isDaemon = true } } - private val layouts = object : LinkedHashMap(128, .75f, true) { - override fun removeEldestEntry(eldest: MutableMap.MutableEntry?) = size > MAX_LAYOUTS - } - private val pendingLayouts = ConcurrentHashMap>() - private val requestedGlyphs = ConcurrentHashMap.newKeySet() - private val completedGlyphs = ConcurrentLinkedQueue() - private val glyphs = ConcurrentHashMap() - private val blankGlyphs = ConcurrentHashMap.newKeySet() - private val pages = ArrayList() - private val closed = AtomicBoolean() - private var library = 0L - private val faces = HashMap() - - fun layout(text: String, font: Font, pixelSize: Int? = null): Layout? { - val key = LayoutKey(font, text) - synchronized(layouts) { layouts[key] }?.let { result -> - if (pixelSize != null) requestGlyphs(result, font, pixelSize) - return result - } - requestLayout(key, pixelSize) - return null - } - - fun measure(text: String, font: Font): Layout { - val key = LayoutKey(font, text) - synchronized(layouts) { layouts[key] }?.let { return it } - return requestLayout(key, null).join() - } - - fun glyphs(layout: Layout, font: Font, pixelSize: Int): Array = synchronized(layout.glyphRuns) { - val run = layout.glyphRuns.getOrPut(pixelSize) { GlyphRun(layout.codePoints.size) } - if (!run.complete) { - var complete = true - for (i in layout.codePoints.indices) if (!run.resolved[i]) { - val key = GlyphKey(font, layout.codePoints[i], pixelSize) - val glyph = glyphs[key] - if (glyph != null) { run.glyphs[i] = glyph; run.resolved[i] = true } - else if (key in blankGlyphs) run.resolved[i] = true - else complete = false - } - run.complete = complete - } - run.glyphs - } - - fun processUploads(limit: Int = 128) { - if (completedGlyphs.isEmpty()) return - RenderSystem.assertOnRenderThread() - repeat(limit) { - val bitmap = completedGlyphs.poll() ?: return - if (bitmap.width == 0 || bitmap.height == 0) { - blankGlyphs += bitmap.key - return@repeat - } - val page = pages.firstOrNull { place(it, bitmap.width, bitmap.height) != null } - ?: newPage().also { place(it, bitmap.width, bitmap.height) } - val px = page.x - bitmap.width - PADDING - val py = page.y - val upload = MemoryUtil.memAlloc(bitmap.width * bitmap.height * 4) - for (coverage in bitmap.pixels) upload.put(0xff.toByte()).put(0xff.toByte()).put(0xff.toByte()).put(coverage) - upload.flip() - RenderSystem.getDevice().createCommandEncoder().writeToTexture( - page.texture, upload, NativeImage.Format.RGBA, 0, 0, px, py, bitmap.width, bitmap.height, - ) - MemoryUtil.memFree(upload) - glyphs[bitmap.key] = Glyph( - page, - px.toFloat() / PAGE_SIZE, py.toFloat() / PAGE_SIZE, - (px + bitmap.width).toFloat() / PAGE_SIZE, (py + bitmap.height).toFloat() / PAGE_SIZE, - bitmap.width, bitmap.height, bitmap.left, bitmap.top, - ) - } - } - - fun close() { - if (!closed.compareAndSet(false, true)) return - executor.execute { - faces.values.forEach { FT_Done_Face(it.face) } - faces.clear() - if (library != 0L) FT_Done_FreeType(library) - library = 0L - } - executor.shutdown() - pages.forEach(AtlasPage::close) - pages.clear() - } - - private fun requestGlyphs(layout: Layout, font: Font, pixelSize: Int) { - for (codePoint in layout.codePoints) { - val key = GlyphKey(font, codePoint, pixelSize) - if (!glyphs.containsKey(key) && key !in blankGlyphs && requestedGlyphs.add(key)) submit { completedGlyphs += rasterize(key, face(font)) } - } - } - - private fun requestLayout(key: LayoutKey, pixelSize: Int?): CompletableFuture = - pendingLayouts.computeIfAbsent(key) { - CompletableFuture().also { future -> - submit { - try { - val result = buildLayout(key.text, face(key.font)) - synchronized(layouts) { layouts[key] = result } - if (pixelSize != null) requestGlyphs(result, key.font, pixelSize) - future.complete(result) - } catch (error: Throwable) { - future.completeExceptionally(error) - throw error - } finally { - pendingLayouts.remove(key, future) - } - } - } - } - - private fun submit(task: () -> Unit) { - if (!closed.get()) executor.execute { - try { task() } catch (e: Exception) { System.err.println("[V5] FreeType: ${e.message}") } - } - } - - private fun face(font: Font): FaceData = faces.getOrPut(font) { - if (library == 0L) MemoryStack.stackPush().use { stack -> - val pointer = stack.mallocPointer(1) - checkFt(FT_Init_FreeType(pointer), "initialize FreeType") - library = pointer[0] - } - val bytes = font.buffer() - MemoryStack.stackPush().use { stack -> - val pointer = stack.mallocPointer(1) - checkFt(FT_New_Memory_Face(library, bytes, 0, pointer), "load ${font.name}") - FaceData(FT_Face.create(pointer[0]), bytes) - } - } - - private fun buildLayout(text: String, data: FaceData): Layout { - val codePoints = ArrayList(text.length) - val xs = ArrayList(text.length) - val lines = ArrayList(text.length) - val widths = ArrayList() - var line = 0 - var x = 0f - var previous = 0 - var offset = 0 - while (offset < text.length) { - val codePoint = text.codePointAt(offset) - offset += Character.charCount(codePoint) - if (codePoint == '\r'.code) { - if (offset < text.length && text[offset] == '\n') offset++ - widths += x; line++; x = 0f; previous = 0; continue - } - if (codePoint == '\n'.code) { widths += x; line++; x = 0f; previous = 0; continue } - val glyph = glyphIndex(data.face, codePoint) - if (previous != 0 && glyph != 0) x += kerning(data, previous, glyph) - codePoints += codePoint; xs += x; lines += line - checkFt(FT_Load_Glyph(data.face, glyph, org.lwjgl.util.freetype.FreeType.FT_LOAD_NO_SCALE), "measure glyph") - x += data.face.glyph()!!.metrics().horiAdvance() * BASE_SIZE / data.units - previous = glyph - } - widths += x - val lineWidths = widths.toFloatArray() - return Layout(codePoints.toIntArray(), xs.toFloatArray(), lines.toIntArray(), lineWidths, lineWidths.maxOrNull() ?: 0f, data.ascender, data.lineHeight) - } - - private fun kerning(data: FaceData, left: Int, right: Int): Float { - val key = (left.toLong() shl 32) or (right.toLong() and 0xffffffffL) - return data.kernings.getOrPut(key) { - MemoryStack.stackPush().use { stack -> - val value = FT_Vector.malloc(stack) - if (FT_Get_Kerning(data.face, left, right, FT_KERNING_UNSCALED, value) == 0) value.x() * BASE_SIZE / data.units else 0f - } - } - } - - private fun rasterize(key: GlyphKey, data: FaceData): BitmapGlyph { - if (data.pixelSize != key.pixelSize) { - checkFt(FT_Set_Pixel_Sizes(data.face, 0, key.pixelSize), "set ${key.pixelSize}px font size") - data.pixelSize = key.pixelSize - } - val index = glyphIndex(data.face, key.codePoint) - checkFt(FT_Load_Glyph(data.face, index, FT_LOAD_DEFAULT), "load glyph U+${key.codePoint.toString(16)}") - val slot = data.face.glyph()!! - checkFt(FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL), "render glyph U+${key.codePoint.toString(16)}") - val bitmap = slot.bitmap() - val width = bitmap.width() - val height = bitmap.rows() - val pixels = ByteArray(width * height) - if (width > 0 && height > 0) { - val pitch = bitmap.pitch() - val source = bitmap.buffer(kotlin.math.abs(pitch) * height)!! - for (y in 0 until height) { - val row = if (pitch >= 0) y * pitch else (height - 1 - y) * -pitch - for (x in 0 until width) pixels[y * width + x] = source[row + x] - } - } - return BitmapGlyph(key, pixels, width, height, slot.bitmap_left(), slot.bitmap_top()) - } - - private fun glyphIndex(face: FT_Face, codePoint: Int): Int { - val direct = FT_Get_Char_Index(face, codePoint.toLong()) - if (direct != 0) return direct - return FT_Get_Char_Index(face, 0xfffd).takeIf { it != 0 } ?: 0 - } - - private fun newPage(): AtlasPage { - val device = RenderSystem.getDevice() - val texture = device.createTexture( - { "V5 glyph atlas ${pages.size}" }, - GpuTexture.USAGE_COPY_DST or GpuTexture.USAGE_TEXTURE_BINDING, - TextureFormat.RGBA8, PAGE_SIZE, PAGE_SIZE, 1, 1, - ) - val empty = MemoryUtil.memCalloc(PAGE_SIZE * PAGE_SIZE * 4) - device.createCommandEncoder().writeToTexture(texture, empty, NativeImage.Format.RGBA, 0, 0, 0, 0, PAGE_SIZE, PAGE_SIZE) - MemoryUtil.memFree(empty) - val view = device.createTextureView(texture) - val sampler = RenderSystem.getSamplerCache().getSampler(AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, FilterMode.LINEAR, FilterMode.LINEAR, false) - return AtlasPage(texture, view, TextureSetup.singleTexture(view, sampler)).also(pages::add) - } - - private fun place(page: AtlasPage, width: Int, height: Int): Unit? { - val paddedWidth = width + PADDING - val paddedHeight = height + PADDING - if (page.x + paddedWidth > PAGE_SIZE) { page.x = PADDING; page.y += page.rowHeight + PADDING; page.rowHeight = 0 } - if (page.y + paddedHeight > PAGE_SIZE) return null - page.x += paddedWidth - page.rowHeight = max(page.rowHeight, height) - return Unit - } - - private fun checkFt(error: Int, action: String) = check(error == 0) { "Failed to $action (FreeType error $error)" } - - companion object { - const val BASE_SIZE = 8f - private const val PAGE_SIZE = 1024 - private const val PADDING = 2 - private const val MAX_LAYOUTS = 1024 - } -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt index 5a9b3357..22cf9989 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/GuiRendererBackend.kt @@ -1,77 +1,46 @@ package com.chattriggers.ctjs.api.render -import com.chattriggers.ctjs.internal.mixins.GuiGraphicsExtractorAccessor -import com.mojang.blaze3d.platform.NativeImage -import com.mojang.blaze3d.vertex.VertexConsumer +import com.chattriggers.ctjs.api.render.skia.SkijaPIP +import io.github.humbleui.skija.* +import io.github.humbleui.skija.Image as SkijaImage +import io.github.humbleui.skija.svg.SVGDOM +import io.github.humbleui.skija.svg.SVGLengthContext +import io.github.humbleui.types.RRect +import io.github.humbleui.types.Rect import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphicsExtractor -import net.minecraft.client.gui.navigation.ScreenRectangle -import net.minecraft.client.gui.render.TextureSetup -import net.minecraft.client.renderer.RenderPipelines -import net.minecraft.client.renderer.state.gui.GuiElementRenderState -import net.minecraft.client.renderer.texture.DynamicTexture -import org.joml.Matrix3x2f -import org.lwjgl.nanovg.NanoSVG.nsvgCreateRasterizer -import org.lwjgl.nanovg.NanoSVG.nsvgDelete -import org.lwjgl.nanovg.NanoSVG.nsvgDeleteRasterizer -import org.lwjgl.nanovg.NanoSVG.nsvgParse -import org.lwjgl.nanovg.NanoSVG.nsvgRasterize -import org.lwjgl.system.MemoryUtil import java.awt.Color import java.awt.image.BufferedImage +import java.io.ByteArrayOutputStream import java.io.File import java.io.FileInputStream import java.io.FileNotFoundException import java.net.URI -import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.CopyOnWriteArrayList -import java.util.concurrent.Executors -import java.util.concurrent.LinkedBlockingQueue import javax.imageio.ImageIO import javax.imageio.metadata.IIOMetadataNode -import kotlin.math.PI -import kotlin.math.atan2 -import kotlin.math.ceil -import kotlin.math.cos -import kotlin.math.floor -import kotlin.math.hypot import kotlin.math.max -import kotlin.math.min import kotlin.math.roundToInt -import kotlin.math.sin -/** Minecraft GUI extraction and GPU resource implementation for [Renderer]. */ +/** Skija-backed 2D renderer used by the JavaScript-facing [Renderer] API. */ open class GuiRendererBackend { - private val mc = Minecraft.getInstance() - private val preRenderCallbacks = CopyOnWriteArrayList() - private val renderCallbacks = CopyOnWriteArrayList() - private val imageCache = HashMap() - private val generatedTextureCache = HashMap() - private val gifCache = HashMap() - private val urlCache = ConcurrentHashMap() - private val pendingDownloads = ConcurrentHashMap.newKeySet() - private val failedDownloads = ConcurrentHashMap.newKeySet() - private val downloadQueue = LinkedBlockingQueue>() - private val decodeExecutor = Executors.newFixedThreadPool(2) { task -> - Thread(task, "V5 image decoder").apply { isDaemon = true } - } - private val decodedImages = ConcurrentLinkedQueue>() - private val pendingImages = HashMap() - private val failedImages = HashSet() - private val decodedGifs = ConcurrentLinkedQueue>() - private val pendingGifs = HashMap() - private val failedGifs = HashSet() - private val vertexPool = ArrayDeque() - private val inFlightVertices = ArrayDeque() - @Volatile private var textEngine: FreeTypeTextRenderer? = FreeTypeTextRenderer() - @Volatile private var destroyed = false - - private var activeContext: GuiGraphicsExtractor? = null - private val context get() = activeContext ?: DrawContextHolder.currentContext + private val callbacks = CopyOnWriteArrayList() + private val preCallbacks = CopyOnWriteArrayList() + private val images = HashMap() + private val gifs = HashMap() + private val urlImages = HashMap() + private val pendingUrls = ConcurrentHashMap.newKeySet() + private val failedUrls = ConcurrentHashMap.newKeySet() + private val downloadedUrls = ConcurrentLinkedQueue>() + private val typefaces = HashMap() + private val fonts = HashMap() + private val alphaStack = ArrayDeque() + private val scissorDepths = ArrayDeque() + private var canvas: Canvas? = null private var alpha = 1f - private var clip: Clip? = null - private val states = ArrayDeque() + private var saveDepth = 0 @JvmField val defaultFont = Font("Default", "/assets/v5/font.otf") @@ -85,772 +54,381 @@ open class GuiRendererBackend { override fun hashCode() = 31 * (31 * (31 * width + height) + frameCount) + delays.contentHashCode() } - private data class CachedTexture(val texture: DynamicTexture, var refs: Int = 1) : AutoCloseable { - val setup = TextureSetup.singleTexture(texture.textureView, texture.sampler) - override fun close() = texture.close() - } - - private data class CachedGif( - val frames: List, - val delays: IntArray, - val width: Int, - val height: Int, - var refs: Int = 1, - ) - private data class DecodedGif(val frames: List, val delays: IntArray, val width: Int, val height: Int) - - private data class Clip(val local: FloatArray, val screen: ScreenRectangle) - private data class SavedState(val alpha: Float, val clip: Clip?) + private data class CachedImage(val image: SkijaImage, var refs: Int = 1) + private data class CachedGif(val frames: List, val delays: IntArray, val width: Int, val height: Int, var refs: Int = 1) + private data class FontKey(val font: Font, val size: Float) private enum class Gradient { LEFT_TO_RIGHT, TOP_TO_BOTTOM, TL_TO_BR, BL_TO_TR } - private class QuadState( - private val x: Float, - private val y: Float, - private val w: Float, - private val h: Float, - private val c0: Int, - private val c1: Int, - private val c2: Int, - private val c3: Int, - private val pose: Matrix3x2f, - private val textured: Boolean, - private val setup: TextureSetup, - private val scissor: ScreenRectangle?, - private val area: ScreenRectangle, - ) : GuiElementRenderState { - override fun buildVertices(buffer: VertexConsumer) { - for (i in 0..3) { - val consumer = buffer.addVertexWith2DPose( - pose, - if (i >= 2) x + w else x, - if (i == 1 || i == 2) y + h else y, - ) - if (textured) consumer.setUv(if (i >= 2) 1f else 0f, if (i == 1 || i == 2) 1f else 0f) - consumer.setColor(when (i) { 0 -> c0; 1 -> c1; 2 -> c2; else -> c3 }) - } - } + fun registerV5Render(callback: Runnable) { callbacks += callback } + fun unregisterV5Render(callback: Runnable) { callbacks -= callback } + fun registerV5PreRender(callback: Runnable) { preCallbacks += callback } + fun unregisterV5PreRender(callback: Runnable) { preCallbacks -= callback } + fun clearCallbacks() { callbacks.clear(); preCallbacks.clear() } - override fun pipeline() = if (textured) RenderPipelines.GUI_TEXTURED else RenderPipelines.GUI - override fun textureSetup() = setup - override fun scissorArea() = scissor - override fun bounds() = area - } - - private class MeshState( - private val vertices: FloatArray, - private val count: Int, - private val pose: Matrix3x2f, - private val textured: Boolean, - private val setup: TextureSetup, - private val scissor: ScreenRectangle?, - private val area: ScreenRectangle, - ) : GuiElementRenderState { - override fun buildVertices(buffer: VertexConsumer) { - for (i in 0 until count) { - val offset = i * 5 - val consumer = buffer.addVertexWith2DPose(pose, vertices[offset], vertices[offset + 1]) - if (textured) consumer.setUv(vertices[offset + 2], vertices[offset + 3]) - consumer.setColor(vertices[offset + 4].toRawBits()) - } - } - - override fun pipeline() = if (textured) RenderPipelines.GUI_TEXTURED else RenderPipelines.GUI - override fun textureSetup() = setup - override fun scissorArea() = scissor - override fun bounds() = area + fun runPreDrawables(context: GuiGraphicsExtractor) { + if (preCallbacks.isNotEmpty()) SkijaPIP.draw(context, Runnable { runCallbacks(preCallbacks) }, pre = true) } - fun registerV5Render(runnable: Runnable) { renderCallbacks += runnable } - fun unregisterV5Render(runnable: Runnable) { renderCallbacks -= runnable } - fun registerV5PreRender(runnable: Runnable) { preRenderCallbacks += runnable } - fun unregisterV5PreRender(runnable: Runnable) { preRenderCallbacks -= runnable } - fun clearCallbacks() { renderCallbacks.clear(); preRenderCallbacks.clear() } - - - fun runPreDrawables(context: GuiGraphicsExtractor) { - synchronized(vertexPool) { - vertexPool.addAll(inFlightVertices) - inFlightVertices.clear() - } - withContext(context) { runCallbacks(preRenderCallbacks) } + fun runDrawables(context: GuiGraphicsExtractor) { + if (callbacks.isEmpty()) return + if (Minecraft.getInstance().screen is Gui) context.blurBeforeThisStratum() + SkijaPIP.draw(context, Runnable { runCallbacks(callbacks) }) } - - fun runDrawables(context: GuiGraphicsExtractor) = withContext(context) { - processImageQueues() - textEngine?.processUploads() - runCallbacks(renderCallbacks) + private fun runCallbacks(list: List) = list.forEach { + try { it.run() } catch (error: Exception) { error.printStackTrace() } } - private inline fun withContext(drawContext: GuiGraphicsExtractor, block: () -> Unit) { - val previous = DrawContextHolder.currentContext - DrawContextHolder.currentContext = drawContext - activeContext = drawContext + internal fun beginSkijaFrame(canvas: Canvas) { + this.canvas = canvas alpha = 1f - clip = null - states.clear() - try { block() } finally { - while (states.isNotEmpty()) restore() - if (clip != null) drawContext.disableScissor() - alpha = 1f - clip = null - activeContext = null - DrawContextHolder.currentContext = previous - } + alphaStack.clear() + scissorDepths.clear() + saveDepth = 0 + processDownloads() } - private fun runCallbacks(callbacks: List) = callbacks.forEach { - try { it.run() } catch (e: Exception) { e.printStackTrace() } + internal fun endSkijaFrame() { + canvas?.restoreToCount(1) + canvas = null + alpha = 1f + alphaStack.clear() + scissorDepths.clear() + saveDepth = 0 } - fun blurBackground() { context?.blurBeforeThisStratum() } - fun save() { context?.pose()?.pushMatrix(); states.addLast(SavedState(alpha, clip)) } + internal fun translateSkija(x: Float, y: Float) = canvas?.translate(x, y) != null + internal fun scaleSkija(x: Float, y: Float) = canvas?.scale(x, y) != null + internal fun rotateSkija(degrees: Float) = canvas?.rotate(degrees) != null + + fun blurBackground() = Unit + fun save() { + canvas?.save() ?: return + alphaStack.addLast(alpha) + saveDepth++ + } fun restore() { - val saved = states.removeLastOrNull() ?: return - val changedClip = clip != saved.clip - context?.pose()?.popMatrix() - if (changedClip) { - if (clip != null) context?.disableScissor() - if (clip == null) saved.clip?.local?.let { - context?.enableScissor(it[0].roundToInt(), it[1].roundToInt(), (it[0] + it[2]).roundToInt(), (it[1] + it[3]).roundToInt()) - } + val active = canvas ?: return + while (scissorDepths.lastOrNull() == saveDepth) { + active.restore() + scissorDepths.removeLast() + } + if (alphaStack.isNotEmpty()) { + active.restore() + alpha = alphaStack.removeLast() + saveDepth-- } - alpha = saved.alpha - clip = saved.clip } fun globalAlpha(value: Float) { alpha = value.coerceIn(0f, 1f) } - - fun scissor(x: Float, y: Float, w: Float, h: Float) { - val ctx = context ?: return - val local = floatArrayOf(x, y, w, h) - val transformed = ScreenRectangle(x.toInt(), y.toInt(), ceil(w.toDouble()).toInt(), ceil(h.toDouble()).toInt()) - .transformMaxBounds(Matrix3x2f(ctx.pose())) - val intersected = clip?.screen?.intersection(transformed) ?: transformed - ctx.enableScissor(x.roundToInt(), y.roundToInt(), (x + w).roundToInt(), (y + h).roundToInt()) - clip = Clip(local, intersected) + fun scissor(x: Float, y: Float, width: Float, height: Float) { + val active = canvas ?: return + active.save() + active.clipRect(Rect.makeXYWH(x, y, width, height), true) + scissorDepths.addLast(saveDepth) + } + fun resetScissor() { + val active = canvas ?: return + while (scissorDepths.lastOrNull() == saveDepth) { + active.restore() + scissorDepths.removeLast() + } } - - fun resetScissor() { if (clip != null) context?.disableScissor(); clip = null } - fun pushScissor(x: Float, y: Float, w: Float, h: Float) { save(); scissor(x, y, w, h) } + fun pushScissor(x: Float, y: Float, width: Float, height: Float) { save(); canvas?.clipRect(Rect.makeXYWH(x, y, width, height), true) } fun popScissor() = restore() - fun drawRect(x: Float, y: Float, w: Float, h: Float, color: Int) = - emitQuad(x, y, w, h, applyAlpha(color)) + fun drawRect(x: Float, y: Float, width: Float, height: Float, color: Int) = paint(color).use { + canvas?.drawRect(Rect.makeXYWH(x, y, width, height), it) + Unit + } - fun drawRoundedRect(x: Float, y: Float, w: Float, h: Float, radius: Float, color: Int) = - if (radius <= 0f) drawRect(x, y, w, h, color) else emitFill(x, y, w, h, radius, radius, radius, radius, applyAlpha(color)) + fun drawRoundedRect(x: Float, y: Float, width: Float, height: Float, radius: Float, color: Int) = paint(color).use { + canvas?.drawRRect(RRect.makeXYWH(x, y, width, height, radius.coerceAtLeast(0f)), it) + Unit + } - fun drawRoundedRectVaried(x: Float, y: Float, w: Float, h: Float, color: Int, tl: Float, tr: Float, br: Float, bl: Float) = - if (max(max(tl, tr), max(br, bl)) <= 0f) drawRect(x, y, w, h, color) - else emitFill(x, y, w, h, tl, tr, br, bl, applyAlpha(color)) + fun drawRoundedRectVaried(x: Float, y: Float, width: Float, height: Float, color: Int, tl: Float, tr: Float, br: Float, bl: Float) = + paint(color).use { + canvas?.drawRRect(RRect.makeComplexXYWH(x, y, width, height, radii(tl, tr, br, bl)), it) + Unit + } - fun drawCircle(x: Float, y: Float, radius: Float, color: Int) = - drawRoundedRect(x - radius, y - radius, radius * 2, radius * 2, radius, color) + fun drawCircle(x: Float, y: Float, radius: Float, color: Int) = paint(color).use { canvas?.drawCircle(x, y, radius, it); Unit } - @JvmOverloads - fun drawHollowRect(x: Float, y: Float, w: Float, h: Float, thickness: Float, color: Int, radius: Float = 0f) { - val t = thickness.coerceAtLeast(0.1f) - emitRing(x, y, w, h, radius, x + t, y + t, w - 2 * t, h - 2 * t, max(0f, radius - t), applyAlpha(color)) - } - - - fun drawLine(x1: Float, y1: Float, x2: Float, y2: Float, thickness: Float, color: Int) { - val dx = x2 - x1 - val dy = y2 - y1 - val length = hypot(dx.toDouble(), dy.toDouble()).toFloat() - if (length == 0f) return drawCircle(x1, y1, thickness / 2f, color) - val nx = -dy / length * thickness / 2f - val ny = dx / length * thickness / 2f - val c = applyAlpha(color) - emitQuadPoints(x1 + nx, y1 + ny, x1 - nx, y1 - ny, x2 - nx, y2 - ny, x2 + nx, y2 + ny, c) - drawCircle(x1, y1, thickness / 2f, color) - drawCircle(x2, y2, thickness / 2f, color) - } - - - fun drawDropShadow(x: Float, y: Float, w: Float, h: Float, radius: Float, blur: Float, spread: Float, color: Int) { - val steps = max(2, ceil(blur.coerceAtLeast(1f) / 2f).toInt()) - var ix = x - spread - var iy = y - spread - var iw = w + 2 * spread - var ih = h + 2 * spread - var ir = radius + spread - for (step in 1..steps) { - val distance = blur * step / steps - val ox = x - spread - distance - val oy = y - spread - distance - val ow = w + 2 * (spread + distance) - val oh = h + 2 * (spread + distance) - val outerRadius = radius + spread + distance - val fade = 1f - step.toFloat() / (steps + 1) - emitRing(ix, iy, iw, ih, ir, ox, oy, ow, oh, outerRadius, applyAlpha(withAlpha(color, (((color ushr 24) and 255) * fade).roundToInt()))) - ix = ox; iy = oy; iw = ow; ih = oh; ir = outerRadius + fun drawHollowRect(x: Float, y: Float, width: Float, height: Float, thickness: Float, color: Int, radius: Float = 0f) = + paint(color, PaintMode.STROKE).use { + it.strokeWidth = thickness + if (radius > 0f) canvas?.drawRRect(RRect.makeXYWH(x, y, width, height, radius), it) + else canvas?.drawRect(Rect.makeXYWH(x, y, width, height), it) + Unit } + + fun drawLine(x1: Float, y1: Float, x2: Float, y2: Float, thickness: Float, color: Int) = paint(color, PaintMode.STROKE).use { + it.strokeWidth = thickness + canvas?.drawLine(x1, y1, x2, y2, it) + Unit } - + fun drawDropShadow(x: Float, y: Float, width: Float, height: Float, radius: Float, blur: Float, spread: Float, color: Int) = + MaskFilter.makeBlur(FilterBlurMode.NORMAL, blur / 2f).use { filter -> + paint(color).setMaskFilter(filter).use { + canvas?.drawRRect(RRect.makeXYWH(x - spread, y - spread, width + spread * 2, height + spread * 2, radius + spread), it) + Unit + } + } + @JvmOverloads - fun drawGradientRect(x: Float, y: Float, w: Float, h: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) { - val gradient = resolveGradient(direction) - if (radius <= 0f) emitGradientQuad(x, y, w, h, color1, color2, gradient) - else emitFill(x, y, w, h, radius, radius, radius, radius, color1, color2, gradient) - } + fun drawGradientRect(x: Float, y: Float, width: Float, height: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) = + gradientShader(x, y, width, height, color1, color2, direction).use { shader -> + Paint().setAntiAlias(true).setShader(shader).use { + if (radius > 0f) canvas?.drawRRect(RRect.makeXYWH(x, y, width, height, radius), it) + else canvas?.drawRect(Rect.makeXYWH(x, y, width, height), it) + Unit + } + } - @JvmOverloads - fun drawHollowGradientRect(x: Float, y: Float, w: Float, h: Float, thickness: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) { - val t = thickness.coerceAtLeast(0.1f) - emitRing(x, y, w, h, radius, x + t, y + t, w - 2 * t, h - 2 * t, max(0f, radius - t), color1, color2, resolveGradient(direction)) - } + fun drawHollowGradientRect(x: Float, y: Float, width: Float, height: Float, thickness: Float, color1: Int, color2: Int, direction: Any, radius: Float = 0f) = + gradientShader(x, y, width, height, color1, color2, direction).use { shader -> + Paint().setAntiAlias(true).setShader(shader).setMode(PaintMode.STROKE).setStrokeWidth(thickness).use { + if (radius > 0f) canvas?.drawRRect(RRect.makeXYWH(x, y, width, height, radius), it) + else canvas?.drawRect(Rect.makeXYWH(x, y, width, height), it) + Unit + } + } - @JvmOverloads - fun drawCheckerboard(x: Float, y: Float, w: Float, h: Float, radius: Float, size: Float = 4f) { - val width = ceil(w.toDouble()).toInt().coerceAtLeast(1) - val height = ceil(h.toDouble()).toInt().coerceAtLeast(1) - val step = size.roundToInt().coerceAtLeast(1) - val key = "checker:$width:$height:$step" - val texture = generatedTextureCache.getOrPut(key) { - val image = NativeImage(width, height, false) - for (py in 0 until height) for (px in 0 until width) { - image.setPixel(px, py, if ((px / step + py / step) % 2 == 0) 0xff404040.toInt() else 0xff737373.toInt()) + fun drawCheckerboard(x: Float, y: Float, width: Float, height: Float, radius: Float, size: Float = 4f) { + val active = canvas ?: return + active.save() + active.clipRRect(RRect.makeXYWH(x, y, width, height, radius), true) + val step = size.coerceAtLeast(0.1f) + var row = 0 + var py = y + while (py < y + height) { + var column = 0 + var px = x + while (px < x + width) { + drawRect(px, py, step, step, if ((row + column) % 2 == 0) 0xff404040.toInt() else 0xff737373.toInt()) + px += step; column++ } - createTexture("V5 checkerboard", image) + py += step; row++ } - drawTexture(texture, x, y, w, h, radius, 1f) + active.restore() } - - fun drawHueBar(x: Float, y: Float, w: Float, h: Float, radius: Float) { - val texture = generatedTextureCache.getOrPut("hue") { - val image = NativeImage(256, 1, false) - for (px in 0 until 256) { - image.setPixel(px, 0, 0xff000000.toInt() or (Color.HSBtoRGB(px / 255f, 1f, 1f) and 0xffffff)) + fun drawHueBar(x: Float, y: Float, width: Float, height: Float, radius: Float) { + val colors = IntArray(7) { applyAlpha(0xff000000.toInt() or (Color.HSBtoRGB(it / 6f, 1f, 1f) and 0xffffff)) } + Shader.makeLinearGradient(x, y, x + width, y, colors).use { shader -> + Paint().setAntiAlias(true).setShader(shader).use { paint -> + canvas?.drawRRect(RRect.makeXYWH(x, y, width, height, radius), paint) } - createTexture("V5 hue bar", image) } - drawTexture(texture, x, y, w, h, radius, 1f) } fun getDefaultFont() = defaultFont - @JvmOverloads fun text(text: String, x: Float, y: Float, size: Float, color: Int, font: Font? = defaultFont, align: Int) { - val ctx = context ?: return - val resolvedFont = font ?: defaultFont - val renderer = textRenderer() - val scale = size / 8f - val pose = Matrix3x2f(ctx.pose()) - val framebufferScale = mc.window.guiScale * scale * max( - hypot(pose.m00().toDouble(), pose.m01().toDouble()), - hypot(pose.m10().toDouble(), pose.m11().toDouble()), - ) - val pixelSize = ceil(8.0 * framebufferScale).toInt().coerceIn(1, 512) - val layout = renderer.layout(text, resolvedFont, pixelSize) ?: return - val localY = when { - align and 32 != 0 -> -layout.height - align and 16 != 0 -> -layout.height / 2f - align and 8 != 0 -> 0f - else -> -layout.ascender + val skijaFont = skijaFont(font ?: defaultFont, size) + TextLine.make(text, skijaFont).use { line -> + val drawX = when { + align and 4 != 0 -> x - line.width + align and 2 != 0 -> x - line.width / 2f + else -> x + } + val metrics = skijaFont.metrics + val baseline = when { + align and 32 != 0 -> y - metrics.descent + align and 16 != 0 -> y - (metrics.ascent + metrics.descent) / 2f + align and 8 != 0 -> y - metrics.ascent + else -> y + } + paint(color).use { canvas?.drawTextLine(line, drawX, baseline, it) } } - ctx.pose().pushMatrix() - ctx.pose().translate(x, y) - ctx.pose().scale(scale, scale) - emitText(renderer, layout, resolvedFont, pixelSize, localY, align, applyAlpha(color)) - ctx.pose().popMatrix() } - @JvmOverloads - fun textWidth(text: String, size: Float, font: Font? = defaultFont): Float = - textRenderer().measure(text, font ?: defaultFont).width * size / 8f + fun textWidth(text: String, size: Float, font: Font? = defaultFont) = + TextLine.make(text, skijaFont(font ?: defaultFont, size)).use { it.width } - fun loadImage(path: String): String { - if (path.isRemoteUrl()) return path - synchronized(imageCache) { - imageCache[path]?.let { it.refs++; return path } - if (path in failedImages) return path - pendingImages[path]?.let { pendingImages[path] = it + 1; return path } - pendingImages[path] = 1 - } - decodeExecutor.execute { - val image = try { - if (path.endsWith(".svg", true)) loadSvg(readImage(path), path) else NativeImage.read(readImage(path)) - } catch (e: Exception) { - println("[V5] Failed to load image $path: ${e.message}"); null - } - if (destroyed) image?.close() else decodedImages += path to image + if (path.isUrl()) return path + synchronized(images) { + images[path]?.let { it.refs++; return path } + images[path] = CachedImage(createImage(readImage(path), path)) } return path } - fun unloadImage(path: String) = synchronized(imageCache) { - imageCache[path]?.let { if (--it.refs <= 0) { it.close(); imageCache.remove(path) } } - pendingImages[path]?.let { pendingImages[path] = max(0, it - 1) } + fun unloadImage(path: String) = synchronized(images) { + images[path]?.let { if (--it.refs <= 0) { it.image.close(); images.remove(path) } } } - fun isImageLoaded(path: String) = synchronized(imageCache) { path in imageCache } - - @JvmOverloads - fun drawImage(path: String, x: Float, y: Float, w: Float, h: Float, radius: Float = 0f, alpha: Float = 1f) { - if (path.isRemoteUrl()) return drawImageFromUrl(path, x, y, w, h, radius, alpha) - val texture = synchronized(imageCache) { imageCache[path] } - if (texture == null) { ensureImageRequested(path); return } - drawTexture(texture, x, y, w, h, radius, alpha) - } + fun isImageLoaded(path: String) = synchronized(images) { path in images } - private fun ensureImageRequested(path: String) { - synchronized(imageCache) { - if (path in imageCache || path in pendingImages || path in failedImages) return - } - loadImage(path) + @JvmOverloads + fun drawImage(path: String, x: Float, y: Float, width: Float, height: Float, radius: Float = 0f, imageAlpha: Float = 1f) { + if (path.isUrl()) return drawImageFromUrl(path, x, y, width, height, radius, imageAlpha) + val image = synchronized(images) { images[path] } ?: runCatching { loadImage(path) }.getOrNull()?.let { synchronized(images) { images[it] } } ?: return + drawImage(image.image, x, y, width, height, radius, imageAlpha) } - @JvmOverloads - fun drawImageFromUrl(url: String, x: Float, y: Float, w: Float, h: Float, radius: Float = 0f, alpha: Float = 1f) { - if (url == "none" || url in failedDownloads) return - urlCache[url]?.let { return drawTexture(it, x, y, w, h, radius, alpha) } - if (pendingDownloads.add(url)) Thread({ - val image = try { - URI.create(url).toURL().openConnection().apply { + fun drawImageFromUrl(url: String, x: Float, y: Float, width: Float, height: Float, radius: Float = 0f, imageAlpha: Float = 1f) { + if (url == "none" || url in failedUrls) return + urlImages[url]?.let { return drawImage(it, x, y, width, height, radius, imageAlpha) } + if (pendingUrls.add(url)) Thread({ + val bytes = runCatching { + URI(url).toURL().openConnection().apply { connectTimeout = 5000; readTimeout = 5000; setRequestProperty("User-Agent", "V5-Loader") - }.getInputStream().use(NativeImage::read) - } catch (_: Exception) { null } - downloadQueue += url to image - }, "V5 image ${url.hashCode()}").start() - } - - private fun processImageQueues() { - for (ignored in 0 until 5) { - val (url, image) = downloadQueue.poll() ?: break - if (image == null) failedDownloads += url else urlCache[url] = createTexture("V5 URL $url", image) - pendingDownloads -= url - } - repeat(5) { - val (path, image) = decodedImages.poll() ?: return@repeat - synchronized(imageCache) { - val refs = pendingImages.remove(path) ?: 0 - if (image == null) failedImages += path - else if (refs > 0) imageCache[path] = createTexture("V5 image $path", image).also { it.refs = refs } - else image.close() - } - } - decodedGifs.poll()?.let { (path, decoded) -> - val refs = synchronized(gifCache) { pendingGifs.remove(path) ?: 0 } - if (decoded == null) failedGifs += path - else if (refs > 0) gifCache[path] = CachedGif( - decoded.frames.mapIndexed { index, image -> createTexture("V5 GIF $path#$index", image) }, - decoded.delays, decoded.width, decoded.height, refs, - ) else decoded.frames.forEach(NativeImage::close) - } + }.getInputStream().use { it.readBytes() } + }.getOrNull() + downloadedUrls += url to bytes + }, "V5 image ${url.hashCode()}").apply { isDaemon = true }.start() } - fun loadGif(path: String): GifData? { - synchronized(gifCache) { - gifCache[path]?.let { it.refs++; return GifData(it.width, it.height, it.frames.size, it.delays) } - if (path in pendingGifs || path in failedGifs) return null - pendingGifs[path] = 1 + synchronized(gifs) { + gifs[path]?.let { it.refs++; return GifData(it.width, it.height, it.frames.size, it.delays) } } - decodeExecutor.execute { - val gif = decodeGif(path) - if (destroyed) gif?.frames?.forEach(NativeImage::close) else decodedGifs += path to gif - } - return null - } - - private fun decodeGif(path: String): DecodedGif? = try { - FileInputStream(File(path)).use { stream -> - val reader = ImageIO.getImageReadersByFormatName("gif").asSequence().firstOrNull() ?: return null - reader.input = ImageIO.createImageInputStream(stream) - val count = reader.getNumImages(true) - val first = reader.read(0) - val master = BufferedImage(first.width, first.height, BufferedImage.TYPE_INT_ARGB) - val graphics = master.createGraphics().apply { background = Color(0, 0, 0, 0) } - val frames = ArrayList(count) - val delays = IntArray(count) - for (i in 0 until count) { - val frame = reader.read(i) - val tree = reader.getImageMetadata(i).getAsTree(reader.getImageMetadata(i).nativeMetadataFormatName) as IIOMetadataNode - val gce = tree.getElementsByTagName("GraphicControlExtension").item(0) as IIOMetadataNode - val desc = tree.getElementsByTagName("ImageDescriptor").item(0) as IIOMetadataNode - val fx = desc.getAttribute("imageLeftPosition").toInt() - val fy = desc.getAttribute("imageTopPosition").toInt() - delays[i] = (gce.getAttribute("delayTime").toInt() * 10).coerceAtLeast(10) - graphics.drawImage(frame, fx, fy, null) - frames += master.toNativeImage() - if (gce.getAttribute("disposalMethod") == "restoreToBackgroundColor") graphics.clearRect(fx, fy, frame.width, frame.height) - } - graphics.dispose(); reader.dispose() - DecodedGif(frames, delays, first.width, first.height) - } - } catch (e: Exception) { println("[V5] Failed to load GIF $path: ${e.message}"); null } - - fun unloadGif(path: String) = synchronized(gifCache) { - gifCache[path]?.let { if (--it.refs <= 0) { it.frames.forEach(CachedTexture::close); gifCache.remove(path) } } - pendingGifs[path]?.let { pendingGifs[path] = max(0, it - 1) } - } - - - @JvmOverloads - fun drawGif(path: String, x: Float, y: Float, w: Float, h: Float, frameIndex: Int, radius: Float = 0f, alpha: Float = 1f) { - val frames = gifCache[path]?.frames ?: return - if (frames.isNotEmpty()) drawTexture(frames[Math.floorMod(frameIndex, frames.size)], x, y, w, h, radius, alpha) + val decoded = decodeGif(path) ?: return null + synchronized(gifs) { gifs[path] = decoded } + return GifData(decoded.width, decoded.height, decoded.frames.size, decoded.delays) } - private fun drawTexture(texture: CachedTexture, x: Float, y: Float, w: Float, h: Float, radius: Float, imageAlpha: Float) { - val color = applyAlpha(withAlpha(0xffffffff.toInt(), (255 * imageAlpha.coerceIn(0f, 1f)).roundToInt())) - if (radius <= 0f) emitQuad(x, y, w, h, color, textured = true, setup = texture.setup) - else emitFill(x, y, w, h, radius, radius, radius, radius, color, textured = true, setup = texture.setup) + fun unloadGif(path: String) = synchronized(gifs) { + gifs[path]?.let { if (--it.refs <= 0) { it.frames.forEach(SkijaImage::close); gifs.remove(path) } } } - private fun readImage(path: String): ByteArray { - val trimmed = path.trim() - require(!trimmed.isRemoteUrl()) { "Remote images must use drawImageFromUrl" } - val stream = when { - File(trimmed).isFile -> FileInputStream(trimmed) - else -> GuiRendererBackend::class.java.getResourceAsStream(trimmed) ?: throw FileNotFoundException(trimmed) - } - return stream.use { it.readBytes() } - } - - private fun String.isRemoteUrl() = startsWith("http://", true) || startsWith("https://", true) - - private fun loadSvg(bytes: ByteArray, name: String): NativeImage { - val svg = nsvgParse(String(bytes), "px", 96f) ?: error("Invalid SVG: $name") - val width = svg.width().roundToInt().coerceAtLeast(1) - val height = svg.height().roundToInt().coerceAtLeast(1) - val pixels = MemoryUtil.memAlloc(width * height * 4) - val rasterizer = nsvgCreateRasterizer() - try { - nsvgRasterize(rasterizer, svg, 0f, 0f, 1f, pixels, width, height, width * 4) - val image = NativeImage(width, height, false) - for (y in 0 until height) for (x in 0 until width) { - val i = (y * width + x) * 4 - image.setPixel(x, y, ((pixels.get(i + 3).toInt() and 255) shl 24) or ((pixels.get(i).toInt() and 255) shl 16) or - ((pixels.get(i + 1).toInt() and 255) shl 8) or (pixels.get(i + 2).toInt() and 255)) - } - return image - } finally { nsvgDeleteRasterizer(rasterizer); nsvgDelete(svg); MemoryUtil.memFree(pixels) } + @JvmOverloads + fun drawGif(path: String, x: Float, y: Float, width: Float, height: Float, frameIndex: Int, radius: Float = 0f, imageAlpha: Float = 1f) { + val frames = synchronized(gifs) { gifs[path]?.frames } ?: return + if (frames.isNotEmpty()) drawImage(frames[Math.floorMod(frameIndex, frames.size)], x, y, width, height, radius, imageAlpha) } - private fun BufferedImage.toNativeImage(): NativeImage { - val native = NativeImage(width, height, false) - for (y in 0 until height) for (x in 0 until width) native.setPixel(x, y, getRGB(x, y)) - return native + fun clearImageCache() { + synchronized(images) { images.values.forEach { it.image.close() }; images.clear() } + synchronized(gifs) { gifs.values.flatMap { it.frames }.forEach(SkijaImage::close); gifs.clear() } + urlImages.values.forEach(SkijaImage::close); urlImages.clear(); pendingUrls.clear(); failedUrls.clear(); downloadedUrls.clear() } - private fun createTexture(name: String, image: NativeImage) = CachedTexture(DynamicTexture({ name }, image)) + fun getCacheStats() = "Images: ${images.size}, GIFs: ${gifs.size}, URLs: ${urlImages.size}" - fun clearImageCache() { - synchronized(imageCache) { - imageCache.values.forEach(CachedTexture::close); imageCache.clear() - pendingImages.clear(); failedImages.clear() - } - generatedTextureCache.values.forEach(CachedTexture::close); generatedTextureCache.clear() - synchronized(gifCache) { - gifCache.values.flatMap { it.frames }.forEach(CachedTexture::close); gifCache.clear() - pendingGifs.clear(); failedGifs.clear() - } - while (true) (decodedImages.poll() ?: break).second?.close() - while (true) (decodedGifs.poll() ?: break).second?.frames?.forEach(NativeImage::close) - urlCache.values.filterNotNull().forEach(CachedTexture::close); urlCache.clear(); pendingDownloads.clear(); failedDownloads.clear() - } - fun getCacheStats() = "Images: ${imageCache.size}, GIFs: ${gifCache.size}, URLs: ${urlCache.size}" fun destroy() { - destroyed = true - decodeExecutor.shutdownNow() - synchronized(this) { textEngine?.close(); textEngine = null } clearImageCache() + fonts.values.forEach(io.github.humbleui.skija.Font::close); fonts.clear() + typefaces.values.forEach(Typeface::close); typefaces.clear() + } + + private fun drawImage(image: SkijaImage, x: Float, y: Float, width: Float, height: Float, radius: Float, imageAlpha: Float) { + Paint().setAntiAlias(true).setAlphaf(alpha * imageAlpha.coerceIn(0f, 1f)).use { paint -> + val active = canvas ?: return + active.save() + active.clipRRect(RRect.makeXYWH(x, y, width, height, radius), true) + active.drawImageRect( + image, Rect.makeWH(image.width.toFloat(), image.height.toFloat()), Rect.makeXYWH(x, y, width, height), + SamplingMode.MITCHELL, paint, true, + ) + active.restore() + } } - private fun textRenderer(): FreeTypeTextRenderer = textEngine ?: synchronized(this) { - textEngine ?: FreeTypeTextRenderer().also { textEngine = it } - } - - private fun emitText(renderer: FreeTypeTextRenderer, layout: FreeTypeTextRenderer.Layout, font: Font, pixelSize: Int, y: Float, align: Int, color: Int) { - val ctx = context ?: return - val pose = Matrix3x2f(ctx.pose()) - val bitmapScale = 8f / pixelSize - var vertices: FloatArray? = null - var count = 0 - var page: FreeTypeTextRenderer.AtlasPage? = null - var minX = Float.POSITIVE_INFINITY - var minY = Float.POSITIVE_INFINITY - var maxX = Float.NEGATIVE_INFINITY - var maxY = Float.NEGATIVE_INFINITY - val glyphs = renderer.glyphs(layout, font, pixelSize) - - fun flush() { - val data = vertices ?: return - val atlas = page ?: return releaseFloats(data) - if (count > 0) emitMesh(data, count, true, atlas.setup, minX, minY, maxX, maxY, pose) else releaseFloats(data) - vertices = null; count = 0; page = null - minX = Float.POSITIVE_INFINITY; minY = Float.POSITIVE_INFINITY - maxX = Float.NEGATIVE_INFINITY; maxY = Float.NEGATIVE_INFINITY + private fun processDownloads() { + repeat(5) { + val (url, bytes) = downloadedUrls.poll() ?: return + if (bytes == null) failedUrls += url else runCatching { createImage(bytes, url) } + .onSuccess { urlImages[url] = it }.onFailure { failedUrls += url } + pendingUrls -= url } + } - for (i in layout.codePoints.indices) { - val glyph = glyphs[i] ?: continue - if (glyph.page !== page) { flush(); page = glyph.page; vertices = acquireFloats(4 * 5 * 16) } - if (count + 4 > vertices!!.size / 5) { - val old = vertices!! - vertices = acquireFloats(old.size * 2).also { old.copyInto(it) } - releaseFloats(old) - } - val lineWidth = layout.lineWidths[layout.lines[i]] - val lineX = when { - align and 4 != 0 -> -lineWidth - align and 2 != 0 -> -lineWidth / 2f - else -> 0f - } - val x0 = lineX + layout.xs[i] + glyph.left * bitmapScale - val baseline = y + layout.ascender + layout.lines[i] * layout.lineHeight - val y0 = baseline - glyph.top * bitmapScale - val x1 = x0 + glyph.width * bitmapScale - val y1 = y0 + glyph.height * bitmapScale - minX = min(minX, x0); minY = min(minY, y0); maxX = max(maxX, x1); maxY = max(maxY, y1) - count = putText(vertices!!, count, x0, y0, glyph.u0, glyph.v0, color) - count = putText(vertices!!, count, x0, y1, glyph.u0, glyph.v1, color) - count = putText(vertices!!, count, x1, y1, glyph.u1, glyph.v1, color) - count = putText(vertices!!, count, x1, y0, glyph.u1, glyph.v0, color) - } - flush() - } - - private fun putText(vertices: FloatArray, index: Int, x: Float, y: Float, u: Float, v: Float, color: Int): Int { - val offset = index * 5 - vertices[offset] = x; vertices[offset + 1] = y; vertices[offset + 2] = u; vertices[offset + 3] = v - vertices[offset + 4] = Float.fromBits(color) - return index + 1 - } - - private fun emitFill( - x: Float, y: Float, w: Float, h: Float, - tl: Float, tr: Float, br: Float, bl: Float, - color1: Int, color2: Int = color1, gradient: Gradient? = null, - textured: Boolean = false, setup: TextureSetup = TextureSetup.noTexture(), - ) { - val ctx = context ?: return - if (w <= 0f || h <= 0f) return - val pose = Matrix3x2f(ctx.pose()) - val maxRadius = min(w, h) / 2f - val rtl = tl.coerceIn(0f, maxRadius) - val rtr = tr.coerceIn(0f, maxRadius) - val rbr = br.coerceIn(0f, maxRadius) - val rbl = bl.coerceIn(0f, maxRadius) - val count = contourPointCount(rtl, rtr, rbr, rbl, pose) - val points = acquireFloats(count * 2) - val outer = acquireFloats(count * 2) - writeContour(points, outer, x, y, w, h, rtl, rtr, rbr, rbl, pose) - val vertices = acquireFloats(count * 8 * 5) - var vertexCount = 0 - val cx = x + w / 2f - val cy = y + h / 2f - for (i in 0 until count) { - val next = (i + 1) % count - val ax = points[i * 2]; val ay = points[i * 2 + 1] - val bx = points[next * 2]; val by = points[next * 2 + 1] - val oax = outer[i * 2]; val oay = outer[i * 2 + 1] - val obx = outer[next * 2]; val oby = outer[next * 2 + 1] - vertexCount = put(vertices, vertexCount, cx, cy, sampleColor(cx, cy, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) - vertexCount = put(vertices, vertexCount, bx, by, sampleColor(bx, by, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) - vertexCount = put(vertices, vertexCount, ax, ay, sampleColor(ax, ay, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) - vertexCount = put(vertices, vertexCount, ax, ay, sampleColor(ax, ay, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) - vertexCount = put(vertices, vertexCount, oax, oay, withAlpha(sampleColor(oax, oay, x, y, w, h, color1, color2, gradient), 0), x, y, w, h, textured) - vertexCount = put(vertices, vertexCount, ax, ay, sampleColor(ax, ay, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) - vertexCount = put(vertices, vertexCount, bx, by, sampleColor(bx, by, x, y, w, h, color1, color2, gradient), x, y, w, h, textured) - vertexCount = put(vertices, vertexCount, obx, oby, withAlpha(sampleColor(obx, oby, x, y, w, h, color1, color2, gradient), 0), x, y, w, h, textured) - } - releaseFloats(points); releaseFloats(outer) - emitMesh(vertices, vertexCount, textured, setup, x - localPixel(pose), y - localPixel(pose), x + w + localPixel(pose), y + h + localPixel(pose), pose) - } - - private fun emitRing( - ax: Float, ay: Float, aw: Float, ah: Float, ar: Float, - bx: Float, by: Float, bw: Float, bh: Float, br: Float, - color: Int, - ) = emitRing(ax, ay, aw, ah, ar, bx, by, bw, bh, br, color, color, null) - - private fun emitRing( - ax: Float, ay: Float, aw: Float, ah: Float, ar: Float, - bx: Float, by: Float, bw: Float, bh: Float, br: Float, - color1: Int, color2: Int, gradient: Gradient?, - ) { - val ctx = context ?: return - if (aw <= 0f || ah <= 0f || bw <= 0f || bh <= 0f) return - val pose = Matrix3x2f(ctx.pose()) - val radiusA = ar.coerceIn(0f, min(aw, ah) / 2f) - val radiusB = br.coerceIn(0f, min(bw, bh) / 2f) - val segments = cornerSegments(max(radiusA, radiusB), pose) - val count = 4 * (segments + 1) - val a = acquireFloats(count * 2) - val b = acquireFloats(count * 2) - writeContour(a, null, ax, ay, aw, ah, radiusA, radiusA, radiusA, radiusA, pose, segments) - writeContour(b, null, bx, by, bw, bh, radiusB, radiusB, radiusB, radiusB, pose, segments) - val vertices = acquireFloats(count * 4 * 5) - var vertexCount = 0 - for (i in 0 until count) { - val next = (i + 1) % count - val aix = a[i * 2]; val aiy = a[i * 2 + 1] - val bix = b[i * 2]; val biy = b[i * 2 + 1] - val anx = a[next * 2]; val any = a[next * 2 + 1] - val bnx = b[next * 2]; val bny = b[next * 2 + 1] - vertexCount = put(vertices, vertexCount, aix, aiy, sampleColor(aix, aiy, ax, ay, aw, ah, color1, color2, gradient)) - vertexCount = put(vertices, vertexCount, bix, biy, sampleColor(bix, biy, ax, ay, aw, ah, color1, color2, gradient)) - vertexCount = put(vertices, vertexCount, bnx, bny, sampleColor(bnx, bny, ax, ay, aw, ah, color1, color2, gradient)) - vertexCount = put(vertices, vertexCount, anx, any, sampleColor(anx, any, ax, ay, aw, ah, color1, color2, gradient)) - } - releaseFloats(a); releaseFloats(b) - emitMesh(vertices, vertexCount, false, TextureSetup.noTexture(), min(ax, bx), min(ay, by), max(ax + aw, bx + bw), max(ay + ah, by + bh), pose) - } - - private fun contourPointCount(tl: Float, tr: Float, br: Float, bl: Float, pose: Matrix3x2f) = - cornerSegments(tl, pose) + cornerSegments(tr, pose) + cornerSegments(br, pose) + cornerSegments(bl, pose) + 4 - - private fun cornerSegments(radius: Float, pose: Matrix3x2f): Int { - val renderedRadius = radius * max( - hypot(pose.m00().toDouble(), pose.m01().toDouble()), - hypot(pose.m10().toDouble(), pose.m11().toDouble()), - ) * mc.window.guiScale - return ceil(PI * renderedRadius / 4.0).toInt().coerceIn(1, 32) - } - - private fun writeContour( - points: FloatArray, outer: FloatArray?, x: Float, y: Float, w: Float, h: Float, - tl: Float, tr: Float, br: Float, bl: Float, pose: Matrix3x2f, fixedSegments: Int = 0, - ) { - var point = 0 - for (corner in 0..3) { - val radius = when (corner) { 0 -> tl; 1 -> tr; 2 -> br; else -> bl } - val cx = when (corner) { 0, 3 -> x + radius; else -> x + w - radius } - val cy = when (corner) { 0, 1 -> y + radius; else -> y + h - radius } - val start = when (corner) { 0 -> PI; 1 -> -PI / 2; 2 -> 0.0; else -> PI / 2 } - val segments = if (fixedSegments > 0) fixedSegments else cornerSegments(radius, pose) - for (i in 0..segments) { - val angle = start + PI * i / (2 * segments) - val dx = cos(angle).toFloat() - val dy = sin(angle).toFloat() - points[point * 2] = cx + dx * radius - points[point * 2 + 1] = cy + dy * radius - outer?.let { - val feather = framebufferPixelAlong(dx, dy, pose) - it[point * 2] = cx + dx * (radius + feather) - it[point * 2 + 1] = cy + dy * (radius + feather) + private fun createImage(bytes: ByteArray, name: String): SkijaImage { + if (!name.substringBefore('?').endsWith(".svg", true)) return SkijaImage.makeDeferredFromEncodedBytes(bytes) + Data.makeFromBytes(bytes).use { data -> + SVGDOM(data).use { dom -> + val root = dom.root ?: error("Invalid SVG: $name") + val size = root.getIntrinsicSize(SVGLengthContext(256f, 256f, 96f)) + val width = max(1, size.x.roundToInt()) + val height = max(1, size.y.roundToInt()) + Surface.makeRaster(ImageInfo(width, height, ColorType.N32, ColorAlphaType.PREMUL, ColorSpace.getSRGB())).use { surface -> + surface.canvas.clear(0) + dom.setContainerSize(width.toFloat(), height.toFloat()) + dom.render(surface.canvas) + return surface.makeImageSnapshot() } - point++ } } } - private fun framebufferPixelAlong(dx: Float, dy: Float, pose: Matrix3x2f): Float { - val tx = pose.m00() * dx + pose.m10() * dy - val ty = pose.m01() * dx + pose.m11() * dy - val length = mc.window.guiScale * hypot(tx.toDouble(), ty.toDouble()) - return if (length > 1e-6) (1.0 / length).toFloat() else 0f - } - - private fun localPixel(pose: Matrix3x2f): Float = max( - max(framebufferPixelAlong(1f, 0f, pose), framebufferPixelAlong(0f, 1f, pose)), - max(framebufferPixelAlong(0.70710677f, 0.70710677f, pose), framebufferPixelAlong(0.70710677f, -0.70710677f, pose)), - ) - - private fun emitGradientQuad(x: Float, y: Float, w: Float, h: Float, a: Int, b: Int, gradient: Gradient) = - emitQuad( - x, y, w, h, - gradientColor(x, y, x, y, w, h, a, b, gradient), - gradientColor(x, y + h, x, y, w, h, a, b, gradient), - gradientColor(x + w, y + h, x, y, w, h, a, b, gradient), - gradientColor(x + w, y, x, y, w, h, a, b, gradient), - ) - - private fun emitQuad( - x: Float, y: Float, w: Float, h: Float, c0: Int, c1: Int = c0, c2: Int = c0, c3: Int = c0, - textured: Boolean = false, setup: TextureSetup = TextureSetup.noTexture(), - ) { - val ctx = context ?: return - if (w <= 0f || h <= 0f) return - val pose = Matrix3x2f(ctx.pose()) - val bounds = bounds(x, y, x + w, y + h, pose) - (ctx as GuiGraphicsExtractorAccessor).ctjsGuiRenderState.addGuiElement( - QuadState(x, y, w, h, c0, c1, c2, c3, pose, textured, setup, clip?.screen, bounds), - ) - } - - private fun emitQuadPoints( - x0: Float, y0: Float, x1: Float, y1: Float, x2: Float, y2: Float, x3: Float, y3: Float, color: Int, - ) { - val ctx = context ?: return - val pose = Matrix3x2f(ctx.pose()) - val vertices = acquireFloats(20) - var count = 0 - count = put(vertices, count, x0, y0, color); count = put(vertices, count, x1, y1, color) - count = put(vertices, count, x2, y2, color); count = put(vertices, count, x3, y3, color) - emitMesh(vertices, count, false, TextureSetup.noTexture(), min(min(x0, x1), min(x2, x3)), min(min(y0, y1), min(y2, y3)), max(max(x0, x1), max(x2, x3)), max(max(y0, y1), max(y2, y3)), pose) - } - - private fun put( - vertices: FloatArray, index: Int, x: Float, y: Float, color: Int, - boundsX: Float = 0f, boundsY: Float = 0f, boundsW: Float = 1f, boundsH: Float = 1f, textured: Boolean = false, - ): Int { - val offset = index * 5 - vertices[offset] = x; vertices[offset + 1] = y - vertices[offset + 2] = if (textured) (x - boundsX) / boundsW else 0f - vertices[offset + 3] = if (textured) (y - boundsY) / boundsH else 0f - vertices[offset + 4] = Float.fromBits(color) - return index + 1 - } - - private fun acquireFloats(size: Int): FloatArray = synchronized(vertexPool) { - vertexPool.firstOrNull { it.size >= size }?.also(vertexPool::remove) ?: FloatArray(size) - } - - private fun releaseFloats(vertices: FloatArray) = synchronized(vertexPool) { vertexPool.addLast(vertices) } - - private fun emitMesh( - vertices: FloatArray, count: Int, textured: Boolean, setup: TextureSetup, - minX: Float, minY: Float, maxX: Float, maxY: Float, pose: Matrix3x2f, - ) { - val ctx = context ?: return releaseFloats(vertices) - val area = bounds(minX, minY, maxX, maxY, pose) - synchronized(vertexPool) { inFlightVertices.addLast(vertices) } - (ctx as GuiGraphicsExtractorAccessor).ctjsGuiRenderState.addGuiElement(MeshState(vertices, count, pose, textured, setup, clip?.screen, area)) - } - - private fun bounds(minX: Float, minY: Float, maxX: Float, maxY: Float, pose: Matrix3x2f): ScreenRectangle { - var area = ScreenRectangle(floor(minX).toInt(), floor(minY).toInt(), ceil(maxX - floor(minX)).toInt(), ceil(maxY - floor(minY)).toInt()).transformMaxBounds(pose) - clip?.screen?.let { area = area.intersection(it) ?: ScreenRectangle.empty() } - return area - } - - private fun resolveGradient(direction: Any): Gradient { - val name = direction.toString() - return when { - name.contains("TopToBottom") -> Gradient.TOP_TO_BOTTOM - name.contains("TopLeftToBottomRight") -> Gradient.TL_TO_BR - name.contains("BottomLeftToTopRight") -> Gradient.BL_TO_TR - else -> Gradient.LEFT_TO_RIGHT + private fun decodeGif(path: String): CachedGif? = runCatching { + FileInputStream(path).use { stream -> + val reader = ImageIO.getImageReadersByFormatName("gif").next() + reader.input = ImageIO.createImageInputStream(stream) + val count = reader.getNumImages(true) + val first = reader.read(0) + val master = BufferedImage(first.width, first.height, BufferedImage.TYPE_INT_ARGB) + val graphics = master.createGraphics().apply { background = Color(0, 0, 0, 0) } + val frames = ArrayList(count) + val delays = IntArray(count) + repeat(count) { index -> + val frame = reader.read(index) + val tree = reader.getImageMetadata(index).getAsTree(reader.getImageMetadata(index).nativeMetadataFormatName) as IIOMetadataNode + val control = tree.getElementsByTagName("GraphicControlExtension").item(0) as IIOMetadataNode + val descriptor = tree.getElementsByTagName("ImageDescriptor").item(0) as IIOMetadataNode + val x = descriptor.getAttribute("imageLeftPosition").toInt() + val y = descriptor.getAttribute("imageTopPosition").toInt() + delays[index] = (control.getAttribute("delayTime").toInt() * 10).coerceAtLeast(10) + graphics.drawImage(frame, x, y, null) + frames += bufferedImage(master) + if (control.getAttribute("disposalMethod") == "restoreToBackgroundColor") graphics.clearRect(x, y, frame.width, frame.height) + } + graphics.dispose(); reader.dispose() + CachedGif(frames, delays, first.width, first.height) } + }.onFailure { println("[V5] Failed to load GIF $path: ${it.message}") }.getOrNull() + + private fun bufferedImage(image: BufferedImage): SkijaImage { + val output = ByteArrayOutputStream() + ImageIO.write(image, "png", output) + return SkijaImage.makeDeferredFromEncodedBytes(output.toByteArray()) } - private fun sampleColor(px: Float, py: Float, x: Float, y: Float, w: Float, h: Float, a: Int, b: Int, gradient: Gradient?) = - if (gradient == null) a else gradientColor(px, py, x, y, w, h, a, b, gradient) + private fun skijaFont(font: Font, size: Float) = fonts.getOrPut(FontKey(font, size)) { + io.github.humbleui.skija.Font(typefaces.getOrPut(font) { + FontMgr.getDefault().makeFromData(Data.makeFromBytes(font.buffer().let { buffer -> ByteArray(buffer.remaining()).also(buffer::get) })) + ?: error("Failed to load font ${font.name}") + }, size) + .setSubpixel(true) + .setEdging(FontEdging.SUBPIXEL_ANTI_ALIAS) + .setHinting(FontHinting.SLIGHT) + } + + private fun paint(color: Int, mode: PaintMode = PaintMode.FILL) = Paint() + .setAntiAlias(true).setMode(mode).setColor(applyAlpha(color)) + + private fun gradientShader(x: Float, y: Float, width: Float, height: Float, color1: Int, color2: Int, direction: Any): Shader { + val (endX, endY) = when (resolveGradient(direction)) { + Gradient.TOP_TO_BOTTOM -> x to y + height + Gradient.TL_TO_BR -> x + width to y + height + Gradient.BL_TO_TR -> x + width to y - height + Gradient.LEFT_TO_RIGHT -> x + width to y + } + return Shader.makeLinearGradient(x, y, endX, endY, intArrayOf(applyAlpha(color1), applyAlpha(color2))) + } - private fun gradientColor(px: Float, py: Float, x: Float, y: Float, w: Float, h: Float, a: Int, b: Int, direction: Gradient): Int { - val value = when (direction) { - Gradient.TOP_TO_BOTTOM -> (py - y) / h - Gradient.TL_TO_BR -> ((px - x) / w + (py - y) / h) / 2f - Gradient.BL_TO_TR -> ((px - x) / w + 1f - (py - y) / h) / 2f - Gradient.LEFT_TO_RIGHT -> (px - x) / w - }.coerceIn(0f, 1f) - fun channel(shift: Int) = (((a ushr shift) and 255) + (((b ushr shift) and 255) - ((a ushr shift) and 255)) * value).roundToInt() - return applyAlpha((channel(24) shl 24) or (channel(16) shl 16) or (channel(8) shl 8) or channel(0)) + private fun resolveGradient(direction: Any) = when { + direction.toString().contains("TopToBottom") -> Gradient.TOP_TO_BOTTOM + direction.toString().contains("TopLeftToBottomRight") -> Gradient.TL_TO_BR + direction.toString().contains("BottomLeftToTopRight") -> Gradient.BL_TO_TR + else -> Gradient.LEFT_TO_RIGHT } - private fun applyAlpha(color: Int): Int = withAlpha(color, (((color ushr 24) and 255) * alpha).roundToInt()) - private fun withAlpha(color: Int, value: Int) = (color and 0xffffff) or (value.coerceIn(0, 255) shl 24) + private fun radii(tl: Float, tr: Float, br: Float, bl: Float) = floatArrayOf(tl, tl, tr, tr, br, br, bl, bl) + private fun applyAlpha(color: Int) = (color and 0xffffff) or ((((color ushr 24) and 255) * alpha).roundToInt().coerceIn(0, 255) shl 24) + private fun String.isUrl() = startsWith("http://", true) || startsWith("https://", true) + private fun readImage(path: String): ByteArray = when { + File(path).isFile -> FileInputStream(path) + else -> GuiRendererBackend::class.java.getResourceAsStream(path) ?: throw FileNotFoundException(path) + }.use { it.readBytes() } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderLayers.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderLayers.kt deleted file mode 100644 index 43725cf7..00000000 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderLayers.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.chattriggers.ctjs.api.render - -import com.mojang.blaze3d.pipeline.BlendFunction -import com.mojang.blaze3d.pipeline.ColorTargetState -import com.mojang.blaze3d.pipeline.RenderPipeline -import com.mojang.blaze3d.vertex.DefaultVertexFormat -import com.mojang.blaze3d.vertex.VertexFormat.Mode -import net.minecraft.client.renderer.RenderPipelines as MinecraftRenderPipelines -import net.minecraft.client.renderer.rendertype.LayeringTransform -import net.minecraft.client.renderer.rendertype.RenderSetup -import net.minecraft.client.renderer.rendertype.RenderType -import java.util.Optional - -/** The only custom world pipelines are the two states vanilla does not expose: no-depth ESP. */ -object RenderPipelines { - @JvmField val LINE_LIST = MinecraftRenderPipelines.LINES_TRANSLUCENT - @JvmField val TRIANGLE_STRIP = MinecraftRenderPipelines.DEBUG_FILLED_BOX - - @JvmField - val LINE_LIST_ESP: RenderPipeline = RenderPipeline.builder(MinecraftRenderPipelines.LINES_SNIPPET) - .withLocation("pipeline/ctjs_lines_esp") - .withVertexFormat(DefaultVertexFormat.POSITION_COLOR_NORMAL_LINE_WIDTH, Mode.LINES) - .withCull(false) - .withColorTargetState(ColorTargetState(BlendFunction.TRANSLUCENT)) - .withDepthStencilState(Optional.empty()) - .build() - - @JvmField - val TRIANGLE_STRIP_ESP: RenderPipeline = RenderPipeline.builder(MinecraftRenderPipelines.DEBUG_FILLED_SNIPPET) - .withLocation("pipeline/ctjs_filled_box_esp") - .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, Mode.QUADS) - .withCull(false) - .withColorTargetState(ColorTargetState(BlendFunction.TRANSLUCENT)) - .withDepthStencilState(Optional.empty()) - .build() -} - -object RenderLayers { - @JvmField - val LINE_LIST: RenderType = RenderType.create( - "line-list", - RenderSetup.builder(RenderPipelines.LINE_LIST) - .setLayeringTransform(LayeringTransform.VIEW_OFFSET_Z_LAYERING) - .createRenderSetup(), - ) - - @JvmField - val LINE_LIST_ESP: RenderType = RenderType.create( - "line-list-esp", - RenderSetup.builder(RenderPipelines.LINE_LIST_ESP).createRenderSetup(), - ) - - @JvmField - val TRIANGLE_STRIP: RenderType = RenderType.create( - "filled-box", - RenderSetup.builder(RenderPipelines.TRIANGLE_STRIP) - .setLayeringTransform(LayeringTransform.VIEW_OFFSET_Z_LAYERING) - .sortOnUpload() - .createRenderSetup(), - ) - - @JvmField - val TRIANGLE_STRIP_ESP: RenderType = RenderType.create( - "filled-box-esp", - RenderSetup.builder(RenderPipelines.TRIANGLE_STRIP_ESP).sortOnUpload().createRenderSetup(), - ) -} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderUtils.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderUtils.kt index 17204051..45c34d0c 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderUtils.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/RenderUtils.kt @@ -1,40 +1,16 @@ package com.chattriggers.ctjs.api.render -import com.chattriggers.ctjs.internal.engine.CTEvents import net.minecraft.client.Minecraft -import net.minecraft.client.gui.Font -import net.minecraft.client.renderer.rendertype.RenderType -import com.mojang.blaze3d.vertex.VertexConsumer -import net.minecraft.client.renderer.MultiBufferSource -import com.mojang.blaze3d.vertex.ByteBufferBuilder -import com.mojang.blaze3d.vertex.PoseStack +import net.minecraft.gizmos.GizmoStyle +import net.minecraft.gizmos.Gizmos +import net.minecraft.gizmos.TextGizmo +import net.minecraft.util.ARGB import net.minecraft.world.entity.Entity import net.minecraft.world.phys.AABB -import net.minecraft.util.ARGB import net.minecraft.world.phys.Vec3 -import org.joml.Quaternionf -import kotlin.math.max -import kotlin.math.min object RenderUtils { private val client = Minecraft.getInstance() - private val bufferSource = MultiBufferSource.immediate(ByteBufferBuilder(2 * 1024 * 1024)) - private val boxes = mutableListOf() - private val lines = mutableListOf() - private val texts = mutableListOf() - - private data class BoxCommand(val box: AABB, val color: Color, val filled: Boolean, val depth: Boolean, val thickness: Float) - private data class LineCommand(val start: Vec3, val end: Vec3, val color: Color, val thickness: Float, val depth: Boolean) - private data class BatchKey(val layer: RenderType, val thickness: Float?) - private data class TextCommand( - val text: String, - val pos: Vec3, - val scale: Float, - val backgroundBox: Boolean, - val increase: Boolean, - val seeThrough: Boolean, - val translate: Boolean, - ) data class Color(val r: Int, val g: Int, val b: Int, val a: Int) { val rf = r / 255f @@ -44,151 +20,6 @@ object RenderUtils { val packed = ARGB.color(a, r, g, b) } - init { - CTEvents.POST_RENDER_WORLD.register { matrices, _ -> render(matrices) } - } - - private fun render(matrices: PoseStack) { - if (boxes.isEmpty() && lines.isEmpty() && texts.isEmpty()) return - - val pendingBoxes = boxes.toList().also { boxes.clear() } - val pendingLines = lines.toList().also { lines.clear() } - val pendingTexts = texts.toList().also { texts.clear() } - val camera = client.gameRenderer.mainCamera - - matrices.pushPose() - matrices.translate(-camera.position().x, -camera.position().y, -camera.position().z) - renderBoxes(matrices, pendingBoxes) - renderLines(matrices, pendingLines) - matrices.popPose() - renderTexts(matrices, pendingTexts, camera.position(), camera.rotation()) - - bufferSource.endBatch() - } - - private fun renderBoxes(matrices: PoseStack, commands: List) { - val batches = commands.groupBy { command -> - val layer = when { - command.filled && command.depth -> RenderLayers.TRIANGLE_STRIP - command.filled -> RenderLayers.TRIANGLE_STRIP_ESP - command.depth -> RenderLayers.LINE_LIST - else -> RenderLayers.LINE_LIST_ESP - } - BatchKey(layer, command.thickness.takeUnless { command.filled }?.coerceAtLeast(0.1f)) - } - - for ((key, batch) in batches) { - val buffer = bufferSource.getBuffer(key.layer) - - for ((box, color, filled) in batch) { - if (filled) { - writeFilledBox(matrices.last(), buffer, box, color.packed) - } else { - writeBox(matrices.last(), buffer, box, color.packed, key.thickness ?: 1f) - } - } - bufferSource.endBatch() - } - } - - private fun renderLines(matrices: PoseStack, commands: List) { - val batches = commands.groupBy { command -> - val layer = if (command.depth) RenderLayers.LINE_LIST else RenderLayers.LINE_LIST_ESP - BatchKey(layer, command.thickness.coerceAtLeast(0.1f)) - } - - for ((key, batch) in batches) { - val buffer = bufferSource.getBuffer(key.layer) - for ((start, end, color) in batch) { - writeLine(matrices.last(), buffer, start, end, color.packed, requireNotNull(key.thickness)) - } - bufferSource.endBatch() - } - } - - private fun writeFilledBox(entry: PoseStack.Pose, buffer: VertexConsumer, box: AABB, argb: Int) { - val minX = min(box.minX, box.maxX).toFloat() - val minY = min(box.minY, box.maxY).toFloat() - val minZ = min(box.minZ, box.maxZ).toFloat() - val maxX = max(box.minX, box.maxX).toFloat() - val maxY = max(box.minY, box.maxY).toFloat() - val maxZ = max(box.minZ, box.maxZ).toFloat() - - quad(buffer, entry, minX, minY, minZ, maxX, minY, minZ, maxX, maxY, minZ, minX, maxY, minZ, argb) - quad(buffer, entry, minX, minY, maxZ, minX, maxY, maxZ, maxX, maxY, maxZ, maxX, minY, maxZ, argb) - quad(buffer, entry, minX, minY, minZ, minX, maxY, minZ, minX, maxY, maxZ, minX, minY, maxZ, argb) - quad(buffer, entry, maxX, minY, minZ, maxX, minY, maxZ, maxX, maxY, maxZ, maxX, maxY, minZ, argb) - quad(buffer, entry, minX, maxY, minZ, maxX, maxY, minZ, maxX, maxY, maxZ, minX, maxY, maxZ, argb) - quad(buffer, entry, minX, minY, minZ, minX, minY, maxZ, maxX, minY, maxZ, maxX, minY, minZ, argb) - } - - private fun quad( - buffer: VertexConsumer, - entry: PoseStack.Pose, - x1: Float, y1: Float, z1: Float, - x2: Float, y2: Float, z2: Float, - x3: Float, y3: Float, z3: Float, - x4: Float, y4: Float, z4: Float, - argb: Int, - ) { - buffer.addVertex(entry, x1, y1, z1).setColor(argb) - buffer.addVertex(entry, x2, y2, z2).setColor(argb) - buffer.addVertex(entry, x3, y3, z3).setColor(argb) - buffer.addVertex(entry, x4, y4, z4).setColor(argb) - } - - private fun writeBox(entry: PoseStack.Pose, buffer: VertexConsumer, box: AABB, argb: Int, lineWidth: Float) { - val min = Vec3(box.minX, box.minY, box.minZ) - val max = Vec3(box.maxX, box.maxY, box.maxZ) - val corners = arrayOf( - Vec3(min.x, min.y, min.z), Vec3(max.x, min.y, min.z), - Vec3(max.x, min.y, max.z), Vec3(min.x, min.y, max.z), - Vec3(min.x, max.y, min.z), Vec3(max.x, max.y, min.z), - Vec3(max.x, max.y, max.z), Vec3(min.x, max.y, max.z), - ) - val edges = intArrayOf(0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7) - for (i in edges.indices step 2) { - writeLine(entry, buffer, corners[edges[i]], corners[edges[i + 1]], argb, lineWidth) - } - } - - private fun writeLine(entry: PoseStack.Pose, buffer: VertexConsumer, start: Vec3, end: Vec3, argb: Int, lineWidth: Float) { - val normal = end.subtract(start).normalize() - - buffer.addVertex(entry, start.x.toFloat(), start.y.toFloat(), start.z.toFloat()).setColor(argb).setNormal(entry, normal.x.toFloat(), normal.y.toFloat(), normal.z.toFloat()).setLineWidth(lineWidth) - buffer.addVertex(entry, end.x.toFloat(), end.y.toFloat(), end.z.toFloat()).setColor(argb).setNormal(entry, normal.x.toFloat(), normal.y.toFloat(), normal.z.toFloat()).setLineWidth(lineWidth) - } - - private fun renderTexts(matrices: PoseStack, commands: List, cameraPos: Vec3, cameraRotation: Quaternionf) { - for ((text, pos, scale, backgroundBox, increase, seeThrough, translate) in commands) { - val relative = pos.subtract(cameraPos) - matrices.pushPose() - if (translate) matrices.translate(relative.x, relative.y, relative.z) - matrices.mulPose(cameraRotation) - - val renderScale = if (increase) { - scale * (relative.length().toFloat() / 120f).coerceAtLeast(0.01f) - } else { - scale * 0.025f - } - matrices.scale(renderScale, -renderScale, renderScale) - - client.font.drawInBatch( - text, - -client.font.width(text) / 2f, - 0f, - -1, - backgroundBox, - matrices.last().pose(), - bufferSource, - if (seeThrough) Font.DisplayMode.SEE_THROUGH else Font.DisplayMode.NORMAL, - 0, - 15728880, - ) - matrices.popPose() - } - } - @JvmStatic @JvmOverloads fun drawFilledBox(pos: Vec3, color: Color, depth: Boolean = false) = @@ -197,7 +28,7 @@ object RenderUtils { @JvmStatic @JvmOverloads fun drawFilledBox(box: AABB, color: Color, depth: Boolean = false) { - boxes += BoxCommand(box, color, true, depth, 1f) + Gizmos.cuboid(box, GizmoStyle.fill(color.packed)).depth(depth) } @JvmStatic @@ -208,40 +39,45 @@ object RenderUtils { @JvmStatic @JvmOverloads fun drawWireFrameBox(box: AABB, color: Color, thickness: Float = 5f, depth: Boolean = false) { - boxes += BoxCommand(box, color, false, depth, thickness) + Gizmos.cuboid(box, GizmoStyle.stroke(color.packed, thickness)).depth(depth) } @JvmStatic @JvmOverloads fun drawBox(box: AABB, color: Color, thickness: Float = 2f, depth: Boolean = false) { - drawFilledBox(box, color, depth) - drawWireFrameBox(box, color, thickness, depth) + Gizmos.cuboid(box, GizmoStyle.strokeAndFill(color.packed, thickness, color.packed)).depth(depth) } @JvmStatic @JvmOverloads fun drawStyledBox(pos: Vec3, color1: Color, color2: Color, wireThickness: Float = 5f, depth: Boolean = false) { val box = AABB(pos.x, pos.y, pos.z, pos.x + 1, pos.y + 1, pos.z + 1) - drawFilledBox(box, color1, depth) - drawWireFrameBox(box, color2, wireThickness, depth) + Gizmos.cuboid(box, GizmoStyle.strokeAndFill(color2.packed, wireThickness, color1.packed)).depth(depth) } @JvmStatic @JvmOverloads fun drawSizedBox(pos: Vec3, width: Double, height: Double, length: Double, color: Color, filled: Boolean = true, thickness: Float = 1f, depth: Boolean = false) { val box = AABB(pos.x - width / 2, pos.y, pos.z - length / 2, pos.x + width / 2, pos.y + height, pos.z + length / 2) - boxes += BoxCommand(box, color, filled, depth, thickness) + Gizmos.cuboid(box, if (filled) GizmoStyle.fill(color.packed) else GizmoStyle.stroke(color.packed, thickness)).depth(depth) } @JvmStatic @JvmOverloads - fun drawHitbox(entity: Entity, color: Color, thickness: Float = 2f, depth: Boolean = false) = - drawBox(entity.boundingBox, color, thickness, depth) + fun drawHitbox(entity: Entity, color: Color, thickness: Float = 2f, depth: Boolean = false) { + val partialTicks = client.deltaTracker.getGameTimeDeltaPartialTick(true) + val box = entity.boundingBox.move( + entity.xOld + (entity.x - entity.xOld) * partialTicks - entity.x, + entity.yOld + (entity.y - entity.yOld) * partialTicks - entity.y, + entity.zOld + (entity.z - entity.zOld) * partialTicks - entity.z, + ) + drawBox(box, color, thickness, depth) + } @JvmStatic @JvmOverloads fun drawLine(start: Vec3, end: Vec3, color: Color, thickness: Float = 3f, depth: Boolean = false) { - lines += LineCommand(start, end, color, thickness, depth) + Gizmos.line(start, end, color.packed, thickness).depth(depth) } @JvmStatic @@ -255,6 +91,14 @@ object RenderUtils { @JvmStatic @JvmOverloads fun drawText(text: String, pos: Vec3, scale: Float = 1f, backgroundBox: Boolean = false, increase: Boolean = false, seeThrough: Boolean = false, translate: Boolean = true) { - texts += TextCommand(text, pos, scale, backgroundBox, increase, seeThrough, translate) + val distanceScale = if (increase) (pos.distanceTo(client.gameRenderer.mainCamera.position()).toFloat() / 120f).coerceAtLeast(0.01f) else 1f + val style = TextGizmo.Style.whiteAndCentered().withScale(TextGizmo.Style.DEFAULT_SCALE * scale * distanceScale) + Gizmos.billboardText(text, if (translate) pos else client.gameRenderer.mainCamera.position(), style).apply { + if (seeThrough) setAlwaysOnTop() + } + } + + private fun net.minecraft.gizmos.GizmoProperties.depth(depth: Boolean) = apply { + if (!depth) setAlwaysOnTop() } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt index 2b984cd8..109032db 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/Renderer.kt @@ -181,12 +181,14 @@ object Renderer : GuiRendererBackend() { @JvmStatic @JvmOverloads fun translate(x: Float, y: Float, z: Float = 0.0F) = apply { + if (translateSkija(x, y)) return@apply DrawContextHolder.currentContext?.pose()?.translate(x, y) ?: matrixStack.translate(x, y, z) } @JvmStatic @JvmOverloads fun scale(scaleX: Float, scaleY: Float = scaleX, scaleZ: Float = 1f) = apply { + if (scaleSkija(scaleX, scaleY)) return@apply DrawContextHolder.currentContext?.pose()?.scale(scaleX, scaleY) ?: matrixStack.scale(scaleX, scaleY, scaleZ) } @@ -194,6 +196,7 @@ object Renderer : GuiRendererBackend() { @JvmOverloads fun rotate(angle: Float, x: Float = 0f, y: Float = 0f, z: Float = 1f) = apply { if (x == 0f && y == 0f && z != 0f) { + if (rotateSkija(angle * z)) return@apply DrawContextHolder.currentContext?.pose()?.rotate(Math.toRadians((angle * z).toDouble()).toFloat()) ?: matrixStack.rotate(angle, x, y, z) } else matrixStack.rotate(angle, x, y, z) diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaBootstrap.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaBootstrap.kt new file mode 100644 index 00000000..1e1409d8 --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaBootstrap.kt @@ -0,0 +1,38 @@ +package com.chattriggers.ctjs.api.render.skia + +import net.fabricmc.loader.api.FabricLoader +import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint +import net.fabricmc.loader.impl.launch.FabricLauncherBase +import java.net.URI +import java.nio.file.Files +import java.nio.file.StandardCopyOption + +class SkijaBootstrap : PreLaunchEntrypoint { + override fun onPreLaunch() { + val artifact = when { + System.getProperty("os.name").contains("win", true) -> "skija-windows-x64" + System.getProperty("os.name").contains("mac", true) && System.getProperty("os.arch").contains("aarch64", true) -> "skija-macos-arm64" + System.getProperty("os.name").contains("mac", true) -> "skija-macos-x64" + System.getProperty("os.arch").contains("aarch64", true) -> "skija-linux-arm64" + else -> "skija-linux-x64" + } + val cache = FabricLoader.getInstance().gameDir.resolve("config/ChatTriggers/cache") + val file = cache.resolve("$artifact-$VERSION.jar") + if (!Files.exists(file)) { + Files.createDirectories(cache) + val temporary = Files.createTempFile(cache, "skija-", ".tmp") + try { + URI("https://repo1.maven.org/maven2/io/github/humbleui/$artifact/$VERSION/${file.fileName}") + .toURL().openStream().use { Files.copy(it, temporary, StandardCopyOption.REPLACE_EXISTING) } + Files.move(temporary, file, StandardCopyOption.REPLACE_EXISTING) + } finally { + Files.deleteIfExists(temporary) + } + } + FabricLauncherBase.getLauncher().addToClassPath(file) + } + + private companion object { + const val VERSION = "0.143.11" + } +} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt new file mode 100644 index 00000000..0e618e78 --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaPIP.kt @@ -0,0 +1,89 @@ +package com.chattriggers.ctjs.api.render.skia + +import com.chattriggers.ctjs.api.render.Renderer +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.vertex.PoseStack +import net.minecraft.client.gui.GuiGraphicsExtractor +import net.minecraft.client.gui.navigation.ScreenRectangle +import net.minecraft.client.gui.render.pip.PictureInPictureRenderer +import net.minecraft.client.renderer.MultiBufferSource +import net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState +import org.joml.Matrix3x2f + +internal open class SkijaPIP(bufferSource: MultiBufferSource.BufferSource) : PictureInPictureRenderer(bufferSource) { + private val surface = SkijaSurface() + + override fun getTranslateY(height: Int, guiScale: Int) = height / 2f + override fun getRenderStateClass() = State::class.java + override fun getTextureLabel() = "V5 Skija" + + override fun renderToTexture(state: State, _poseStack: PoseStack) { + val color = RenderSystem.outputColorTextureOverride ?: return + surface.render(color.getWidth(0), color.getHeight(0), color.texture()) { canvas -> + canvas.resetMatrix() + canvas.scale(state.guiScale, state.guiScale) + Renderer.beginSkijaFrame(canvas) + try { + state.callback.run() + } finally { + Renderer.endSkijaFrame() + } + } + } + + override fun close() { + surface.close() + super.close() + } + + open class State( + private val width: Int, + private val height: Int, + val guiScale: Float, + private val poseMatrix: Matrix3x2f, + private val scissor: ScreenRectangle?, + private val area: ScreenRectangle, + val callback: Runnable, + ) : PictureInPictureRenderState { + override fun x0() = 0 + override fun y0() = 0 + override fun x1() = width + override fun y1() = height + override fun scale() = 1f + override fun pose() = poseMatrix + override fun scissorArea() = scissor + override fun bounds() = area + } + + companion object { + fun draw(graphics: GuiGraphicsExtractor, callback: Runnable, pre: Boolean = false) { + val width = graphics.guiWidth() + val height = graphics.guiHeight() + val pose = Matrix3x2f(graphics.pose()) + val screen = ScreenRectangle(0, 0, width, height).transformMaxBounds(pose) + val scissor = graphics.scissorStack.peek() + val bounds = scissor?.intersection(screen) ?: screen + if (bounds.width <= 0 || bounds.height <= 0) return + val scale = net.minecraft.client.Minecraft.getInstance().window.guiScale.toFloat() + graphics.guiRenderState.addPicturesInPictureState( + if (pre) PreState(width, height, scale, pose, scissor, bounds, callback) + else State(width, height, scale, pose, scissor, bounds, callback), + ) + } + } + + class PreState( + width: Int, + height: Int, + guiScale: Float, + poseMatrix: Matrix3x2f, + scissor: ScreenRectangle?, + area: ScreenRectangle, + callback: Runnable, + ) : State(width, height, guiScale, poseMatrix, scissor, area, callback) +} + +internal class SkijaPrePIP(bufferSource: MultiBufferSource.BufferSource) : SkijaPIP(bufferSource) { + @Suppress("UNCHECKED_CAST") + override fun getRenderStateClass() = SkijaPIP.PreState::class.java as Class +} diff --git a/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt new file mode 100644 index 00000000..6ace24bf --- /dev/null +++ b/src/main/kotlin/com/chattriggers/ctjs/api/render/skia/SkijaSurface.kt @@ -0,0 +1,193 @@ +package com.chattriggers.ctjs.api.render.skia + +import com.mojang.blaze3d.opengl.GlStateManager +import com.mojang.blaze3d.opengl.GlTexture +import com.mojang.blaze3d.textures.GpuTexture +import io.github.humbleui.skija.BackendRenderTarget +import io.github.humbleui.skija.ColorSpace +import io.github.humbleui.skija.ColorType +import io.github.humbleui.skija.DirectContext +import io.github.humbleui.skija.Surface +import io.github.humbleui.skija.SurfaceOrigin +import org.lwjgl.opengl.GL11C +import org.lwjgl.opengl.GL12C +import org.lwjgl.opengl.GL13C +import org.lwjgl.opengl.GL14C +import org.lwjgl.opengl.GL15C +import org.lwjgl.opengl.GL20C +import org.lwjgl.opengl.GL21C +import org.lwjgl.opengl.GL30C +import org.lwjgl.opengl.GL31C +import org.lwjgl.opengl.GL33C + +internal class SkijaSurface : AutoCloseable { + private var context: DirectContext? = null + private var renderTarget: BackendRenderTarget? = null + private var surface: Surface? = null + private var fbo = 0 + private var depthStencil = 0 + private var width = 0 + private var height = 0 + private var textureId = 0 + + fun render(width: Int, height: Int, texture: GpuTexture, draw: (io.github.humbleui.skija.Canvas) -> Unit) { + val colorTexture = texture as? GlTexture ?: return + val state = GlState.capture() + try { + bindTarget(colorTexture.glId(), width, height) + GlStateManager._viewport(0, 0, width, height) + GL33C.glBindSampler(0, 0) + GL15C.glBindBuffer(GL21C.GL_PIXEL_UNPACK_BUFFER, 0) + GL11C.glPixelStorei(GL11C.GL_UNPACK_ALIGNMENT, 1) + GL11C.glPixelStorei(GL12C.GL_UNPACK_ROW_LENGTH, 0) + GL11C.glPixelStorei(GL12C.GL_UNPACK_SKIP_PIXELS, 0) + GL11C.glPixelStorei(GL12C.GL_UNPACK_SKIP_ROWS, 0) + + val directContext = context ?: DirectContext.makeGL().also { context = it } + directContext.resetGLAll() + val skijaSurface = surface(width, height, colorTexture.glId(), directContext) + draw(skijaSurface.canvas) + directContext.flushAndSubmit(skijaSurface, true) + } finally { + context?.resetGLAll() + state.restore() + } + } + + private fun bindTarget(colorTexture: Int, width: Int, height: Int) { + if (fbo == 0) fbo = GlStateManager.glGenFramebuffers() + GlStateManager._glBindFramebuffer(GL30C.GL_FRAMEBUFFER, fbo) + GlStateManager._glFramebufferTexture2D(GL30C.GL_FRAMEBUFFER, GL30C.GL_COLOR_ATTACHMENT0, GL11C.GL_TEXTURE_2D, colorTexture, 0) + if (depthStencil != 0 && this.width == width && this.height == height) return + if (depthStencil != 0) GL30C.glDeleteRenderbuffers(depthStencil) + depthStencil = GL30C.glGenRenderbuffers() + GL30C.glBindRenderbuffer(GL30C.GL_RENDERBUFFER, depthStencil) + GL30C.glRenderbufferStorage(GL30C.GL_RENDERBUFFER, GL30C.GL_DEPTH24_STENCIL8, width, height) + GL30C.glBindRenderbuffer(GL30C.GL_RENDERBUFFER, 0) + GL30C.glFramebufferRenderbuffer(GL30C.GL_FRAMEBUFFER, GL30C.GL_DEPTH_STENCIL_ATTACHMENT, GL30C.GL_RENDERBUFFER, depthStencil) + this.width = width + this.height = height + } + + private fun surface(width: Int, height: Int, texture: Int, context: DirectContext): Surface { + surface?.takeIf { it.width == width && it.height == height && textureId == texture }?.let { return it } + surface?.close() + renderTarget?.close() + renderTarget = BackendRenderTarget.makeGL(width, height, 0, 8, fbo, GL30C.GL_RGBA8) + return Surface.wrapBackendRenderTarget(context, renderTarget!!, SurfaceOrigin.BOTTOM_LEFT, ColorType.RGBA_8888, ColorSpace.getSRGB()) + .also { surface = it; textureId = texture } + } + + override fun close() { + surface?.close() + renderTarget?.close() + if (depthStencil != 0) GL30C.glDeleteRenderbuffers(depthStencil) + if (fbo != 0) GlStateManager._glDeleteFramebuffers(fbo) + context?.close() + surface = null + renderTarget = null + context = null + depthStencil = 0 + fbo = 0 + } +} + +private data class GlState( + val readFramebuffer: Int, + val drawFramebuffer: Int, + val viewport: IntArray, + val activeTexture: Int, + val texture: Int, + val sampler: Int, + val program: Int, + val vertexArray: Int, + val arrayBuffer: Int, + val scissorBox: IntArray, + val blendSrcRgb: Int, + val blendDstRgb: Int, + val blendSrcAlpha: Int, + val blendDstAlpha: Int, + val blendEquationRgb: Int, + val blendEquationAlpha: Int, + val blend: Boolean, + val cull: Boolean, + val depth: Boolean, + val stencil: Boolean, + val scissor: Boolean, + val primitiveRestart: Boolean, + val depthMask: Boolean, + val unpackBuffer: Int, + val unpackAlignment: Int, + val unpackRowLength: Int, + val unpackSkipPixels: Int, + val unpackSkipRows: Int, +) { + fun restore() { + GL20C.glUseProgram(program) + GL13C.glActiveTexture(GL13C.GL_TEXTURE0) + GL11C.glBindTexture(GL11C.GL_TEXTURE_2D, texture) + GL33C.glBindSampler(0, sampler) + GL13C.glActiveTexture(activeTexture) + GL30C.glBindVertexArray(vertexArray) + GL15C.glBindBuffer(GL15C.GL_ARRAY_BUFFER, arrayBuffer) + GL20C.glBlendEquationSeparate(blendEquationRgb, blendEquationAlpha) + GL14C.glBlendFuncSeparate(blendSrcRgb, blendDstRgb, blendSrcAlpha, blendDstAlpha) + setEnabled(GL11C.GL_BLEND, blend) + setEnabled(GL11C.GL_CULL_FACE, cull) + setEnabled(GL11C.GL_DEPTH_TEST, depth) + setEnabled(GL11C.GL_STENCIL_TEST, stencil) + setEnabled(GL11C.GL_SCISSOR_TEST, scissor) + setEnabled(GL31C.GL_PRIMITIVE_RESTART, primitiveRestart) + GL11C.glDepthMask(depthMask) + GL30C.glBindFramebuffer(GL30C.GL_READ_FRAMEBUFFER, readFramebuffer) + GL30C.glBindFramebuffer(GL30C.GL_DRAW_FRAMEBUFFER, drawFramebuffer) + GL11C.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]) + GL11C.glScissor(scissorBox[0], scissorBox[1], scissorBox[2], scissorBox[3]) + GL15C.glBindBuffer(GL21C.GL_PIXEL_UNPACK_BUFFER, unpackBuffer) + GL11C.glPixelStorei(GL11C.GL_UNPACK_ALIGNMENT, unpackAlignment) + GL11C.glPixelStorei(GL12C.GL_UNPACK_ROW_LENGTH, unpackRowLength) + GL11C.glPixelStorei(GL12C.GL_UNPACK_SKIP_PIXELS, unpackSkipPixels) + GL11C.glPixelStorei(GL12C.GL_UNPACK_SKIP_ROWS, unpackSkipRows) + } + + companion object { + fun capture(): GlState { + val activeTexture = GL11C.glGetInteger(GL13C.GL_ACTIVE_TEXTURE) + GL13C.glActiveTexture(GL13C.GL_TEXTURE0) + return GlState( + GL11C.glGetInteger(GL30C.GL_READ_FRAMEBUFFER_BINDING), + GL11C.glGetInteger(GL30C.GL_DRAW_FRAMEBUFFER_BINDING), + ints(GL11C.GL_VIEWPORT, 4), + activeTexture, + GL11C.glGetInteger(GL11C.GL_TEXTURE_BINDING_2D), + GL11C.glGetInteger(GL33C.GL_SAMPLER_BINDING), + GL11C.glGetInteger(GL20C.GL_CURRENT_PROGRAM), + GL11C.glGetInteger(GL30C.GL_VERTEX_ARRAY_BINDING), + GL11C.glGetInteger(GL15C.GL_ARRAY_BUFFER_BINDING), + ints(GL11C.GL_SCISSOR_BOX, 4), + GL11C.glGetInteger(GL14C.GL_BLEND_SRC_RGB), + GL11C.glGetInteger(GL14C.GL_BLEND_DST_RGB), + GL11C.glGetInteger(GL14C.GL_BLEND_SRC_ALPHA), + GL11C.glGetInteger(GL14C.GL_BLEND_DST_ALPHA), + GL11C.glGetInteger(GL20C.GL_BLEND_EQUATION_RGB), + GL11C.glGetInteger(GL20C.GL_BLEND_EQUATION_ALPHA), + GL11C.glIsEnabled(GL11C.GL_BLEND), + GL11C.glIsEnabled(GL11C.GL_CULL_FACE), + GL11C.glIsEnabled(GL11C.GL_DEPTH_TEST), + GL11C.glIsEnabled(GL11C.GL_STENCIL_TEST), + GL11C.glIsEnabled(GL11C.GL_SCISSOR_TEST), + GL11C.glIsEnabled(GL31C.GL_PRIMITIVE_RESTART), + GL11C.glGetBoolean(GL11C.GL_DEPTH_WRITEMASK), + GL11C.glGetInteger(GL21C.GL_PIXEL_UNPACK_BUFFER_BINDING), + GL11C.glGetInteger(GL11C.GL_UNPACK_ALIGNMENT), + GL11C.glGetInteger(GL12C.GL_UNPACK_ROW_LENGTH), + GL11C.glGetInteger(GL12C.GL_UNPACK_SKIP_PIXELS), + GL11C.glGetInteger(GL12C.GL_UNPACK_SKIP_ROWS), + ) + } + + private fun ints(name: Int, size: Int) = IntArray(size).also { GL11C.glGetIntegerv(name, it) } + private fun setEnabled(capability: Int, enabled: Boolean) = + if (enabled) GL11C.glEnable(capability) else GL11C.glDisable(capability) + } +} diff --git a/src/main/resources/assets/v5/font/default.json b/src/main/resources/assets/v5/font/default.json deleted file mode 100644 index f9f3ca8d..00000000 --- a/src/main/resources/assets/v5/font/default.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "providers": [ - { - "type": "ttf", - "file": "v5:font.ttf", - "size": 9, - "oversample": 4, - "shift": [0, 0] - } - ] -} diff --git a/src/main/resources/assets/v5/font/font.ttf b/src/main/resources/assets/v5/font/font.ttf deleted file mode 100644 index 0a6b8298043e8e19daebe96e6e9d3168d15d390c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528296 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%0Ax9vQjH*yU7Z;{BaAn)PT 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 z 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�<;h<0%KJ->Oo7;QnU;$M=Q`uCJ3!UtI--zcixBAq5I*y z*9~YR+JrWvEodvmr`?Wrpq=Oev_mpVXzxa!sgflTjJr^3Xj0nAfee}@X){x*bzJ7 zk=Pl#U{~x0`~76*2~bbEGiRCinGdiB_QYP;8~b1>_Qf*nhvnEG2jD;)goAMi4#i6Y zfEVILcrotAJ$MOTikIQ#cm-aGS7ET(;I;TZCI+v=_rr-F>+uG>5pTkq@fIcyZ^hg2 zcDw`cWa9Ay%y)2<-3$0Zyc_Sqy?8I)habZG@x%B4J_u_1NAV&27=9c-fuF=rF$uU2 zA7;MBARXc(AnZMdpT|e(u7h8|FXET*%lH-iDt?WbijU#r_;vgSK7mg%P54dx7CwdF zW~ShG@VodlehP@!=K|T_zV0c zzKXxXU*m7^xA+?V7yb@k$2aiz_y_zW{t5q#f5E@v-|+AF5Bw+oi^+iVyKiAF94SMv zp81~9unY@_%`t?IcC0&CjX9;_$p1*QTYz-arjGS-ikv;J%V8^{K+!E6W{%7(Gw zYy^|dM#7n5QLK_xv1&G&jbUTiI3|aUXA{^&2Er_{$!rRn%BHdDYzC9dYS>IRi_K