mirror of
https://git.webmc.xyz/Starlike-Client/Starlike-Client
synced 2025-06-02 08:52:00 -09:00
Starlike v0.4.2
This commit is contained in:
parent
2e1f9e8fb3
commit
04e8e3b68d
164
EaglerTools/UpdateEaglercraftVersion.sh
Executable file
164
EaglerTools/UpdateEaglercraftVersion.sh
Executable file
@ -0,0 +1,164 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
echo '
|
||||
##################################################
|
||||
|
||||
You need Eclipse installed to use this script.
|
||||
|
||||
Import the Eclipse Clean Up profile from:
|
||||
./desktopRuntime/eclipseProject/starlike_basic_format.xml
|
||||
|
||||
##################################################
|
||||
'
|
||||
|
||||
if ! dos2unix -V &> /dev/null; then
|
||||
echo "Error: dos2unix is not installed. Please install it and try again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SCRIPT_DONE="0"
|
||||
TMP_DIR="$(mktemp -d)"
|
||||
|
||||
cleanup() {
|
||||
if [[ "$SCRIPT_DONE" != "1" ]]; then
|
||||
echo
|
||||
echo
|
||||
echo "Script interrupted, cleaning up..."
|
||||
echo
|
||||
|
||||
git branch -D update-branch 2>/dev/null || :
|
||||
rm -rf "$TMP_DIR"
|
||||
|
||||
if [[ -n "${CURRENT_BRANCH:-}" ]]; then
|
||||
git checkout -f "$CURRENT_BRANCH"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Cleaned up."
|
||||
SCRIPT_DONE="1"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
for sig in HUP INT QUIT ABRT ALRM TERM USR1 USR2 PIPE EXIT; do
|
||||
trap cleanup "$sig"
|
||||
done
|
||||
|
||||
echo
|
||||
echo "Starting script..."
|
||||
echo
|
||||
|
||||
git remote remove workspace
|
||||
git remote add workspace "https://git.eaglercraft.rip/eaglercraft/eaglercraft-1.8-workspace.git"
|
||||
git fetch workspace
|
||||
|
||||
echo
|
||||
echo
|
||||
echo "Here are the last 5 commits and their commit hashes:"
|
||||
git --no-pager log -n 5 --oneline workspace/master
|
||||
echo
|
||||
echo "What is the commit hash of the client's current update?"
|
||||
echo "(e.g. the client is currently on u40 and the latest is u42, type the commit hash of u40)"
|
||||
read -rp "> " CURRENT_HASH
|
||||
echo
|
||||
echo
|
||||
if ! git rev-parse "$CURRENT_HASH" &> /dev/null; then
|
||||
echo "Invalid hash: $CURRENT_HASH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CURRENT_BRANCH="$(git branch --show-current)"
|
||||
git stash -u
|
||||
echo
|
||||
echo
|
||||
echo "All current working changes have been stashed."
|
||||
echo "You can apply them by running \`git stash apply\`."
|
||||
echo
|
||||
echo
|
||||
git checkout -f "$CURRENT_BRANCH"
|
||||
git reset --hard "$CURRENT_BRANCH"
|
||||
echo
|
||||
echo
|
||||
echo "Run Clean Up in Eclipse using the imported profile"
|
||||
echo "Press enter to continue..."
|
||||
read -r
|
||||
echo
|
||||
echo
|
||||
git add -A
|
||||
FORMAT_COMMIT="0"
|
||||
if git commit -m 'format'; then
|
||||
FORMAT_COMMIT="1"
|
||||
fi
|
||||
|
||||
git checkout -f workspace/master
|
||||
git reset --hard workspace/master
|
||||
cp -r . "$TMP_DIR"
|
||||
rm -rf "$TMP_DIR"/.git
|
||||
|
||||
git branch -D update-branch || :
|
||||
git checkout -b update-branch "$CURRENT_HASH"
|
||||
git reset --hard "$CURRENT_HASH"
|
||||
echo
|
||||
echo
|
||||
echo "Run Clean Up in Eclipse using the imported profile"
|
||||
echo "Press enter to continue..."
|
||||
read -r
|
||||
echo
|
||||
echo
|
||||
find . -type f -print0 | xargs -0 dos2unix || :
|
||||
find . -type f -print0 | xargs -0 chmod -x || :
|
||||
chmod +x ./gradlew ./*.sh
|
||||
git add -A
|
||||
git commit --amend -m "$(git log -n 1 --format='%s' "$CURRENT_HASH")" -m "$(git log -n 1 --format='%b' "$CURRENT_HASH")"
|
||||
|
||||
cp -r "$TMP_DIR"/ ./
|
||||
rm -rf "$TMP_DIR"
|
||||
echo
|
||||
echo
|
||||
echo "Run Clean Up in Eclipse using the imported profile"
|
||||
echo "Press enter to continue..."
|
||||
read -r
|
||||
echo
|
||||
echo
|
||||
find . -type f -print0 | xargs -0 dos2unix || :
|
||||
find . -type f -print0 | xargs -0 chmod -x || :
|
||||
chmod +x ./gradlew ./*.sh
|
||||
git add -A
|
||||
git commit -m "$(git log -n 1 --format='%s' workspace/master)" -m "$(git log -n 1 --format='%b' workspace/master)"
|
||||
|
||||
git checkout -f "$CURRENT_BRANCH"
|
||||
git reset --hard "$CURRENT_BRANCH"
|
||||
if ! git cherry-pick -n "$(git log -n 1 --format="%H" update-branch)"; then
|
||||
echo
|
||||
echo
|
||||
echo "Fix all merge conflicts before continuing."
|
||||
echo "Press enter to continue..."
|
||||
read -r
|
||||
echo
|
||||
echo
|
||||
fi
|
||||
|
||||
git add -A
|
||||
echo
|
||||
echo
|
||||
while [[ -z "${COMMIT_NAME:-}" ]]; do
|
||||
echo "Please enter a commit name."
|
||||
read -rp "> " COMMIT_NAME
|
||||
done
|
||||
echo
|
||||
echo
|
||||
if [[ "$FORMAT_COMMIT" == "1" ]]; then
|
||||
git commit --amend -m "$COMMIT_NAME"
|
||||
else
|
||||
git commit -m "$COMMIT_NAME"
|
||||
fi
|
||||
|
||||
git branch -D update-branch
|
||||
|
||||
echo
|
||||
echo
|
||||
echo "Done!"
|
||||
SCRIPT_DONE="1"
|
||||
exit
|
33
build.gradle
33
build.gradle
@ -25,7 +25,17 @@ sourceSets {
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
desktop {
|
||||
java {
|
||||
srcDirs(
|
||||
"src/main/java",
|
||||
"src/game/java",
|
||||
"src/protocol-game/java",
|
||||
"src/protocol-relay/java",
|
||||
"src/lwjgl/java"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
@ -36,16 +46,19 @@ dependencies {
|
||||
teavm(teavm.libs.jso)
|
||||
teavm(teavm.libs.jsoApis)
|
||||
compileOnly "org.teavm:teavm-core:0.9.2" // workaround for a few hacks
|
||||
|
||||
desktopImplementation fileTree("desktopRuntime/eclipseProject/deps_fix")
|
||||
}
|
||||
|
||||
def folder = "javascript"
|
||||
def name = "classes.js"
|
||||
|
||||
teavm.js {
|
||||
compileJava.options.encoding = "UTF-8"
|
||||
obfuscated = true
|
||||
sourceMap = true
|
||||
targetFileName = "../" + name
|
||||
optimization = OptimizationLevel.AGGRESSIVE
|
||||
optimization = OptimizationLevel.AGGRESSIVE // Change to "AGGRESSIVE" for release
|
||||
outOfProcess = false
|
||||
fastGlobalAnalysis = false
|
||||
processMemory = 512
|
||||
@ -71,3 +84,19 @@ tasks.named("generateJavaScript") {
|
||||
phile.write(dest, "UTF-8")
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('runclient', JavaExec) {
|
||||
classpath = sourceSets.desktop.compileClasspath
|
||||
group = "EaglercraftX"
|
||||
description = "Runs the client"
|
||||
classpath sourceSets.desktop.runtimeClasspath
|
||||
jvmArgs '-Djava.library.path=.'
|
||||
if (System.getProperty("os.name").toLowerCase().contains("mac")) {
|
||||
jvmArgs '-Djava.library.path=. -XstartOnFirstThread'
|
||||
}
|
||||
|
||||
args = ["hide-renderdoc"]
|
||||
|
||||
workingDir "./desktopRuntime"
|
||||
main 'net.lax1dude.eaglercraft.v1_8.internal.lwjgl.MainClass'
|
||||
}
|
@ -1 +1,5 @@
|
||||
0.4.1
|
||||
<<<<<<< Updated upstream
|
||||
0.4.2
|
||||
=======
|
||||
0.4.2
|
||||
>>>>>>> Stashed changes
|
||||
|
@ -83,6 +83,7 @@ uniform sampler2D u_metalsLUT;
|
||||
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
|
||||
#define LIB_INCLUDE_PBR_LIGHTING_PREFETCH
|
||||
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
uniform sampler2D u_irradianceMap;
|
||||
|
||||
@ -139,14 +140,14 @@ void main() {
|
||||
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
|
||||
float shadowSample = 1.0;
|
||||
vec4 shadowWorldPos4f = worldPosition4f;
|
||||
shadowWorldPos4f.xyz += normalVector3f * 0.05;
|
||||
shadowWorldPos4f.xyz += normalVector3f * 0.1;
|
||||
|
||||
vec4 shadowTexPos4f;
|
||||
vec2 tmpVec2;
|
||||
for(;;) {
|
||||
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
|
||||
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z + 0.0001), 0.0);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -175,7 +176,7 @@ void main() {
|
||||
#ifdef DO_COMPILE_SUN_SHADOWS
|
||||
lightColor3f *= shadowSample * skyLight;
|
||||
#endif
|
||||
vec3 normalWrap3f = normalVector3f * (dot(-worldDirection4f.xyz, normalVector3f) < 0.0 ? -1.0 : 1.0);
|
||||
vec3 normalWrap3f = normalVector3f * COMPARE_LT_C_C(dot(-worldDirection4f.xyz, normalVector3f), 0.0, -1.0, 1.0);
|
||||
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalWrap3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
|
||||
}
|
||||
|
||||
@ -194,8 +195,8 @@ void main() {
|
||||
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
|
||||
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
|
||||
}else {
|
||||
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
|
||||
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
|
||||
irradianceMapSamplePos2f.xz *= vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, -0.25));
|
||||
irradianceMapSamplePos2f.xz += vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, 0.75));
|
||||
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
|
||||
}
|
||||
skyLight *= lightmapCoords2f.g * u_sunColor3f_sky1f.w;
|
||||
@ -210,7 +211,7 @@ void main() {
|
||||
for(int i = 0; i < safeLightCount; ++i) {
|
||||
dlightDist3f = worldPosition4f.xyz - u_dynamicLightArray[i].u_lightPosition4f.xyz;
|
||||
dlightDir3f = normalize(dlightDist3f);
|
||||
dlightDir3f = dlightDir3f * (dot(dlightDir3f, normalVector3f) < 0.0 ? 1.0 : -1.0);
|
||||
dlightDir3f = dlightDir3f * COMPARE_LT_C_C(dot(dlightDir3f, normalVector3f), 0.0, 1.0, -1.0);
|
||||
dlightDir3f = materialData3f.b == 1.0 ? normalVector3f : -dlightDir3f;
|
||||
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
|
||||
continue;
|
||||
|
@ -40,5 +40,6 @@ void main() {
|
||||
}
|
||||
gbufferColor4f = vec4(diffuseRGBA.rgb, v_lightmap2f.r);
|
||||
gbufferNormal4f = vec4(0.5, 0.5, 1.0, v_lightmap2f.g);
|
||||
gbufferMaterial4f = vec4(texture(u_samplerNormalMaterial, vec2(v_texCoord2f.x, v_texCoord2f.y * u_textureYScale2f.x + u_textureYScale2f.y)).rgb, 1.0);
|
||||
gbufferMaterial4f = texture(u_samplerNormalMaterial, vec2(v_texCoord2f.x, v_texCoord2f.y * u_textureYScale2f.x + u_textureYScale2f.y));
|
||||
gbufferMaterial4f.a = 0.502 - gbufferMaterial4f.a * 0.502;
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -60,6 +60,7 @@ uniform float u_skyLightFactor1f;
|
||||
#endif
|
||||
|
||||
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_env_map.glsl"
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
void main() {
|
||||
vec3 diffuseColor3f;
|
||||
@ -86,7 +87,7 @@ void main() {
|
||||
|
||||
#ifdef COMPILE_GLOBAL_AMBIENT_OCCLUSION
|
||||
vec4 ao = textureLod(u_ssaoTexture, min(v_position2f * u_halfResolutionPixelAlignment2f, 1.0), 0.0);
|
||||
ao.g = ao.b > 0.0 ? ao.g : 1.0;
|
||||
ao.g = mix(COMPARE_GT_0_1(0.0, ao.b), 1.0, ao.g);
|
||||
shadow = mix(shadow, shadow * ao.g, 0.9);
|
||||
#endif
|
||||
|
||||
@ -102,8 +103,8 @@ void main() {
|
||||
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
|
||||
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
|
||||
}else {
|
||||
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
|
||||
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
|
||||
irradianceMapSamplePos2f.xz *= vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, -0.25));
|
||||
irradianceMapSamplePos2f.xz += vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, 0.75));
|
||||
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
|
||||
}
|
||||
|
||||
@ -114,8 +115,8 @@ void main() {
|
||||
vec3 specular = vec3(0.0);
|
||||
|
||||
#ifdef COMPILE_ENV_MAP_REFLECTIONS
|
||||
float f = materialData4f.g < 0.06 ? 1.0 : 0.0;
|
||||
f += materialData4f.r < 0.5 ? 1.0 : 0.0;
|
||||
float f = COMPARE_LT_0_ANY(materialData4f.g, 0.06);
|
||||
f += COMPARE_LT_0_ANY(materialData4f.r, 0.5);
|
||||
while((materialData4f.a >= 0.5 ? f : -1.0) == 0.0) {
|
||||
vec4 worldPosition4f = vec4(v_position2f, depth, 1.0) * 2.0 - 1.0;
|
||||
worldPosition4f = u_inverseProjMatrix4f * worldPosition4f;
|
||||
@ -137,8 +138,8 @@ void main() {
|
||||
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
|
||||
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
|
||||
}else {
|
||||
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
|
||||
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
|
||||
reflectDir.xz = reflectDir.xz * vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, -0.25));
|
||||
reflectDir.xz += vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, 0.75));
|
||||
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
|
||||
}
|
||||
envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
|
||||
@ -152,8 +153,8 @@ void main() {
|
||||
|
||||
#ifdef COMPILE_SCREEN_SPACE_REFLECTIONS
|
||||
#ifndef COMPILE_ENV_MAP_REFLECTIONS
|
||||
float f = materialData4f.g < 0.06 ? 1.0 : 0.0;
|
||||
f += materialData4f.r < 0.5 ? 1.0 : 0.0;
|
||||
float f = COMPARE_LT_0_ANY(materialData4f.g, 0.06);
|
||||
f += COMPARE_LT_0_ANY(materialData4f.r, 0.5);
|
||||
if(f == 0.0) {
|
||||
#else
|
||||
if((materialData4f.a < 0.5 ? f : -1.0) == 0.0) {
|
||||
|
@ -73,8 +73,12 @@ in vec3 v_viewdir3f;
|
||||
uniform vec2 u_textureCoords01;
|
||||
#endif
|
||||
#else
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
uniform vec4 u_materialConstants4f;
|
||||
#else
|
||||
uniform vec3 u_materialConstants3f;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
|
||||
mat3 cotangent_frame(in vec3 N, in vec3 p, in vec2 uv) {
|
||||
@ -155,14 +159,21 @@ void main() {
|
||||
normal = cf * vec3(normal2, sqrt(1.0 - dot(normal2, normal2)));
|
||||
}
|
||||
uv2.y += 0.5;
|
||||
vec3 material = texture(u_samplerNormalMaterial, uv2).rgb;
|
||||
vec4 material = texture(u_samplerNormalMaterial, uv2);
|
||||
#else
|
||||
vec3 material = u_materialConstants3f;
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
vec4 material = u_materialConstants4f;
|
||||
#else
|
||||
vec4 material = vec4(u_materialConstants3f, 1.0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
material.a = 1.0 - material.a + u_useEnvMap1f;
|
||||
material.a *= 0.502;
|
||||
|
||||
gbufferColor4f.rgb = color.rgb;
|
||||
gbufferColor4f.a = lightmap.r;
|
||||
gbufferNormal4f.rgb = normal * 0.5 + 0.5;
|
||||
gbufferNormal4f.a = lightmap.g;
|
||||
gbufferMaterial4f = vec4(material.rgb, u_useEnvMap1f);
|
||||
gbufferMaterial4f = material;
|
||||
}
|
||||
|
@ -24,7 +24,6 @@ layout(location = 0) out vec4 output4f;
|
||||
|
||||
in vec2 v_position2f;
|
||||
|
||||
uniform sampler2D u_gbufferDepthTexture;
|
||||
uniform sampler2D u_gbufferNormalTexture;
|
||||
uniform sampler2D u_fogDepthTexture;
|
||||
|
||||
@ -34,6 +33,7 @@ uniform sampler2D u_lightShaftsTexture;
|
||||
|
||||
#ifdef COMPILE_FOG_ATMOSPHERE
|
||||
uniform sampler2D u_environmentMap;
|
||||
uniform sampler2D u_skyTexture;
|
||||
uniform vec3 u_sunColorAdd3f;
|
||||
#endif
|
||||
|
||||
@ -57,11 +57,6 @@ void main() {
|
||||
}
|
||||
#endif
|
||||
|
||||
float solidDepth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
|
||||
if(solidDepth != fragPos4f.z) {
|
||||
discard;
|
||||
}
|
||||
|
||||
fragPos4f.xyz *= 2.0;
|
||||
fragPos4f.xyz -= 1.0;
|
||||
|
||||
@ -85,18 +80,26 @@ void main() {
|
||||
fragPos4f.xz *= 0.75;
|
||||
|
||||
vec3 envMapSample3f;
|
||||
vec3 skyboxSample3f;
|
||||
|
||||
fragPos4f.xz *= vec2(-0.5, -0.25);
|
||||
fragPos4f.xz += vec2(0.5, 0.25);
|
||||
envMapSample3f = textureLod(u_environmentMap, fragPos4f.xz, 0.0).rgb + u_sunColorAdd3f;
|
||||
|
||||
skyboxSample3f = textureLod(u_skyTexture, v_position2f, 0.0).rgb;
|
||||
|
||||
#ifdef COMPILE_FOG_LIGHT_SHAFTS
|
||||
f2 = textureLod(u_lightShaftsTexture, v_position2f, 0.0).r;
|
||||
envMapSample3f *= pow(f2, 2.25);
|
||||
f = (f * 0.85 + 0.2) * f2 + f * (1.0 - f2);
|
||||
f2 = textureLod(u_lightShaftsTexture, v_position2f, 0.0).r * 0.95 + 0.05;
|
||||
envMapSample3f *= (f2 * 0.8 + 0.2);
|
||||
skyboxSample3f *= f2 * f2 * f2;
|
||||
f = min(f + 0.15, 1.0);
|
||||
f2 = 0.5 + f * 0.5;
|
||||
#else
|
||||
f = max(f * 1.0375 - 0.0375, 0.0);
|
||||
f2 = 0.3 + f * 0.7;
|
||||
#endif
|
||||
|
||||
output4f = vec4(envMapSample3f * fogColor4f.rgb, f);
|
||||
output4f = vec4(mix(envMapSample3f, skyboxSample3f, f2) * fogColor4f.rgb, f);
|
||||
#else
|
||||
output4f = vec4(fogColor4f.rgb, f);
|
||||
#endif
|
||||
|
@ -129,8 +129,12 @@ layout(std140) uniform u_worldLightingData {
|
||||
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
|
||||
uniform sampler2D u_samplerNormalMaterial;
|
||||
#else
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
uniform vec4 u_materialConstants4f;
|
||||
#else
|
||||
uniform vec3 u_materialConstants3f;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
uniform sampler2D u_metalsLUT;
|
||||
|
||||
@ -158,6 +162,7 @@ uniform sampler2D u_lightShaftsTexture;
|
||||
#endif
|
||||
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/pbr_env_map.glsl"
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
#ifdef DO_COMPILE_SUN_SHADOWS
|
||||
uniform sampler2DShadow u_sunShadowDepthTexture;
|
||||
@ -167,14 +172,14 @@ vec2(-0.077, 0.995), vec2(0.998, 0.015),
|
||||
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
|
||||
vec2(-0.697, -0.511), vec2(0.740, -0.612),
|
||||
vec2(0.675, 0.682));
|
||||
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
|
||||
#define SMOOTH_SHADOW_RADIUS 0.00075
|
||||
#define SMOOTH_SHADOW_SAMPLES (1.0 / 8.0)
|
||||
#define SMOOTH_SHADOW_RADIUS 0.000488
|
||||
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
|
||||
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
|
||||
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
|
||||
tmpVec2.y += lod;\
|
||||
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
|
||||
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
|
||||
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z + 0.0001), 0.0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -184,7 +189,7 @@ void main() {
|
||||
vec4 diffuseColor4f;
|
||||
vec3 normalVector3f;
|
||||
vec2 lightmapCoords2f;
|
||||
vec3 materialData3f;
|
||||
vec4 materialData4f;
|
||||
float block1f;
|
||||
|
||||
// =========== RESOLVE CONSTANTS ============ //
|
||||
@ -270,13 +275,17 @@ void main() {
|
||||
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
|
||||
vec2 uv2 = vec2(1.0, 0.5) * texCoords2f;
|
||||
uv2.y += 0.5;
|
||||
materialData3f = texture(u_samplerNormalMaterial, uv2).rgb;
|
||||
materialData4f = texture(u_samplerNormalMaterial, uv2);
|
||||
#else
|
||||
materialData3f = u_materialConstants3f;
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
materialData4f = u_materialConstants4f;
|
||||
#else
|
||||
materialData4f = vec4(u_materialConstants3f, 1.0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
vec3 metalN, metalK;
|
||||
PREFETCH_METALS(diffuseColor4f.rgb, materialData3f.g, metalN, metalK)
|
||||
PREFETCH_METALS(diffuseColor4f.rgb, materialData4f.g, metalN, metalK)
|
||||
|
||||
// ============ SUN LIGHTING ============== //
|
||||
|
||||
@ -292,7 +301,7 @@ void main() {
|
||||
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
|
||||
float shadowSample = 1.0;
|
||||
vec4 shadowWorldPos4f = worldPosition4f;
|
||||
shadowWorldPos4f.xyz += normalVector3f * 0.05;
|
||||
shadowWorldPos4f.xyz += normalVector3f * 0.1;
|
||||
|
||||
vec4 shadowTexPos4f;
|
||||
vec2 tmpVec2;
|
||||
@ -301,7 +310,6 @@ void main() {
|
||||
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
|
||||
#ifdef COMPILE_SUN_SHADOW_SMOOTH
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
@ -309,7 +317,7 @@ void main() {
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@ -339,16 +347,16 @@ void main() {
|
||||
#ifdef DO_COMPILE_SUN_SHADOWS
|
||||
lightColor3f *= shadowSample * skyLight;
|
||||
#endif
|
||||
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
|
||||
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f, materialData4f.rgb, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
|
||||
}
|
||||
|
||||
float f;
|
||||
#ifdef COMPILE_PARABOLOID_ENV_MAP
|
||||
#if defined(COMPILE_PARABOLOID_ENV_MAP) && !defined(COMPILE_ENABLE_TEX_GEN)
|
||||
|
||||
// =========== ENVIRONMENT MAP =========== //
|
||||
|
||||
f = materialData3f.g < 0.06 ? 1.0 : 0.0;
|
||||
f += materialData3f.r < 0.5 ? 1.0 : 0.0;
|
||||
f = COMPARE_LT_0_ANY(materialData4f.g, 0.06);
|
||||
f += COMPARE_LT_0_ANY(materialData4f.r, 0.5);
|
||||
while(f == 0.0) {
|
||||
float dst2 = dot(worldPosition4f.xyz, worldPosition4f.xyz);
|
||||
if(dst2 > 25.0) {
|
||||
@ -365,13 +373,13 @@ void main() {
|
||||
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
|
||||
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
|
||||
}else {
|
||||
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
|
||||
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
|
||||
reflectDir.xz = reflectDir.xz * vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, -0.25));
|
||||
reflectDir.xz += vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, 0.75));
|
||||
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
|
||||
}
|
||||
envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
|
||||
if(envMapSample4f.a == 1.0) {
|
||||
lightColor3f += eaglercraftIBL_Specular(diffuseColor4f.rgb, envMapSample4f.rgb * envMapSample4f.a, worldDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * (1.0 - sqrt(dst2) * 0.2);
|
||||
lightColor3f += eaglercraftIBL_Specular(diffuseColor4f.rgb, envMapSample4f.rgb * envMapSample4f.a, worldDirection4f.xyz, normalVector3f, materialData4f.rgb, metalN, metalK) * (1.0 - sqrt(dst2) * 0.2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -393,8 +401,8 @@ void main() {
|
||||
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
|
||||
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
|
||||
}else {
|
||||
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
|
||||
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
|
||||
irradianceMapSamplePos2f.xz *= vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, -0.25));
|
||||
irradianceMapSamplePos2f.xz += vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, 0.75));
|
||||
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
|
||||
}
|
||||
skyLight *= lightmapCoords2f.g * u_sunColor3f_sky1f.w;
|
||||
@ -409,7 +417,7 @@ void main() {
|
||||
for(int i = 0; i < safeLightCount; ++i) {
|
||||
dlightDist3f = worldPosition4f.xyz - u_dynamicLightArray[i].u_lightPosition4f.xyz;
|
||||
dlightDir3f = normalize(dlightDist3f);
|
||||
dlightDir3f = materialData3f.b == 1.0 ? normalVector3f : -dlightDir3f;
|
||||
dlightDir3f = materialData4f.b == 1.0 ? normalVector3f : -dlightDir3f;
|
||||
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
|
||||
continue;
|
||||
}
|
||||
@ -419,7 +427,7 @@ void main() {
|
||||
continue;
|
||||
}
|
||||
dlightColor3f *= ((cm - 0.025) / cm);
|
||||
lightColor3f += eaglercraftLighting(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.w;
|
||||
lightColor3f += eaglercraftLighting(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f, materialData4f.rgb, metalN, metalK) * u_blockSkySunDynamicLightFac4f.w;
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -429,7 +437,7 @@ void main() {
|
||||
vec4 fogBlend4f = vec4(0.0);
|
||||
#ifndef COMPILE_ENABLE_TEX_GEN
|
||||
while(u_fogParameters4f.x > 0.0) {
|
||||
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
|
||||
float atmos = COMPARE_LT_C_C(u_fogParameters4f.x, 4.0, 0.0, 4.0);
|
||||
float type = u_fogParameters4f.x - atmos;
|
||||
fogBlend4f = mix(u_fogColorLight4f, u_fogColorDark4f, lightmapCoords2f.g);
|
||||
|
||||
@ -454,8 +462,10 @@ void main() {
|
||||
fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb;
|
||||
|
||||
#ifdef COMPILE_FOG_LIGHT_SHAFTS
|
||||
fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
|
||||
fogBlend4f.a = fogBlend4f.a * 0.85 + 0.2;
|
||||
fogBlend4f.rgb *= textureLod(u_lightShaftsTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r * 0.76 + 0.24;
|
||||
fogBlend4f.a = min(fogBlend4f.a * 0.8 + 0.35, 1.0);
|
||||
#else
|
||||
fogBlend4f.a = max(fogBlend4f.a * 0.83 + 0.17, 0.0);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@ -465,7 +475,7 @@ void main() {
|
||||
|
||||
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
|
||||
skyLight *= u_blockSkySunDynamicLightFac4f.y;
|
||||
float emissive = materialData3f.b == 1.0 ? 0.0 : materialData3f.b;
|
||||
float emissive = materialData4f.b == 1.0 ? 0.0 : materialData4f.b;
|
||||
diffuseColor4f.rgb *= max(skyLight + blockLight, vec3(emissive * emissive * 20.0 + 0.075)) * 0.075;
|
||||
diffuseColor4f.rgb += lightColor3f;
|
||||
|
||||
|
@ -85,6 +85,8 @@ layout(std140) uniform u_worldLightingData {
|
||||
uniform sampler2D u_environmentMap;
|
||||
uniform sampler2D u_brdfLUT;
|
||||
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
#define GLASS_ROUGHNESS 0.15
|
||||
#define GLASS_F0 0.4
|
||||
|
||||
@ -126,14 +128,14 @@ vec2(-0.077, 0.995), vec2(0.998, 0.015),
|
||||
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
|
||||
vec2(-0.697, -0.511), vec2(0.740, -0.612),
|
||||
vec2(0.675, 0.682));
|
||||
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
|
||||
#define SMOOTH_SHADOW_RADIUS 0.00075
|
||||
#define SMOOTH_SHADOW_SAMPLES (1.0 / 8.0)
|
||||
#define SMOOTH_SHADOW_RADIUS 0.000488
|
||||
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
|
||||
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
|
||||
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
|
||||
tmpVec2.y += lod;\
|
||||
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
|
||||
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
|
||||
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z + 0.0001), 0.0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -184,16 +186,15 @@ void main() {
|
||||
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
|
||||
float shadowSample = 1.0;
|
||||
vec4 shadowWorldPos4f = worldPosition4f;
|
||||
shadowWorldPos4f.xyz += normalVector3f * 0.05;
|
||||
shadowWorldPos4f.xyz += normalVector3f * 0.1;
|
||||
|
||||
vec4 shadowTexPos4f;
|
||||
vec2 tmpVec2;
|
||||
for(;;) {
|
||||
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
|
||||
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z + 0.0001), 0.0);
|
||||
#ifdef COMPILE_SUN_SHADOW_SMOOTH
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
@ -201,7 +202,7 @@ void main() {
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@ -252,8 +253,8 @@ void main() {
|
||||
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
|
||||
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
|
||||
}else {
|
||||
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
|
||||
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
|
||||
reflectDir.xz = reflectDir.xz * vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, -0.25));
|
||||
reflectDir.xz += vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0 , 0.25, 0.75));
|
||||
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
|
||||
}
|
||||
envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
|
||||
@ -291,7 +292,7 @@ void main() {
|
||||
|
||||
float fogFade = 0.0;
|
||||
if(u_fogParameters4f.x > 0.0) {
|
||||
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
|
||||
float atmos = COMPARE_LT_C_C(u_fogParameters4f.x, 4.0, 0.0, 4.0);
|
||||
float type = u_fogParameters4f.x - atmos;
|
||||
fogFade = mix(u_fogColorDark4f.a, u_fogColorLight4f.a, lightmapCoords2f.g);
|
||||
|
||||
|
@ -53,7 +53,7 @@ void main() {
|
||||
#endif
|
||||
#ifdef DEBUG_VIEW_3
|
||||
vec4 color4f = textureLod(u_texture0, v_position2f, 0.0);
|
||||
output4f = vec4(color4f.b > 0.99 ? 1.0 : 0.0, color4f.a, 0.0, 1.0);
|
||||
output4f = vec4((color4f.a - (color4f.a > 0.5 ? 0.5 : 0.0)) * 2.0, color4f.a > 0.5 ? 1.0 : 0.0, color4f.b > 0.99 ? 1.0 : 0.0, 1.0);
|
||||
#endif
|
||||
#ifdef DEBUG_VIEW_4
|
||||
output4f = vec4(vec3(clamp((textureLod(u_texture0, v_position2f, 0.0).r - u_depthSliceStartEnd2f.x) * u_depthSliceStartEnd2f.y, 0.0, 1.0)), 1.0);
|
||||
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2025 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
// Assuming modern GPUs probably implement clamp, max, and ciel without branches
|
||||
|
||||
// value1 > value2 ? 1.0 : 0.0
|
||||
#define COMPARE_GT_0_1(value1, value2) clamp(ceil(value1 - value2), 0.0, 1.0)
|
||||
|
||||
// value1 > value2 ? N : 0.0
|
||||
#define COMPARE_GT_0_ANY(value1, value2) max(ceil(value1 - value2), 0.0)
|
||||
|
||||
// value1 < value2 ? 1.0 : 0.0
|
||||
#define COMPARE_LT_0_1(value1, value2) clamp(ceil(value2 - value1), 0.0, 1.0)
|
||||
|
||||
// value1 < value2 ? N : 0.0
|
||||
#define COMPARE_LT_0_ANY(value1, value2) max(ceil(value2 - value1), 0.0)
|
||||
|
||||
// value1 > value2 ? ifGT : ifLT
|
||||
#define COMPARE_GT_C_C(value1, value2, ifGT, ifLT) (COMPARE_GT_0_1(value1, value2) * (ifGT - ifLT) + ifLT)
|
||||
|
||||
// value1 < value2 ? ifLT : ifGT
|
||||
#define COMPARE_LT_C_C(value1, value2, ifLT, ifGT) (COMPARE_LT_0_1(value1, value2) * (ifLT - ifGT) + ifGT)
|
@ -37,6 +37,9 @@ uniform mat4 u_inverseProjectionMatrix4f;
|
||||
#ifdef COMPILE_SUN_SHADOW
|
||||
uniform sampler2D u_sunShadowTexture;
|
||||
#endif
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
uniform sampler2D u_subsurfaceScatteringTexture;
|
||||
#endif
|
||||
|
||||
uniform vec3 u_sunDirection3f;
|
||||
uniform vec3 u_sunColor3f;
|
||||
@ -49,30 +52,64 @@ void main() {
|
||||
vec3 normalVector3f;
|
||||
vec2 lightmapCoords2f;
|
||||
vec3 materialData3f;
|
||||
vec4 sampleVar4f;
|
||||
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
|
||||
if(depth == 0.0) {
|
||||
discard;
|
||||
}
|
||||
sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
|
||||
diffuseColor3f.rgb = sampleVar4f.rgb;
|
||||
diffuseColor3f *= diffuseColor3f;
|
||||
lightmapCoords2f.x = sampleVar4f.a;
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
float subsurfValue = textureLod(u_subsurfaceScatteringTexture, v_position2f, 0.0).r;
|
||||
subsurfValue *= subsurfValue;
|
||||
output4f = vec4(subsurfValue * u_sunColor3f * diffuseColor3f * 0.125, 0.0);
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_SUN_SHADOW
|
||||
#ifdef COMPILE_COLORED_SHADOW
|
||||
vec4 shadow = textureLod(u_sunShadowTexture, v_position2f, 0.0);
|
||||
if(shadow.a < 0.05) {
|
||||
#ifndef COMPILE_SUBSURFACE_SCATTERING
|
||||
discard;
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
vec3 shadow = vec3(textureLod(u_sunShadowTexture, v_position2f, 0.0).r);
|
||||
#ifndef COMPILE_SUBSURFACE_SCATTERING
|
||||
if(shadow.r < 0.05) {
|
||||
#ifndef COMPILE_SUBSURFACE_SCATTERING
|
||||
discard;
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef COMPILE_SUBSURFACE_SCATTERING
|
||||
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
|
||||
#endif
|
||||
|
||||
#ifndef COMPILE_SUN_SHADOW
|
||||
if(depth == 0.0) {
|
||||
#ifndef COMPILE_SUBSURFACE_SCATTERING
|
||||
discard;
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
vec4 sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
|
||||
sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
|
||||
|
||||
#ifndef COMPILE_SUN_SHADOW
|
||||
vec3 shadow = vec3(sampleVar4f.a, 0.0, 0.0);
|
||||
@ -85,9 +122,12 @@ void main() {
|
||||
normalVector3f.xyz = sampleVar4f.rgb * 2.0 - 1.0;
|
||||
lightmapCoords2f.y = sampleVar4f.a;
|
||||
|
||||
#ifndef COMPILE_SUBSURFACE_SCATTERING
|
||||
sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
|
||||
diffuseColor3f.rgb = sampleVar4f.rgb;
|
||||
diffuseColor3f *= diffuseColor3f;
|
||||
lightmapCoords2f.x = sampleVar4f.a;
|
||||
#endif
|
||||
materialData3f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0).rgb;
|
||||
|
||||
vec3 worldSpaceNormal = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
|
||||
@ -97,6 +137,15 @@ void main() {
|
||||
worldSpacePosition = u_inverseProjectionMatrix4f * worldSpacePosition;
|
||||
worldSpacePosition = u_inverseViewMatrix4f * vec4(worldSpacePosition.xyz / worldSpacePosition.w, 0.0);
|
||||
|
||||
diffuseColor3f *= diffuseColor3f;
|
||||
output4f = vec4(eaglercraftLighting(diffuseColor3f, u_sunColor3f * shadow.rgb, normalize(-worldSpacePosition.xyz), u_sunDirection3f, worldSpaceNormal, materialData3f), 0.0);
|
||||
}
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
output4f.rgb +=
|
||||
#else
|
||||
output4f = vec4(
|
||||
#endif
|
||||
eaglercraftLighting(diffuseColor3f, u_sunColor3f * shadow.rgb, normalize(-worldSpacePosition.xyz), u_sunDirection3f, worldSpaceNormal, materialData3f)
|
||||
#ifdef COMPILE_SUBSURFACE_SCATTERING
|
||||
* (1.0 - subsurfValue * 0.0625);
|
||||
#else
|
||||
, 0.0);
|
||||
#endif
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2023 lax1dude. All Rights Reserved.
|
||||
* Copyright (c) 2023-2025 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
@ -31,21 +31,40 @@ uniform vec3 u_lightDir3f;
|
||||
uniform sampler2D u_moonTextures;
|
||||
uniform sampler2D u_cloudsTexture;
|
||||
|
||||
#define MOON_SURFACE 0.9
|
||||
#define MOON_MARGIN 0.0125
|
||||
|
||||
void main() {
|
||||
gl_FragDepth = 0.0;
|
||||
vec4 color4f = texture(u_moonTextures, v_position2f);
|
||||
if(color4f.a < 0.99) {
|
||||
discard;
|
||||
vec2 coord2f = v_position2f * 2.0 - 1.0;
|
||||
|
||||
vec2 texUV = (coord2f * (1.0 / (MOON_SURFACE + MOON_MARGIN))) * 0.5 + 0.5;
|
||||
vec4 color4f = vec4(0.0);
|
||||
if(texUV == clamp(texUV, vec2(0.0), vec2(1.0))) {
|
||||
color4f = texture(u_moonTextures, texUV);
|
||||
}
|
||||
|
||||
vec3 moonNormal3f;
|
||||
moonNormal3f.xy = color4f.rg * 2.0 - 1.0;
|
||||
moonNormal3f.z = sqrt(1.0 - dot(moonNormal3f.xy, moonNormal3f.xy));
|
||||
float NdotV = dot(moonNormal3f, u_lightDir3f);
|
||||
output4f = vec4(u_moonColor3f * (color4f.b * color4f.b * mix(max(NdotV, 0.0), max(NdotV + 0.45, 0.0) * 0.5f, max(u_lightDir3f.z * u_lightDir3f.z * -u_lightDir3f.z, 0.0))), 0.0);
|
||||
float NdotV = max(dot(moonNormal3f, u_lightDir3f), 0.0);
|
||||
vec3 viewDir = normalize(v_position3f);
|
||||
|
||||
vec2 surfaceCoord2f = coord2f * (1.0 / MOON_SURFACE);
|
||||
vec3 moonAtmosNormalInner3f = vec3(surfaceCoord2f, sqrt(1.0 - dot(surfaceCoord2f, surfaceCoord2f)));
|
||||
vec3 moonAtmosNormalOuter3f = vec3(surfaceCoord2f, sqrt(-1.0 + dot(surfaceCoord2f, surfaceCoord2f)));
|
||||
float NdotVInner = max(dot(moonAtmosNormalInner3f, u_lightDir3f), 0.0);
|
||||
float NdotVOuter = max(dot(moonAtmosNormalOuter3f, u_lightDir3f) + 0.65, 0.0);
|
||||
|
||||
float atmosInner = max((MOON_SURFACE * 0.2) / moonAtmosNormalInner3f.z - 0.2, 0.0);
|
||||
float atmosOuter = max((MOON_SURFACE * 0.2) / moonAtmosNormalOuter3f.z - 0.4, 0.0);
|
||||
|
||||
output4f = vec4(u_moonColor3f * (color4f.b * color4f.b * NdotV + (NdotVInner * atmosInner + NdotVOuter * atmosOuter * vec3(0.8, 0.825, 0.9)) * (0.5 - max(u_lightDir3f.z, 0.0) * 0.25)), 0.0);
|
||||
|
||||
if(viewDir.y < 0.01) {
|
||||
return;
|
||||
}
|
||||
|
||||
vec2 cloudSampleCoord2f = (viewDir.xz / (viewDir.y + 1.0)) * 0.975 * 0.5 + 0.5;
|
||||
vec4 cloudSample = textureLod(u_cloudsTexture, cloudSampleCoord2f, 0.0);
|
||||
output4f.rgb = mix(output4f.rgb, output4f.rgb * max(cloudSample.a * 1.25 - 0.25, 0.0), smoothstep(0.0, 1.0, min(viewDir.y * 8.0, 1.0)));
|
||||
|
@ -19,7 +19,6 @@
|
||||
precision highp sampler2DShadow;
|
||||
|
||||
in vec4 v_position4f;
|
||||
in vec3 v_positionClip3f;
|
||||
|
||||
#ifdef COMPILE_TEXTURE_ATTRIB
|
||||
in vec2 v_texture2f;
|
||||
@ -102,14 +101,14 @@ vec2(-0.077, 0.995), vec2(0.998, 0.015),
|
||||
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
|
||||
vec2(-0.697, -0.511), vec2(0.740, -0.612),
|
||||
vec2(0.675, 0.682));
|
||||
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
|
||||
#define SMOOTH_SHADOW_RADIUS 0.00075
|
||||
#define SMOOTH_SHADOW_SAMPLES (1.0 / 8.0)
|
||||
#define SMOOTH_SHADOW_RADIUS 0.000488
|
||||
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
|
||||
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
|
||||
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
|
||||
tmpVec2.y += lod;\
|
||||
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
|
||||
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
|
||||
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z + 0.0001), 0.0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -120,13 +119,11 @@ uniform sampler2D u_refractionMap;
|
||||
uniform sampler2D u_brdfLUT;
|
||||
uniform sampler2D u_normalMap;
|
||||
|
||||
#ifdef COMPILE_FOG_LIGHT_SHAFTS
|
||||
uniform sampler2D u_lightShaftsTexture;
|
||||
#endif
|
||||
|
||||
uniform vec4 u_waterWindOffset4f;
|
||||
uniform vec3 u_wavingBlockOffset3f;
|
||||
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
#define WATER_ROUGHNESS 0.05
|
||||
#define WATER_F0 0.5
|
||||
|
||||
@ -301,16 +298,15 @@ void main() {
|
||||
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
|
||||
float shadowSample = 1.0;
|
||||
vec4 shadowWorldPos4f = worldPosition4f;
|
||||
shadowWorldPos4f.xyz += normalVector3f * 0.05;
|
||||
shadowWorldPos4f.xyz += normalVector3f * 0.1;
|
||||
|
||||
vec4 shadowTexPos4f;
|
||||
vec2 tmpVec2;
|
||||
for(;;) {
|
||||
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
|
||||
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z + 0.0001), 0.0);
|
||||
#ifdef COMPILE_SUN_SHADOW_SMOOTH
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
@ -318,7 +314,7 @@ void main() {
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
|
||||
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@ -356,8 +352,8 @@ void main() {
|
||||
lightmapCoords2f *= lightmapCoords2f;
|
||||
|
||||
float e = 0.0;
|
||||
e += envMapSample4f.g <= 0.0 ? 0.0 : 1.0;
|
||||
e += lightmapCoords2f.y > 0.5 ? 0.0 : 1.0;
|
||||
e += COMPARE_GT_0_ANY(envMapSample4f.g, 0.0);
|
||||
e += COMPARE_LT_0_ANY(lightmapCoords2f.y, 0.5);
|
||||
//e += abs(normalVector3f.y) > 0.1 ? 0.0 : 1.0;
|
||||
if(e == 0.0) {
|
||||
vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
|
||||
@ -370,8 +366,8 @@ void main() {
|
||||
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
|
||||
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
|
||||
}else {
|
||||
reflectDir.xz *= vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
|
||||
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
|
||||
reflectDir.xz *= vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, -0.25));
|
||||
reflectDir.xz += vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, 0.75));
|
||||
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
|
||||
}
|
||||
envMapSample4f.rgb *= (lightmapCoords2f.y * 2.0 - 1.0);
|
||||
@ -405,47 +401,11 @@ void main() {
|
||||
|
||||
#endif
|
||||
|
||||
// ============ CACLULATE FOG ============= //
|
||||
|
||||
vec4 fogBlend4f = vec4(0.0);
|
||||
while(u_fogParameters4f.x > 0.0) {
|
||||
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
|
||||
float type = u_fogParameters4f.x - atmos;
|
||||
fogBlend4f = mix(u_fogColorLight4f, u_fogColorDark4f, lightmapCoords2f.g);
|
||||
|
||||
float f, l = length(v_position4f.xyz);
|
||||
if(type == 1.0) {
|
||||
f = (l - u_fogParameters4f.z) / (u_fogParameters4f.w - u_fogParameters4f.z);
|
||||
}else {
|
||||
f = 1.0 - exp(-u_fogParameters4f.y * l);
|
||||
}
|
||||
|
||||
fogBlend4f.a *= clamp(f, 0.0, 1.0);
|
||||
|
||||
if(atmos == 0.0) {
|
||||
break;
|
||||
}
|
||||
|
||||
vec3 atmosSamplePos = v_position4f.xyz / -l;
|
||||
atmosSamplePos.xz /= abs(atmosSamplePos.y) + 1.0;
|
||||
atmosSamplePos.xz *= vec2(-0.5, -0.25) * 0.75;
|
||||
atmosSamplePos.xz += vec2(0.5, 0.25);
|
||||
|
||||
fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb + u_fogColorAddSun4f.rgb;
|
||||
|
||||
#ifdef COMPILE_FOG_LIGHT_SHAFTS
|
||||
fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
|
||||
fogBlend4f.a = fogBlend4f.a * 0.85 + 0.2;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
// ============ OUTPUT COLOR ============== //
|
||||
|
||||
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
|
||||
vec3 skyLight = (lightmapCoords2f.g + 0.05) * vec3(0.9102, 0.9, 1.0) * u_blockSkySunDynamicLightFac4f.y;
|
||||
diffuseColor4f.rgb *= (skyLight + blockLight) * 0.075;
|
||||
diffuseColor4f.rgb += lightColor3f;
|
||||
diffuseColor4f.rgb = mix(diffuseColor4f.rgb + refractionSample.rgb, fogBlend4f.rgb, fogBlend4f.a);
|
||||
diffuseColor4f.rgb += lightColor3f + refractionSample.rgb;
|
||||
output4f = vec4(diffuseColor4f.rgb, 1.0);
|
||||
}
|
||||
|
@ -20,10 +20,6 @@ in vec3 a_position3f;
|
||||
|
||||
out vec4 v_position4f;
|
||||
|
||||
#ifdef COMPILE_FOG_LIGHT_SHAFTS
|
||||
out vec3 v_positionClip3f;
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_TEXTURE_ATTRIB
|
||||
in vec2 a_texture2f;
|
||||
out vec2 v_texture2f;
|
||||
@ -75,8 +71,4 @@ void main() {
|
||||
#endif
|
||||
|
||||
gl_Position = u_projectionMat4f * v_position4f;
|
||||
|
||||
#ifdef COMPILE_FOG_LIGHT_SHAFTS
|
||||
v_positionClip3f = gl_Position.xyw;
|
||||
#endif
|
||||
}
|
||||
|
@ -84,6 +84,8 @@ uniform vec4 u_nearFarPlane4f;
|
||||
|
||||
uniform vec4 u_pixelAlignment4f;
|
||||
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
#define reprojDepthLimit 0.25
|
||||
|
||||
#define GET_LINEAR_DEPTH_FROM_VALUE(depthSample) (u_nearFarPlane4f.z / (u_nearFarPlane4f.y + u_nearFarPlane4f.x + (depthSample * 2.0 - 1.0) * u_nearFarPlane4f.w))
|
||||
@ -135,9 +137,9 @@ void main() {
|
||||
|
||||
#ifdef COMPILE_REPROJECT_SSR
|
||||
vec4 materials = textureLod(u_gbufferMaterialTexture, v_position2f2, 0.0);
|
||||
float f = materials.g < 0.06 ? 1.0 : 0.0;
|
||||
f += materials.r < 0.5 ? 1.0 : 0.0;
|
||||
f += materials.a > 0.5 ? 1.0 : 0.0;
|
||||
float f = COMPARE_LT_0_ANY(materials.g, 0.06);
|
||||
f += COMPARE_LT_0_ANY(materials.r, 0.5);
|
||||
f += COMPARE_GT_0_ANY(materials.a, 0.5);
|
||||
if(f > 0.0) {
|
||||
return;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "§eHigh Performance PBR",
|
||||
"desc": "Pack made from scratch specifically for this client, designed to give what I call the best balance between quality and performance possible in a browser but obviously that's just my opinion",
|
||||
"vers": "1.3.1",
|
||||
"vers": "1.4.0",
|
||||
"author": "lax1dude",
|
||||
"api_vers": 1,
|
||||
"features": [
|
||||
@ -19,6 +19,7 @@
|
||||
"POST_LENS_DISTORION",
|
||||
"POST_LENS_FLARES",
|
||||
"POST_BLOOM",
|
||||
"POST_FXAA"
|
||||
"POST_FXAA",
|
||||
"SUBSURFACE_SCATTERING"
|
||||
]
|
||||
}
|
||||
|
@ -60,14 +60,14 @@ vec2(-0.077, 0.995), vec2(0.998, 0.015),
|
||||
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
|
||||
vec2(-0.697, -0.511), vec2(0.740, -0.612),
|
||||
vec2(0.675, 0.682));
|
||||
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
|
||||
#define SMOOTH_SHADOW_RADIUS 0.00075
|
||||
#define SMOOTH_SHADOW_SAMPLES (1.0 / 8.0)
|
||||
#define SMOOTH_SHADOW_RADIUS 0.000488
|
||||
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
|
||||
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
|
||||
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
|
||||
tmpVec2.y += lod;\
|
||||
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
|
||||
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
|
||||
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z + 0.0001), 0.0);
|
||||
#endif
|
||||
|
||||
uniform vec3 u_sunDirection3f;
|
||||
@ -97,7 +97,7 @@ void main() {
|
||||
worldSpacePosition.xyz -= 1.0;
|
||||
worldSpacePosition = u_inverseViewProjMatrix4f * worldSpacePosition;
|
||||
worldSpacePosition.xyz /= worldSpacePosition.w;
|
||||
worldSpacePosition.xyz += worldSpaceNormal * 0.05;
|
||||
worldSpacePosition.xyz += worldSpaceNormal * 0.1;
|
||||
worldSpacePosition.w = 1.0;
|
||||
float skyLight = max(normalVector4f.a * 2.0 - 1.0, 0.0);
|
||||
float shadowSample;
|
||||
@ -106,9 +106,8 @@ void main() {
|
||||
for(;;) {
|
||||
shadowSpacePosition = u_sunShadowMatrixLOD04f * worldSpacePosition;
|
||||
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowSpacePosition.z), 0.0);
|
||||
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowSpacePosition.z + 0.0001), 0.0);
|
||||
#ifdef COMPILE_SUN_SHADOW_SMOOTH
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
@ -116,7 +115,7 @@ void main() {
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
#endif
|
||||
#ifdef COMPILE_COLORED_SHADOW
|
||||
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
|
||||
|
@ -23,6 +23,10 @@ precision highp sampler2D;
|
||||
in vec3 v_position3f;
|
||||
in vec3 v_color3f;
|
||||
|
||||
#ifndef COMPILE_PARABOLOID_SKY
|
||||
in vec3 v_positionClip3f;
|
||||
#endif
|
||||
|
||||
layout(location = 0) out vec4 output4f;
|
||||
|
||||
uniform vec3 u_sunDirection3f;
|
||||
@ -33,10 +37,15 @@ uniform vec4 u_lightningColor4f;
|
||||
uniform sampler2D u_cloudsTexture;
|
||||
#endif
|
||||
|
||||
#ifndef COMPILE_PARABOLOID_SKY
|
||||
uniform sampler2D u_sunOcclusion;
|
||||
uniform sampler2D u_gbufferDepthTexture;
|
||||
#endif
|
||||
|
||||
#define SKY_BRIGHTNESS 5.0
|
||||
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
void main() {
|
||||
gl_FragDepth = 0.0;
|
||||
vec3 viewDir = normalize(v_position3f);
|
||||
@ -46,6 +55,7 @@ void main() {
|
||||
float f = max(dot(viewDir, u_sunDirection3f) - 0.995, 0.0) * 100.0;
|
||||
float intensity = min(f * 2.0, 1.0);
|
||||
intensity *= intensity * intensity * intensity * textureLod(u_sunOcclusion, vec2(0.5, 0.5), 0.0).r * 2.0;
|
||||
intensity *= 1.0 - COMPARE_GT_0_1(textureLod(u_gbufferDepthTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r, 0.0);
|
||||
output4f = vec4(v_color3f * SKY_BRIGHTNESS + intensity * u_sunColor3f, 0.0);
|
||||
#endif
|
||||
#ifdef COMPILE_CLOUDS
|
||||
|
@ -26,6 +26,10 @@ layout(location = 1) in vec2 a_colorIndex2f;
|
||||
out vec3 v_position3f;
|
||||
out vec3 v_color3f;
|
||||
|
||||
#ifndef COMPILE_PARABOLOID_SKY
|
||||
out vec3 v_positionClip3f;
|
||||
#endif
|
||||
|
||||
uniform mat4 u_viewMatrix4f;
|
||||
#ifdef COMPILE_PARABOLOID_SKY
|
||||
uniform float u_farPlane1f;
|
||||
@ -47,5 +51,6 @@ void main() {
|
||||
gl_Position = vec4(pos.xyz, 1.0);
|
||||
#else
|
||||
gl_Position = u_projMatrix4f * vec4(pos.xyz, 1.0);
|
||||
v_positionClip3f = gl_Position.xyw;
|
||||
#endif
|
||||
}
|
||||
|
@ -33,6 +33,8 @@ uniform mat4 u_inverseProjectionMatrix4f;
|
||||
|
||||
uniform mat2 u_randomizerDataMatrix2f;
|
||||
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
const vec3 ssaoKernel[8] = vec3[](
|
||||
vec3(0.599,0.721,0.350),vec3(0.114,0.791,0.601),
|
||||
vec3(0.067,0.995,0.069),vec3(0.511,-0.510,0.692),
|
||||
@ -48,8 +50,8 @@ vec3(0.716,-0.439,0.543),vec3(-0.400,0.733,0.550));
|
||||
tmpVec4_2.zw = matProjInv2f * vec4(tmpVec4_2.xy, textureLod(u_gbufferDepthTexture, tmpVec4_2.xy * 0.5 + 0.5, 0.0).r * 2.0 - 1.0, 1.0);\
|
||||
tmpVec4_2.z /= tmpVec4_2.w;\
|
||||
tmpVec4_2.x = smoothstep(0.0, 1.0, radius * 0.5 / abs(pos.z - tmpVec4_2.z));\
|
||||
divisor += tmpVec4_2.x > 0.0 ? 1.0 : 0.0;\
|
||||
occlusion += (tmpVec4_2.z >= tmpVec4_1.z ? 1.0 : 0.0) * tmpVec4_2.x;
|
||||
divisor += COMPARE_GT_0_1(tmpVec4_2.x, 0.0);\
|
||||
occlusion += COMPARE_GT_0_1(tmpVec4_2.z, tmpVec4_1.z) * tmpVec4_2.x;
|
||||
|
||||
void main() {
|
||||
vec3 originalClipSpacePos = vec3(v_position2f, textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r);
|
||||
|
@ -0,0 +1,158 @@
|
||||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2025 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision highp float;
|
||||
precision highp sampler2D;
|
||||
|
||||
in vec2 v_position2f;
|
||||
|
||||
layout(location = 0) out float output1f;
|
||||
|
||||
uniform mat4 u_inverseViewMatrix4f;
|
||||
uniform mat4 u_inverseViewProjMatrix4f;
|
||||
|
||||
uniform sampler2D u_gbufferNormalTexture;
|
||||
uniform sampler2D u_gbufferDepthTexture;
|
||||
uniform sampler2D u_gbufferMaterialTexture;
|
||||
uniform sampler2D u_sunShadowDepthTexture;
|
||||
|
||||
#ifdef COMPILE_SUN_SHADOW_LOD0
|
||||
uniform mat4 u_sunShadowMatrixLOD04f;
|
||||
#define SUN_SHADOW_MAP_FRAC 1.0
|
||||
#endif
|
||||
#ifdef COMPILE_SUN_SHADOW_LOD1
|
||||
uniform mat4 u_sunShadowMatrixLOD04f;
|
||||
uniform mat4 u_sunShadowMatrixLOD14f;
|
||||
#define SUN_SHADOW_MAP_FRAC 0.5
|
||||
#endif
|
||||
#ifdef COMPILE_SUN_SHADOW_LOD2
|
||||
uniform mat4 u_sunShadowMatrixLOD04f;
|
||||
uniform mat4 u_sunShadowMatrixLOD14f;
|
||||
uniform mat4 u_sunShadowMatrixLOD24f;
|
||||
#define SUN_SHADOW_MAP_FRAC 0.3333333
|
||||
#endif
|
||||
|
||||
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
|
||||
|
||||
const vec2 POISSON_DISK[4] = vec2[](
|
||||
vec2(0.998, -0.0438),
|
||||
vec2(-0.345, -0.933),
|
||||
vec2(-0.996, 0.046),
|
||||
vec2(0.230, 0.960));
|
||||
#define SMOOTH_SHADOW_SAMPLES (1.0 / 5.0)
|
||||
#define SMOOTH_SHADOW_RADIUS 0.000488
|
||||
#define SCATTER_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
|
||||
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
|
||||
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
|
||||
tmpVec2.y += lod;\
|
||||
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
|
||||
accum += scatterSampleInterpolated(tex, vec3(tmpVec2, vec3Pos.z));
|
||||
|
||||
#define SUN_SHADOW_DEPTH_SIZE_2F vec2(SUN_SHADOW_DEPTH_SIZE_2F_X, SUN_SHADOW_DEPTH_SIZE_2F_Y)
|
||||
#define SUN_SHADOW_DEPTH_SIZE_2F_INV vec2((1.0 / SUN_SHADOW_DEPTH_SIZE_2F_X), (1.0 / SUN_SHADOW_DEPTH_SIZE_2F_Y))
|
||||
|
||||
uniform vec3 u_sunDirection3f;
|
||||
|
||||
#define SCATTER_SAMPLE(tex, vec2Pos, comp) max(textureLod(tex, (vec2Pos), 0.0).r - comp, 0.0)
|
||||
|
||||
float scatterSampleInterpolated(in sampler2D texIn, in vec3 vec3Pos) {
|
||||
vec2 icoord2f = vec3Pos.xy * SUN_SHADOW_DEPTH_SIZE_2F;
|
||||
vec2 floor2fTmp = floor(icoord2f);
|
||||
vec2 ceil2fTmp = ceil(icoord2f);
|
||||
vec2 ret1 = vec2( // top two samples
|
||||
SCATTER_SAMPLE(texIn, (floor2fTmp + 0.5) * SUN_SHADOW_DEPTH_SIZE_2F_INV, vec3Pos.z),
|
||||
SCATTER_SAMPLE(texIn, (vec2(ceil2fTmp.x, floor2fTmp.y) + 0.5) * SUN_SHADOW_DEPTH_SIZE_2F_INV, vec3Pos.z)
|
||||
);
|
||||
vec2 ret2 = vec2( // bottom two samples
|
||||
SCATTER_SAMPLE(texIn, (vec2(floor2fTmp.x, ceil2fTmp.y) + 0.5) * SUN_SHADOW_DEPTH_SIZE_2F_INV, vec3Pos.z),
|
||||
SCATTER_SAMPLE(texIn, (ceil2fTmp + 0.5) * SUN_SHADOW_DEPTH_SIZE_2F_INV, vec3Pos.z)
|
||||
);
|
||||
vec2 factors = icoord2f - floor2fTmp;
|
||||
vec2 cunt = vec2(1.0 - factors.x, factors.x);
|
||||
ret1 = ret1 * cunt * (1.0 - factors.y) + ret2 * cunt * factors.y;
|
||||
return (ret1.x + ret1.y) * 0.25;
|
||||
}
|
||||
|
||||
void main() {
|
||||
output1f = 0.0;
|
||||
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
|
||||
if(depth == 0.0) {
|
||||
return;
|
||||
}
|
||||
float material1f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0).a;
|
||||
material1f = 2.0 * material1f - COMPARE_GT_0_1(material1f, 0.5);
|
||||
if(material1f < 0.05) {
|
||||
return;
|
||||
}
|
||||
vec4 normalVector4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
|
||||
if(normalVector4f.a < 0.5) {
|
||||
return;
|
||||
}
|
||||
normalVector4f.xyz *= 2.0;
|
||||
normalVector4f.xyz -= 1.0;
|
||||
vec3 worldSpaceNormal = normalize(mat3(u_inverseViewMatrix4f) * normalVector4f.xyz);
|
||||
vec4 worldSpacePosition = vec4(v_position2f, depth, 1.0);
|
||||
worldSpacePosition.xyz *= 2.0;
|
||||
worldSpacePosition.xyz -= 1.0;
|
||||
worldSpacePosition = u_inverseViewProjMatrix4f * worldSpacePosition;
|
||||
worldSpacePosition.xyz /= worldSpacePosition.w;
|
||||
worldSpacePosition.xyz += worldSpaceNormal * 0.05;
|
||||
worldSpacePosition.w = 1.0;
|
||||
float shadowSample;
|
||||
vec2 tmpVec2;
|
||||
vec4 shadowSpacePosition;
|
||||
for(;;) {
|
||||
shadowSpacePosition = u_sunShadowMatrixLOD04f * worldSpacePosition;
|
||||
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
|
||||
shadowSample = scatterSampleInterpolated(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowSpacePosition.z));
|
||||
SCATTER_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
SCATTER_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
SCATTER_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
SCATTER_POISSON_SAMPLE(3, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
|
||||
shadowSample *= SMOOTH_SHADOW_SAMPLES;
|
||||
break;
|
||||
}
|
||||
|
||||
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
|
||||
shadowSpacePosition = u_sunShadowMatrixLOD14f * worldSpacePosition;
|
||||
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
|
||||
shadowSpacePosition.y += 1.0;
|
||||
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
|
||||
shadowSample = scatterSampleInterpolated(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy, shadowSpacePosition.z + 0.00015));
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_SUN_SHADOW_LOD2
|
||||
shadowSpacePosition = u_sunShadowMatrixLOD24f * worldSpacePosition;
|
||||
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
|
||||
shadowSpacePosition.y += 2.0;
|
||||
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
|
||||
shadowSample = scatterSampleInterpolated(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy, shadowSpacePosition.z + 0.00015));
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
output1f = normalVector4f.a * min(material1f, 0.5);
|
||||
return;
|
||||
}
|
||||
|
||||
material1f = (1.0 - material1f) * 512.0;
|
||||
output1f = max(1.0 - shadowSample * material1f, 0.0);
|
||||
}
|
@ -230,6 +230,13 @@ eaglercraft.shaders.gui.option.POST_FXAA.desc.2=This is the preferred antialiasi
|
||||
eaglercraft.shaders.gui.option.POST_FXAA.desc.4=ON: enable fxaa (slower)
|
||||
eaglercraft.shaders.gui.option.POST_FXAA.desc.5=OFF: disable fxaa (faster)
|
||||
|
||||
eaglercraft.shaders.gui.option.SUBSURFACE_SCATTERING.label=S.S. Scattering
|
||||
|
||||
eaglercraft.shaders.gui.option.SUBSURFACE_SCATTERING.desc.0=Applies subsurface scattering to sunlight calculations, requires shadows to be enabled!
|
||||
eaglercraft.shaders.gui.option.SUBSURFACE_SCATTERING.desc.2=This effect is mainly used on grass and leaf blocks to make them look more realistic in sunlight, however it is not a perfect model of reality
|
||||
eaglercraft.shaders.gui.option.SUBSURFACE_SCATTERING.desc.4=ON: enable subsurf scattering (slower)
|
||||
eaglercraft.shaders.gui.option.SUBSURFACE_SCATTERING.desc.5=OFF: disable subsurf scattering (faster)
|
||||
|
||||
eaglercraft.shaders.gui.unsupported.title=Shaders are unavailable on this device!
|
||||
eaglercraft.shaders.gui.unsupported.reason.hdrFramebuffer=Reason: No HDR render target support
|
||||
eaglercraft.shaders.gui.unsupported.reason.oldOpenGLVersion=Reason: OpenGL ES 3.0 (WebGL 2.0) is not supported!
|
||||
|
@ -1065,9 +1065,6 @@ public class Minecraft implements IThreadListener {
|
||||
public void launchIntegratedServer(String folderName, String worldName, WorldSettings worldSettingsIn) {
|
||||
this.loadWorld((WorldClient) null);
|
||||
renderManager.setEnableFNAWSkins(this.gameSettings.enableFNAWSkins);
|
||||
session.reset();
|
||||
EaglerProfile.clearServerSkinOverride();
|
||||
PauseMenuCustomizeState.reset();
|
||||
SingleplayerServerController.launchEaglercraftServer(folderName, gameSettings.difficulty.getDifficultyId(),
|
||||
Math.max(gameSettings.renderDistanceChunks, 2), worldSettingsIn);
|
||||
EagRuntime.setMCServerWindowGlobal("singleplayer");
|
||||
@ -1100,6 +1097,7 @@ public class Minecraft implements IThreadListener {
|
||||
EaglerProfile.clearServerSkinOverride();
|
||||
PauseMenuCustomizeState.reset();
|
||||
ClientUUIDLoadingCache.flushRequestCache();
|
||||
ClientUUIDLoadingCache.resetFlags();
|
||||
WebViewOverlayController.setPacketSendCallback(null);
|
||||
|
||||
this.guiAchievement.clearAchievements();
|
||||
|
@ -1,5 +1,7 @@
|
||||
package net.minecraft.client.gui;
|
||||
|
||||
import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL._wglBindFramebuffer;
|
||||
import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_COLOR_BUFFER_BIT;
|
||||
import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_LINEAR;
|
||||
import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_MODELVIEW;
|
||||
import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_ONE_MINUS_SRC_ALPHA;
|
||||
@ -31,6 +33,7 @@ import net.lax1dude.eaglercraft.v1_8.crypto.SHA1Digest;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.EnumCursorType;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.minecraft.MainMenuSkyboxTexture;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer;
|
||||
@ -46,7 +49,6 @@ import net.lax1dude.eaglercraft.v1_8.update.UpdateService;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.util.MathHelper;
|
||||
@ -86,7 +88,8 @@ public class GuiMainMenu extends GuiScreen implements GuiYesNoCallback {
|
||||
* + Texture allocated for the current viewport of the main menu's panorama
|
||||
* background.
|
||||
*/
|
||||
private static DynamicTexture viewportTexture = null;
|
||||
private static MainMenuSkyboxTexture viewportTexture = null;
|
||||
private static MainMenuSkyboxTexture viewportTexture2 = null;
|
||||
private static final ResourceLocation splashTexts = new ResourceLocation("texts/splashes.txt");
|
||||
private static final ResourceLocation minecraftTitleTextures = new ResourceLocation(
|
||||
"textures/gui/title/minecraft.png");
|
||||
@ -104,6 +107,7 @@ public class GuiMainMenu extends GuiScreen implements GuiYesNoCallback {
|
||||
new ResourceLocation("textures/gui/title/background/panorama_4.png"),
|
||||
new ResourceLocation("textures/gui/title/background/panorama_5.png") };
|
||||
private static ResourceLocation backgroundTexture = null;
|
||||
private static ResourceLocation backgroundTexture2 = null;
|
||||
private static GuiMainMenu instance = null;
|
||||
|
||||
public static void doResourceReloadHack() {
|
||||
@ -315,7 +319,7 @@ public class GuiMainMenu extends GuiScreen implements GuiYesNoCallback {
|
||||
GlStateManager.disableCull();
|
||||
GlStateManager.depthMask(false);
|
||||
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
||||
byte b0 = enableBlur ? (byte) 8 : (byte) 1;
|
||||
byte b0 = enableBlur ? (byte) 4 : (byte) 1;
|
||||
|
||||
for (int i = 0; i < b0 * b0; ++i) {
|
||||
GlStateManager.pushMatrix();
|
||||
@ -529,8 +533,10 @@ public class GuiMainMenu extends GuiScreen implements GuiYesNoCallback {
|
||||
@Override
|
||||
public void initGui() {
|
||||
if (viewportTexture == null) {
|
||||
viewportTexture = new DynamicTexture(256, 256);
|
||||
viewportTexture = new MainMenuSkyboxTexture(256, 256);
|
||||
backgroundTexture = this.mc.getTextureManager().getDynamicTextureLocation("background", viewportTexture);
|
||||
viewportTexture2 = new MainMenuSkyboxTexture(256, 256);
|
||||
backgroundTexture2 = this.mc.getTextureManager().getDynamicTextureLocation("background", viewportTexture2);
|
||||
}
|
||||
this.updateCheckerOverlay.setResolution(mc, width, height);
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
@ -661,15 +667,42 @@ public class GuiMainMenu extends GuiScreen implements GuiYesNoCallback {
|
||||
* + Renders the skybox in the main menu
|
||||
*/
|
||||
private void renderSkybox(int parInt1, int parInt2, float parFloat1) {
|
||||
viewportTexture.bindFramebuffer();
|
||||
GlStateManager.viewport(0, 0, 256, 256);
|
||||
GlStateManager.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
GlStateManager.clear(GL_COLOR_BUFFER_BIT);
|
||||
this.drawPanorama(parInt1, parInt2, parFloat1);
|
||||
viewportTexture2.bindFramebuffer();
|
||||
GlStateManager.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
GlStateManager.clear(GL_COLOR_BUFFER_BIT);
|
||||
this.mc.getTextureManager().bindTexture(backgroundTexture);
|
||||
this.rotateAndBlurSkybox(parFloat1);
|
||||
viewportTexture.bindFramebuffer();
|
||||
this.mc.getTextureManager().bindTexture(backgroundTexture2);
|
||||
this.rotateAndBlurSkybox(parFloat1);
|
||||
viewportTexture2.bindFramebuffer();
|
||||
this.mc.getTextureManager().bindTexture(backgroundTexture);
|
||||
this.rotateAndBlurSkybox(parFloat1);
|
||||
viewportTexture.bindFramebuffer();
|
||||
this.mc.getTextureManager().bindTexture(backgroundTexture2);
|
||||
this.rotateAndBlurSkybox(parFloat1);
|
||||
viewportTexture2.bindFramebuffer();
|
||||
this.mc.getTextureManager().bindTexture(backgroundTexture);
|
||||
this.rotateAndBlurSkybox(parFloat1);
|
||||
viewportTexture.bindFramebuffer();
|
||||
this.mc.getTextureManager().bindTexture(backgroundTexture2);
|
||||
this.rotateAndBlurSkybox(parFloat1);
|
||||
this.rotateAndBlurSkybox(parFloat1);
|
||||
|
||||
// Notch fucked up, the last iteration is not necessary, in the vanilla renderer
|
||||
// it is unintentionally discarded and the previous iteration is used
|
||||
|
||||
// viewportTexture2.bindFramebuffer();
|
||||
// this.mc.getTextureManager().bindTexture(backgroundTexture);
|
||||
// this.rotateAndBlurSkybox(parFloat1);
|
||||
|
||||
_wglBindFramebuffer(0x8D40, null);
|
||||
|
||||
this.mc.getTextureManager().bindTexture(backgroundTexture);
|
||||
GlStateManager.viewport(0, 0, this.mc.displayWidth, this.mc.displayHeight);
|
||||
float f = this.width > this.height ? 120.0F / (float) this.width : 120.0F / (float) this.height;
|
||||
float f1 = (float) this.height * f / 256.0F;
|
||||
@ -694,10 +727,9 @@ public class GuiMainMenu extends GuiScreen implements GuiYesNoCallback {
|
||||
* + Rotate and blurs the skybox view in the main menu
|
||||
*/
|
||||
private void rotateAndBlurSkybox(float parFloat1) {
|
||||
this.mc.getTextureManager().bindTexture(backgroundTexture);
|
||||
EaglercraftGPU.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
EaglercraftGPU.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
EaglercraftGPU.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 256, 256);
|
||||
// EaglercraftGPU.glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 256, 256);
|
||||
GlStateManager.enableBlend();
|
||||
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
||||
GlStateManager.colorMask(true, true, true, false);
|
||||
|
@ -328,7 +328,7 @@ public class GuiMultiplayer extends GuiScreen implements GuiYesNoCallback {
|
||||
}
|
||||
|
||||
public boolean func_175394_b(ServerListEntryNormal parServerListEntryNormal, int parInt1) {
|
||||
return parInt1 < this.savedServerList.countServers();
|
||||
return parInt1 < this.savedServerList.countServers() - 1;
|
||||
}
|
||||
|
||||
public ServerData getSelectedServer() {
|
||||
|
@ -4,7 +4,6 @@ import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_BACK;
|
||||
import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_FRONT;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.boss.EntityDragon;
|
||||
@ -182,7 +181,7 @@ public class ModelDragon extends ModelBase {
|
||||
this.body.rotateAngleZ = 0.0F;
|
||||
this.body.render(f);
|
||||
|
||||
boolean flag = DeferredStateManager.isEnableShadowRender();
|
||||
// boolean flag = DeferredStateManager.isEnableShadowRender();
|
||||
for (int j = 0; j < 2; ++j) {
|
||||
GlStateManager.enableCull();
|
||||
float f12 = f1 * 3.1415927F * 2.0F;
|
||||
@ -201,12 +200,14 @@ public class ModelDragon extends ModelBase {
|
||||
this.rearLeg.render(f);
|
||||
GlStateManager.scale(-1.0F, 1.0F, 1.0F);
|
||||
if (j == 0) {
|
||||
GlStateManager.cullFace(flag ? GL_BACK : GL_FRONT);
|
||||
// GlStateManager.cullFace(flag ? GL_BACK : GL_FRONT);
|
||||
GlStateManager.cullFace(GL_FRONT);
|
||||
}
|
||||
}
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
GlStateManager.cullFace(flag ? GL_FRONT : GL_BACK);
|
||||
// GlStateManager.cullFace(flag ? GL_FRONT : GL_BACK);
|
||||
GlStateManager.cullFace(GL_BACK);
|
||||
GlStateManager.disableCull();
|
||||
float f11 = -((float) Math.sin((double) (f1 * 3.1415927F * 2.0F))) * 0.0F;
|
||||
f9 = f1 * 3.1415927F * 2.0F;
|
||||
|
@ -252,6 +252,8 @@ public class GuiConnecting extends GuiScreen {
|
||||
if (ConnectionHandshake.attemptHandshake(this.mc, webSocket, this, previousGuiScreen,
|
||||
currentPassword, allowPlaintext, allowCookies, cookieData)) {
|
||||
logger.info("Handshake Success");
|
||||
webSocket.setEnableStringFrames(false);
|
||||
webSocket.clearStringFrames();
|
||||
this.networkManager = new WebSocketNetworkManager(webSocket);
|
||||
this.networkManager.setPluginInfo(ConnectionHandshake.pluginBrand,
|
||||
ConnectionHandshake.pluginVersion);
|
||||
|
@ -2414,7 +2414,7 @@ public class EntityRenderer implements IResourceManagerReloadListener {
|
||||
GlStateManager.setFogStart(f1 * 0.25F);
|
||||
GlStateManager.setFogEnd(f1);
|
||||
}
|
||||
EaglercraftGPU.glFogi('\u855a', '\u855b');
|
||||
// EaglercraftGPU.glFogi('\u855a', '\u855b');
|
||||
} else if (this.cloudFog) {
|
||||
GlStateManager.setFog(GL_EXP);
|
||||
GlStateManager.setFogDensity(0.1F);
|
||||
@ -2444,8 +2444,6 @@ public class EntityRenderer implements IResourceManagerReloadListener {
|
||||
GlStateManager.setFogEnd(f);
|
||||
}
|
||||
|
||||
EaglercraftGPU.glFogi('\u855a', '\u855b');
|
||||
|
||||
if (this.mc.theWorld.provider.doesXZShowFog((int) entity.posX, (int) entity.posZ)) {
|
||||
GlStateManager.setFogStart(f * 0.05F);
|
||||
GlStateManager.setFogEnd(Math.min(f, 192.0F) * 0.5F);
|
||||
|
@ -256,6 +256,10 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
private List<RenderGlobal.ContainerLocalRenderInformation> renderInfos = Lists.newArrayListWithCapacity(69696);
|
||||
private final Set<TileEntity> field_181024_n = Sets.newHashSet();
|
||||
private ViewFrustum viewFrustum;
|
||||
private int glSunList = -1;
|
||||
private int moonPhase = -1;
|
||||
private int glMoonList = -1;
|
||||
private int glHorizonList = -1;
|
||||
/**
|
||||
* + The star GL Call list
|
||||
*/
|
||||
@ -326,6 +330,8 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
this.renderContainer = new RenderList();
|
||||
this.renderChunkFactory = new ListChunkFactory();
|
||||
this.cloudRenderer = new EaglerCloudRenderer(mcIn);
|
||||
this.generateSun();
|
||||
this.generateHorizon();
|
||||
this.generateStars();
|
||||
this.generateSky();
|
||||
this.generateSky2();
|
||||
@ -532,6 +538,42 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
: null);
|
||||
}
|
||||
|
||||
private void generateHorizon() {
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
||||
|
||||
if (this.glHorizonList >= 0) {
|
||||
GLAllocation.deleteDisplayLists(this.glHorizonList);
|
||||
this.glHorizonList = -1;
|
||||
}
|
||||
|
||||
this.glHorizonList = GLAllocation.generateDisplayLists();
|
||||
EaglercraftGPU.glNewList(this.glHorizonList, GL_COMPILE);
|
||||
worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR);
|
||||
worldrenderer.pos(-1.0D, 0.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, 0.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, 0.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, 0.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, 0.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, 0.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, 0.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, 0.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
tessellator.draw();
|
||||
EaglercraftGPU.glEndList();
|
||||
}
|
||||
|
||||
private void generateSky() {
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
||||
@ -585,6 +627,27 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
|
||||
}
|
||||
|
||||
private void generateSun() {
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
||||
|
||||
if (this.glSunList >= 0) {
|
||||
GLAllocation.deleteDisplayLists(this.glSunList);
|
||||
this.glSunList = -1;
|
||||
}
|
||||
|
||||
this.glSunList = GLAllocation.generateDisplayLists();
|
||||
EaglercraftGPU.glNewList(this.glSunList, GL_COMPILE);
|
||||
float f17 = 30.0F;
|
||||
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
|
||||
worldrenderer.pos((double) (-f17), 100.0D, (double) (-f17)).tex(0.0D, 0.0D).endVertex();
|
||||
worldrenderer.pos((double) f17, 100.0D, (double) (-f17)).tex(1.0D, 0.0D).endVertex();
|
||||
worldrenderer.pos((double) f17, 100.0D, (double) f17).tex(1.0D, 1.0D).endVertex();
|
||||
worldrenderer.pos((double) (-f17), 100.0D, (double) f17).tex(0.0D, 1.0D).endVertex();
|
||||
tessellator.draw();
|
||||
EaglercraftGPU.glEndList();
|
||||
}
|
||||
|
||||
public double getCloudCounter(float partialTicks) {
|
||||
return (double) cloudTickCounter + partialTicks;
|
||||
}
|
||||
@ -637,6 +700,35 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
+ ", " + renderDispatcher.getDebugInfo();
|
||||
}
|
||||
|
||||
private int getMoonList(int phase) {
|
||||
if (phase != moonPhase) {
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
||||
|
||||
if (glMoonList == -1) {
|
||||
glMoonList = GLAllocation.generateDisplayLists();
|
||||
}
|
||||
|
||||
EaglercraftGPU.glNewList(this.glMoonList, GL_COMPILE);
|
||||
float f17 = 20.0F;
|
||||
int j = phase % 4;
|
||||
int l = phase / 4 % 2;
|
||||
float f22 = (float) (j + 0) / 4.0F;
|
||||
float f23 = (float) (l + 0) / 2.0F;
|
||||
float f24 = (float) (j + 1) / 4.0F;
|
||||
float f14 = (float) (l + 1) / 2.0F;
|
||||
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
|
||||
worldrenderer.pos((double) (-f17), -100.0D, (double) f17).tex((double) f24, (double) f14).endVertex();
|
||||
worldrenderer.pos((double) f17, -100.0D, (double) f17).tex((double) f22, (double) f14).endVertex();
|
||||
worldrenderer.pos((double) f17, -100.0D, (double) (-f17)).tex((double) f22, (double) f23).endVertex();
|
||||
worldrenderer.pos((double) (-f17), -100.0D, (double) (-f17)).tex((double) f24, (double) f23).endVertex();
|
||||
tessellator.draw();
|
||||
EaglercraftGPU.glEndList();
|
||||
moonPhase = phase;
|
||||
}
|
||||
return glMoonList;
|
||||
}
|
||||
|
||||
protected Vector3f getViewVector(Entity entityIn, double partialTicks) {
|
||||
float f = (float) ((double) entityIn.prevRotationPitch
|
||||
+ (double) (entityIn.rotationPitch - entityIn.prevRotationPitch) * partialTicks);
|
||||
@ -738,6 +830,7 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
if (theWorld.provider.getHasNoSky()) {
|
||||
dfc.is_rendering_shadowsSun_clamped = 0;
|
||||
dfc.is_rendering_lightShafts = false;
|
||||
dfc.is_rendering_subsurfaceScattering = false;
|
||||
} else {
|
||||
int maxDist = renderDistanceChunks << 4;
|
||||
int ss = dfc.is_rendering_shadowsSun;
|
||||
@ -745,7 +838,9 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
--ss;
|
||||
}
|
||||
dfc.is_rendering_shadowsSun_clamped = ss;
|
||||
dfc.is_rendering_lightShafts = dfc.lightShafts;
|
||||
dfc.is_rendering_lightShafts = ss > 0 && dfc.lightShafts && dfc.shaderPackInfo.LIGHT_SHAFTS;
|
||||
dfc.is_rendering_subsurfaceScattering = ss > 0 && dfc.subsurfaceScattering
|
||||
&& dfc.shaderPackInfo.SUBSURFACE_SCATTERING;
|
||||
}
|
||||
boolean flag = false;
|
||||
if (EaglerDeferredPipeline.instance == null) {
|
||||
@ -1611,29 +1706,10 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F);
|
||||
CustomSky.renderSky(this.theWorld, this.renderEngine, partialTicks);
|
||||
GlStateManager.rotate(this.theWorld.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F);
|
||||
float f17 = 30.0F;
|
||||
this.renderEngine.bindTexture(locationSunPng);
|
||||
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
|
||||
worldrenderer.pos((double) (-f17), 100.0D, (double) (-f17)).tex(0.0D, 0.0D).endVertex();
|
||||
worldrenderer.pos((double) f17, 100.0D, (double) (-f17)).tex(1.0D, 0.0D).endVertex();
|
||||
worldrenderer.pos((double) f17, 100.0D, (double) f17).tex(1.0D, 1.0D).endVertex();
|
||||
worldrenderer.pos((double) (-f17), 100.0D, (double) f17).tex(0.0D, 1.0D).endVertex();
|
||||
tessellator.draw();
|
||||
f17 = 20.0F;
|
||||
GlStateManager.callList(glSunList);
|
||||
this.renderEngine.bindTexture(locationMoonPhasesPng);
|
||||
int i = this.theWorld.getMoonPhase();
|
||||
int j = i % 4;
|
||||
int l = i / 4 % 2;
|
||||
float f22 = (float) (j + 0) / 4.0F;
|
||||
float f23 = (float) (l + 0) / 2.0F;
|
||||
float f24 = (float) (j + 1) / 4.0F;
|
||||
float f14 = (float) (l + 1) / 2.0F;
|
||||
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
|
||||
worldrenderer.pos((double) (-f17), -100.0D, (double) f17).tex((double) f24, (double) f14).endVertex();
|
||||
worldrenderer.pos((double) f17, -100.0D, (double) f17).tex((double) f22, (double) f14).endVertex();
|
||||
worldrenderer.pos((double) f17, -100.0D, (double) (-f17)).tex((double) f22, (double) f23).endVertex();
|
||||
worldrenderer.pos((double) (-f17), -100.0D, (double) (-f17)).tex((double) f24, (double) f23).endVertex();
|
||||
tessellator.draw();
|
||||
GlStateManager.callList(getMoonList(this.theWorld.getMoonPhase()));
|
||||
GlStateManager.disableTexture2D();
|
||||
float f15 = this.theWorld.getStarBrightness(partialTicks) * f16;
|
||||
boolean b = !CustomSky.hasSkyLayers(this.theWorld);
|
||||
@ -1656,31 +1732,13 @@ public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListene
|
||||
GlStateManager.callList(this.glSkyList2);
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
float f18 = 1.0F;
|
||||
float f19 = -((float) (d0 + 65.0D));
|
||||
float f20 = -1.0F;
|
||||
worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR);
|
||||
worldrenderer.pos(-1.0D, (double) f19, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, (double) f19, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, (double) f19, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, (double) f19, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, (double) f19, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, (double) f19, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, (double) f19, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, (double) f19, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
||||
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
||||
tessellator.draw();
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(0.0F, f19, 0.0F);
|
||||
GlStateManager.scale(1.0f, 1.0f - f19, 1.0f);
|
||||
GlStateManager.callList(this.glHorizonList);
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
if (this.theWorld.provider.isSkyColored()) {
|
||||
|
@ -63,4 +63,9 @@ public class Tessellator {
|
||||
public WorldRenderer getWorldRenderer() {
|
||||
return this.worldRenderer;
|
||||
}
|
||||
|
||||
public void uploadDisplayList(int displayList) {
|
||||
this.worldRenderer.finishDrawing();
|
||||
WorldVertexBufferUploader.uploadDisplayList(displayList, this.worldRenderer);
|
||||
}
|
||||
}
|
||||
|
@ -1005,13 +1005,15 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||
GlStateManager.pushMatrix();
|
||||
ItemCameraTransforms itemcameratransforms = model.getItemCameraTransforms();
|
||||
itemcameratransforms.applyTransform(cameraTransformType);
|
||||
boolean flag = DeferredStateManager.isEnableShadowRender();
|
||||
// boolean flag = DeferredStateManager.isEnableShadowRender();
|
||||
if (this.func_183005_a(itemcameratransforms.getTransform(cameraTransformType))) {
|
||||
GlStateManager.cullFace(flag ? GL_BACK : GL_FRONT);
|
||||
// GlStateManager.cullFace(flag ? GL_BACK : GL_FRONT);
|
||||
GlStateManager.cullFace(GL_FRONT);
|
||||
}
|
||||
|
||||
this.renderItem(stack, model);
|
||||
GlStateManager.cullFace(flag ? GL_FRONT : GL_BACK);
|
||||
// GlStateManager.cullFace(flag ? GL_FRONT : GL_BACK);
|
||||
GlStateManager.cullFace(GL_BACK);
|
||||
GlStateManager.popMatrix();
|
||||
GlStateManager.disableRescaleNormal();
|
||||
GlStateManager.disableBlend();
|
||||
|
@ -4,7 +4,6 @@ import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_BACK;
|
||||
import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_FRONT;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.model.ModelQuadruped;
|
||||
import net.minecraft.client.renderer.BlockRendererDispatcher;
|
||||
@ -50,8 +49,9 @@ public class LayerMooshroomMushroom implements LayerRenderer<EntityMooshroom> {
|
||||
BlockRendererDispatcher blockrendererdispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher();
|
||||
this.mooshroomRenderer.bindTexture(TextureMap.locationBlocksTexture);
|
||||
GlStateManager.enableCull();
|
||||
boolean flag = DeferredStateManager.isEnableShadowRender();
|
||||
GlStateManager.cullFace(flag ? GL_BACK : GL_FRONT);
|
||||
// boolean flag = DeferredStateManager.isEnableShadowRender();
|
||||
// GlStateManager.cullFace(flag ? GL_BACK : GL_FRONT);
|
||||
GlStateManager.cullFace(GL_FRONT);
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.scale(1.0F, -1.0F, 1.0F);
|
||||
GlStateManager.translate(0.2F, 0.35F, 0.5F);
|
||||
@ -75,7 +75,8 @@ public class LayerMooshroomMushroom implements LayerRenderer<EntityMooshroom> {
|
||||
GlStateManager.translate(-0.5F, -0.5F, 0.5F);
|
||||
blockrendererdispatcher.renderBlockBrightness(Blocks.red_mushroom.getDefaultState(), 1.0F);
|
||||
GlStateManager.popMatrix();
|
||||
GlStateManager.cullFace(flag ? GL_FRONT : GL_BACK);
|
||||
// GlStateManager.cullFace(flag ? GL_FRONT : GL_BACK);
|
||||
GlStateManager.cullFace(GL_BACK);
|
||||
GlStateManager.disableCull();
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ public class TextureManager implements ITickable, IResourceManagerReloadListener
|
||||
}
|
||||
}
|
||||
|
||||
public ResourceLocation getDynamicTextureLocation(String name, DynamicTexture texture) {
|
||||
public ResourceLocation getDynamicTextureLocation(String name, ITextureObject texture) {
|
||||
int integer = this.mapTextureCounters.getOrDefault(name, 0) + 1;
|
||||
this.mapTextureCounters.put(name, integer);
|
||||
ResourceLocation resourcelocation = new ResourceLocation(
|
||||
|
@ -1124,7 +1124,7 @@ public class GameSettings {
|
||||
}
|
||||
|
||||
this.mc.thePlayer.sendQueue.addToSendQueue(new C15PacketClientSettings(this.language,
|
||||
Math.max(this.renderDistanceChunks, 2), this.chatVisibility, this.chatColours, i));
|
||||
Math.max(this.renderDistanceChunks, 3), this.chatVisibility, this.chatColours, i));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -79,7 +79,7 @@ import net.minecraft.world.WorldServer;
|
||||
*/
|
||||
public abstract class Entity implements ICommandSender {
|
||||
private static final AxisAlignedBB ZERO_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
|
||||
private static int nextEntityID;
|
||||
private static int nextEntityID = 1;
|
||||
private int entityId;
|
||||
public double renderDistanceWeight;
|
||||
public boolean preventEntitySpawning;
|
||||
@ -207,12 +207,12 @@ public abstract class Entity implements ICommandSender {
|
||||
return Entity.this.getName();
|
||||
}
|
||||
});
|
||||
category.addCrashSection("Entity\'s Exact location", String.format("%.2f, %.2f, %.2f",
|
||||
category.addCrashSection("Entity\'s Exact location", HString.format("%.2f, %.2f, %.2f",
|
||||
new Object[] { Double.valueOf(this.posX), Double.valueOf(this.posY), Double.valueOf(this.posZ) }));
|
||||
category.addCrashSection("Entity\'s Block location",
|
||||
CrashReportCategory.getCoordinateInfo((double) MathHelper.floor_double(this.posX),
|
||||
(double) MathHelper.floor_double(this.posY), (double) MathHelper.floor_double(this.posZ)));
|
||||
category.addCrashSection("Entity\'s Momentum", String.format("%.2f, %.2f, %.2f", new Object[] {
|
||||
category.addCrashSection("Entity\'s Momentum", HString.format("%.2f, %.2f, %.2f", new Object[] {
|
||||
Double.valueOf(this.motionX), Double.valueOf(this.motionY), Double.valueOf(this.motionZ) }));
|
||||
category.addCrashSectionCallable("Entity\'s Rider", new Callable<String>() {
|
||||
@Override
|
||||
|
@ -1489,7 +1489,7 @@ public abstract class EntityPlayer extends EntityLivingBase implements ICommandS
|
||||
}
|
||||
|
||||
EntityList.EntityEggInfo entitylist$entityegginfo = (EntityList.EntityEggInfo) EntityList.entityEggs
|
||||
.get(Integer.valueOf(EntityList.getEntityID(entitylivingbase)));
|
||||
.get(EntityList.getEntityID(entitylivingbase));
|
||||
if (entitylist$entityegginfo != null) {
|
||||
this.triggerAchievement(entitylist$entityegginfo.field_151512_d);
|
||||
}
|
||||
|
@ -670,7 +670,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
|
||||
EntityLivingBase entitylivingbase = this.func_94060_bK();
|
||||
if (entitylivingbase != null) {
|
||||
EntityList.EntityEggInfo entitylist$entityegginfo = (EntityList.EntityEggInfo) EntityList.entityEggs
|
||||
.get(Integer.valueOf(EntityList.getEntityID(entitylivingbase)));
|
||||
.get(EntityList.getEntityID(entitylivingbase));
|
||||
if (entitylist$entityegginfo != null) {
|
||||
this.triggerAchievement(entitylist$entityegginfo.field_151513_e);
|
||||
}
|
||||
|
@ -2,6 +2,8 @@ package net.minecraft.item;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.carrotsearch.hppc.IntObjectHashMap;
|
||||
import com.carrotsearch.hppc.SortedIterationIntObjectHashMap;
|
||||
import com.carrotsearch.hppc.cursors.ObjectCursor;
|
||||
|
||||
import net.minecraft.block.BlockFence;
|
||||
@ -55,7 +57,7 @@ public class ItemMonsterPlacer extends Item {
|
||||
* by the last three parameters. Parameters: world, entityID, x, y, z.
|
||||
*/
|
||||
public static Entity spawnCreature(World worldIn, int entityID, double x, double y, double z) {
|
||||
if (!EntityList.entityEggs.containsKey(Integer.valueOf(entityID))) {
|
||||
if (!EntityList.entityEggs.containsKey(entityID)) {
|
||||
return null;
|
||||
} else {
|
||||
Entity entity = null;
|
||||
@ -87,7 +89,7 @@ public class ItemMonsterPlacer extends Item {
|
||||
@Override
|
||||
public int getColorFromItemStack(ItemStack itemstack, int i) {
|
||||
EntityList.EntityEggInfo entitylist$entityegginfo = (EntityList.EntityEggInfo) EntityList.entityEggs
|
||||
.get(Integer.valueOf(itemstack.getMetadata()));
|
||||
.get(itemstack.getMetadata());
|
||||
return entitylist$entityegginfo != null
|
||||
? (i == 0 ? entitylist$entityegginfo.primaryColor : entitylist$entityegginfo.secondaryColor)
|
||||
: 16777215;
|
||||
@ -110,7 +112,8 @@ public class ItemMonsterPlacer extends Item {
|
||||
*/
|
||||
@Override
|
||||
public void getSubItems(Item item, CreativeTabs var2, List<ItemStack> list) {
|
||||
for (ObjectCursor<EntityList.EntityEggInfo> entitylist$entityegginfo : EntityList.entityEggs.values()) {
|
||||
for (ObjectCursor<EntityList.EntityEggInfo> entitylist$entityegginfo : new SortedIterationIntObjectHashMap<>(
|
||||
(IntObjectHashMap<EntityList.EntityEggInfo>) EntityList.entityEggs, (a, b) -> a - b).values()) {
|
||||
list.add(new ItemStack(item, 1, entitylist$entityegginfo.value.spawnedID));
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
package net.minecraft.item;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
@ -8,9 +10,6 @@ import java.util.Set;
|
||||
|
||||
import com.carrotsearch.hppc.IntObjectHashMap;
|
||||
import com.carrotsearch.hppc.IntObjectMap;
|
||||
import com.carrotsearch.hppc.ObjectIntHashMap;
|
||||
import com.carrotsearch.hppc.ObjectIntMap;
|
||||
import com.carrotsearch.hppc.cursors.IntCursor;
|
||||
import com.google.common.collect.HashMultimap;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
@ -54,7 +53,7 @@ import net.minecraft.world.World;
|
||||
*
|
||||
*/
|
||||
public class ItemPotion extends Item {
|
||||
private static final ObjectIntMap<List<PotionEffect>> SUB_ITEMS_CACHE = new ObjectIntHashMap<>();
|
||||
private static final Map<List<PotionEffect>, Integer> SUB_ITEMS_CACHE = new HashMap<>();
|
||||
|
||||
/**
|
||||
* + returns wether or not a potion is a throwable splash potion based on damage
|
||||
@ -273,15 +272,18 @@ public class ItemPotion extends Item {
|
||||
|
||||
List list = PotionHelper.getPotionEffects(i1, false);
|
||||
if (list != null && !list.isEmpty()) {
|
||||
SUB_ITEMS_CACHE.put(list, i1);
|
||||
SUB_ITEMS_CACHE.put(list, Integer.valueOf(i1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (IntCursor cur : SUB_ITEMS_CACHE.values()) {
|
||||
subItems.add(new ItemStack(itemIn, 1, cur.value));
|
||||
Iterator iterator = SUB_ITEMS_CACHE.values().iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
int j1 = ((Integer) iterator.next()).intValue();
|
||||
subItems.add(new ItemStack(itemIn, 1, j1));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -16,13 +14,16 @@ package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
class OpenGLObjects {
|
||||
|
||||
static class BufferArrayGL implements IBufferArrayGL {
|
||||
|
||||
static class VertexArrayGL implements IVertexArrayGL {
|
||||
|
||||
final int ptr;
|
||||
|
||||
BufferArrayGL(int ptr) {
|
||||
|
||||
VertexArrayGL(int ptr) {
|
||||
this.ptr = ptr;
|
||||
}
|
||||
|
||||
@ -215,4 +216,4 @@ class OpenGLObjects {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,16 +1,31 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import static org.lwjgl.glfw.GLFW.glfwGetClipboardString;
|
||||
import static org.lwjgl.glfw.GLFW.glfwSetClipboardString;
|
||||
import static org.lwjgl.glfw.GLFW.*;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Desktop;
|
||||
import java.awt.Dialog.ModalExclusionType;
|
||||
import java.awt.Dialog.ModalityType;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.HeadlessException;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.Dialog.ModalExclusionType;
|
||||
import java.awt.Dialog.ModalityType;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
@ -34,37 +49,186 @@ import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class PlatformApplication {
|
||||
|
||||
private static long win = 0l;
|
||||
|
||||
static void initHooks(long glfwWindow) {
|
||||
win = glfwWindow;
|
||||
}
|
||||
|
||||
public static void openLink(String url) {
|
||||
URI safeURL;
|
||||
try {
|
||||
safeURL = new URI(url);
|
||||
String proto = safeURL.getScheme();
|
||||
if(!proto.equalsIgnoreCase("http") && !proto.equalsIgnoreCase("https")) {
|
||||
throw new IllegalArgumentException("Suspicious protocol: " + proto);
|
||||
}
|
||||
}catch(URISyntaxException | IllegalArgumentException ex) {
|
||||
PlatformRuntime.logger.error("Refusing to open invalid URL: {}", url);
|
||||
PlatformRuntime.logger.error(ex);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
Desktop.getDesktop().browse(safeURL);
|
||||
} catch (Throwable var5) {
|
||||
PlatformRuntime.logger.error("Failed to browse to URL: {}", safeURL.toString());
|
||||
PlatformRuntime.logger.error(var5);
|
||||
}
|
||||
}
|
||||
|
||||
public static void setClipboard(String text) {
|
||||
glfwSetClipboardString(win, text);
|
||||
}
|
||||
|
||||
public static String getClipboard() {
|
||||
String str = glfwGetClipboardString(win);
|
||||
return str == null ? "" : str;
|
||||
}
|
||||
|
||||
public static void setLocalStorage(String name, byte[] data) {
|
||||
setLocalStorage(name, data, true);
|
||||
}
|
||||
|
||||
public static void setLocalStorage(String name, byte[] data, boolean hooks) {
|
||||
if(data == null) {
|
||||
(new File("_eagstorage."+name+".dat")).delete();
|
||||
}else {
|
||||
try(FileOutputStream f = new FileOutputStream(new File("_eagstorage."+name+".dat"))) {
|
||||
f.write(data);
|
||||
} catch (IOException e) {
|
||||
EagRuntime.debugPrintStackTrace(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] getLocalStorage(String data) {
|
||||
return getLocalStorage(data, true);
|
||||
}
|
||||
|
||||
public static byte[] getLocalStorage(String data, boolean hooks) {
|
||||
File f = new File("_eagstorage."+data+".dat");
|
||||
if(!f.isFile()) {
|
||||
return null;
|
||||
}
|
||||
byte[] b = new byte[(int)f.length()];
|
||||
try(FileInputStream s = new FileInputStream(f)) {
|
||||
s.read(b);
|
||||
return b;
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static final DateFormat dateFormatSS = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
|
||||
private static final File screeshotsDir = new File("screenshots");
|
||||
|
||||
public static String saveScreenshot() {
|
||||
if(!screeshotsDir.isDirectory() && !screeshotsDir.mkdirs()) {
|
||||
PlatformRuntime.logger.error("Failed to create screenshots directory: {}", screeshotsDir.getAbsolutePath());
|
||||
return "nothing";
|
||||
}
|
||||
String name = "screenshot_" + dateFormatSS.format(new Date()).toString() + ".png";
|
||||
int w = PlatformInput.getWindowWidth();
|
||||
int h = PlatformInput.getWindowHeight();
|
||||
ByteBuffer screenshotBuffer = PlatformRuntime.allocateByteBuffer(w * h * 4);
|
||||
PlatformOpenGL._wglReadPixels(0, 0, w, h, RealOpenGLEnums.GL_RGBA, RealOpenGLEnums.GL_UNSIGNED_BYTE, screenshotBuffer);
|
||||
BufferedImage bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
|
||||
int i;
|
||||
for(int y = 0; y < h; ++y) {
|
||||
for(int x = 0; x < w; ++x) {
|
||||
i = (x + (h - y - 1) * w) << 2;
|
||||
bufferedImage.setRGB(x, y,
|
||||
((screenshotBuffer.get(i) & 0xFF) << 16) | ((screenshotBuffer.get(i + 1) & 0xFF) << 8)
|
||||
| (screenshotBuffer.get(i + 2) & 0xFF) | 0xFF000000);
|
||||
}
|
||||
}
|
||||
PlatformRuntime.freeByteBuffer(screenshotBuffer);
|
||||
File screenshotFile = new File(screeshotsDir, name);
|
||||
try {
|
||||
ImageIO.write(bufferedImage, "PNG", screenshotFile);
|
||||
}catch(IOException ex) {
|
||||
PlatformRuntime.logger.error("Failed to write screenshot: {}", screenshotFile.getAbsolutePath());
|
||||
return "nothing";
|
||||
}
|
||||
PlatformRuntime.logger.info("Saved screenshot to: {}", screenshotFile.getAbsolutePath());
|
||||
return name;
|
||||
}
|
||||
|
||||
public static void showPopup(String msg) {
|
||||
JOptionPane pane = new JOptionPane(msg, JOptionPane.WARNING_MESSAGE, JOptionPane.DEFAULT_OPTION, null,
|
||||
new Object[] { "OK" }, "OK");
|
||||
pane.setInitialValue("OK");
|
||||
JDialog dialog = pane.createDialog("EaglercraftX Runtime");
|
||||
pane.selectInitialValue();
|
||||
dialog.setIconImage(Toolkit.getDefaultToolkit().getImage("icon32.png"));
|
||||
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
||||
dialog.setAlwaysOnTop(true);
|
||||
dialog.setModal(true);
|
||||
dialog.setLocationByPlatform(true);
|
||||
dialog.setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE);
|
||||
dialog.setModalityType(ModalityType.TOOLKIT_MODAL);
|
||||
dialog.setLocationRelativeTo(null);
|
||||
dialog.setVisible(true);
|
||||
}
|
||||
|
||||
private static volatile boolean fileChooserOpen = false;
|
||||
private static volatile boolean fileChooserHasResult = false;
|
||||
private static volatile FileChooserResult fileChooserResultObject = null;
|
||||
|
||||
public static void displayFileChooser(final String mime, final String ext) {
|
||||
if(!fileChooserOpen) {
|
||||
fileChooserOpen = true;
|
||||
clearFileChooserResult();
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
runDisplayFileChooser(mime, ext);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private static void runDisplayFileChooser(String mime, String ext) {
|
||||
try {
|
||||
JFileChooser fc = new FileChooserAlwaysOnTop((new File(".")).getAbsoluteFile());
|
||||
fc.setDialogTitle("select a file");
|
||||
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
|
||||
fc.setMultiSelectionEnabled(false);
|
||||
fc.setFileFilter(new FileFilterExt(ext));
|
||||
if(fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
|
||||
File f = fc.getSelectedFile();
|
||||
if(f != null) {
|
||||
String name = f.getName();
|
||||
byte[] bytes = new byte[(int)f.length()];
|
||||
try(FileInputStream is = new FileInputStream(f)) {
|
||||
is.read(bytes);
|
||||
}
|
||||
fileChooserResultObject = new FileChooserResult(name, bytes);
|
||||
}else {
|
||||
fileChooserResultObject = null;
|
||||
}
|
||||
}
|
||||
}catch(Throwable t) {
|
||||
fileChooserResultObject = null;
|
||||
}
|
||||
fileChooserOpen = false;
|
||||
fileChooserHasResult = true;
|
||||
}
|
||||
|
||||
private static class FileChooserAlwaysOnTop extends JFileChooser {
|
||||
|
||||
|
||||
private FileChooserAlwaysOnTop(File file) {
|
||||
super(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
protected JDialog createDialog(Component parent) throws HeadlessException {
|
||||
JDialog dialog = super.createDialog(parent);
|
||||
dialog.setAlwaysOnTop(true);
|
||||
return dialog;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private static class FileFilterExt extends FileFilter {
|
||||
@ -87,89 +251,10 @@ public class PlatformApplication {
|
||||
|
||||
}
|
||||
|
||||
private static long win = 0l;
|
||||
|
||||
private static final DateFormat dateFormatSS = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
|
||||
|
||||
private static final File screeshotsDir = new File("screenshots");
|
||||
|
||||
private static volatile boolean fileChooserOpen = false;
|
||||
|
||||
private static volatile boolean fileChooserHasResult = false;
|
||||
|
||||
private static volatile FileChooserResult fileChooserResultObject = null;
|
||||
|
||||
private static MainMenuCreditsDialog creditsDialog = null;
|
||||
|
||||
private static final File downloadsDirectory = new File("downloads");
|
||||
private static final Logger downloadsLogger = LogManager.getLogger("DownloadsFolder");
|
||||
|
||||
public static void addLogMessage(String logMessage, boolean isError) {
|
||||
|
||||
}
|
||||
|
||||
public static void clearFileChooserResult() {
|
||||
fileChooserHasResult = false;
|
||||
fileChooserResultObject = null;
|
||||
}
|
||||
|
||||
public static void displayFileChooser(final String mime, final String ext) {
|
||||
if (!fileChooserOpen) {
|
||||
fileChooserOpen = true;
|
||||
clearFileChooserResult();
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
runDisplayFileChooser(mime, ext);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public static void downloadFileWithName(String fileName, byte[] fileContents) {
|
||||
if (!downloadsDirectory.isDirectory() && !downloadsDirectory.mkdirs()) {
|
||||
throw new RuntimeException("Could not create directory: " + downloadsDirectory.getAbsolutePath());
|
||||
}
|
||||
|
||||
File f = new File(downloadsDirectory, fileName);
|
||||
if (f.exists()) {
|
||||
String name = fileName;
|
||||
String ext = "";
|
||||
int i = fileName.lastIndexOf('.');
|
||||
if (i != -1) {
|
||||
name = fileName.substring(0, i);
|
||||
ext = fileName.substring(i);
|
||||
}
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
f = new File(downloadsDirectory, name + " (" + (++i) + ")" + ext);
|
||||
} while (f.exists());
|
||||
}
|
||||
|
||||
try (FileOutputStream fos = new FileOutputStream(f)) {
|
||||
fos.write(fileContents);
|
||||
} catch (IOException ex) {
|
||||
throw new RuntimeException("Could not save file: " + f.getAbsolutePath());
|
||||
}
|
||||
|
||||
downloadsLogger.info("Saved {} byte file to: {}", fileContents.length, f.getAbsolutePath());
|
||||
|
||||
try {
|
||||
Desktop.getDesktop().open(downloadsDirectory);
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean fileChooserHasResult() {
|
||||
return fileChooserHasResult;
|
||||
}
|
||||
|
||||
public static String getClipboard() {
|
||||
String str = glfwGetClipboardString(win);
|
||||
return str == null ? "" : str;
|
||||
}
|
||||
|
||||
public static FileChooserResult getFileChooserResult() {
|
||||
fileChooserHasResult = false;
|
||||
FileChooserResult res = fileChooserResultObject;
|
||||
@ -177,34 +262,15 @@ public class PlatformApplication {
|
||||
return res;
|
||||
}
|
||||
|
||||
public static byte[] getLocalStorage(String data) {
|
||||
return getLocalStorage(data, true);
|
||||
public static void clearFileChooserResult() {
|
||||
fileChooserHasResult = false;
|
||||
fileChooserResultObject = null;
|
||||
}
|
||||
|
||||
public static byte[] getLocalStorage(String data, boolean hooks) {
|
||||
File f = new File("_eagstorage." + data + ".dat");
|
||||
if (!f.isFile()) {
|
||||
return null;
|
||||
}
|
||||
byte[] b = new byte[(int) f.length()];
|
||||
try (FileInputStream s = new FileInputStream(f)) {
|
||||
s.read(b);
|
||||
return b;
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static void initHooks(long glfwWindow) {
|
||||
win = glfwWindow;
|
||||
}
|
||||
|
||||
public static boolean isShowingDebugConsole() {
|
||||
return false;
|
||||
}
|
||||
private static MainMenuCreditsDialog creditsDialog = null;
|
||||
|
||||
public static void openCreditsPopup(String text) {
|
||||
if (creditsDialog == null) {
|
||||
if(creditsDialog == null) {
|
||||
creditsDialog = new MainMenuCreditsDialog();
|
||||
}
|
||||
creditsDialog.setCreditsText(text);
|
||||
@ -212,130 +278,58 @@ public class PlatformApplication {
|
||||
creditsDialog.setVisible(true);
|
||||
}
|
||||
|
||||
public static void openLink(String url) {
|
||||
URI safeURL;
|
||||
try {
|
||||
safeURL = new URI(url);
|
||||
String proto = safeURL.getScheme();
|
||||
if (!proto.equalsIgnoreCase("http") && !proto.equalsIgnoreCase("https")) {
|
||||
throw new IllegalArgumentException("Suspicious protocol: " + proto);
|
||||
private static final File downloadsDirectory = new File("downloads");
|
||||
private static final Logger downloadsLogger = LogManager.getLogger("DownloadsFolder");
|
||||
|
||||
public static void downloadFileWithName(String fileName, byte[] fileContents) {
|
||||
if(!downloadsDirectory.isDirectory() && !downloadsDirectory.mkdirs()) {
|
||||
throw new RuntimeException("Could not create directory: " + downloadsDirectory.getAbsolutePath());
|
||||
}
|
||||
|
||||
File f = new File(downloadsDirectory, fileName);
|
||||
if(f.exists()) {
|
||||
String name = fileName;
|
||||
String ext = "";
|
||||
int i = fileName.lastIndexOf('.');
|
||||
if(i != -1) {
|
||||
name = fileName.substring(0, i);
|
||||
ext = fileName.substring(i);
|
||||
}
|
||||
} catch (URISyntaxException | IllegalArgumentException ex) {
|
||||
PlatformRuntime.logger.error("Refusing to open invalid URL: {}", url);
|
||||
PlatformRuntime.logger.error(ex);
|
||||
return;
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
f = new File(downloadsDirectory, name + " (" + (++i) + ")" + ext);
|
||||
}while(f.exists());
|
||||
}
|
||||
|
||||
try(FileOutputStream fos = new FileOutputStream(f)) {
|
||||
fos.write(fileContents);
|
||||
}catch(IOException ex) {
|
||||
throw new RuntimeException("Could not save file: " + f.getAbsolutePath());
|
||||
}
|
||||
|
||||
downloadsLogger.info("Saved {} byte file to: {}", fileContents.length, f.getAbsolutePath());
|
||||
|
||||
try {
|
||||
Desktop.getDesktop().browse(safeURL);
|
||||
} catch (Throwable var5) {
|
||||
PlatformRuntime.logger.error("Failed to browse to URL: {}", safeURL.toString());
|
||||
PlatformRuntime.logger.error(var5);
|
||||
Desktop.getDesktop().open(downloadsDirectory);
|
||||
}catch(Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
private static void runDisplayFileChooser(String mime, String ext) {
|
||||
try {
|
||||
JFileChooser fc = new FileChooserAlwaysOnTop((new File(".")).getAbsoluteFile());
|
||||
fc.setDialogTitle("select a file");
|
||||
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
|
||||
fc.setMultiSelectionEnabled(false);
|
||||
fc.setFileFilter(new FileFilterExt(ext));
|
||||
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
|
||||
File f = fc.getSelectedFile();
|
||||
if (f != null) {
|
||||
String name = f.getName();
|
||||
byte[] bytes = new byte[(int) f.length()];
|
||||
try (FileInputStream is = new FileInputStream(f)) {
|
||||
is.read(bytes);
|
||||
}
|
||||
fileChooserResultObject = new FileChooserResult(name, bytes);
|
||||
} else {
|
||||
fileChooserResultObject = null;
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
fileChooserResultObject = null;
|
||||
}
|
||||
fileChooserOpen = false;
|
||||
fileChooserHasResult = true;
|
||||
public static void addLogMessage(String logMessage, boolean isError) {
|
||||
|
||||
}
|
||||
|
||||
public static String saveScreenshot() {
|
||||
if (!screeshotsDir.isDirectory() && !screeshotsDir.mkdirs()) {
|
||||
PlatformRuntime.logger.error("Failed to create screenshots directory: {}", screeshotsDir.getAbsolutePath());
|
||||
return "nothing";
|
||||
}
|
||||
String name = "screenshot_" + dateFormatSS.format(new Date()).toString() + ".png";
|
||||
int w = PlatformInput.getWindowWidth();
|
||||
int h = PlatformInput.getWindowHeight();
|
||||
ByteBuffer screenshotBuffer = PlatformRuntime.allocateByteBuffer(w * h * 4);
|
||||
PlatformOpenGL._wglReadPixels(0, 0, w, h, RealOpenGLEnums.GL_RGBA, RealOpenGLEnums.GL_UNSIGNED_BYTE,
|
||||
screenshotBuffer);
|
||||
BufferedImage bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
|
||||
int i;
|
||||
for (int y = 0; y < h; ++y) {
|
||||
for (int x = 0; x < w; ++x) {
|
||||
i = (x + (h - y - 1) * w) << 2;
|
||||
bufferedImage.setRGB(x, y,
|
||||
((screenshotBuffer.get(i) & 0xFF) << 16) | ((screenshotBuffer.get(i + 1) & 0xFF) << 8)
|
||||
| (screenshotBuffer.get(i + 2) & 0xFF) | 0xFF000000);
|
||||
}
|
||||
}
|
||||
PlatformRuntime.freeByteBuffer(screenshotBuffer);
|
||||
File screenshotFile = new File(screeshotsDir, name);
|
||||
try {
|
||||
ImageIO.write(bufferedImage, "PNG", screenshotFile);
|
||||
} catch (IOException ex) {
|
||||
PlatformRuntime.logger.error("Failed to write screenshot: {}", screenshotFile.getAbsolutePath());
|
||||
return "nothing";
|
||||
}
|
||||
PlatformRuntime.logger.info("Saved screenshot to: {}", screenshotFile.getAbsolutePath());
|
||||
return name;
|
||||
}
|
||||
|
||||
public static void setClipboard(String text) {
|
||||
glfwSetClipboardString(win, text);
|
||||
}
|
||||
|
||||
public static void setLocalStorage(String name, byte[] data) {
|
||||
setLocalStorage(name, data, true);
|
||||
}
|
||||
|
||||
public static void setLocalStorage(String name, byte[] data, boolean hooks) {
|
||||
if (data == null) {
|
||||
(new File("_eagstorage." + name + ".dat")).delete();
|
||||
} else {
|
||||
try (FileOutputStream f = new FileOutputStream(new File("_eagstorage." + name + ".dat"))) {
|
||||
f.write(data);
|
||||
} catch (IOException e) {
|
||||
EagRuntime.debugPrintStackTrace(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void setMCServerWindowGlobal(String str) {
|
||||
|
||||
public static boolean isShowingDebugConsole() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void showDebugConsole() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void showPopup(String msg) {
|
||||
JOptionPane pane = new JOptionPane(msg, JOptionPane.WARNING_MESSAGE, JOptionPane.DEFAULT_OPTION, null,
|
||||
new Object[] { "OK" }, "OK");
|
||||
pane.setInitialValue("OK");
|
||||
JDialog dialog = pane.createDialog("EaglercraftX Runtime");
|
||||
pane.selectInitialValue();
|
||||
dialog.setIconImage(Toolkit.getDefaultToolkit().getImage("icon32.png"));
|
||||
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
||||
dialog.setAlwaysOnTop(true);
|
||||
dialog.setModal(true);
|
||||
dialog.setLocationByPlatform(true);
|
||||
dialog.setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE);
|
||||
dialog.setModalityType(ModalityType.TOOLKIT_MODAL);
|
||||
dialog.setLocationRelativeTo(null);
|
||||
dialog.setVisible(true);
|
||||
public static void setMCServerWindowGlobal(String str) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
@ -13,22 +29,6 @@ import javax.imageio.ImageIO;
|
||||
import net.lax1dude.eaglercraft.v1_8.EaglerInputStream;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.ImageData;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class PlatformAssets {
|
||||
|
||||
static URL getDesktopResourceURL(String path) {
|
||||
@ -98,4 +98,4 @@ public class PlatformAssets {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,18 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.paulscode.lwjgl3.LibraryLWJGLOpenAL;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import paulscode.sound.SoundSystem;
|
||||
import paulscode.sound.SoundSystemConfig;
|
||||
import paulscode.sound.SoundSystemLogger;
|
||||
import paulscode.sound.codecs.CodecJOrbis;
|
||||
import paulscode.sound.codecs.CodecWav;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -28,6 +14,21 @@ import paulscode.sound.codecs.CodecWav;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.paulscode.lwjgl3.LibraryLWJGLOpenAL;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import paulscode.sound.SoundSystem;
|
||||
import paulscode.sound.SoundSystemConfig;
|
||||
import paulscode.sound.SoundSystemLogger;
|
||||
import paulscode.sound.codecs.CodecJOrbis;
|
||||
import paulscode.sound.codecs.CodecWav;
|
||||
|
||||
public class PlatformAudio {
|
||||
|
||||
protected static class PaulscodeAudioHandle implements IAudioHandle {
|
||||
@ -249,4 +250,4 @@ public class PlatformAudio {
|
||||
// nope
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,14 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.DebugFilesystem;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.JDBCFilesystem;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.JDBCFilesystemConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -24,6 +14,17 @@ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.DebugFilesystem;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.JDBCFilesystem;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.JDBCFilesystemConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
|
||||
public class PlatformFilesystem {
|
||||
|
||||
public static final Logger logger = LogManager.getLogger("PlatformFilesystem");
|
||||
@ -79,4 +80,4 @@ public class PlatformFilesystem {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import static org.lwjgl.glfw.GLFW.GLFW_ARROW_CURSOR;
|
||||
@ -70,22 +86,6 @@ import org.lwjgl.glfw.GLFWGamepadState;
|
||||
import org.lwjgl.glfw.GLFWVidMode;
|
||||
import org.lwjgl.system.MemoryStack;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class PlatformInput {
|
||||
|
||||
private static class Gamepad {
|
||||
@ -955,4 +955,4 @@ public class PlatformInput {
|
||||
return b;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import java.net.URI;
|
||||
@ -7,22 +23,6 @@ import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.DesktopWebSocketClient;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class PlatformNetworking {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger("PlatformNetworking");
|
||||
@ -43,4 +43,4 @@ public class PlatformNetworking {
|
||||
return new DesktopWebSocketClient(uri);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import static org.lwjgl.egl.EGL10.EGL_VERSION;
|
||||
@ -85,22 +101,6 @@ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerFolderResourcePack;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.ServerPlatformSingleplayer;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class PlatformRuntime {
|
||||
|
||||
public static class NativeNIO {
|
||||
@ -744,4 +744,4 @@ public class PlatformRuntime {
|
||||
PlatformRuntime.logger.fatal("Crash report was written to: {}", file2.getAbsolutePath());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,8 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.recording.EnumScreenRecordingCodec;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -18,6 +14,11 @@ import net.lax1dude.eaglercraft.v1_8.recording.EnumScreenRecordingCodec;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.recording.EnumScreenRecordingCodec;
|
||||
|
||||
public class PlatformScreenRecord {
|
||||
|
||||
public static void endRecording() {
|
||||
@ -56,4 +57,4 @@ public class PlatformScreenRecord {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,10 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.update.UpdateCertificate;
|
||||
import net.lax1dude.eaglercraft.v1_8.update.UpdateProgressStruct;
|
||||
import net.lax1dude.eaglercraft.v1_8.update.UpdateResultObj;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -20,6 +14,13 @@ import net.lax1dude.eaglercraft.v1_8.update.UpdateResultObj;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.update.UpdateCertificate;
|
||||
import net.lax1dude.eaglercraft.v1_8.update.UpdateProgressStruct;
|
||||
import net.lax1dude.eaglercraft.v1_8.update.UpdateResultObj;
|
||||
|
||||
public class PlatformUpdateSvc {
|
||||
|
||||
private static final UpdateProgressStruct dummyStruct = new UpdateProgressStruct();
|
||||
@ -64,4 +65,4 @@ public class PlatformUpdateSvc {
|
||||
public static boolean supported() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID;
|
||||
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelReadyState;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2024 ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -19,15 +14,18 @@ import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelReadyState;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID;
|
||||
import net.lax1dude.eaglercraft.v1_8.voice.EnumVoiceChannelReadyState;
|
||||
|
||||
public class PlatformVoiceClient {
|
||||
|
||||
public static void activateVoice(boolean talk) {
|
||||
|
||||
}
|
||||
|
||||
public static EnumVoiceChannelReadyState getReadyState() {
|
||||
return EnumVoiceChannelReadyState.NONE;
|
||||
}
|
||||
|
||||
public static void initialize() {
|
||||
|
||||
@ -41,29 +39,17 @@ public class PlatformVoiceClient {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void mutePeer(EaglercraftUUID uuid, boolean mute) {
|
||||
|
||||
}
|
||||
|
||||
public static void resetPeerStates() {
|
||||
|
||||
}
|
||||
|
||||
public static void setICEServers(String[] servs) {
|
||||
|
||||
}
|
||||
|
||||
public static void setMicVolume(float f) {
|
||||
|
||||
}
|
||||
|
||||
public static void setVoiceListenVolume(float f) {
|
||||
|
||||
}
|
||||
|
||||
public static void setVoiceProximity(int prox) {
|
||||
|
||||
}
|
||||
|
||||
public static void setVoiceSpeakVolume(float f) {
|
||||
|
||||
@ -93,4 +79,24 @@ public class PlatformVoiceClient {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
public static void resetPeerStates() {
|
||||
|
||||
}
|
||||
|
||||
public static void setVoiceProximity(int prox) {
|
||||
|
||||
}
|
||||
|
||||
public static void setMicVolume(float f) {
|
||||
|
||||
}
|
||||
|
||||
public static void mutePeer(EaglercraftUUID uuid, boolean mute) {
|
||||
|
||||
}
|
||||
|
||||
public static EnumVoiceChannelReadyState getReadyState() {
|
||||
return EnumVoiceChannelReadyState.NONE;
|
||||
}
|
||||
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2024 ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@ -47,22 +63,6 @@ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.internal.ClientPlatformSingleplayer;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.lan.LANPeerEvent;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class PlatformWebRTC {
|
||||
|
||||
public static class LANClient {
|
||||
|
@ -1,25 +1,25 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewServer;
|
||||
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.server.SPacketWebViewMessageV4EAG;
|
||||
import net.lax1dude.eaglercraft.v1_8.webview.WebViewOverlayController.IPacketSendCallback;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class PlatformWebView {
|
||||
|
||||
private static FallbackWebViewServer fallbackServer = null;
|
||||
@ -91,4 +91,4 @@ public class PlatformWebView {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,8 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import org.lwjgl.system.jemalloc.JEmalloc;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -18,6 +14,11 @@ import org.lwjgl.system.jemalloc.JEmalloc;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import org.lwjgl.system.jemalloc.JEmalloc;
|
||||
|
||||
public class EaglerLWJGLAllocator {
|
||||
|
||||
public static class WrongBufferClassType extends RuntimeException {
|
||||
@ -213,4 +214,4 @@ public class EaglerLWJGLAllocator {
|
||||
throw notOriginal(clazz);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,9 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import net.lax1dude.unsafememcpy.UnsafeMemcpy;
|
||||
import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2025 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -19,6 +14,12 @@ import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import net.lax1dude.unsafememcpy.UnsafeMemcpy;
|
||||
import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
|
||||
public class EaglerLWJGLByteBuffer extends ByteBuffer {
|
||||
|
||||
final long address;
|
||||
@ -220,13 +221,6 @@ public class EaglerLWJGLByteBuffer extends ByteBuffer {
|
||||
return limit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer limit(int newLimit) {
|
||||
if (newLimit < 0 || newLimit > capacity)
|
||||
throw Buffer.makeIOOBE(newLimit);
|
||||
limit = newLimit;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer mark() {
|
||||
@ -239,13 +233,6 @@ public class EaglerLWJGLByteBuffer extends ByteBuffer {
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer position(int newPosition) {
|
||||
if (newPosition < 0 || newPosition > limit)
|
||||
throw Buffer.makeIOOBE(newPosition);
|
||||
position = newPosition;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer put(byte b) {
|
||||
@ -409,4 +396,18 @@ public class EaglerLWJGLByteBuffer extends ByteBuffer {
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public ByteBuffer limit(int newLimit) {
|
||||
if(newLimit < 0 || newLimit > capacity) throw Buffer.makeIOOBE(newLimit);
|
||||
limit = newLimit;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer position(int newPosition) {
|
||||
if(newPosition < 0 || newPosition > limit) throw Buffer.makeIOOBE(newPosition);
|
||||
position = newPosition;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
@ -1,9 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import net.lax1dude.unsafememcpy.UnsafeMemcpy;
|
||||
import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2025 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -19,6 +14,12 @@ import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import net.lax1dude.unsafememcpy.UnsafeMemcpy;
|
||||
import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
|
||||
public class EaglerLWJGLFloatBuffer extends FloatBuffer {
|
||||
|
||||
private static final int SHIFT = 2;
|
||||
@ -134,14 +135,6 @@ public class EaglerLWJGLFloatBuffer extends FloatBuffer {
|
||||
return limit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FloatBuffer limit(int newLimit) {
|
||||
if (newLimit < 0 || newLimit > capacity)
|
||||
throw Buffer.makeIOOBE(newLimit);
|
||||
limit = newLimit;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FloatBuffer mark() {
|
||||
mark = position;
|
||||
@ -153,13 +146,6 @@ public class EaglerLWJGLFloatBuffer extends FloatBuffer {
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FloatBuffer position(int newPosition) {
|
||||
if (newPosition < 0 || newPosition > limit)
|
||||
throw Buffer.makeIOOBE(newPosition);
|
||||
position = newPosition;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FloatBuffer put(float b) {
|
||||
@ -245,4 +231,18 @@ public class EaglerLWJGLFloatBuffer extends FloatBuffer {
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public FloatBuffer limit(int newLimit) {
|
||||
if(newLimit < 0 || newLimit > capacity) throw Buffer.makeIOOBE(newLimit);
|
||||
limit = newLimit;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FloatBuffer position(int newPosition) {
|
||||
if(newPosition < 0 || newPosition > limit) throw Buffer.makeIOOBE(newPosition);
|
||||
position = newPosition;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
@ -1,9 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import net.lax1dude.unsafememcpy.UnsafeMemcpy;
|
||||
import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2025 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -19,6 +14,12 @@ import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import net.lax1dude.unsafememcpy.UnsafeMemcpy;
|
||||
import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
|
||||
public class EaglerLWJGLIntBuffer extends IntBuffer {
|
||||
|
||||
private static final int SHIFT = 2;
|
||||
@ -134,14 +135,6 @@ public class EaglerLWJGLIntBuffer extends IntBuffer {
|
||||
return limit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IntBuffer limit(int newLimit) {
|
||||
if (newLimit < 0 || newLimit > capacity)
|
||||
throw Buffer.makeIOOBE(newLimit);
|
||||
limit = newLimit;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IntBuffer mark() {
|
||||
mark = position;
|
||||
@ -153,14 +146,6 @@ public class EaglerLWJGLIntBuffer extends IntBuffer {
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IntBuffer position(int newPosition) {
|
||||
if (newPosition < 0 || newPosition > limit)
|
||||
throw Buffer.makeIOOBE(newPosition);
|
||||
position = newPosition;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IntBuffer put(int b) {
|
||||
if (position >= limit)
|
||||
@ -245,4 +230,18 @@ public class EaglerLWJGLIntBuffer extends IntBuffer {
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public IntBuffer limit(int newLimit) {
|
||||
if(newLimit < 0 || newLimit > capacity) throw Buffer.makeIOOBE(newLimit);
|
||||
limit = newLimit;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IntBuffer position(int newPosition) {
|
||||
if(newPosition < 0 || newPosition > limit) throw Buffer.makeIOOBE(newPosition);
|
||||
position = newPosition;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
@ -1,9 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import net.lax1dude.unsafememcpy.UnsafeMemcpy;
|
||||
import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2025 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -19,6 +14,12 @@ import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.buffer;
|
||||
|
||||
import net.lax1dude.unsafememcpy.UnsafeMemcpy;
|
||||
import net.lax1dude.unsafememcpy.UnsafeUtils;
|
||||
|
||||
public class EaglerLWJGLShortBuffer extends ShortBuffer {
|
||||
|
||||
private static final int SHIFT = 1;
|
||||
@ -134,13 +135,6 @@ public class EaglerLWJGLShortBuffer extends ShortBuffer {
|
||||
return limit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShortBuffer limit(int newLimit) {
|
||||
if (newLimit < 0 || newLimit > capacity)
|
||||
throw Buffer.makeIOOBE(newLimit);
|
||||
limit = newLimit;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShortBuffer mark() {
|
||||
@ -153,13 +147,6 @@ public class EaglerLWJGLShortBuffer extends ShortBuffer {
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShortBuffer position(int newPosition) {
|
||||
if (newPosition < 0 || newPosition > limit)
|
||||
throw Buffer.makeIOOBE(newPosition);
|
||||
position = newPosition;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShortBuffer put(int index, short b) {
|
||||
@ -245,4 +232,18 @@ public class EaglerLWJGLShortBuffer extends ShortBuffer {
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public ShortBuffer limit(int newLimit) {
|
||||
if(newLimit < 0 || newLimit > capacity) throw Buffer.makeIOOBE(newLimit);
|
||||
limit = newLimit;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShortBuffer position(int newPosition) {
|
||||
if(newPosition < 0 || newPosition > limit) throw Buffer.makeIOOBE(newPosition);
|
||||
position = newPosition;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.io.File;
|
||||
@ -13,22 +29,6 @@ import net.lax1dude.eaglercraft.v1_8.internal.buffer.ByteBuffer;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.vfs2.EaglerFileSystemException;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.vfs2.VFSIterator2.BreakLoop;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class DebugFilesystem implements IEaglerFilesystem {
|
||||
|
||||
public static DebugFilesystem initialize(String fsName, File filesystemRoot) {
|
||||
@ -226,10 +226,6 @@ public class DebugFilesystem implements IEaglerFilesystem {
|
||||
return new File(filesystemRoot, path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRamdisk() {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void iterateFile(String pathName, File f, VFSFilenameIterator itr, boolean recursive) {
|
||||
if (!f.exists()) {
|
||||
@ -253,4 +249,11 @@ public class DebugFilesystem implements IEaglerFilesystem {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isRamdisk() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -12,67 +28,14 @@ import net.lax1dude.eaglercraft.v1_8.internal.IClientConfigAdapter;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IClientConfigAdapterHooks;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayEntry;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
|
||||
private static class DesktopClientConfigAdapterHooks implements IClientConfigAdapterHooks {
|
||||
|
||||
@Override
|
||||
public void callCrashReportHook(String crashReport, Consumer<String> customMessageCB) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String callLocalStorageLoadHook(String key) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void callLocalStorageSavedHook(String key, String base64) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void callScreenChangedHook(String screenName, int scaledWidth, int scaledHeight, int realWidth,
|
||||
int realHeight, int scaleFactor) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static final IClientConfigAdapter instance = new DesktopClientConfigAdapter();
|
||||
|
||||
public final List<DefaultServer> defaultServers = new ArrayList<>();
|
||||
|
||||
private final DesktopClientConfigAdapterHooks hooks = new DesktopClientConfigAdapterHooks();
|
||||
|
||||
private final List<RelayEntry> relays = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public boolean allowUpdateDL() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowUpdateSvc() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultLocale() {
|
||||
return "en_US";
|
||||
@ -83,42 +46,6 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
return defaultServers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDownloadOfflineButtonLink() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IClientConfigAdapterHooks getHooks() {
|
||||
return hooks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject getIntegratedServerOpts() {
|
||||
return new JSONObject("{\"container\":null,\"worldsDB\":\"worlds\"}");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalStorageNamespace() {
|
||||
return EaglercraftVersion.localStorageNamespace;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RelayEntry> getRelays() {
|
||||
if (relays.isEmpty()) {
|
||||
int relayId = (new EaglercraftRandom()).nextInt(3);
|
||||
relays.add(new RelayEntry("wss://relay.deev.is/", "lax1dude relay #1", relayId == 0));
|
||||
relays.add(new RelayEntry("wss://relay.lax1dude.net/", "lax1dude relay #2", relayId == 1));
|
||||
relays.add(new RelayEntry("wss://relay.shhnowisnottheti.me/", "ayunami relay #1", relayId == 2));
|
||||
}
|
||||
return relays;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getResourcePacksDB() {
|
||||
return "resourcePacks";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerToJoin() {
|
||||
return null;
|
||||
@ -130,23 +57,26 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowBootMenu() {
|
||||
return false;
|
||||
public String getResourcePacksDB() {
|
||||
return "resourcePacks";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowFNAWSkins() {
|
||||
return true;
|
||||
public JSONObject getIntegratedServerOpts() {
|
||||
return new JSONObject("{\"container\":null,\"worldsDB\":\"worlds\"}");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowServerRedirects() {
|
||||
return true;
|
||||
}
|
||||
private final List<RelayEntry> relays = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public boolean isAllowVoiceClient() {
|
||||
return false;
|
||||
public List<RelayEntry> getRelays() {
|
||||
if (relays.isEmpty()) {
|
||||
int relayId = (new EaglercraftRandom()).nextInt(3);
|
||||
relays.add(new RelayEntry("wss://relay.deev.is/", "lax1dude relay #1", relayId == 0));
|
||||
relays.add(new RelayEntry("wss://relay.lax1dude.net/", "lax1dude relay #2", relayId == 1));
|
||||
relays.add(new RelayEntry("wss://relay.shhnowisnottheti.me/", "ayunami relay #1", relayId == 2));
|
||||
}
|
||||
return relays;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -154,11 +84,6 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCheckRelaysForUpdates() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCheckShaderGLErrors() {
|
||||
return false;
|
||||
@ -170,7 +95,12 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEaglerNoDelay() {
|
||||
public boolean allowUpdateSvc() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowUpdateDL() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -179,6 +109,46 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDownloadOfflineButtonLink() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useSpecialCursors() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLogInvalidCerts() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCheckRelaysForUpdates() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnableSignatureBadge() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowVoiceClient() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowFNAWSkins() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalStorageNamespace() {
|
||||
return EaglercraftVersion.localStorageNamespace;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnableMinceraft() {
|
||||
return true;
|
||||
@ -190,22 +160,12 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnableSignatureBadge() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnableWebViewCSP() {
|
||||
public boolean isAllowServerRedirects() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnforceVSync() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isForceProfanityFilter() {
|
||||
public boolean isOpenDebugConsoleOnLaunch() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -215,12 +175,22 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLogInvalidCerts() {
|
||||
public boolean isEnableWebViewCSP() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowBootMenu() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpenDebugConsoleOnLaunch() {
|
||||
public boolean isForceProfanityFilter() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEaglerNoDelay() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -230,8 +200,38 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useSpecialCursors() {
|
||||
public boolean isEnforceVSync() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public IClientConfigAdapterHooks getHooks() {
|
||||
return hooks;
|
||||
}
|
||||
|
||||
private static class DesktopClientConfigAdapterHooks implements IClientConfigAdapterHooks {
|
||||
|
||||
@Override
|
||||
public void callLocalStorageSavedHook(String key, String base64) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String callLocalStorageLoadHook(String key) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void callCrashReportHook(String crashReport, Consumer<String> customMessageCB) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void callScreenChangedHook(String screenName, int scaledWidth, int scaledHeight, int realWidth,
|
||||
int realHeight, int scaleFactor) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.net.URI;
|
||||
@ -8,22 +24,6 @@ import net.lax1dude.eaglercraft.v1_8.internal.EnumEaglerConnectionState;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class DesktopWebSocketClient extends AbstractWebSocketClient {
|
||||
|
||||
static final Logger logger = LogManager.getLogger("DesktopWebSocketClient");
|
||||
@ -72,14 +72,6 @@ public class DesktopWebSocketClient extends AbstractWebSocketClient {
|
||||
return playConnectState;
|
||||
}
|
||||
|
||||
public void handleBytes(byte[] array) {
|
||||
addRecievedFrame(new DesktopWebSocketFrameBinary(array));
|
||||
}
|
||||
|
||||
public void handleString(String str) {
|
||||
addRecievedFrame(new DesktopWebSocketFrameString(str));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isClosed() {
|
||||
return playConnectState.isClosed();
|
||||
@ -110,4 +102,13 @@ public class DesktopWebSocketClient extends AbstractWebSocketClient {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void handleString(String str) {
|
||||
addRecievedFrame(new DesktopWebSocketFrameString(str));
|
||||
}
|
||||
|
||||
public void handleBytes(byte[] array) {
|
||||
addRecievedFrame(new DesktopWebSocketFrameBinary(array));
|
||||
}
|
||||
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.io.InputStream;
|
||||
@ -6,22 +22,6 @@ import net.lax1dude.eaglercraft.v1_8.EaglerInputStream;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IWebSocketFrame;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class DesktopWebSocketFrameBinary implements IWebSocketFrame {
|
||||
|
||||
private final byte[] byteArray;
|
||||
@ -32,6 +32,16 @@ public class DesktopWebSocketFrameBinary implements IWebSocketFrame {
|
||||
this.timestamp = PlatformRuntime.steadyTimeMillis();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isString() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray() {
|
||||
return byteArray;
|
||||
@ -47,19 +57,9 @@ public class DesktopWebSocketFrameBinary implements IWebSocketFrame {
|
||||
return byteArray.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isString() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.io.InputStream;
|
||||
@ -5,22 +21,6 @@ import java.io.InputStream;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IWebSocketFrame;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class DesktopWebSocketFrameString implements IWebSocketFrame {
|
||||
|
||||
private final String string;
|
||||
@ -31,6 +31,16 @@ public class DesktopWebSocketFrameString implements IWebSocketFrame {
|
||||
this.timestamp = PlatformRuntime.steadyTimeMillis();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isString() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString() {
|
||||
return string;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray() {
|
||||
return null;
|
||||
@ -46,19 +56,9 @@ public class DesktopWebSocketFrameString implements IWebSocketFrame {
|
||||
return string.length();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString() {
|
||||
return string;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isString() {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,10 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import fi.iki.elonen.NanoHTTPD;
|
||||
import fi.iki.elonen.NanoHTTPD.Response.Status;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -20,6 +14,13 @@ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import fi.iki.elonen.NanoHTTPD;
|
||||
import fi.iki.elonen.NanoHTTPD.Response.Status;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
|
||||
class FallbackWebViewHTTPD extends NanoHTTPD {
|
||||
|
||||
static final Logger logger = FallbackWebViewServer.logger;
|
||||
@ -40,4 +41,4 @@ class FallbackWebViewHTTPD extends NanoHTTPD {
|
||||
"<!DOCTYPE html><html><head><title>Eaglercraft Desktop Runtime</title></head><body><h1>404 Not Found</h1></body></html>");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,17 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.WebViewOptions;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.webview.PermissionsCache;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -27,6 +14,20 @@ import net.lax1dude.eaglercraft.v1_8.webview.PermissionsCache;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.WebViewOptions;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.webview.PermissionsCache;
|
||||
|
||||
class FallbackWebViewProtocol {
|
||||
|
||||
static class CPacketClientHandshake implements FallbackWebViewPacket {
|
||||
@ -300,4 +301,4 @@ class FallbackWebViewProtocol {
|
||||
return json.toString();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
@ -19,22 +35,6 @@ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.server.SPacketWebViewMessageV4EAG;
|
||||
import net.lax1dude.eaglercraft.v1_8.webview.WebViewOverlayController.IPacketSendCallback;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class FallbackWebViewServer {
|
||||
|
||||
static final Logger logger = LogManager.getLogger("FallbackWebViewServer");
|
||||
@ -57,75 +57,16 @@ public class FallbackWebViewServer {
|
||||
this.options = options;
|
||||
}
|
||||
|
||||
public String getURL() {
|
||||
return !dead ? currentURL : null;
|
||||
}
|
||||
|
||||
public void handleMessageFromServer(SPacketWebViewMessageV4EAG packet) {
|
||||
if (packet.type == SPacketWebViewMessageV4EAG.TYPE_STRING) {
|
||||
if (websocketServer != null) {
|
||||
websocketServer.handleServerMessageStr(new String(packet.data, StandardCharsets.UTF_8));
|
||||
} else {
|
||||
logger.error("Recieved string message, but the webview server is not running!");
|
||||
}
|
||||
} else if (packet.type == SPacketWebViewMessageV4EAG.TYPE_BINARY) {
|
||||
if (websocketServer != null) {
|
||||
websocketServer.handleServerMessageBytes(packet.data);
|
||||
} else {
|
||||
logger.error("Recieved string message, but the webview server is not running!");
|
||||
}
|
||||
} else {
|
||||
logger.error("Unknown server webview message type {}", packet.type);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isDead() {
|
||||
return dead;
|
||||
}
|
||||
|
||||
public void killServer() {
|
||||
if (!dead) {
|
||||
dead = true;
|
||||
if (websocketServer != null) {
|
||||
try {
|
||||
websocketServer.stop(10000);
|
||||
} catch (Throwable th) {
|
||||
logger.error("Failed to stop WebSocket server, aborting");
|
||||
logger.error(th);
|
||||
}
|
||||
websocketServer = null;
|
||||
}
|
||||
if (httpServer != null) {
|
||||
try {
|
||||
httpServer.stop();
|
||||
} catch (Throwable th) {
|
||||
logger.error("Failed to stop HTTP server, aborting");
|
||||
logger.error(th);
|
||||
}
|
||||
httpServer = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int randomPort() {
|
||||
try (ServerSocket sockler = new ServerSocket(0)) {
|
||||
return sockler.getLocalPort();
|
||||
} catch (IOException ex) {
|
||||
throw new RuntimeException("Failed to find random port to bind to!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void runTick() {
|
||||
|
||||
}
|
||||
|
||||
public void setPacketSendCallback(IPacketSendCallback callback) {
|
||||
this.callback = callback;
|
||||
if (websocketServer != null) {
|
||||
websocketServer.setEaglerPacketSendCallback(callback);
|
||||
}
|
||||
}
|
||||
|
||||
public void start() throws RuntimeException {
|
||||
dead = false;
|
||||
StringBuilder vigg = new StringBuilder();
|
||||
@ -188,4 +129,67 @@ public class FallbackWebViewServer {
|
||||
logger.info("Listening for HTTP on {}", currentURL);
|
||||
}
|
||||
|
||||
}
|
||||
private int randomPort() {
|
||||
try(ServerSocket sockler = new ServerSocket(0)) {
|
||||
return sockler.getLocalPort();
|
||||
}catch(IOException ex) {
|
||||
throw new RuntimeException("Failed to find random port to bind to!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public String getURL() {
|
||||
return !dead ? currentURL : null;
|
||||
}
|
||||
|
||||
public void handleMessageFromServer(SPacketWebViewMessageV4EAG packet) {
|
||||
if(packet.type == SPacketWebViewMessageV4EAG.TYPE_STRING) {
|
||||
if(websocketServer != null) {
|
||||
websocketServer.handleServerMessageStr(new String(packet.data, StandardCharsets.UTF_8));
|
||||
}else {
|
||||
logger.error("Recieved string message, but the webview server is not running!");
|
||||
}
|
||||
}else if(packet.type == SPacketWebViewMessageV4EAG.TYPE_BINARY) {
|
||||
if(websocketServer != null) {
|
||||
websocketServer.handleServerMessageBytes(packet.data);
|
||||
}else {
|
||||
logger.error("Recieved string message, but the webview server is not running!");
|
||||
}
|
||||
}else {
|
||||
logger.error("Unknown server webview message type {}", packet.type);
|
||||
}
|
||||
}
|
||||
|
||||
public void setPacketSendCallback(IPacketSendCallback callback) {
|
||||
this.callback = callback;
|
||||
if(websocketServer != null) {
|
||||
websocketServer.setEaglerPacketSendCallback(callback);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void killServer() {
|
||||
if(!dead) {
|
||||
dead = true;
|
||||
if(websocketServer != null) {
|
||||
try {
|
||||
websocketServer.stop(10000);
|
||||
} catch (Throwable th) {
|
||||
logger.error("Failed to stop WebSocket server, aborting");
|
||||
logger.error(th);
|
||||
}
|
||||
websocketServer = null;
|
||||
}
|
||||
if(httpServer != null) {
|
||||
try {
|
||||
httpServer.stop();
|
||||
} catch (Throwable th) {
|
||||
logger.error("Failed to stop HTTP server, aborting");
|
||||
logger.error(th);
|
||||
}
|
||||
httpServer = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,7 +1,20 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
import static net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.readPacket;
|
||||
import static net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.writePacket;
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.nio.ByteBuffer;
|
||||
@ -12,16 +25,6 @@ import org.java_websocket.server.WebSocketServer;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.WebViewOptions;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.CPacketClientHandshake;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.CPacketWebViewChannelClose;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.CPacketWebViewChannelOpen;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.CPacketWebViewJSPermission;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.CPacketWebViewMessage;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.EnumWebViewJSPermission;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.FallbackWebViewPacket;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.SPacketServerError;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.SPacketServerHandshake;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.SPacketWebViewMessage;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.GameMessagePacket;
|
||||
import net.lax1dude.eaglercraft.v1_8.socket.protocol.pkt.client.CPacketWebViewMessageEnV4EAG;
|
||||
@ -30,22 +33,8 @@ import net.lax1dude.eaglercraft.v1_8.webview.PermissionsCache;
|
||||
import net.lax1dude.eaglercraft.v1_8.webview.PermissionsCache.Permission;
|
||||
import net.lax1dude.eaglercraft.v1_8.webview.WebViewOverlayController.IPacketSendCallback;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
import static net.lax1dude.eaglercraft.v1_8.internal.lwjgl.FallbackWebViewProtocol.*;
|
||||
|
||||
class FallbackWebViewWSD extends WebSocketServer {
|
||||
|
||||
static final Logger logger = FallbackWebViewServer.logger;
|
||||
@ -81,115 +70,16 @@ class FallbackWebViewWSD extends WebSocketServer {
|
||||
this.start();
|
||||
}
|
||||
|
||||
private void handleClose() {
|
||||
if (currentChannelName != null && callback != null) {
|
||||
callback.sendPacket(new CPacketWebViewMessageEnV4EAG(false, null));
|
||||
}
|
||||
currentChannelName = null;
|
||||
}
|
||||
|
||||
private void handleMessage(ByteBuffer buffer) {
|
||||
if (currentChannelName != null) {
|
||||
safeCallbackSend(new CPacketWebViewMessageV4EAG(buffer.array()));
|
||||
} else {
|
||||
terminate("Sent binary webview message while channel was closed");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleMessage(String str) {
|
||||
WebSocket ws = webSocket;
|
||||
FallbackWebViewPacket _packet = readPacket(str);
|
||||
if (_packet != null) {
|
||||
if (!hasHandshake) {
|
||||
if (_packet instanceof CPacketClientHandshake) {
|
||||
hasHandshake = true;
|
||||
Permission perm = PermissionsCache.getJavaScriptAllowed(options.permissionsOriginUUID,
|
||||
hashPermissionFlags());
|
||||
ws.send(writePacket(
|
||||
new SPacketServerHandshake(options, EnumWebViewJSPermission.fromPermission(perm))));
|
||||
} else {
|
||||
terminate("Unknown or unexpected packet: " + _packet.getClass().getSimpleName());
|
||||
}
|
||||
} else {
|
||||
if (_packet instanceof CPacketWebViewChannelOpen) {
|
||||
CPacketWebViewChannelOpen packet = (CPacketWebViewChannelOpen) _packet;
|
||||
if (currentChannelName == null) {
|
||||
currentChannelName = packet.messageChannel;
|
||||
logger.info("[{}]: opened WebView channel \"{}\"", ws.getRemoteSocketAddress(),
|
||||
packet.messageChannel);
|
||||
safeCallbackSend(new CPacketWebViewMessageEnV4EAG(true, packet.messageChannel));
|
||||
} else {
|
||||
terminate("Tried to open multiple channels");
|
||||
}
|
||||
} else if (_packet instanceof CPacketWebViewMessage) {
|
||||
CPacketWebViewMessage packet = (CPacketWebViewMessage) _packet;
|
||||
if (currentChannelName != null) {
|
||||
safeCallbackSend(new CPacketWebViewMessageV4EAG(packet.messageContent));
|
||||
} else {
|
||||
terminate("Tried to send message without opening channel");
|
||||
}
|
||||
} else if (_packet instanceof CPacketWebViewChannelClose) {
|
||||
if (currentChannelName != null) {
|
||||
currentChannelName = null;
|
||||
safeCallbackSend(new CPacketWebViewMessageEnV4EAG(false, null));
|
||||
} else {
|
||||
terminate("Tried to close missing channel");
|
||||
}
|
||||
} else if (_packet instanceof CPacketWebViewJSPermission) {
|
||||
CPacketWebViewJSPermission packet = (CPacketWebViewJSPermission) _packet;
|
||||
switch (packet.permission) {
|
||||
case NOT_SET:
|
||||
PermissionsCache.clearJavaScriptAllowed(options.permissionsOriginUUID);
|
||||
break;
|
||||
case ALLOW:
|
||||
PermissionsCache.setJavaScriptAllowed(options.permissionsOriginUUID, hashPermissionFlags(),
|
||||
true);
|
||||
break;
|
||||
case BLOCK:
|
||||
PermissionsCache.setJavaScriptAllowed(options.permissionsOriginUUID, hashPermissionFlags(),
|
||||
false);
|
||||
break;
|
||||
default:
|
||||
terminate("Unknown permission state selected!");
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
terminate("Unknown or unexpected packet: " + _packet.getClass().getSimpleName());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
terminate("Invalid packet recieved");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleOpen() {
|
||||
hasHandshake = false;
|
||||
currentChannelName = null;
|
||||
}
|
||||
|
||||
void handleServerMessageBytes(byte[] msg) {
|
||||
if (webSocket != null) {
|
||||
if (currentChannelName != null) {
|
||||
webSocket.send(msg);
|
||||
} else {
|
||||
logger.error("Recieved binary message from server, but the channel is not open!");
|
||||
}
|
||||
} else {
|
||||
logger.error("Recieved binary message from server, but there is no active websocket!");
|
||||
}
|
||||
}
|
||||
|
||||
void handleServerMessageStr(String msg) {
|
||||
if (webSocket != null) {
|
||||
if (currentChannelName != null) {
|
||||
webSocket.send(writePacket(new SPacketWebViewMessage(msg)));
|
||||
} else {
|
||||
logger.error("Recieved string message from server, but the channel is not open!");
|
||||
}
|
||||
} else {
|
||||
logger.error("Recieved string message from server, but there is no active websocket!");
|
||||
private void handleClose() {
|
||||
if(currentChannelName != null && callback != null) {
|
||||
callback.sendPacket(new CPacketWebViewMessageEnV4EAG(false, null));
|
||||
}
|
||||
currentChannelName = null;
|
||||
}
|
||||
|
||||
private int hashPermissionFlags() {
|
||||
@ -199,14 +89,172 @@ class FallbackWebViewWSD extends WebSocketServer {
|
||||
return i;
|
||||
}
|
||||
|
||||
private void handleMessage(String str) {
|
||||
WebSocket ws = webSocket;
|
||||
FallbackWebViewPacket _packet = readPacket(str);
|
||||
if(_packet != null) {
|
||||
if(!hasHandshake) {
|
||||
if(_packet instanceof CPacketClientHandshake) {
|
||||
hasHandshake = true;
|
||||
Permission perm = PermissionsCache.getJavaScriptAllowed(options.permissionsOriginUUID, hashPermissionFlags());
|
||||
ws.send(writePacket(new SPacketServerHandshake(options, EnumWebViewJSPermission.fromPermission(perm))));
|
||||
}else {
|
||||
terminate("Unknown or unexpected packet: " + _packet.getClass().getSimpleName());
|
||||
}
|
||||
}else {
|
||||
if(_packet instanceof CPacketWebViewChannelOpen) {
|
||||
CPacketWebViewChannelOpen packet = (CPacketWebViewChannelOpen)_packet;
|
||||
if(currentChannelName == null) {
|
||||
currentChannelName = packet.messageChannel;
|
||||
logger.info("[{}]: opened WebView channel \"{}\"", ws.getRemoteSocketAddress(), packet.messageChannel);
|
||||
safeCallbackSend(new CPacketWebViewMessageEnV4EAG(true, packet.messageChannel));
|
||||
}else {
|
||||
terminate("Tried to open multiple channels");
|
||||
}
|
||||
}else if(_packet instanceof CPacketWebViewMessage) {
|
||||
CPacketWebViewMessage packet = (CPacketWebViewMessage)_packet;
|
||||
if(currentChannelName != null) {
|
||||
safeCallbackSend(new CPacketWebViewMessageV4EAG(packet.messageContent));
|
||||
}else {
|
||||
terminate("Tried to send message without opening channel");
|
||||
}
|
||||
}else if(_packet instanceof CPacketWebViewChannelClose) {
|
||||
if(currentChannelName != null) {
|
||||
currentChannelName = null;
|
||||
safeCallbackSend(new CPacketWebViewMessageEnV4EAG(false, null));
|
||||
}else {
|
||||
terminate("Tried to close missing channel");
|
||||
}
|
||||
}else if(_packet instanceof CPacketWebViewJSPermission) {
|
||||
CPacketWebViewJSPermission packet = (CPacketWebViewJSPermission)_packet;
|
||||
switch(packet.permission) {
|
||||
case NOT_SET:
|
||||
PermissionsCache.clearJavaScriptAllowed(options.permissionsOriginUUID);
|
||||
break;
|
||||
case ALLOW:
|
||||
PermissionsCache.setJavaScriptAllowed(options.permissionsOriginUUID, hashPermissionFlags(), true);
|
||||
break;
|
||||
case BLOCK:
|
||||
PermissionsCache.setJavaScriptAllowed(options.permissionsOriginUUID, hashPermissionFlags(), false);
|
||||
break;
|
||||
default:
|
||||
terminate("Unknown permission state selected!");
|
||||
break;
|
||||
}
|
||||
|
||||
}else {
|
||||
terminate("Unknown or unexpected packet: " + _packet.getClass().getSimpleName());
|
||||
}
|
||||
}
|
||||
}else {
|
||||
terminate("Invalid packet recieved");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleMessage(ByteBuffer buffer) {
|
||||
if(currentChannelName != null) {
|
||||
safeCallbackSend(new CPacketWebViewMessageV4EAG(buffer.array()));
|
||||
}else {
|
||||
terminate("Sent binary webview message while channel was closed");
|
||||
}
|
||||
}
|
||||
|
||||
private void terminate(String msg) {
|
||||
if(webSocket != null) {
|
||||
logger.error("[{}]: Terminating connection, reason: \"{}\"", webSocket.getRemoteSocketAddress(), msg);
|
||||
webSocket.send(writePacket(new SPacketServerError(msg)));
|
||||
webSocket.close();
|
||||
}
|
||||
}
|
||||
|
||||
private void safeCallbackSend(GameMessagePacket packet) {
|
||||
if(callback != null) {
|
||||
callback.sendPacket(packet);
|
||||
}else {
|
||||
logger.error("webview sent packet to server, but there's no callback registered to send packets!");
|
||||
}
|
||||
}
|
||||
|
||||
void handleServerMessageStr(String msg) {
|
||||
if(webSocket != null) {
|
||||
if(currentChannelName != null) {
|
||||
webSocket.send(writePacket(new SPacketWebViewMessage(msg)));
|
||||
}else {
|
||||
logger.error("Recieved string message from server, but the channel is not open!");
|
||||
}
|
||||
}else {
|
||||
logger.error("Recieved string message from server, but there is no active websocket!");
|
||||
}
|
||||
}
|
||||
|
||||
void handleServerMessageBytes(byte[] msg) {
|
||||
if(webSocket != null) {
|
||||
if(currentChannelName != null) {
|
||||
webSocket.send(msg);
|
||||
}else {
|
||||
logger.error("Recieved binary message from server, but the channel is not open!");
|
||||
}
|
||||
}else {
|
||||
logger.error("Recieved binary message from server, but there is no active websocket!");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
hasStarted = true;
|
||||
if(onStartNotify != null) {
|
||||
synchronized(onStartNotify) {
|
||||
onStartNotify.notifyAll();
|
||||
}
|
||||
onStartNotify = null;
|
||||
}else {
|
||||
logger.warn("No mutex to notify!");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(WebSocket arg0, ClientHandshake arg1) {
|
||||
boolean result;
|
||||
synchronized(webSockMutex) {
|
||||
if(webSocket == null) {
|
||||
webSocket = arg0;
|
||||
result = true;
|
||||
}else {
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
if(result) {
|
||||
logger.info("[{}]: WebSocket connection opened", arg0.getRemoteSocketAddress());
|
||||
handleOpen();
|
||||
}else {
|
||||
logger.error("[{}]: Rejecting duplicate connection", arg0.getRemoteSocketAddress());
|
||||
arg0.send(writePacket(new SPacketServerError("You already have a tab open!")));
|
||||
arg0.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(WebSocket arg0, String arg1) {
|
||||
if(arg0 == webSocket) {
|
||||
handleMessage(arg1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(WebSocket arg0, ByteBuffer arg1) {
|
||||
if(arg0 == webSocket) {
|
||||
handleMessage(arg1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(WebSocket arg0, int arg1, String arg2, boolean arg3) {
|
||||
synchronized (webSockMutex) {
|
||||
if (arg0 == webSocket) {
|
||||
synchronized(webSockMutex) {
|
||||
if(arg0 == webSocket) {
|
||||
logger.info("[{}]: WebSocket connection closed", arg0.getRemoteSocketAddress());
|
||||
try {
|
||||
handleClose();
|
||||
} finally {
|
||||
}finally {
|
||||
webSocket = null;
|
||||
}
|
||||
}
|
||||
@ -219,72 +267,8 @@ class FallbackWebViewWSD extends WebSocketServer {
|
||||
logger.error(arg1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(WebSocket arg0, ByteBuffer arg1) {
|
||||
if (arg0 == webSocket) {
|
||||
handleMessage(arg1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(WebSocket arg0, String arg1) {
|
||||
if (arg0 == webSocket) {
|
||||
handleMessage(arg1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(WebSocket arg0, ClientHandshake arg1) {
|
||||
boolean result;
|
||||
synchronized (webSockMutex) {
|
||||
if (webSocket == null) {
|
||||
webSocket = arg0;
|
||||
result = true;
|
||||
} else {
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
if (result) {
|
||||
logger.info("[{}]: WebSocket connection opened", arg0.getRemoteSocketAddress());
|
||||
handleOpen();
|
||||
} else {
|
||||
logger.error("[{}]: Rejecting duplicate connection", arg0.getRemoteSocketAddress());
|
||||
arg0.send(writePacket(new SPacketServerError("You already have a tab open!")));
|
||||
arg0.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
hasStarted = true;
|
||||
if (onStartNotify != null) {
|
||||
synchronized (onStartNotify) {
|
||||
onStartNotify.notifyAll();
|
||||
}
|
||||
onStartNotify = null;
|
||||
} else {
|
||||
logger.warn("No mutex to notify!");
|
||||
}
|
||||
}
|
||||
|
||||
private void safeCallbackSend(GameMessagePacket packet) {
|
||||
if (callback != null) {
|
||||
callback.sendPacket(packet);
|
||||
} else {
|
||||
logger.error("webview sent packet to server, but there's no callback registered to send packets!");
|
||||
}
|
||||
}
|
||||
|
||||
public void setEaglerPacketSendCallback(IPacketSendCallback callback) {
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
private void terminate(String msg) {
|
||||
if (webSocket != null) {
|
||||
logger.error("[{}]: Terminating connection, reason: \"{}\"", webSocket.getRemoteSocketAddress(), msg);
|
||||
webSocket.send(writePacket(new SPacketServerError(msg)));
|
||||
webSocket.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
@ -13,22 +29,6 @@ import javax.swing.SwingConstants;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class FilesystemConvertingDialog extends JFrame {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@ -76,4 +76,4 @@ public class FilesystemConvertingDialog extends JFrame {
|
||||
progressBar.setValue(val);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.sql.Connection;
|
||||
@ -13,9 +29,9 @@ import java.util.LinkedList;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Properties;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IEaglerFilesystem;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformFilesystem;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.VFSFilenameIterator;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.ByteBuffer;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.vfs2.EaglerFileSystemException;
|
||||
@ -23,30 +39,33 @@ import net.lax1dude.eaglercraft.v1_8.internal.vfs2.VFSIterator2;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class JDBCFilesystem implements IEaglerFilesystem {
|
||||
|
||||
public static final Logger logger = LogManager.getLogger("JDBCFilesystem");
|
||||
|
||||
private static volatile boolean cleanupThreadStarted = false;
|
||||
private boolean newFilesystem = true;
|
||||
|
||||
private static volatile boolean cleanupThreadStarted = false;
|
||||
private static final Collection<JDBCFilesystem> jdbcFilesystems = new LinkedList<>();
|
||||
|
||||
private final String dbName;
|
||||
private final String jdbcUri;
|
||||
private final String jdbcDriver;
|
||||
|
||||
private final Connection conn;
|
||||
private final PreparedStatement createStatement;
|
||||
private final PreparedStatement updateStatement;
|
||||
private final PreparedStatement readStatement;
|
||||
private final PreparedStatement existsStatement;
|
||||
private final PreparedStatement sizeStatement;
|
||||
private final PreparedStatement deleteStatement;
|
||||
private final PreparedStatement renameStatement;
|
||||
private final PreparedStatement iterateNonRecursive;
|
||||
private final PreparedStatement iterateRecursive;
|
||||
private boolean hasClosed = false;
|
||||
|
||||
private final Object mutex = new Object();
|
||||
|
||||
public static IEaglerFilesystem initialize(String dbName, String jdbcUri, String jdbcDriver) {
|
||||
Class<?> driver;
|
||||
try {
|
||||
@ -55,24 +74,22 @@ public class JDBCFilesystem implements IEaglerFilesystem {
|
||||
throw new EaglerFileSystemException("JDBC driver class not found in JRE: " + jdbcDriver, e);
|
||||
}
|
||||
Driver driverObj = null;
|
||||
Enumeration<Driver> registeredDriversItr = DriverManager.getDrivers();
|
||||
while (registeredDriversItr.hasMoreElements()) {
|
||||
Enumeration<Driver> registeredDriversItr = DriverManager.getDrivers();
|
||||
while(registeredDriversItr.hasMoreElements()) {
|
||||
Driver drv = registeredDriversItr.nextElement();
|
||||
if (drv.getClass().equals(driver)) {
|
||||
if(drv.getClass().equals(driver)) {
|
||||
driverObj = drv;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (driverObj == null) {
|
||||
logger.warn(
|
||||
"The class \"{}\" is not a registered JDBC driver, eaglercraft will try all registered drivers...",
|
||||
jdbcDriver);
|
||||
if(driverObj == null) {
|
||||
logger.warn("The class \"{}\" is not a registered JDBC driver, eaglercraft will try all registered drivers...", jdbcDriver);
|
||||
}
|
||||
Properties props = new Properties();
|
||||
for (Entry<Object, Object> etr : System.getProperties().entrySet()) {
|
||||
if (etr.getKey() instanceof String) {
|
||||
String str = (String) etr.getKey();
|
||||
if (str.startsWith("eagler.jdbc." + dbName + ".opts.")) {
|
||||
for(Entry<Object, Object> etr : System.getProperties().entrySet()) {
|
||||
if(etr.getKey() instanceof String) {
|
||||
String str = (String)etr.getKey();
|
||||
if(str.startsWith("eagler.jdbc." + dbName + ".opts.")) {
|
||||
props.put(str.substring(18 + dbName.length()), etr.getValue());
|
||||
}
|
||||
}
|
||||
@ -80,12 +97,12 @@ public class JDBCFilesystem implements IEaglerFilesystem {
|
||||
logger.info("Connecting to database: \"{}\"", jdbcUri);
|
||||
Connection conn;
|
||||
try {
|
||||
if (driverObj != null) {
|
||||
if(driverObj != null) {
|
||||
conn = driverObj.connect(jdbcUri, props);
|
||||
} else {
|
||||
}else {
|
||||
conn = DriverManager.getConnection(jdbcUri, props);
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("Failed to connect to database: \"" + jdbcUri + "\"", ex);
|
||||
}
|
||||
try {
|
||||
@ -93,334 +110,51 @@ public class JDBCFilesystem implements IEaglerFilesystem {
|
||||
} catch (SQLException ex) {
|
||||
try {
|
||||
conn.close();
|
||||
} catch (SQLException ex2) {
|
||||
}catch(SQLException ex2) {
|
||||
}
|
||||
throw new EaglerFileSystemException("Failed to initialize database: \"" + jdbcUri + "\"", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void quietClose(Statement stmt) {
|
||||
try {
|
||||
stmt.close();
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
private static void startCleanupThread() {
|
||||
if (!cleanupThreadStarted) {
|
||||
cleanupThreadStarted = true;
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||
synchronized (jdbcFilesystems) {
|
||||
if (!jdbcFilesystems.isEmpty()) {
|
||||
for (JDBCFilesystem fs : jdbcFilesystems) {
|
||||
fs.shutdown0();
|
||||
}
|
||||
jdbcFilesystems.clear();
|
||||
}
|
||||
}
|
||||
}, "JDBCFilesystemCleanup"));
|
||||
}
|
||||
}
|
||||
|
||||
private boolean newFilesystem = true;
|
||||
|
||||
private final String dbName;
|
||||
private final String jdbcUri;
|
||||
private final String jdbcDriver;
|
||||
private final Connection conn;
|
||||
private final PreparedStatement createStatement;
|
||||
private final PreparedStatement updateStatement;
|
||||
private final PreparedStatement readStatement;
|
||||
private final PreparedStatement existsStatement;
|
||||
private final PreparedStatement sizeStatement;
|
||||
private final PreparedStatement deleteStatement;
|
||||
private final PreparedStatement renameStatement;
|
||||
|
||||
private final PreparedStatement iterateNonRecursive;
|
||||
|
||||
private final PreparedStatement iterateRecursive;
|
||||
|
||||
private boolean hasClosed = false;
|
||||
|
||||
private final Object mutex = new Object();
|
||||
|
||||
private JDBCFilesystem(String dbName, Connection conn, String jdbcUri, String jdbcDriver) throws SQLException {
|
||||
this.dbName = dbName;
|
||||
this.conn = conn;
|
||||
this.jdbcUri = jdbcUri;
|
||||
this.jdbcDriver = jdbcDriver;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.execute("CREATE TABLE IF NOT EXISTS " + "\"eaglercraft_desktop_runtime_filesystem\" ("
|
||||
+ "\"FileName\" VARCHAR(1024) NOT NULL," + "\"FileSize\" INT NOT NULL,"
|
||||
+ "\"FileData\" BLOB NOT NULL," + "PRIMARY KEY(\"FileName\"))");
|
||||
|
||||
try(Statement stmt = conn.createStatement()) {
|
||||
stmt.execute("CREATE TABLE IF NOT EXISTS "
|
||||
+ "\"eaglercraft_desktop_runtime_filesystem\" ("
|
||||
+ "\"FileName\" VARCHAR(1024) NOT NULL,"
|
||||
+ "\"FileSize\" INT NOT NULL,"
|
||||
+ "\"FileData\" BLOB NOT NULL,"
|
||||
+ "PRIMARY KEY(\"FileName\"))");
|
||||
|
||||
int totalFiles = 0;
|
||||
try (ResultSet resultSet = stmt
|
||||
.executeQuery("SELECT COUNT(*) AS total_files FROM eaglercraft_desktop_runtime_filesystem")) {
|
||||
if (resultSet.next()) {
|
||||
try(ResultSet resultSet = stmt.executeQuery("SELECT COUNT(*) AS total_files FROM eaglercraft_desktop_runtime_filesystem")) {
|
||||
if(resultSet.next()) {
|
||||
totalFiles = resultSet.getInt(1);
|
||||
}
|
||||
}
|
||||
logger.info("Loaded JDBC filesystem with {} files: \"{}\"", totalFiles, jdbcUri);
|
||||
if (totalFiles > 0) {
|
||||
if(totalFiles > 0) {
|
||||
newFilesystem = false;
|
||||
}
|
||||
}
|
||||
this.createStatement = conn.prepareStatement(
|
||||
"INSERT INTO eaglercraft_desktop_runtime_filesystem (FileName, FileSize, FileData) VALUES(?,?,?)");
|
||||
this.updateStatement = conn.prepareStatement(
|
||||
"UPDATE eaglercraft_desktop_runtime_filesystem SET FileSize = ?, FileData = ? WHERE FileName = ?");
|
||||
this.readStatement = conn.prepareStatement(
|
||||
"SELECT FileData FROM eaglercraft_desktop_runtime_filesystem WHERE FileName = ? LIMIT 1");
|
||||
this.existsStatement = conn.prepareStatement(
|
||||
"SELECT COUNT(FileName) AS has_object FROM eaglercraft_desktop_runtime_filesystem WHERE FileName = ? LIMIT 1");
|
||||
this.sizeStatement = conn.prepareStatement(
|
||||
"SELECT FileSize FROM eaglercraft_desktop_runtime_filesystem WHERE FileName = ? LIMIT 1");
|
||||
this.deleteStatement = conn
|
||||
.prepareStatement("DELETE FROM eaglercraft_desktop_runtime_filesystem WHERE FileName = ?");
|
||||
this.renameStatement = conn
|
||||
.prepareStatement("UPDATE eaglercraft_desktop_runtime_filesystem SET FileName = ? WHERE FileName = ?");
|
||||
this.iterateNonRecursive = conn.prepareStatement(
|
||||
"SELECT FileName FROM eaglercraft_desktop_runtime_filesystem WHERE FileName LIKE ? AND NOT FileName LIKE ?");
|
||||
this.iterateRecursive = conn
|
||||
.prepareStatement("SELECT FileName FROM eaglercraft_desktop_runtime_filesystem WHERE FileName LIKE ?");
|
||||
this.createStatement = conn.prepareStatement("INSERT INTO eaglercraft_desktop_runtime_filesystem (FileName, FileSize, FileData) VALUES(?,?,?)");
|
||||
this.updateStatement = conn.prepareStatement("UPDATE eaglercraft_desktop_runtime_filesystem SET FileSize = ?, FileData = ? WHERE FileName = ?");
|
||||
this.readStatement = conn.prepareStatement("SELECT FileData FROM eaglercraft_desktop_runtime_filesystem WHERE FileName = ? LIMIT 1");
|
||||
this.existsStatement = conn.prepareStatement("SELECT COUNT(FileName) AS has_object FROM eaglercraft_desktop_runtime_filesystem WHERE FileName = ? LIMIT 1");
|
||||
this.sizeStatement = conn.prepareStatement("SELECT FileSize FROM eaglercraft_desktop_runtime_filesystem WHERE FileName = ? LIMIT 1");
|
||||
this.deleteStatement = conn.prepareStatement("DELETE FROM eaglercraft_desktop_runtime_filesystem WHERE FileName = ?");
|
||||
this.renameStatement = conn.prepareStatement("UPDATE eaglercraft_desktop_runtime_filesystem SET FileName = ? WHERE FileName = ?");
|
||||
this.iterateNonRecursive = conn.prepareStatement("SELECT FileName FROM eaglercraft_desktop_runtime_filesystem WHERE FileName LIKE ? AND NOT FileName LIKE ?");
|
||||
this.iterateRecursive = conn.prepareStatement("SELECT FileName FROM eaglercraft_desktop_runtime_filesystem WHERE FileName LIKE ?");
|
||||
startCleanupThread();
|
||||
synchronized (jdbcFilesystems) {
|
||||
synchronized(jdbcFilesystems) {
|
||||
jdbcFilesystems.add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeHandle() {
|
||||
shutdown0();
|
||||
synchronized (jdbcFilesystems) {
|
||||
jdbcFilesystems.remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int eaglerCopy(String pathNameOld, String pathNameNew) {
|
||||
try {
|
||||
synchronized (mutex) {
|
||||
if (hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
readStatement.setString(1, pathNameOld);
|
||||
try (ResultSet resultSet = readStatement.executeQuery()) {
|
||||
byte[] has = null;
|
||||
if (resultSet.next()) {
|
||||
has = resultSet.getBytes(1);
|
||||
}
|
||||
if (has == null) {
|
||||
return -1;
|
||||
}
|
||||
existsStatement.setString(1, pathNameNew);
|
||||
boolean exists;
|
||||
try (ResultSet resultSet2 = existsStatement.executeQuery()) {
|
||||
if (resultSet2.next()) {
|
||||
exists = resultSet2.getInt(1) > 0;
|
||||
} else {
|
||||
exists = false;
|
||||
}
|
||||
}
|
||||
if (exists) {
|
||||
updateStatement.setInt(1, has.length);
|
||||
updateStatement.setBytes(2, has);
|
||||
updateStatement.setString(3, pathNameNew);
|
||||
if (updateStatement.executeUpdate() == 0) {
|
||||
throw new EaglerFileSystemException("SQL file update query did not update any rows!");
|
||||
}
|
||||
} else {
|
||||
createStatement.setString(1, pathNameNew);
|
||||
createStatement.setInt(2, has.length);
|
||||
createStatement.setBytes(3, has);
|
||||
createStatement.executeUpdate();
|
||||
}
|
||||
return has.length;
|
||||
}
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing copy!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean eaglerDelete(String pathName) {
|
||||
try {
|
||||
synchronized (mutex) {
|
||||
if (hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
deleteStatement.setString(1, pathName);
|
||||
int ret = deleteStatement.executeUpdate();
|
||||
if (ret == 0) {
|
||||
PlatformFilesystem.logger.warn("Tried to delete file that doesn't exist: \"{}\"", pathName);
|
||||
}
|
||||
return ret > 0;
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing delete!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean eaglerExists(String pathName) {
|
||||
try {
|
||||
synchronized (mutex) {
|
||||
if (hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
existsStatement.setString(1, pathName);
|
||||
try (ResultSet resultSet = existsStatement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
return resultSet.getInt(1) > 0;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing exists!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eaglerIterate(String pathName, VFSFilenameIterator itr, boolean recursive) {
|
||||
try {
|
||||
synchronized (mutex) {
|
||||
if (hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
PreparedStatement stmt;
|
||||
if (recursive) {
|
||||
stmt = iterateRecursive;
|
||||
stmt.setString(1, pathName + (!pathName.endsWith("/") ? "/%" : "%"));
|
||||
;
|
||||
} else {
|
||||
stmt = iterateNonRecursive;
|
||||
if (!pathName.endsWith("/")) {
|
||||
pathName += "/";
|
||||
}
|
||||
stmt.setString(1, pathName + "%");
|
||||
stmt.setString(2, pathName + "%/%");
|
||||
}
|
||||
try (ResultSet resultSet = stmt.executeQuery()) {
|
||||
while (resultSet.next()) {
|
||||
try {
|
||||
itr.next(resultSet.getString(1));
|
||||
} catch (VFSIterator2.BreakLoop exx) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing iterate!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean eaglerMove(String pathNameOld, String pathNameNew) {
|
||||
try {
|
||||
synchronized (mutex) {
|
||||
if (hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
renameStatement.setString(1, pathNameNew);
|
||||
renameStatement.setString(2, pathNameOld);
|
||||
return renameStatement.executeUpdate() > 0;
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing move!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer eaglerRead(String pathName) {
|
||||
try {
|
||||
synchronized (mutex) {
|
||||
if (hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
readStatement.setString(1, pathName);
|
||||
byte[] has = null;
|
||||
try (ResultSet resultSet = readStatement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
has = resultSet.getBytes(1);
|
||||
}
|
||||
}
|
||||
if (has == null) {
|
||||
PlatformFilesystem.logger.warn("Tried to read file that doesn't exist: \"{}\"", pathName);
|
||||
return null;
|
||||
}
|
||||
ByteBuffer byteBuf = PlatformRuntime.allocateByteBuffer(has.length);
|
||||
byteBuf.put(has);
|
||||
byteBuf.flip();
|
||||
return byteBuf;
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing read!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int eaglerSize(String pathName) {
|
||||
try {
|
||||
synchronized (mutex) {
|
||||
if (hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
sizeStatement.setString(1, pathName);
|
||||
try (ResultSet resultSet = sizeStatement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
return resultSet.getInt(1);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing size!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eaglerWrite(String pathName, ByteBuffer data) {
|
||||
try {
|
||||
synchronized (mutex) {
|
||||
if (hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
existsStatement.setString(1, pathName);
|
||||
boolean exists;
|
||||
try (ResultSet resultSet = existsStatement.executeQuery()) {
|
||||
if (resultSet.next()) {
|
||||
exists = resultSet.getInt(1) > 0;
|
||||
} else {
|
||||
exists = false;
|
||||
}
|
||||
}
|
||||
byte[] cp = new byte[data.remaining()];
|
||||
data.get(cp);
|
||||
if (exists) {
|
||||
updateStatement.setInt(1, cp.length);
|
||||
updateStatement.setBytes(2, cp);
|
||||
updateStatement.setString(3, pathName);
|
||||
if (updateStatement.executeUpdate() == 0) {
|
||||
throw new EaglerFileSystemException("SQL file update query did not update any rows!");
|
||||
}
|
||||
} else {
|
||||
createStatement.setString(1, pathName);
|
||||
createStatement.setInt(2, cp.length);
|
||||
createStatement.setBytes(3, cp);
|
||||
createStatement.executeUpdate();
|
||||
}
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing write!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFilesystemName() {
|
||||
return dbName;
|
||||
@ -435,19 +169,38 @@ public class JDBCFilesystem implements IEaglerFilesystem {
|
||||
return newFilesystem;
|
||||
}
|
||||
|
||||
private static void startCleanupThread() {
|
||||
if(!cleanupThreadStarted) {
|
||||
cleanupThreadStarted = true;
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||
synchronized(jdbcFilesystems) {
|
||||
if(!jdbcFilesystems.isEmpty()) {
|
||||
for(JDBCFilesystem fs : jdbcFilesystems) {
|
||||
fs.shutdown0();
|
||||
}
|
||||
jdbcFilesystems.clear();
|
||||
}
|
||||
}
|
||||
}, "JDBCFilesystemCleanup"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRamdisk() {
|
||||
return false;
|
||||
public void closeHandle() {
|
||||
shutdown0();
|
||||
synchronized(jdbcFilesystems) {
|
||||
jdbcFilesystems.remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
private void shutdown0() {
|
||||
synchronized (mutex) {
|
||||
if (!hasClosed) {
|
||||
synchronized(mutex) {
|
||||
if(!hasClosed) {
|
||||
hasClosed = true;
|
||||
logger.info("Disconnecting from database: \"{}\"", jdbcUri);
|
||||
try {
|
||||
shutdown1();
|
||||
} catch (Throwable t) {
|
||||
}catch(Throwable t) {
|
||||
logger.error("Failed to disconnect from database: \"{}\"");
|
||||
logger.error(t);
|
||||
}
|
||||
@ -456,7 +209,7 @@ public class JDBCFilesystem implements IEaglerFilesystem {
|
||||
}
|
||||
|
||||
private void shutdown1() throws SQLException {
|
||||
if (!conn.isClosed()) {
|
||||
if(!conn.isClosed()) {
|
||||
quietClose(createStatement);
|
||||
quietClose(updateStatement);
|
||||
quietClose(readStatement);
|
||||
@ -470,4 +223,238 @@ public class JDBCFilesystem implements IEaglerFilesystem {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
private static void quietClose(Statement stmt) {
|
||||
try {
|
||||
stmt.close();
|
||||
}catch(Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean eaglerDelete(String pathName) {
|
||||
try {
|
||||
synchronized(mutex) {
|
||||
if(hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
deleteStatement.setString(1, pathName);
|
||||
int ret = deleteStatement.executeUpdate();
|
||||
if(ret == 0) {
|
||||
PlatformFilesystem.logger.warn("Tried to delete file that doesn't exist: \"{}\"", pathName);
|
||||
}
|
||||
return ret > 0;
|
||||
}
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing delete!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer eaglerRead(String pathName) {
|
||||
try {
|
||||
synchronized(mutex) {
|
||||
if(hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
readStatement.setString(1, pathName);
|
||||
byte[] has = null;
|
||||
try(ResultSet resultSet = readStatement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
has = resultSet.getBytes(1);
|
||||
}
|
||||
}
|
||||
if(has == null) {
|
||||
PlatformFilesystem.logger.warn("Tried to read file that doesn't exist: \"{}\"", pathName);
|
||||
return null;
|
||||
}
|
||||
ByteBuffer byteBuf = PlatformRuntime.allocateByteBuffer(has.length);
|
||||
byteBuf.put(has);
|
||||
byteBuf.flip();
|
||||
return byteBuf;
|
||||
}
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing read!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eaglerWrite(String pathName, ByteBuffer data) {
|
||||
try {
|
||||
synchronized(mutex) {
|
||||
if(hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
existsStatement.setString(1, pathName);
|
||||
boolean exists;
|
||||
try(ResultSet resultSet = existsStatement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
exists = resultSet.getInt(1) > 0;
|
||||
}else {
|
||||
exists = false;
|
||||
}
|
||||
}
|
||||
byte[] cp = new byte[data.remaining()];
|
||||
data.get(cp);
|
||||
if(exists) {
|
||||
updateStatement.setInt(1, cp.length);
|
||||
updateStatement.setBytes(2, cp);
|
||||
updateStatement.setString(3, pathName);
|
||||
if(updateStatement.executeUpdate() == 0) {
|
||||
throw new EaglerFileSystemException("SQL file update query did not update any rows!");
|
||||
}
|
||||
}else {
|
||||
createStatement.setString(1, pathName);
|
||||
createStatement.setInt(2, cp.length);
|
||||
createStatement.setBytes(3, cp);
|
||||
createStatement.executeUpdate();
|
||||
}
|
||||
}
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing write!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean eaglerExists(String pathName) {
|
||||
try {
|
||||
synchronized(mutex) {
|
||||
if(hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
existsStatement.setString(1, pathName);
|
||||
try(ResultSet resultSet = existsStatement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
return resultSet.getInt(1) > 0;
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing exists!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean eaglerMove(String pathNameOld, String pathNameNew) {
|
||||
try {
|
||||
synchronized(mutex) {
|
||||
if(hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
renameStatement.setString(1, pathNameNew);
|
||||
renameStatement.setString(2, pathNameOld);
|
||||
return renameStatement.executeUpdate() > 0;
|
||||
}
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing move!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int eaglerCopy(String pathNameOld, String pathNameNew) {
|
||||
try {
|
||||
synchronized(mutex) {
|
||||
if(hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
readStatement.setString(1, pathNameOld);
|
||||
try(ResultSet resultSet = readStatement.executeQuery()) {
|
||||
byte[] has = null;
|
||||
if(resultSet.next()) {
|
||||
has = resultSet.getBytes(1);
|
||||
}
|
||||
if(has == null) {
|
||||
return -1;
|
||||
}
|
||||
existsStatement.setString(1, pathNameNew);
|
||||
boolean exists;
|
||||
try(ResultSet resultSet2 = existsStatement.executeQuery()) {
|
||||
if(resultSet2.next()) {
|
||||
exists = resultSet2.getInt(1) > 0;
|
||||
}else {
|
||||
exists = false;
|
||||
}
|
||||
}
|
||||
if(exists) {
|
||||
updateStatement.setInt(1, has.length);
|
||||
updateStatement.setBytes(2, has);
|
||||
updateStatement.setString(3, pathNameNew);
|
||||
if(updateStatement.executeUpdate() == 0) {
|
||||
throw new EaglerFileSystemException("SQL file update query did not update any rows!");
|
||||
}
|
||||
}else {
|
||||
createStatement.setString(1, pathNameNew);
|
||||
createStatement.setInt(2, has.length);
|
||||
createStatement.setBytes(3, has);
|
||||
createStatement.executeUpdate();
|
||||
}
|
||||
return has.length;
|
||||
}
|
||||
}
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing copy!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int eaglerSize(String pathName) {
|
||||
try {
|
||||
synchronized(mutex) {
|
||||
if(hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
sizeStatement.setString(1, pathName);
|
||||
try(ResultSet resultSet = sizeStatement.executeQuery()) {
|
||||
if(resultSet.next()) {
|
||||
return resultSet.getInt(1);
|
||||
}else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing size!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eaglerIterate(String pathName, VFSFilenameIterator itr, boolean recursive) {
|
||||
try {
|
||||
synchronized(mutex) {
|
||||
if(hasClosed || conn.isClosed()) {
|
||||
throw new SQLException("Filesystem database connection is closed!");
|
||||
}
|
||||
PreparedStatement stmt;
|
||||
if(recursive) {
|
||||
stmt = iterateRecursive;
|
||||
stmt.setString(1, pathName + (!pathName.endsWith("/") ? "/%" : "%"));;
|
||||
}else {
|
||||
stmt = iterateNonRecursive;
|
||||
if(!pathName.endsWith("/")) {
|
||||
pathName += "/";
|
||||
}
|
||||
stmt.setString(1, pathName + "%");
|
||||
stmt.setString(2, pathName + "%/%");
|
||||
}
|
||||
try(ResultSet resultSet = stmt.executeQuery()) {
|
||||
while(resultSet.next()) {
|
||||
try {
|
||||
itr.next(resultSet.getString(1));
|
||||
}catch(VFSIterator2.BreakLoop exx) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch(SQLException ex) {
|
||||
throw new EaglerFileSystemException("JDBC exception thrown while executing iterate!", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRamdisk() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.io.File;
|
||||
@ -14,22 +30,6 @@ import net.lax1dude.eaglercraft.v1_8.internal.vfs2.EaglerFileSystemException;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class JDBCFilesystemConverter {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger("JDBCFilesystemConverter");
|
||||
@ -95,17 +95,6 @@ public class JDBCFilesystemConverter {
|
||||
}
|
||||
}
|
||||
|
||||
private static void deleteOldFolder(File file) {
|
||||
File[] f = file.listFiles();
|
||||
for (int i = 0; i < f.length; ++i) {
|
||||
if (f[i].isDirectory()) {
|
||||
deleteOldFolder(f[i]);
|
||||
} else {
|
||||
f[i].delete();
|
||||
}
|
||||
}
|
||||
file.delete();
|
||||
}
|
||||
|
||||
private static void iterateFolder(int slug, File file, List<String> ret) {
|
||||
File[] f = file.listFiles();
|
||||
@ -128,4 +117,16 @@ public class JDBCFilesystemConverter {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void deleteOldFolder(File file) {
|
||||
File[] f = file.listFiles();
|
||||
for(int i = 0; i < f.length; ++i) {
|
||||
if(f[i].isDirectory()) {
|
||||
deleteOldFolder(f[i]);
|
||||
}else {
|
||||
f[i].delete();
|
||||
}
|
||||
}
|
||||
file.delete();
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import javax.swing.UIManager;
|
||||
@ -12,49 +28,10 @@ import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.ShaderSource;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager;
|
||||
import net.minecraft.client.main.Main;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class LWJGLEntryPoint {
|
||||
|
||||
public static Thread mainThread = null;
|
||||
|
||||
private static void getPlatformOptionsFromArgs(String[] args) {
|
||||
for (int i = 0; i < args.length; ++i) {
|
||||
if (args[i].equalsIgnoreCase("fullscreen")) {
|
||||
PlatformInput.setStartupFullscreen(true);
|
||||
} else if (args[i].equalsIgnoreCase("highp")) {
|
||||
ShaderSource.setHighP(true);
|
||||
} else if (args[i].equalsIgnoreCase("gles=200")) {
|
||||
PlatformRuntime.requestGL(200);
|
||||
} else if (args[i].equalsIgnoreCase("gles=300")) {
|
||||
PlatformRuntime.requestGL(300);
|
||||
} else if (args[i].equalsIgnoreCase("gles=310")) {
|
||||
PlatformRuntime.requestGL(310);
|
||||
} else if (args[i].equalsIgnoreCase("disableKHRDebug")) {
|
||||
PlatformRuntime.requestDisableKHRDebug(true);
|
||||
} else {
|
||||
EnumPlatformANGLE angle = EnumPlatformANGLE.fromId(args[i]);
|
||||
if (angle != EnumPlatformANGLE.DEFAULT) {
|
||||
PlatformRuntime.requestANGLE(angle);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main_(String[] args) {
|
||||
mainThread = Thread.currentThread();
|
||||
|
||||
@ -98,5 +75,28 @@ public class LWJGLEntryPoint {
|
||||
Main.appMain();
|
||||
|
||||
}
|
||||
|
||||
private static void getPlatformOptionsFromArgs(String[] args) {
|
||||
for(int i = 0; i < args.length; ++i) {
|
||||
if(args[i].equalsIgnoreCase("fullscreen")) {
|
||||
PlatformInput.setStartupFullscreen(true);
|
||||
}else if(args[i].equalsIgnoreCase("highp")) {
|
||||
ShaderSource.setHighP(true);
|
||||
}else if(args[i].equalsIgnoreCase("gles=200")) {
|
||||
PlatformRuntime.requestGL(200);
|
||||
}else if(args[i].equalsIgnoreCase("gles=300")) {
|
||||
PlatformRuntime.requestGL(300);
|
||||
}else if(args[i].equalsIgnoreCase("gles=310")) {
|
||||
PlatformRuntime.requestGL(310);
|
||||
}else if(args[i].equalsIgnoreCase("disableKHRDebug")) {
|
||||
PlatformRuntime.requestDisableKHRDebug(true);
|
||||
}else {
|
||||
EnumPlatformANGLE angle = EnumPlatformANGLE.fromId(args[i]);
|
||||
if(angle != EnumPlatformANGLE.DEFAULT) {
|
||||
PlatformRuntime.requestANGLE(angle);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
@ -20,22 +36,6 @@ import javax.swing.JPanel;
|
||||
import javax.swing.JSeparator;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class LaunchRenderDocDialog extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = 8312760039213612790L;
|
||||
@ -112,4 +112,4 @@ public class LaunchRenderDocDialog extends JDialog {
|
||||
JSeparator separator = new JSeparator();
|
||||
getContentPane().add(separator, BorderLayout.NORTH);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,17 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Font;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Toolkit;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -27,6 +14,19 @@ import javax.swing.ScrollPaneConstants;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import java.awt.BorderLayout;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import java.awt.Font;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Toolkit;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
|
||||
public class MainMenuCreditsDialog extends JFrame {
|
||||
|
||||
private static final long serialVersionUID = 696969696L;
|
||||
@ -74,4 +74,4 @@ public class MainMenuCreditsDialog extends JFrame {
|
||||
public void setCreditsText(String str) {
|
||||
textArea.setText(str);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,17 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.drafts.Draft;
|
||||
import org.java_websocket.drafts.Draft_6455;
|
||||
import org.java_websocket.extensions.permessage_deflate.PerMessageDeflateExtension;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.EnumEaglerConnectionState;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -27,6 +14,20 @@ import net.lax1dude.eaglercraft.v1_8.internal.EnumEaglerConnectionState;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.lwjgl;
|
||||
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.drafts.Draft;
|
||||
import org.java_websocket.drafts.Draft_6455;
|
||||
import org.java_websocket.extensions.permessage_deflate.PerMessageDeflateExtension;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.EnumEaglerConnectionState;
|
||||
|
||||
class WebSocketClientImpl extends WebSocketClient {
|
||||
|
||||
private static final Draft perMessageDeflateDraft = new Draft_6455(new PerMessageDeflateExtension());
|
||||
@ -77,4 +78,4 @@ class WebSocketClientImpl extends WebSocketClient {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,15 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.internal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.CrashScreenPopup;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.DesktopIntegratedServer;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.MemoryConnection;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2023-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -25,6 +14,18 @@ import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.MemoryConnection;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.internal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.CrashScreenPopup;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.DesktopIntegratedServer;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.MemoryConnection;
|
||||
|
||||
public class ClientPlatformSingleplayer {
|
||||
|
||||
private static CrashScreenPopup crashOverlay = null;
|
||||
@ -97,4 +98,4 @@ public class ClientPlatformSingleplayer {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.server.internal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -13,22 +29,6 @@ import net.lax1dude.eaglercraft.v1_8.internal.lwjgl.DesktopClientConfigAdapter;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.IWASMCrashCallback;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl.MemoryConnection;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2023-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class ServerPlatformSingleplayer {
|
||||
|
||||
private static IEaglerFilesystem filesystem = null;
|
||||
@ -101,4 +101,4 @@ public class ServerPlatformSingleplayer {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,17 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.Toolkit;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -27,6 +14,19 @@ import javax.swing.ScrollPaneConstants;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import java.awt.BorderLayout;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
import java.awt.Font;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.Color;
|
||||
|
||||
public class CrashScreenPopup extends JFrame {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@ -70,4 +70,4 @@ public class CrashScreenPopup extends JFrame {
|
||||
public void setCrashText(String txt) {
|
||||
txtrTest.setText(txt);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.EaglerIntegratedServerWorker;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.ServerPlatformSingleplayer;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2023-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -19,6 +14,12 @@ import net.lax1dude.eaglercraft.v1_8.sp.server.internal.ServerPlatformSingleplay
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.EaglerIntegratedServerWorker;
|
||||
import net.lax1dude.eaglercraft.v1_8.sp.server.internal.ServerPlatformSingleplayer;
|
||||
|
||||
public class DesktopIntegratedServer implements Runnable {
|
||||
|
||||
public static Thread serverThread = null;
|
||||
@ -41,4 +42,4 @@ public class DesktopIntegratedServer implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,11 +1,4 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2023-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -21,9 +14,17 @@ import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.sp.server.internal.lwjgl;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||
|
||||
public class MemoryConnection {
|
||||
|
||||
public static final List<IPCPacketData> clientToServerQueue = new LinkedList<>();
|
||||
public static final List<IPCPacketData> serverToClientQueue = new LinkedList<>();
|
||||
|
||||
}
|
||||
}
|
@ -1,25 +1,25 @@
|
||||
/*
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.settings.KeyBinding;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class ArrayUtils {
|
||||
|
||||
private static final String hex = "0123456789abcdef";
|
||||
@ -78,4 +78,4 @@ public class ArrayUtils {
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import java.util.HashMap;
|
||||
@ -12,22 +28,6 @@ import net.minecraft.client.entity.AbstractClientPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class ClientUUIDLoadingCache {
|
||||
|
||||
private static class WaitingLookup {
|
||||
@ -59,6 +59,10 @@ public class ClientUUIDLoadingCache {
|
||||
private static int requestId = 0;
|
||||
private static long lastFlushReq = EagRuntime.steadyTimeMillis();
|
||||
private static long lastFlushEvict = EagRuntime.steadyTimeMillis();
|
||||
private static boolean ignoreNonEaglerPlayers = false;
|
||||
|
||||
private static final EaglercraftUUID MAGIC_DISABLE_NON_EAGLER_PLAYERS = new EaglercraftUUID(0xEEEEA64771094C4EL,
|
||||
0x86E55B81D17E67EBL);
|
||||
|
||||
public static void evict(EaglercraftUUID clientId) {
|
||||
evictedUUIDs.put(clientId, Long.valueOf(EagRuntime.steadyTimeMillis()));
|
||||
@ -91,16 +95,20 @@ public class ClientUUIDLoadingCache {
|
||||
if (ret == null) {
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
if (mc != null && mc.thePlayer != null && mc.thePlayer.sendQueue.getEaglerMessageProtocol().ver >= 4) {
|
||||
ret = PENDING_UUID;
|
||||
EaglercraftUUID playerUUID = player.getUniqueID();
|
||||
if (!waitingUUIDs.containsKey(playerUUID) && !evictedUUIDs.containsKey(playerUUID)) {
|
||||
int reqID = ++requestId & 0x3FFF;
|
||||
WaitingLookup newLookup = new WaitingLookup(reqID, playerUUID, EagRuntime.steadyTimeMillis(),
|
||||
(AbstractClientPlayer) player);
|
||||
waitingIDs.put(reqID, newLookup);
|
||||
waitingUUIDs.put(playerUUID, newLookup);
|
||||
mc.thePlayer.sendQueue.sendEaglerMessage(
|
||||
new CPacketGetOtherClientUUIDV4EAG(reqID, newLookup.uuid.msb, newLookup.uuid.lsb));
|
||||
if (ignoreNonEaglerPlayers && !player.getGameProfile().getTextures().eaglerPlayer) {
|
||||
ret = VANILLA_UUID;
|
||||
} else {
|
||||
ret = PENDING_UUID;
|
||||
EaglercraftUUID playerUUID = player.getUniqueID();
|
||||
if (!waitingUUIDs.containsKey(playerUUID) && !evictedUUIDs.containsKey(playerUUID)) {
|
||||
int reqID = ++requestId & 0x3FFF;
|
||||
WaitingLookup newLookup = new WaitingLookup(reqID, playerUUID,
|
||||
EagRuntime.steadyTimeMillis(), (AbstractClientPlayer) player);
|
||||
waitingIDs.put(reqID, newLookup);
|
||||
waitingUUIDs.put(playerUUID, newLookup);
|
||||
mc.thePlayer.sendQueue.sendEaglerMessage(
|
||||
new CPacketGetOtherClientUUIDV4EAG(reqID, newLookup.uuid.msb, newLookup.uuid.lsb));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -119,11 +127,19 @@ public class ClientUUIDLoadingCache {
|
||||
lookup.player.clientBrandUUIDCache = clientId;
|
||||
waitingUUIDs.remove(lookup.uuid);
|
||||
} else {
|
||||
logger.warn("Unsolicited client brand UUID lookup response #{} recieved! (Brand UUID: {})", requestId,
|
||||
clientId);
|
||||
if (requestId == -1 && MAGIC_DISABLE_NON_EAGLER_PLAYERS.equals(clientId)) {
|
||||
ignoreNonEaglerPlayers = true;
|
||||
} else {
|
||||
logger.warn("Unsolicited client brand UUID lookup response #{} recieved! (Brand UUID: {})", requestId,
|
||||
clientId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void resetFlags() {
|
||||
ignoreNonEaglerPlayers = false;
|
||||
}
|
||||
|
||||
public static void update() {
|
||||
long timestamp = EagRuntime.steadyTimeMillis();
|
||||
if (timestamp - lastFlushReq > 5000l) {
|
||||
@ -151,4 +167,4 @@ public class ClientUUIDLoadingCache {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,21 +1,21 @@
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
public class DecoderException extends RuntimeException {
|
||||
|
||||
public DecoderException() {
|
||||
@ -34,4 +34,4 @@ public class DecoderException extends RuntimeException {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,23 +1,23 @@
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformInput;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformInput;
|
||||
|
||||
public class Display {
|
||||
|
||||
private static long lastDPIUpdate = -250l;
|
||||
@ -112,4 +112,4 @@ public class Display {
|
||||
return PlatformInput.wasVisualViewportResized();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
@ -28,22 +44,6 @@ import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
|
||||
import net.lax1dude.eaglercraft.v1_8.recording.ScreenRecordingController;
|
||||
import net.lax1dude.eaglercraft.v1_8.update.UpdateService;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class EagRuntime {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger("EagRuntime");
|
||||
@ -383,4 +383,4 @@ public class EagRuntime {
|
||||
return PlatformRuntime.totalMemory();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
@ -7,22 +23,6 @@ import java.util.regex.Pattern;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class EagUtils {
|
||||
|
||||
private static final String hex = "0123456789ABCDEF";
|
||||
@ -106,4 +106,4 @@ public class EagUtils {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,23 +1,23 @@
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import jdk_internal.bidi.Bidi;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2025 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import jdk_internal.bidi.Bidi;
|
||||
|
||||
public class EaglerBidiReorder {
|
||||
|
||||
/**
|
||||
@ -85,4 +85,4 @@ public class EaglerBidiReorder {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
@ -6,22 +22,6 @@ import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class EaglerInputStream extends InputStream {
|
||||
|
||||
public static byte[] inputStreamToBytes(InputStream is) throws IOException {
|
||||
@ -193,4 +193,4 @@ public class EaglerInputStream extends InputStream {
|
||||
return len;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,25 +1,25 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class EaglerOutputStream extends OutputStream {
|
||||
|
||||
protected byte buf[];
|
||||
@ -85,4 +85,4 @@ public class EaglerOutputStream extends OutputStream {
|
||||
public void writeTo(OutputStream out) throws IOException {
|
||||
out.write(buf, 0, count);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,23 +1,23 @@
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
public class EaglerXBungeeVersion {
|
||||
|
||||
public static final String pluginFileEPK = "plugin_download.zip";
|
||||
@ -88,4 +88,4 @@ public class EaglerXBungeeVersion {
|
||||
public static void startPluginDownload() {
|
||||
EagRuntime.downloadFileWithName(pluginFilename, getPluginDownload());
|
||||
}
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -6,22 +22,6 @@ import java.io.OutputStream;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class EaglerZLIB {
|
||||
|
||||
public static int deflateFull(byte[] input, byte[] output) throws IOException {
|
||||
@ -58,4 +58,4 @@ public class EaglerZLIB {
|
||||
return PlatformRuntime.newInflaterInputStream(is);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,23 +1,23 @@
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
|
||||
public class EaglercraftRandom {
|
||||
|
||||
private static final long multiplier = 0x5DEECE66DL;
|
||||
@ -135,4 +135,4 @@ public class EaglercraftRandom {
|
||||
}
|
||||
haveNextNextGaussian = true;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8;
|
||||
|
||||
import java.util.Iterator;
|
||||
@ -24,22 +40,6 @@ import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class EaglercraftSoundManager {
|
||||
|
||||
protected class ActiveSoundEvent {
|
||||
@ -377,4 +377,4 @@ public class EaglercraftSoundManager {
|
||||
PlatformAudio.clearAudioCache();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user