Starlike v0.4.2

This commit is contained in:
zumbiepig 2025-02-24 20:57:22 -08:00
parent 2e1f9e8fb3
commit 04e8e3b68d
No known key found for this signature in database
GPG Key ID: B50A3F986EC14691
810 changed files with 17005 additions and 15606 deletions

View 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

View File

@ -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'
}

View File

@ -1 +1,5 @@
0.4.1
<<<<<<< Updated upstream
0.4.2
=======
0.4.2
>>>>>>> Stashed changes

View File

@ -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;

View File

@ -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;
}

View File

@ -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) {

View File

@ -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;
}

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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
}

View File

@ -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)));

View File

@ -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);
}

View File

@ -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
}

View File

@ -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;
}

View File

@ -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"
]
}

View File

@ -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;

View File

@ -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

View File

@ -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
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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!

View File

@ -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();

View File

@ -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);

View File

@ -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() {

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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()) {

View File

@ -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);
}
}

View File

@ -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();

View File

@ -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();
}
}

View File

@ -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(

View File

@ -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));
}
}

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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));
}

View File

@ -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));
}
}

View File

@ -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 {
}
}
}

View File

@ -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) {
}
}
}

View File

@ -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 {
}
}
}
}

View File

@ -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
}
}
}

View File

@ -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 {
}
}
}
}

View File

@ -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;
}
}
}

View File

@ -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);
}
}
}

View File

@ -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());
}
}
}

View File

@ -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 {
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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 {

View File

@ -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;
}
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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) {
}
}
}

View File

@ -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));
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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>");
}
}
}
}

View File

@ -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();
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -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();
}
}
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}
}
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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 {
}
}
}
}

View File

@ -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 {
}
}
}

View File

@ -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;
}
}
}

View File

@ -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);
}
}
}

View File

@ -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 {
}
}
}
}

View File

@ -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<>();
}
}

View File

@ -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;
}
}
}

View File

@ -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 {
}
}
}
}
}

View File

@ -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);
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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 {
}
}
}
}

View File

@ -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 {
}
}
}
}

View File

@ -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;
}
}
}

View File

@ -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);
}
}
}

View File

@ -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());
}
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}

View File

@ -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