Update to EaglercraftX 1.8 u37
|
@ -0,0 +1,514 @@
|
|||
<!DOCTYPE html>
|
||||
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
<html style="width:100%;height:100%;">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Eaglercraft Desktop Runtime</title>
|
||||
<link type="image/png" rel="shortcut icon" id="vigg" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAR/SURBVEhLtZXZK3ZRFMYPcqXc+gv413DHxVuGIpIhkciQWaRccCNjSCkligwXSOZ5nmfv9zvn2e8+58V753sudmuvvdZ61l5r7XOc8H+GS/D19aUNkPz5+aktQH5/f//4+LBKZKuRkpUtQjCUYG5gD2T38vLy/PwsDfL9/f3Dw8PT05M0b29vnKLhCKCBT4L4gvBLBIei4//4+Hh1dUVEQutUuLu7E83FxQUGnKLBWKfQaA3S+AREVxaEOD8/Pzk50XpzcyMDcH19zdZG3N3d3dzc3Nvb01aX5pQUpQGGQJxcQpfNysoKhUIdHR1o1tbWbInYAgxIPDMzMy8vLzc3FxqOdMoRqwJK8G8ALUYIhHMiSEhIwI6CyIb0qQzC4eGhsXCc1tZWnZIEKzdQJQSXgKxfX18RCM3Z5eWlcfVAxKOjo+Pj49PTU88lTOk2NjbMsePc3t6SAfcgFdszOyMuAdeBg0CQi2lhYUHOeOLDCisN8FzcPFZXV3t7ezHY3t5GQ+6it+2xMASsKhEEWKsmRLRBBUpPvpJ/TpFKFBwKYAiITmicsbYhdHfJAltqhUCVsCQhwslmeXmZxiBQT9c0Ar9E2O3v72sYSE0N1yQArkKy0kBMXLqlZqIZHR3t6empqqqSDcBdhXEJSJ/bUc3q6uq+vj629GB9fR1WsLW1NTs7u7S0RN2locMjIyOEm5ubQ7+4uJienk4/+vv77Y1hwhLBEKhwWHitdVFfX9/Y2Gg2HuLi4owUAysrK8yCG97rh0+ApP5Q2ZycHFlPTExUVFRIBvn5+WhKSkp2dnaMKhptbW2426GgQ/rwuAQCZ1hwFayLiork9hMFBQV1dXVmE0BLS4vqw3QFB8kn4IAxoGPkYpxi4FeDmpqas7Mz4pClAgqGwD48rjY2NmacYqC0tJQ1KSlJWyE5OZkpUKkBAxZVIntAoZh04+Q48fHxPNGBgYHExMT29naj9cBodnZ2mo3jlJWVMeW2OGQck4B1amqqoaGhqamJjx2lGxwcpL0mUgR8fJhsWqJtSkoKU2SbHHUDpkhPBujd8xuQG6PJRM/Pz09PT7O1NNnZ2Tw3fgZkXVhYKCUlUhBATP+hCVyKZGky17RV0g04laayslJ6hlVeFHB4eFhKaogGd0LxtmTgE+hbhKDnPjMzgw8E3qGL2tpaBWpubjYqj2BoaEj6rq4uNATRZ0ZwCbiL6gXEzINk5vCBQJ9rMD4+rkA8QNK036uDg4Py8vLu7m680KjIBNR3zBDoWQM1g98snyB+VSoRW8C/UwR81/SvhgNj9JOTkwwVERUdRBEI0BAdLRVERkhLS8vIyEDQlrsTPTU1lVFhKxARvZgUlFLbegCf4BvIsbi4mIg4E5EogIHhiKCMtU0WUFiVy06j5fAJIDdSBDQw+PegDfBRcbOPwH4F9LuFWIIQdQNKwWqzIE0aoFUaBsw+SQuFw0uNtC9A+F4i3QNrbg3IDn+SAsHh+wYiEpeyBEMLv/cAO6KzAijxxB+Y4wisBhssJUhjEbPJf4Nw+B+JXqLW3bw+wQAAAABJRU5ErkJggg==" />
|
||||
<script type="text/javascript">
|
||||
"use strict";
|
||||
(function() {
|
||||
var webSocketURI = "${client_websocket_uri}";
|
||||
if(webSocketURI === ("$" + "{client_websocket_uri}")) {
|
||||
alert("Don't open this file in your browser");
|
||||
window.addEventListener("load", function() {
|
||||
document.body.innerHTML = "<p style=\"text-align:center;\">cunt</p>";
|
||||
});
|
||||
return;
|
||||
}
|
||||
var eaglercraftXOpts = {eaglercraftXOpts};
|
||||
var cspAttrSupport = false;
|
||||
var checkSupport = function() {
|
||||
if(eaglercraftXOpts.forceWebViewSupport) {
|
||||
cspAttrSupport = true;
|
||||
return true;
|
||||
}else {
|
||||
var tempIFrameElement = document.createElement("iframe");
|
||||
cspAttrSupport = eaglercraftXOpts.enableWebViewCSP && (typeof tempIFrameElement.csp === "string");
|
||||
return (typeof tempIFrameElement.allow === "string") && (typeof tempIFrameElement.sandbox === "object");
|
||||
}
|
||||
};
|
||||
var supported = false;
|
||||
try {
|
||||
supported = checkSupport();
|
||||
}catch(ex) {
|
||||
supported = false;
|
||||
}
|
||||
console.log("CSP attribute support detected as " + cspAttrSupport);
|
||||
if(!supported) {
|
||||
console.error("Required IFrame safety features are not supported!");
|
||||
window.addEventListener("load", function() {
|
||||
document.getElementById("view_loading").style.display = "none";
|
||||
document.getElementById("view_safety_error").style.display = "block";
|
||||
});
|
||||
return;
|
||||
}
|
||||
var websocketInstance = null;
|
||||
var hasOpened = false;
|
||||
var webviewOptions = null;
|
||||
var webviewResetSerial = 0;
|
||||
var hasErrored = false;
|
||||
var hasRegisteredOnMsgHandler = false;
|
||||
var currentMessageHandler = null;
|
||||
var currentIFrame = null;
|
||||
var currentMessageChannelName = null;
|
||||
var elements = {};
|
||||
var loadElements = function() {
|
||||
var jsel = document.getElementsByClassName("__jsel");
|
||||
for(var i = 0; i < jsel.length; ++i) {
|
||||
var el = jsel[i];
|
||||
if(el.id.length > 0) {
|
||||
elements[el.id] = el;
|
||||
}
|
||||
}
|
||||
};
|
||||
function loadEagtekIcon() {
|
||||
var faviconSrc = document.getElementById("vigg").href;
|
||||
var imgElements = document.getElementsByClassName("eagtek_icon");
|
||||
for(var i = 0; i < imgElements.length; ++i) {
|
||||
imgElements[i].src = faviconSrc;
|
||||
}
|
||||
}
|
||||
function setupElementListeners() {
|
||||
elements.button_allow.addEventListener("click", function() {
|
||||
if(websocketInstance !== null) {
|
||||
if(elements.chkbox_remember.checked) {
|
||||
websocketInstance.send(JSON.stringify({$:7,perm:"ALLOW"}));
|
||||
}
|
||||
beginShowingDirect();
|
||||
}
|
||||
});
|
||||
elements.button_block.addEventListener("click", function() {
|
||||
if(websocketInstance !== null) {
|
||||
if(elements.chkbox_remember.checked) {
|
||||
websocketInstance.send(JSON.stringify({$:7,perm:"BLOCK"}));
|
||||
}
|
||||
beginShowingContentBlocked();
|
||||
}
|
||||
});
|
||||
elements.button_re_evaluate.addEventListener("click", function() {
|
||||
if(websocketInstance !== null) {
|
||||
websocketInstance.send(JSON.stringify({$:7,perm:"NOT_SET"}));
|
||||
beginShowingEnableJavaScript();
|
||||
}
|
||||
});
|
||||
}
|
||||
window.specialHack = function() {
|
||||
if(websocketInstance !== null) {
|
||||
websocketInstance.send(JSON.stringify({$:7,perm:"NOT_SET"}));
|
||||
}
|
||||
};
|
||||
var handleHandshake = function(pkt) {
|
||||
webviewOptions = {};
|
||||
webviewOptions.contentMode = pkt.contentMode || "BLOB_BASED";
|
||||
webviewOptions.fallbackTitle = pkt.fallbackTitle || "Server Info";
|
||||
document.title = webviewOptions.fallbackTitle + " - Eaglercraft Desktop Runtime";
|
||||
webviewOptions.scriptEnabled = !!pkt.scriptEnabled;
|
||||
webviewOptions.strictCSPEnable = !!pkt.strictCSPEnable || false;
|
||||
webviewOptions.serverMessageAPIEnabled = !!pkt.serverMessageAPIEnabled;
|
||||
webviewOptions.url = pkt.url;
|
||||
webviewOptions.blob = pkt.blob;
|
||||
webviewOptions.hasApprovedJS = pkt.hasApprovedJS || "NOT_SET";
|
||||
if(webviewOptions.scriptEnabled) {
|
||||
if(webviewOptions.hasApprovedJS === "NOT_SET") {
|
||||
beginShowingEnableJavaScript();
|
||||
}else if(webviewOptions.hasApprovedJS === "ALLOW") {
|
||||
beginShowingDirect();
|
||||
}else if(webviewOptions.hasApprovedJS === "BLOCK") {
|
||||
beginShowingContentBlocked();
|
||||
}else {
|
||||
setErrored("Unknown JS permission state: " + webviewOptions.hasApprovedJS);
|
||||
}
|
||||
}else {
|
||||
beginShowingDirect();
|
||||
}
|
||||
};
|
||||
var handleServerError = function(pkt) {
|
||||
console.error("Recieved error from server: " + pkt.msg);
|
||||
setErrored(pkt.msg);
|
||||
};
|
||||
var handleServerWebViewStrMsg = function(pkt) {
|
||||
var w;
|
||||
if(currentMessageChannelName !== null && currentIFrame !== null && (w = currentIFrame.contentWindow) !== null) {
|
||||
w.postMessage({ver:1,channel:currentMessageChannelName,type:"string",data:pkt.msg}, "*");
|
||||
}else {
|
||||
console.error("Server tried to send the WebView a message, but the message channel is not open!");
|
||||
}
|
||||
};
|
||||
var handleServerWebViewBinMsg = function(arr) {
|
||||
var w;
|
||||
if(currentMessageChannelName !== null && currentIFrame !== null && (w = currentIFrame.contentWindow) !== null) {
|
||||
w.postMessage({ver:1,channel:currentMessageChannelName,type:"binary",data:arr}, "*");
|
||||
}else {
|
||||
console.error("Server tried to send the WebView a message, but the message channel is not open!");
|
||||
}
|
||||
};
|
||||
var hideAllViews = function() {
|
||||
if(currentIFrame !== null) {
|
||||
++webviewResetSerial;
|
||||
if(currentIFrame.parentNode) currentIFrame.parentNode.removeChild(currentIFrame);
|
||||
currentIFrame = null;
|
||||
}
|
||||
elements.view_loading.style.display = "none";
|
||||
elements.view_iframe.style.display = "none";
|
||||
elements.view_allow_javascript.style.display = "none";
|
||||
elements.view_javascript_blocked.style.display = "none";
|
||||
elements.view_safety_error.style.display = "none";
|
||||
};
|
||||
var setErrored = function(str) {
|
||||
if(hasErrored) return;
|
||||
hasErrored = true;
|
||||
hideAllViews();
|
||||
elements.loading_text.style.color = "#CC0000";
|
||||
elements.loading_text.innerText = str;
|
||||
elements.view_loading.style.display = "block";
|
||||
if(websocketInstance !== null) {
|
||||
websocketInstance.close();
|
||||
websocketInstance = null;
|
||||
}
|
||||
};
|
||||
var registerMessageHandler = function() {
|
||||
if(!hasRegisteredOnMsgHandler) {
|
||||
hasRegisteredOnMsgHandler = true;
|
||||
window.addEventListener("message", function(evt) {
|
||||
if(currentIFrame !== null && currentMessageHandler !== null && evt.source === currentIFrame.contentWindow) {
|
||||
currentMessageHandler(evt);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
var beginShowingDirect = function() {
|
||||
if(hasErrored) return;
|
||||
hideAllViews();
|
||||
if(!eaglercraftXOpts.forceWebViewSupport) {
|
||||
try {
|
||||
currentIFrame = document.createElement("iframe");
|
||||
currentIFrame.allow = "";
|
||||
if(currentIFrame.allow != "") throw "Failed to set allow to \"\"";
|
||||
currentIFrame.referrerPolicy = "strict-origin";
|
||||
var requiredSandboxTokens = [ "allow-downloads" ];
|
||||
if(webviewOptions.scriptEnabled) {
|
||||
requiredSandboxTokens.push("allow-scripts");
|
||||
requiredSandboxTokens.push("allow-pointer-lock");
|
||||
}
|
||||
currentIFrame.sandbox = requiredSandboxTokens.join(" ");
|
||||
for(var i = 0; i < requiredSandboxTokens.length; ++i) {
|
||||
if(!currentIFrame.sandbox.contains(requiredSandboxTokens[i])) {
|
||||
throw ("Failed to set sandbox attribute: " + requiredSandboxTokens[i]);
|
||||
}
|
||||
}
|
||||
var sbox = currentIFrame.sandbox;
|
||||
for(var i = 0; i < sbox.length; ++i) {
|
||||
if(!requiredSandboxTokens.includes(sbox.item(i))) {
|
||||
throw ("Unknown sandbox attribute detected: " + sbox.item(i));
|
||||
}
|
||||
}
|
||||
}catch(ex) {
|
||||
if(typeof ex === "string") {
|
||||
console.error("Caught safety error: " + ex);
|
||||
beginShowingSafetyError();
|
||||
}else {webviewOptions
|
||||
console.error("Fatal error while creating iframe!");
|
||||
console.error(ex);
|
||||
setErrored("Fatal error while creating iframe!");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}else {
|
||||
currentIFrame = document.createElement("iframe");
|
||||
try {
|
||||
currentIFrame.allow = "";
|
||||
}catch(ex) {
|
||||
}
|
||||
try {
|
||||
currentIFrame.referrerPolicy = "strict-origin";
|
||||
}catch(ex) {
|
||||
}
|
||||
try {
|
||||
var sandboxTokens = [ "allow-downloads", "allow-same-origin" ];
|
||||
if(webviewOptions.scriptEnabled) {
|
||||
sandboxTokens.push("allow-scripts");
|
||||
sandboxTokens.push("allow-pointer-lock");
|
||||
}
|
||||
currentIFrame.sandbox = sandboxTokens.join(" ");
|
||||
}catch(ex) {
|
||||
}
|
||||
}
|
||||
currentIFrame.credentialless = true;
|
||||
currentIFrame.loading = "lazy";
|
||||
var cspWarn = false;
|
||||
if(webviewOptions.contentMode === "BLOB_BASED") {
|
||||
if(cspAttrSupport && eaglercraftXOpts.enableWebViewCSP) {
|
||||
if(typeof currentIFrame.csp === "string") {
|
||||
var csp = "default-src 'none';";
|
||||
var protos = (webviewOptions.strictCSPEnable ? "" : " http: https:");
|
||||
if(webviewOptions.scriptEnabled) {
|
||||
csp += (" script-src 'unsafe-eval' 'unsafe-inline' data: blob:" + protos + ";");
|
||||
csp += (" style-src 'unsafe-eval' 'unsafe-inline' data: blob:" + protos + ";");
|
||||
csp += (" img-src data: blob:" + protos + ";");
|
||||
csp += (" font-src data: blob:" + protos + ";");
|
||||
csp += (" child-src data: blob:" + protos + ";");
|
||||
csp += (" frame-src data: blob:;");
|
||||
csp += (" media-src data: mediastream: blob:" + protos + ";");
|
||||
csp += (" connect-src data: blob:" + protos + ";");
|
||||
csp += (" worker-src data: blob:" + protos + ";");
|
||||
}else {
|
||||
csp += (" style-src data: 'unsafe-inline'" + protos + ";");
|
||||
csp += (" img-src data:" + protos + ";");
|
||||
csp += (" font-src data:" + protos + ";");
|
||||
csp += (" media-src data:" + protos + ";");
|
||||
}
|
||||
currentIFrame.csp = csp;
|
||||
}else {
|
||||
console.error("This browser does not support CSP attribute on iframes! (try Chrome)");
|
||||
cspWarn = true;
|
||||
}
|
||||
}else {
|
||||
cspWarn = true;
|
||||
}
|
||||
if(cspWarn && webviewOptions.strictCSPEnable) {
|
||||
console.error("Strict CSP was requested for this webview, but that feature is not available!");
|
||||
}
|
||||
}else {
|
||||
cspWarn = true;
|
||||
}
|
||||
currentIFrame.style.border = "none";
|
||||
currentIFrame.style.backgroundColor = "white";
|
||||
currentIFrame.style.width = "100%";
|
||||
currentIFrame.style.height = "100%";
|
||||
elements.view_iframe.appendChild(currentIFrame);
|
||||
elements.view_iframe.style.display = "block";
|
||||
if(webviewOptions.contentMode === "BLOB_BASED") {
|
||||
currentIFrame.srcdoc = webviewOptions.blob;
|
||||
}else {
|
||||
currentIFrame.src = webviewOptions.url;
|
||||
}
|
||||
currentIFrame.focus();
|
||||
if(webviewOptions.scriptEnabled && webviewOptions.serverMessageAPIEnabled) {
|
||||
var resetSer = webviewResetSerial;
|
||||
var curIFrame = currentIFrame;
|
||||
registerMessageHandler();
|
||||
currentMessageHandler = function(evt) {
|
||||
if(resetSer === webviewResetSerial && curIFrame === currentIFrame) {
|
||||
handleMessageRawFromFrame(evt.data);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
var handleMessageRawFromFrame = function(obj) {
|
||||
if(hasErrored) return;
|
||||
if((typeof obj === "object") && (obj.ver === 1) && ((typeof obj.channel === "string") && obj.channel.length > 0)) {
|
||||
if(typeof obj.open === "boolean") {
|
||||
sendMessageEnToServer(obj.open, obj.channel);
|
||||
return;
|
||||
}else if(typeof obj.data === "string") {
|
||||
sendMessageToServerStr(obj.channel, obj.data);
|
||||
return;
|
||||
}else if(obj.data instanceof ArrayBuffer) {
|
||||
sendMessageToServerBin(obj.channel, obj.data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
console.error("WebView sent an invalid message!");
|
||||
};
|
||||
var sendMessageEnToServer = function(messageChannelOpen, channelName) {
|
||||
if(channelName.length > 255) {
|
||||
console.error("WebView tried to " + (messageChannelOpen ? "open" : "close") + " a channel, but channel name is too long, max is 255 characters!");
|
||||
return;
|
||||
}
|
||||
if(messageChannelOpen && currentMessageChannelName !== null) {
|
||||
console.error("WebView tried to open channel, but a channel is already open!");
|
||||
sendMessageEnToServer(false, currentMessageChannelName);
|
||||
}
|
||||
if(!messageChannelOpen && currentMessageChannelName !== null && currentMessageChannelName === channelName) {
|
||||
console.error("WebView tried to close the wrong channel!");
|
||||
}
|
||||
if(!messageChannelOpen && currentMessageChannelName === null) {
|
||||
console.error("WebView tried to close channel, but the channel is not open!");
|
||||
return;
|
||||
}
|
||||
if(websocketInstance !== null) {
|
||||
if(messageChannelOpen) {
|
||||
websocketInstance.send(JSON.stringify({$:3,channel:channelName}));
|
||||
console.log("WebView opened message channel to server: \"" + channelName + "\"");
|
||||
currentMessageChannelName = channelName;
|
||||
}else {
|
||||
websocketInstance.send(JSON.stringify({$:4}));
|
||||
console.log("WebView closed message channel to server: \"" + currentMessageChannelName + "\"");
|
||||
currentMessageChannelName = null;
|
||||
}
|
||||
}else {
|
||||
console.error("WebView tried to send a message, but no websocket is open!");
|
||||
}
|
||||
};
|
||||
var sendMessageToServerStr = function(channelName, msg) {
|
||||
if(channelName.length > 255) {
|
||||
console.error("WebView tried to send a message packet, but channel name is too long, max is 255 characters!");
|
||||
return;
|
||||
}
|
||||
if(channelName !== currentMessageChannelName) {
|
||||
console.error("WebView tried to send a message packet, but the channel is not open!");
|
||||
return;
|
||||
}
|
||||
if(websocketInstance !== null) {
|
||||
websocketInstance.send(JSON.stringify({$:5,msg:msg}));
|
||||
}else {
|
||||
console.error("WebView tried to send a message, but no callback for sending packets is set!");
|
||||
}
|
||||
};
|
||||
var sendMessageToServerBin = function(channelName, msg) {
|
||||
if(channelName.length > 255) {
|
||||
console.error("WebView tried to send a message packet, but channel name is too long, max is 255 characters!");
|
||||
return;
|
||||
}
|
||||
if(channelName !== currentMessageChannelName) {
|
||||
console.error("WebView tried to send a message packet, but the channel is not open!");
|
||||
return;
|
||||
}
|
||||
if(websocketInstance !== null) {
|
||||
websocketInstance.send(msg);
|
||||
}else {
|
||||
console.error("WebView tried to send a message, but no callback for sending packets is set!");
|
||||
}
|
||||
};
|
||||
var beginShowingEnableJavaScript = function() {
|
||||
if(hasErrored) return;
|
||||
hideAllViews();
|
||||
if(webviewOptions.contentMode !== "BLOB_BASED") {
|
||||
elements.strict_csp_value.innerText = "Impossible";
|
||||
elements.strict_csp_value.style.color = "red";
|
||||
}else if(!cspAttrSupport || !eaglercraftXOpts.enableWebViewCSP) {
|
||||
elements.strict_csp_value.innerText = "Unsupported";
|
||||
elements.strict_csp_value.style.color = "red";
|
||||
}else if(webviewOptions.strictCSPEnable) {
|
||||
elements.strict_csp_value.innerText = "Enabled";
|
||||
elements.strict_csp_value.style.color = "green";
|
||||
}else {
|
||||
elements.strict_csp_value.innerText = "Disabled";
|
||||
elements.strict_csp_value.style.color = "red";
|
||||
}
|
||||
if(webviewOptions.serverMessageAPIEnabled) {
|
||||
elements.message_api_value.innerText = "Enabled";
|
||||
elements.message_api_value.style.color = "red";
|
||||
}else {
|
||||
elements.message_api_value.innerText = "Disabled";
|
||||
elements.message_api_value.style.color = "green";
|
||||
}
|
||||
elements.view_allow_javascript.style.display = "block";
|
||||
};
|
||||
var beginShowingContentBlocked = function() {
|
||||
if(hasErrored) return;
|
||||
hideAllViews();
|
||||
elements.view_javascript_blocked.style.display = "block";
|
||||
};
|
||||
var beginShowingSafetyError = function() {
|
||||
if(hasErrored) return;
|
||||
hasErrored = true;
|
||||
hideAllViews();
|
||||
elements.view_safety_error.style.display = "block";
|
||||
};
|
||||
window.addEventListener("load", function() {
|
||||
loadElements();
|
||||
loadEagtekIcon();
|
||||
setupElementListeners();
|
||||
websocketInstance = new WebSocket(webSocketURI);
|
||||
websocketInstance.binaryType = "arraybuffer";
|
||||
websocketInstance.addEventListener("open", function(evt) {
|
||||
console.log("Connection to server opened");
|
||||
hasOpened = true;
|
||||
websocketInstance.send(JSON.stringify({$:0,cspSupport:cspAttrSupport}));
|
||||
});
|
||||
websocketInstance.addEventListener("message", function(evt) {
|
||||
try {
|
||||
if(typeof evt.data === "string") {
|
||||
var pkt = JSON.parse(evt.data);
|
||||
if(typeof pkt.$ !== "number") {
|
||||
throw "Packet type is invalid";
|
||||
}
|
||||
if(webviewOptions === null) {
|
||||
if(pkt.$ === 1) {
|
||||
handleHandshake(pkt);
|
||||
}else if(pkt.$ === 2) {
|
||||
handleServerError(pkt);
|
||||
}else {
|
||||
throw "Unknown packet type " + pkt.$ + " for state handshake!"
|
||||
}
|
||||
}else {
|
||||
if(pkt.$ === 2) {
|
||||
handleServerError(pkt);
|
||||
}else if(pkt.$ === 6) {
|
||||
handleServerWebViewStrMsg(pkt);
|
||||
}else {
|
||||
throw "Unknown packet type " + pkt.$ + " for state open!"
|
||||
}
|
||||
}
|
||||
}else {
|
||||
handleServerWebViewBinMsg(evt.data);
|
||||
}
|
||||
}catch(ex) {
|
||||
console.error("Caught exception processing message from server!");
|
||||
console.error(ex);
|
||||
}
|
||||
});
|
||||
websocketInstance.addEventListener("close", function(evt) {
|
||||
websocketInstance = null;
|
||||
setErrored("Connection to EaglercraftX client lost!");
|
||||
});
|
||||
websocketInstance.addEventListener("error", function(evt) {
|
||||
console.error("WebSocket error: " + evt);
|
||||
});
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<body style="margin:0px;width:100%;height:100%;overflow:hidden;font-family:sans-serif;user-select:none;">
|
||||
<div id="view_loading" style="width:100%;height:100%;display:block;" class="__jsel">
|
||||
<div style="padding-top:13vh;">
|
||||
<h2 style="text-align:center;" id="loading_text" class="__jsel">Please Wait...</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div id="view_iframe" style="width:100%;height:100%;display:none;" class="__jsel">
|
||||
</div>
|
||||
<div id="view_allow_javascript" style="width:100%;height:100%;display:none;" class="__jsel">
|
||||
<div style="padding-top:13vh;">
|
||||
<div style="margin:auto;max-width:450px;border:6px double black;text-align:center;padding:20px;">
|
||||
<h2><img width="32" height="32" style="vertical-align:middle;" class="eagtek_icon"> Allow JavaScript</h2>
|
||||
<p style="font-family:monospace;text-decoration:underline;word-wrap:break-word;" id="target_url"></p>
|
||||
<h4 style="line-height:1.4em;">Strict CSP: <span id="strict_csp_value" class="__jsel"></span> | Message API: <span id="message_api_value" class="__jsel"></span></h4>
|
||||
<p><input id="chkbox_remember" type="checkbox" class="__jsel" checked> Remember my choice</p>
|
||||
<p><button style="font-size:1.5em;" id="button_allow" class="__jsel">Allow</button> <button style="font-size:1.5em;" id="button_block" class="__jsel">Block</button></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="view_javascript_blocked" style="width:100%;height:100%;display:none;" class="__jsel">
|
||||
<div style="padding-top:13vh;">
|
||||
<h1 style="text-align:center;"><img width="48" height="48" style="vertical-align:middle;" class="eagtek_icon"> Content Blocked</h1>
|
||||
<h4 style="text-align:center;">You chose to block JavaScript execution for this embed</h4>
|
||||
<p style="text-align:center;"><button style="font-size:1.0em;" id="button_re_evaluate" class="__jsel">Re-evaluate</button></p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="view_safety_error" style="width:100%;height:100%;display:none;" class="__jsel">
|
||||
<div style="padding-top:13vh;">
|
||||
<h1 style="text-align:center;"><img width="48" height="48" style="vertical-align:middle;" class="eagtek_icon"> IFrame Safety Error</h1>
|
||||
<h4 style="text-align:center;">The content cannot be displayed safely!</h4>
|
||||
<h4 style="text-align:center;">Check console for more details</h4>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -3,24 +3,26 @@
|
|||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
lax1dude:
|
||||
|
||||
|
||||
- Creator of Eaglercraft
|
||||
- Ported the Minecraft 1.8 src to TeaVM
|
||||
- Wrote HW accelerated OpenGL 1.3 emulator
|
||||
- Wrote the default shader pack
|
||||
- Made the integrated PBR resource pack
|
||||
- Added touch and mobile device support
|
||||
- Wrote all desktop emulation code
|
||||
- Wrote EaglercraftXBungee
|
||||
- Wrote EaglercraftXVelocity
|
||||
- Wrote WebRTC relay server
|
||||
- Wrote voice chat server
|
||||
- Wrote the patch and build system
|
||||
|
||||
|
||||
ayunami2000:
|
||||
|
||||
|
||||
- Many bug fixes
|
||||
- WebRTC LAN worlds
|
||||
- WebRTC voice chat
|
||||
- Worked on touch support
|
||||
- Made velocity plugin work
|
||||
- Added resource packs
|
||||
- Added screen recording
|
||||
|
@ -410,7 +412,7 @@
|
|||
Project Author: The Legion of the Bouncy Castle
|
||||
Project URL: https://www.bouncycastle.org/java.html
|
||||
|
||||
Used For: MD5, SHA-1, SHA-256 implementations
|
||||
Used For: MD5, SHA-1, SHA-256, and AES implementations
|
||||
|
||||
* Copyright (c) 2000-2021 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org)
|
||||
*
|
||||
|
@ -668,23 +670,23 @@
|
|||
Project Author: ymnk, JCraft Inc.
|
||||
Project URL: http://www.jcraft.com/jorbis/
|
||||
|
||||
Used For: Audio in desktop runtime
|
||||
Used For: Audio in desktop runtime and browsers that don't support OGG
|
||||
|
||||
* JOrbis
|
||||
* Copyright (C) 2000 ymnk, JCraft,Inc.
|
||||
*
|
||||
*
|
||||
* Written by: 2000 ymnk<ymnk@jcraft.com>
|
||||
*
|
||||
* Many thanks to
|
||||
* Monty <monty@xiph.org> and
|
||||
* The XIPHOPHORUS Company http://www.xiph.org/ .
|
||||
* JOrbis has been based on their awesome works, Vorbis codec.
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
|
@ -696,6 +698,44 @@
|
|||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
Project Name: NanoHTTPD
|
||||
Project Author: NanoHTTPD
|
||||
Project URL: http://nanohttpd.org/
|
||||
|
||||
Used For: HTTP server in the desktop runtime
|
||||
|
||||
* Copyright (c) 2012-2013 by Paul S. Hawke,
|
||||
* 2001,2005-2013 by Jarno Elonen,
|
||||
* 2010 by Konstantinos Togias All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* Neither the name of the NanoHttpd organization nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* 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.
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
Project Name: sqlite-jdbc
|
||||
Project Author: Taro L. Saito (xerial)
|
||||
Project URL: https://github.com/xerial/sqlite-jdbc
|
||||
|
|
After Width: | Height: | Size: 841 B |
After Width: | Height: | Size: 860 B |
After Width: | Height: | Size: 855 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 689 B |
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -16,21 +16,17 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision mediump float;
|
||||
precision mediump sampler2D;
|
||||
EAGLER_IN(vec2, v_texCoord2f)
|
||||
EAGLER_IN(vec4, v_color4f)
|
||||
|
||||
in vec2 v_texCoord2f;
|
||||
in vec4 v_color4f;
|
||||
|
||||
layout(location = 0) out vec4 output4f;
|
||||
EAGLER_FRAG_OUT()
|
||||
|
||||
uniform sampler2D u_inputTexture;
|
||||
uniform vec4 u_colorBias4f;
|
||||
|
||||
void main() {
|
||||
output4f = texture(u_inputTexture, v_texCoord2f) * v_color4f + u_colorBias4f;
|
||||
if(output4f.a < 0.004) {
|
||||
EAGLER_FRAG_COLOR = EAGLER_TEXTURE_2D(u_inputTexture, v_texCoord2f) * v_color4f + u_colorBias4f;
|
||||
if(EAGLER_FRAG_COLOR.a < 0.004) {
|
||||
discard;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -16,18 +16,15 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision highp float;
|
||||
precision mediump sampler2D;
|
||||
EAGLER_VSH_LAYOUT_BEGIN()
|
||||
EAGLER_IN(0, vec3, a_position3f)
|
||||
EAGLER_IN(1, vec2, c_position2i)
|
||||
EAGLER_IN(2, vec2, c_coords2i)
|
||||
EAGLER_IN(3, vec4, c_color4f)
|
||||
EAGLER_VSH_LAYOUT_END()
|
||||
|
||||
layout(location = 0) in vec3 a_position3f;
|
||||
|
||||
layout(location = 1) in vec2 c_position2i;
|
||||
layout(location = 2) in vec2 c_coords2i;
|
||||
layout(location = 3) in vec4 c_color4f;
|
||||
|
||||
out vec2 v_texCoord2f;
|
||||
out vec4 v_color4f;
|
||||
EAGLER_OUT(vec2, v_texCoord2f)
|
||||
EAGLER_OUT(vec4, v_color4f)
|
||||
|
||||
uniform mat4 u_matrixTransform;
|
||||
uniform vec2 u_charSize2f;
|
||||
|
@ -49,5 +46,5 @@ void main() {
|
|||
pos2d.x -= (a_position3f.y - 0.5) * italicBit;
|
||||
v_color4f.a *= 2.0;
|
||||
v_color4f *= u_color4f;
|
||||
gl_Position = u_matrixTransform * vec4(pos2d, 0.0, 1.0);
|
||||
EAGLER_VERT_POSITION = u_matrixTransform * vec4(pos2d, 0.0, 1.0);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -16,20 +16,16 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision mediump float;
|
||||
precision mediump sampler2D;
|
||||
EAGLER_IN(vec2, v_texCoord2f)
|
||||
EAGLER_IN(vec4, v_color4f)
|
||||
|
||||
in vec2 v_texCoord2f;
|
||||
in vec4 v_color4f;
|
||||
|
||||
layout(location = 0) out vec4 output4f;
|
||||
EAGLER_FRAG_OUT()
|
||||
|
||||
uniform sampler2D u_inputTexture;
|
||||
|
||||
void main() {
|
||||
output4f = texture(u_inputTexture, v_texCoord2f) * v_color4f;
|
||||
if(output4f.a < 0.004) {
|
||||
EAGLER_FRAG_COLOR = EAGLER_TEXTURE_2D(u_inputTexture, v_texCoord2f) * v_color4f;
|
||||
if(EAGLER_FRAG_COLOR.a < 0.004) {
|
||||
discard;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -16,20 +16,17 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision highp float;
|
||||
precision mediump sampler2D;
|
||||
EAGLER_VSH_LAYOUT_BEGIN()
|
||||
EAGLER_IN(0, vec2, a_position2f)
|
||||
EAGLER_IN(1, vec3, p_position3f)
|
||||
EAGLER_IN(2, vec2, p_texCoords2i)
|
||||
EAGLER_IN(3, vec2, p_lightMap2f)
|
||||
EAGLER_IN(4, vec2, p_particleSize_texCoordsSize_2i)
|
||||
EAGLER_IN(5, vec4, p_color4f)
|
||||
EAGLER_VSH_LAYOUT_END()
|
||||
|
||||
layout(location = 0) in vec2 a_position2f;
|
||||
|
||||
layout(location = 1) in vec3 p_position3f;
|
||||
layout(location = 2) in vec2 p_texCoords2i;
|
||||
layout(location = 3) in vec2 p_lightMap2f;
|
||||
layout(location = 4) in vec2 p_particleSize_texCoordsSize_2i;
|
||||
layout(location = 5) in vec4 p_color4f;
|
||||
|
||||
out vec2 v_texCoord2f;
|
||||
out vec4 v_color4f;
|
||||
EAGLER_OUT(vec2, v_texCoord2f)
|
||||
EAGLER_OUT(vec4, v_color4f)
|
||||
|
||||
uniform mat4 u_matrixTransform;
|
||||
uniform vec3 u_texCoordSize2f_particleSize1f;
|
||||
|
@ -40,7 +37,7 @@ uniform vec4 u_color4f;
|
|||
uniform sampler2D u_lightmapTexture;
|
||||
|
||||
void main() {
|
||||
v_color4f = u_color4f * p_color4f.bgra * texture(u_lightmapTexture, p_lightMap2f);
|
||||
v_color4f = u_color4f * p_color4f.bgra * EAGLER_TEXTURE_2D(u_lightmapTexture, p_lightMap2f);
|
||||
|
||||
vec2 tex2f = a_position2f * 0.5 + 0.5;
|
||||
tex2f.y = 1.0 - tex2f.y;
|
||||
|
@ -54,5 +51,5 @@ void main() {
|
|||
pos3f += u_transformParam_1_2_5_f * spos2f.xyy;
|
||||
pos3f.zx += u_transformParam_3_4_f * spos2f;
|
||||
|
||||
gl_Position = u_matrixTransform * vec4(pos3f, 1.0);
|
||||
EAGLER_VERT_POSITION = u_matrixTransform * vec4(pos3f, 1.0);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -17,11 +17,11 @@
|
|||
*/
|
||||
|
||||
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
|
||||
in vec4 v_position4f;
|
||||
EAGLER_IN(vec4, v_position4f)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_TEXTURE_ATTRIB
|
||||
in vec2 v_texture2f;
|
||||
EAGLER_IN(vec2, v_texture2f)
|
||||
#endif
|
||||
|
||||
uniform vec4 u_color4f;
|
||||
|
@ -32,15 +32,15 @@ uniform vec4 u_colorBlendAdd4f;
|
|||
#endif
|
||||
|
||||
#ifdef COMPILE_COLOR_ATTRIB
|
||||
in vec4 v_color4f;
|
||||
EAGLER_IN(vec4, v_color4f)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_NORMAL_ATTRIB
|
||||
in vec3 v_normal3f;
|
||||
EAGLER_IN(vec3, v_normal3f)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_LIGHTMAP_ATTRIB
|
||||
in vec2 v_lightmap2f;
|
||||
EAGLER_IN(vec2, v_lightmap2f)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_ENABLE_TEXTURE2D
|
||||
|
@ -76,7 +76,7 @@ uniform vec4 u_fogColor4f;
|
|||
#endif
|
||||
|
||||
#ifdef COMPILE_ENABLE_TEX_GEN
|
||||
in vec3 v_objectPosition3f;
|
||||
EAGLER_IN(vec3, v_objectPosition3f)
|
||||
uniform ivec4 u_texGenPlane4i;
|
||||
uniform vec4 u_texGenS4f;
|
||||
uniform vec4 u_texGenT4f;
|
||||
|
@ -89,7 +89,7 @@ uniform mat4 u_textureMat4f01;
|
|||
uniform vec2 u_textureAnisotropicFix;
|
||||
#endif
|
||||
|
||||
layout(location = 0) out vec4 output4f;
|
||||
EAGLER_FRAG_OUT()
|
||||
|
||||
void main() {
|
||||
|
||||
|
@ -98,22 +98,29 @@ void main() {
|
|||
#else
|
||||
vec4 color = u_color4f;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef COMPILE_ENABLE_TEX_GEN
|
||||
vec4 tmpVec4 = vec4(v_objectPosition3f, 1.0);
|
||||
vec4 texGenVector;
|
||||
|
||||
vec4 texGenPosSrc[2];
|
||||
texGenPosSrc[0] = vec4(v_objectPosition3f, 1.0);
|
||||
texGenPosSrc[1] = v_position4f;
|
||||
|
||||
texGenVector.x = dot(texGenPosSrc[u_texGenPlane4i.x], u_texGenS4f);
|
||||
texGenVector.y = dot(texGenPosSrc[u_texGenPlane4i.y], u_texGenT4f);
|
||||
texGenVector.z = dot(texGenPosSrc[u_texGenPlane4i.z], u_texGenR4f);
|
||||
texGenVector.w = dot(texGenPosSrc[u_texGenPlane4i.w], u_texGenQ4f);
|
||||
|
||||
texGenVector.x = dot(u_texGenPlane4i.x == 1 ? v_position4f : tmpVec4, u_texGenS4f);
|
||||
texGenVector.y = dot(u_texGenPlane4i.y == 1 ? v_position4f : tmpVec4, u_texGenT4f);
|
||||
texGenVector.z = dot(u_texGenPlane4i.z == 1 ? v_position4f : tmpVec4, u_texGenR4f);
|
||||
texGenVector.w = dot(u_texGenPlane4i.w == 1 ? v_position4f : tmpVec4, u_texGenQ4f);
|
||||
#ifdef EAGLER_HAS_GLES_300
|
||||
texGenVector.xyz = mat4x3(
|
||||
u_textureMat4f01[0].xyw,
|
||||
u_textureMat4f01[1].xyw,
|
||||
u_textureMat4f01[2].xyw,
|
||||
u_textureMat4f01[3].xyw
|
||||
) * texGenVector;
|
||||
texGenVector.xy /= texGenVector.z;
|
||||
#else
|
||||
texGenVector = u_textureMat4f01 * texGenVector;
|
||||
color *= texture(u_samplerTexture, texGenVector.xy / texGenVector.w);
|
||||
|
||||
texGenVector.xy /= texGenVector.w;
|
||||
#endif
|
||||
|
||||
color *= EAGLER_TEXTURE_2D(u_samplerTexture, texGenVector.xy);
|
||||
|
||||
#ifdef COMPILE_ENABLE_ALPHA_TEST
|
||||
if(color.a < u_alphaTestRef1f) discard;
|
||||
#endif
|
||||
|
@ -126,20 +133,20 @@ void main() {
|
|||
// d3d11 doesn't support GL_NEAREST upscaling with anisotropic
|
||||
// filtering enabled, so it needs this stupid fix to 'work'
|
||||
vec2 uv = floor(v_texture2f * u_textureAnisotropicFix) + 0.5;
|
||||
color *= texture(u_samplerTexture, uv / u_textureAnisotropicFix);
|
||||
color *= EAGLER_TEXTURE_2D(u_samplerTexture, uv / u_textureAnisotropicFix);
|
||||
#else
|
||||
color *= texture(u_samplerTexture, v_texture2f);
|
||||
color *= EAGLER_TEXTURE_2D(u_samplerTexture, v_texture2f);
|
||||
#endif
|
||||
#else
|
||||
color *= texture(u_samplerTexture, u_textureCoords01);
|
||||
color *= EAGLER_TEXTURE_2D(u_samplerTexture, u_textureCoords01);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_ENABLE_LIGHTMAP
|
||||
#ifdef COMPILE_LIGHTMAP_ATTRIB
|
||||
color *= texture(u_samplerLightmap, v_lightmap2f);
|
||||
color *= EAGLER_TEXTURE_2D(u_samplerLightmap, v_lightmap2f);
|
||||
#else
|
||||
color *= texture(u_samplerLightmap, u_textureCoords02);
|
||||
color *= EAGLER_TEXTURE_2D(u_samplerLightmap, u_textureCoords02);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -161,9 +168,18 @@ void main() {
|
|||
#endif
|
||||
float diffuse = 0.0;
|
||||
vec4 light;
|
||||
#ifdef EAGLER_HAS_GLES_300
|
||||
for(int i = 0; i < u_lightsEnabled1i; ++i) {
|
||||
#else
|
||||
for(int i = 0; i < 4; ++i) {
|
||||
#endif
|
||||
light = u_lightsDirections4fv[i];
|
||||
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
|
||||
#ifndef EAGLER_HAS_GLES_300
|
||||
if(i + 1 >= u_lightsEnabled1i) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
color.rgb *= min(u_lightsAmbient3f + vec3(diffuse), 1.0);
|
||||
#endif
|
||||
|
@ -179,5 +195,5 @@ void main() {
|
|||
color.rgb = mix(color.rgb, u_fogColor4f.rgb, clamp(f, 0.0, 1.0) * u_fogColor4f.a);
|
||||
#endif
|
||||
|
||||
output4f = color;
|
||||
EAGLER_FRAG_COLOR = color;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -16,39 +16,39 @@
|
|||
*
|
||||
*/
|
||||
|
||||
in vec3 a_position3f;
|
||||
EAGLER_IN_AUTO(vec3, a_position3f)
|
||||
|
||||
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
|
||||
#define _COMPILE_VARYING_POSITION
|
||||
#endif
|
||||
|
||||
#ifdef _COMPILE_VARYING_POSITION
|
||||
out vec4 v_position4f;
|
||||
EAGLER_OUT(vec4, v_position4f)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_ENABLE_TEX_GEN
|
||||
out vec3 v_objectPosition3f;
|
||||
EAGLER_OUT(vec3, v_objectPosition3f)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_TEXTURE_ATTRIB
|
||||
in vec2 a_texture2f;
|
||||
out vec2 v_texture2f;
|
||||
EAGLER_IN_AUTO(vec2, a_texture2f)
|
||||
EAGLER_OUT(vec2, v_texture2f)
|
||||
uniform mat4 u_textureMat4f01;
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_COLOR_ATTRIB
|
||||
in vec4 a_color4f;
|
||||
out vec4 v_color4f;
|
||||
EAGLER_IN_AUTO(vec4, a_color4f)
|
||||
EAGLER_OUT(vec4, v_color4f)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_NORMAL_ATTRIB
|
||||
in vec4 a_normal4f;
|
||||
out vec3 v_normal3f;
|
||||
EAGLER_IN_AUTO(vec4, a_normal4f)
|
||||
EAGLER_OUT(vec3, v_normal3f)
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_LIGHTMAP_ATTRIB
|
||||
in vec2 a_lightmap2f;
|
||||
out vec2 v_lightmap2f;
|
||||
EAGLER_IN_AUTO(vec2, a_lightmap2f)
|
||||
EAGLER_OUT(vec2, v_lightmap2f)
|
||||
uniform mat4 u_textureMat4f02;
|
||||
#endif
|
||||
|
||||
|
@ -92,8 +92,8 @@ void main() {
|
|||
#endif
|
||||
|
||||
#ifdef _COMPILE_VARYING_POSITION
|
||||
gl_Position = u_projectionMat4f * v_position4f;
|
||||
EAGLER_VERT_POSITION = u_projectionMat4f * v_position4f;
|
||||
#else
|
||||
gl_Position = u_modelviewProjMat4f * vec4(a_position3f, 1.0);
|
||||
EAGLER_VERT_POSITION = u_modelviewProjMat4f * vec4(a_position3f, 1.0);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ uniform float u_blockConstant1f;
|
|||
#define DO_COMPILE_STATE_WAVING_BLOCKS
|
||||
#define FAKE_SIN(valueIn, valueOut)\
|
||||
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
|
||||
valueOut = valueOut * valueOut * (3.0 - 2.0 * valueOut) * 2.0 - 1.0;
|
||||
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
|
||||
#define LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
|
||||
#endif
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ uniform vec4 u_wavingBlockParam4f;
|
|||
#define DO_COMPILE_STATE_WAVING_BLOCKS
|
||||
#define FAKE_SIN(valueIn, valueOut)\
|
||||
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
|
||||
valueOut = valueOut * valueOut * (3.0 - 2.0 * valueOut) * 2.0 - 1.0;
|
||||
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
|
||||
#define LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
|
||||
#endif
|
||||
|
||||
|
|
|
@ -226,20 +226,18 @@ void main() {
|
|||
#ifdef COMPILE_ENABLE_TEXTURE2D
|
||||
vec2 texCoords2f;
|
||||
#ifdef COMPILE_ENABLE_TEX_GEN
|
||||
vec4 tmpVec4 = vec4(v_objectPosition3f, 1.0);
|
||||
vec4 texGenVector;
|
||||
vec4 texGenPosSrc[2];
|
||||
texGenPosSrc[0] = vec4(v_objectPosition3f, 1.0);
|
||||
texGenPosSrc[1] = v_position4f;
|
||||
texGenVector.x = dot(texGenPosSrc[u_texGenPlane4i.x], u_texGenS4f);
|
||||
texGenVector.y = dot(texGenPosSrc[u_texGenPlane4i.y], u_texGenT4f);
|
||||
texGenVector.z = dot(texGenPosSrc[u_texGenPlane4i.z], u_texGenR4f);
|
||||
texGenVector.w = dot(texGenPosSrc[u_texGenPlane4i.w], u_texGenQ4f);
|
||||
texGenVector = vec4(mat4x3(
|
||||
texGenVector.x = dot(u_texGenPlane4i.x == 1 ? v_position4f : tmpVec4, u_texGenS4f);
|
||||
texGenVector.y = dot(u_texGenPlane4i.y == 1 ? v_position4f : tmpVec4, u_texGenT4f);
|
||||
texGenVector.z = dot(u_texGenPlane4i.z == 1 ? v_position4f : tmpVec4, u_texGenR4f);
|
||||
texGenVector.w = dot(u_texGenPlane4i.w == 1 ? v_position4f : tmpVec4, u_texGenQ4f);
|
||||
texGenVector.xyz = mat4x3(
|
||||
u_textureMat4f01[0].xyw,
|
||||
u_textureMat4f01[1].xyw,
|
||||
u_textureMat4f01[2].xyw,
|
||||
u_textureMat4f01[3].xyw
|
||||
) * texGenVector, 0.0);
|
||||
) * texGenVector;
|
||||
texCoords2f = texGenVector.xy / texGenVector.z;
|
||||
#else
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ uniform float u_baseScale1f;
|
|||
|
||||
#define FAKE_SIN(valueIn, valueOut)\
|
||||
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
|
||||
valueOut = valueOut * valueOut * (3.0 - 2.0 * valueOut) * 2.0 - 1.0;
|
||||
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
|
||||
|
||||
void main() {
|
||||
v_occlusion1f = max(textureLod(u_sunOcclusionValue, vec2(0.5, 0.5), 0.0).r * 1.5 - 0.5, 0.0);
|
||||
|
|
|
@ -99,13 +99,13 @@ void main() {
|
|||
reprojectionReflectionOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
#endif
|
||||
float fragDepth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
|
||||
float fragDepth = textureLod(u_gbufferDepthTexture, v_position2f2, 0.0).r;
|
||||
|
||||
if(fragDepth < 0.000001) {
|
||||
return;
|
||||
}
|
||||
|
||||
vec4 fragClipSpacePos4f = vec4(v_position2f, fragDepth, 1.0) * 2.0 - 1.0;
|
||||
vec4 fragClipSpacePos4f = vec4(v_position2f2, fragDepth, 1.0) * 2.0 - 1.0;
|
||||
vec4 fragPos4f = u_inverseViewProjMatrix4f * fragClipSpacePos4f;
|
||||
fragPos4f.xyz /= fragPos4f.w;
|
||||
fragPos4f.w = 1.0;
|
||||
|
|
|
@ -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.2.1",
|
||||
"vers": "1.2.2",
|
||||
"author": "lax1dude",
|
||||
"api_vers": 1,
|
||||
"features": [
|
||||
|
|
|
@ -70,7 +70,7 @@ void main() {
|
|||
originalViewSpacePos.xyz /= originalViewSpacePos.w;
|
||||
originalViewSpacePos.w = 1.0;
|
||||
|
||||
vec4 noiseVec = textureLod(u_noiseConstantTexture, u_randomizerDataMatrix2f * (v_position2f + originalViewSpacePos.xy + normal3f.xz), 0.0);
|
||||
vec4 noiseVec = textureLod(u_noiseConstantTexture, 13.3725 / fract((u_randomizerDataMatrix2f * (v_position2f * 0.42695346 + originalViewSpacePos.xy * 1.373769945645 + normal3f.xz * 42.69456453)) * 1.123234234), 0.0);
|
||||
noiseVec.xyz *= 2.0;
|
||||
noiseVec.xyz -= 1.0;
|
||||
|
||||
|
|
|
@ -107,22 +107,23 @@ void main() {
|
|||
#else
|
||||
vec4 color = u_color4f;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef COMPILE_ENABLE_TEX_GEN
|
||||
vec4 tmpVec4 = vec4(v_objectPosition3f, 1.0);
|
||||
vec4 texGenVector;
|
||||
|
||||
vec4 texGenPosSrc[2];
|
||||
texGenPosSrc[0] = vec4(v_objectPosition3f, 1.0);
|
||||
texGenPosSrc[1] = v_position4f;
|
||||
|
||||
texGenVector.x = dot(texGenPosSrc[u_texGenPlane4i.x], u_texGenS4f);
|
||||
texGenVector.y = dot(texGenPosSrc[u_texGenPlane4i.y], u_texGenT4f);
|
||||
texGenVector.z = dot(texGenPosSrc[u_texGenPlane4i.z], u_texGenR4f);
|
||||
texGenVector.w = dot(texGenPosSrc[u_texGenPlane4i.w], u_texGenQ4f);
|
||||
|
||||
texGenVector = u_textureMat4f01 * texGenVector;
|
||||
color *= texture(u_samplerTexture, texGenVector.xy / texGenVector.w);
|
||||
|
||||
texGenVector.x = dot(u_texGenPlane4i.x == 1 ? v_position4f : tmpVec4, u_texGenS4f);
|
||||
texGenVector.y = dot(u_texGenPlane4i.y == 1 ? v_position4f : tmpVec4, u_texGenT4f);
|
||||
texGenVector.z = dot(u_texGenPlane4i.z == 1 ? v_position4f : tmpVec4, u_texGenR4f);
|
||||
texGenVector.w = dot(u_texGenPlane4i.w == 1 ? v_position4f : tmpVec4, u_texGenQ4f);
|
||||
texGenVector.xyz = mat4x3(
|
||||
u_textureMat4f01[0].xyw,
|
||||
u_textureMat4f01[1].xyw,
|
||||
u_textureMat4f01[2].xyw,
|
||||
u_textureMat4f01[3].xyw
|
||||
) * texGenVector;
|
||||
|
||||
color *= texture(u_samplerTexture, texGenVector.xy / texGenVector.z);
|
||||
|
||||
#ifdef COMPILE_ENABLE_ALPHA_TEST
|
||||
if(color.a < u_alphaTestRef1f) discard;
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
#line 2 6969
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef EAGLER_HAS_GLES_300
|
||||
|
||||
// For GLES 3.00+ (WebGL 2.0)
|
||||
#ifdef EAGLER_IS_VERTEX_SHADER
|
||||
|
||||
// Vertex Shaders:
|
||||
#define EAGLER_VSH_LAYOUT_BEGIN()
|
||||
#define EAGLER_VSH_LAYOUT_END()
|
||||
#define EAGLER_IN(_loc, _type, _name) layout(location = _loc) in _type _name;
|
||||
#define EAGLER_IN_AUTO(_type, _name) in _type _name;
|
||||
#define EAGLER_OUT(_type, _name) out _type _name;
|
||||
#define EAGLER_VERT_POSITION gl_Position
|
||||
|
||||
#else
|
||||
#ifdef EAGLER_IS_FRAGMENT_SHADER
|
||||
|
||||
// Fragment Shaders:
|
||||
#define EAGLER_IN(_type, _name) in _type _name;
|
||||
#define EAGLER_FRAG_COLOR eagler_FragColor
|
||||
#define EAGLER_FRAG_DEPTH gl_FragDepth
|
||||
|
||||
#define EAGLER_FRAG_OUT() layout(location = 0) out vec4 EAGLER_FRAG_COLOR;
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// All Shaders:
|
||||
|
||||
#define EAGLER_TEXTURE_2D(tex, coord2f) texture(tex, coord2f)
|
||||
#define EAGLER_TEXTURE_2D_LOD(_tex, _coord2f, _lod1f) textureLod(_tex, _coord2f, _lod1f)
|
||||
#define EAGLER_HAS_TEXTURE_2D_LOD
|
||||
|
||||
|
||||
#else
|
||||
#ifdef EAGLER_HAS_GLES_200
|
||||
|
||||
// For GLES 2.00 (WebGL 1.0)
|
||||
#ifdef EAGLER_IS_VERTEX_SHADER
|
||||
|
||||
// Vertex Shaders:
|
||||
#define EAGLER_VSH_LAYOUT_BEGIN()
|
||||
#define EAGLER_VSH_LAYOUT_END()
|
||||
#define EAGLER_IN(_loc, _type, _name) attribute _type _name;
|
||||
#define EAGLER_IN_AUTO(_type, _name) attribute _type _name;
|
||||
#define EAGLER_OUT(_type, _name) varying _type _name;
|
||||
#define EAGLER_VERT_POSITION gl_Position
|
||||
|
||||
#else
|
||||
#ifdef EAGLER_IS_FRAGMENT_SHADER
|
||||
|
||||
// Fragment Shaders:
|
||||
#define EAGLER_IN(_type, _name) varying _type _name;
|
||||
#define EAGLER_FRAG_COLOR gl_FragColor
|
||||
// TODO: Must require EXT_frag_depth to use this on GLES 2.0 (currently not needed)
|
||||
#define EAGLER_FRAG_DEPTH gl_FragDepth
|
||||
|
||||
#define EAGLER_FRAG_OUT()
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// All Shaders:
|
||||
|
||||
#define EAGLER_TEXTURE_2D(_tex, _coord2f) texture2D(_tex, _coord2f)
|
||||
|
||||
#ifdef EAGLER_HAS_GLES_200_SHADER_TEXTURE_LOD
|
||||
#define EAGLER_TEXTURE_2D_LOD(_tex, _coord2f, _lod1f) texture2DLodEXT(_tex, _coord2f, _lod1f)
|
||||
#define EAGLER_HAS_TEXTURE_2D_LOD
|
||||
#else
|
||||
// Beware!
|
||||
#define EAGLER_TEXTURE_2D_LOD(_tex, _coord2f, _lod1f) texture2D(_tex, _coord2f)
|
||||
#define EAGLER_HAS_TEXTURE_2D_LOD
|
||||
#endif
|
||||
|
||||
#else
|
||||
#error Unable to determine API version! (Missing directive EAGLER_HAS_GLES_200 or 300)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#line 1 0
|
|
@ -0,0 +1,55 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
EAGLER_IN(vec2, v_position2f)
|
||||
|
||||
EAGLER_FRAG_OUT()
|
||||
|
||||
uniform sampler2D u_inputTexture;
|
||||
uniform mat4 u_textureMatrix;
|
||||
|
||||
vec2 rand(in vec2 co){
|
||||
float f = dot(co, vec2(12.98984576, 78.23378678));
|
||||
return fract(vec2(sin(f + 0.32490982), cos(f - 0.69890)) * 43758.54576873);
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec4 coords4f = vec4(v_position2f.x * 0.25 - 0.125, v_position2f.y * 0.25 - 0.125, v_position2f.y * 10.0 - 9.0, 1.0);
|
||||
coords4f = u_textureMatrix * coords4f;
|
||||
coords4f.xy /= coords4f.w;
|
||||
EAGLER_FRAG_COLOR = EAGLER_TEXTURE_2D(u_inputTexture, coords4f.xy * 0.5 + 0.5);
|
||||
EAGLER_FRAG_COLOR.rg += rand(v_position2f * 1.2344574345) * 0.05;
|
||||
EAGLER_FRAG_COLOR.ba -= rand(v_position2f * 1.2343525225) * 0.05;
|
||||
EAGLER_FRAG_COLOR.a = fract(sin(dot(coords4f.yz, vec2(12.9898, 78.233))) * 43758.5453);
|
||||
EAGLER_FRAG_COLOR.a += exp(length(rand(coords4f.xw)) * -69.420);
|
||||
EAGLER_FRAG_COLOR = pow(EAGLER_FRAG_COLOR, vec4(1.0 / 2.423952));
|
||||
EAGLER_FRAG_COLOR = pow(EAGLER_FRAG_COLOR, vec4(5.4523856));
|
||||
EAGLER_FRAG_COLOR += 0.00004423 + EAGLER_FRAG_COLOR.a * 0.02;
|
||||
EAGLER_FRAG_COLOR = sqrt(EAGLER_FRAG_COLOR);
|
||||
EAGLER_FRAG_COLOR = pow(EAGLER_FRAG_COLOR, vec4(1.0 / 1.9023576));
|
||||
#ifdef EAGLER_HAS_GLES_300
|
||||
EAGLER_FRAG_COLOR.ra += tanh(fract(EAGLER_FRAG_COLOR.a * 32.324834)) * 0.1012426;
|
||||
#endif
|
||||
EAGLER_FRAG_COLOR.b *= 0.934924;
|
||||
EAGLER_FRAG_COLOR.b += (1.23213 / inversesqrt(EAGLER_FRAG_COLOR.a)) * 0.156365;
|
||||
EAGLER_FRAG_COLOR.ga += rand(gl_FragCoord.xy) * 0.13423567;
|
||||
EAGLER_FRAG_COLOR.rb += gl_PointCoord * 0.0124264565;
|
||||
#ifdef EAGLER_HAS_GLES_300
|
||||
EAGLER_FRAG_COLOR *= 0.95234 + asinh(EAGLER_FRAG_COLOR.g * 5.23423) * 0.0254325;
|
||||
#endif
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -16,15 +16,13 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision highp float;
|
||||
precision lowp sampler2D;
|
||||
EAGLER_VSH_LAYOUT_BEGIN()
|
||||
EAGLER_IN(0, vec2, a_position2f)
|
||||
EAGLER_VSH_LAYOUT_END()
|
||||
|
||||
layout(location = 0) in vec2 a_position2f;
|
||||
|
||||
out vec2 v_position2f;
|
||||
EAGLER_OUT(vec2, v_position2f)
|
||||
|
||||
void main() {
|
||||
v_position2f = a_position2f * 0.5 + 0.5;
|
||||
gl_Position = vec4(a_position2f, 0.0, 1.0);
|
||||
EAGLER_VERT_POSITION = vec4(a_position2f, 0.0, 1.0);
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
#line 2
|
||||
|
||||
// Remove this line below if you plan to modify this file
|
||||
#ifndef EAGLER_IS_GLES_200
|
||||
#define USE_OPTIMIZED
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -52,14 +54,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision mediump float;
|
||||
precision mediump sampler2D;
|
||||
EAGLER_IN(vec2, v_position2f)
|
||||
|
||||
|
||||
in vec2 v_position2f;
|
||||
|
||||
layout(location = 0) out vec4 output4f;
|
||||
EAGLER_FRAG_OUT()
|
||||
|
||||
uniform sampler2D u_screenTexture;
|
||||
uniform vec2 u_screenSize2f;
|
||||
|
@ -110,7 +107,7 @@ uniform vec2 u_screenSize2f;
|
|||
#define FxaaTex sampler2D
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
#define FxaaTexTop(t, p) textureLod(t, p, 0.0)
|
||||
#define FxaaTexTop(t, p) EAGLER_TEXTURE_2D_LOD(t, p, 0.0)
|
||||
|
||||
/*============================================================================
|
||||
GREEN AS LUMA OPTION SUPPORT FUNCTION
|
||||
|
@ -298,7 +295,7 @@ void main(){
|
|||
rcpFrameOpt.xy = -screenSize05;
|
||||
rcpFrameOpt.zw = screenSize05;
|
||||
|
||||
output4f = vec4(FxaaPixelShader(v_position2f + screenSize05, posPos, u_screenTexture, rcpFrameOpt, rcpFrameOpt * 4.0, edgeSharpness, edgeThreshold, edgeThresholdMin).rgb, 1.0);
|
||||
EAGLER_FRAG_COLOR = vec4(FxaaPixelShader(v_position2f + screenSize05, posPos, u_screenTexture, rcpFrameOpt, rcpFrameOpt * 4.0, edgeSharpness, edgeThreshold, edgeThresholdMin).rgb, 1.0);
|
||||
}
|
||||
#else
|
||||
|
||||
|
@ -306,7 +303,6 @@ void main(){
|
|||
// Is it faster? Idfk, probably compiles faster at least, what matters it I tried
|
||||
|
||||
float _616;
|
||||
vec4 _617;
|
||||
|
||||
void main()
|
||||
{
|
||||
|
@ -317,14 +313,14 @@ void main()
|
|||
mediump vec4 _608;
|
||||
for(;;)
|
||||
{
|
||||
mediump vec3 _532 = textureLod(u_screenTexture, _611.xy, 0.0).xyz;
|
||||
mediump vec3 _532 = EAGLER_TEXTURE_2D_LOD(u_screenTexture, _611.xy, 0.0).xyz;
|
||||
mediump float _536 = dot(_532 * _532, vec3(0.2989999949932098388671875, 0.58700001239776611328125, 0.114000000059604644775390625));
|
||||
mediump vec3 _540 = textureLod(u_screenTexture, _611.xw, 0.0).xyz;
|
||||
mediump vec3 _540 = EAGLER_TEXTURE_2D_LOD(u_screenTexture, _611.xw, 0.0).xyz;
|
||||
mediump float _544 = dot(_540 * _540, vec3(0.2989999949932098388671875, 0.58700001239776611328125, 0.114000000059604644775390625));
|
||||
mediump vec3 _548 = textureLod(u_screenTexture, _611.zy, 0.0).xyz;
|
||||
mediump vec3 _556 = textureLod(u_screenTexture, _611.zw, 0.0).xyz;
|
||||
mediump vec3 _548 = EAGLER_TEXTURE_2D_LOD(u_screenTexture, _611.zy, 0.0).xyz;
|
||||
mediump vec3 _556 = EAGLER_TEXTURE_2D_LOD(u_screenTexture, _611.zw, 0.0).xyz;
|
||||
mediump float _560 = dot(_556 * _556, vec3(0.2989999949932098388671875, 0.58700001239776611328125, 0.114000000059604644775390625));
|
||||
mediump vec4 _390 = textureLod(u_screenTexture, _290, 0.0);
|
||||
mediump vec4 _390 = EAGLER_TEXTURE_2D_LOD(u_screenTexture, _290, 0.0);
|
||||
mediump vec3 _564 = _390.xyz;
|
||||
mediump float _568 = dot(_564 * _564, vec3(0.2989999949932098388671875, 0.58700001239776611328125, 0.114000000059604644775390625));
|
||||
mediump float _397 = dot(_548 * _548, vec3(0.2989999949932098388671875, 0.58700001239776611328125, 0.114000000059604644775390625)) + 0.00260416674427688121795654296875;
|
||||
|
@ -347,8 +343,8 @@ void main()
|
|||
mediump vec2 _484 = (_612 * 4.0).zw;
|
||||
vec2 _615 = -hp_copy_481;
|
||||
mediump vec2 mp_copy_615 = _615;
|
||||
mediump vec4 _498 = textureLod(u_screenTexture, mp_copy_614 * _454 + _290, 0.0) + textureLod(u_screenTexture, _449 * _454 + _290, 0.0);
|
||||
mediump vec4 _505 = ((textureLod(u_screenTexture, mp_copy_615 * _484 + _290, 0.0) + textureLod(u_screenTexture, _481 * _484 + _290, 0.0)) * 0.25) + (_498 * 0.25);
|
||||
mediump vec4 _498 = EAGLER_TEXTURE_2D_LOD(u_screenTexture, mp_copy_614 * _454 + _290, 0.0) + EAGLER_TEXTURE_2D_LOD(u_screenTexture, _449 * _454 + _290, 0.0);
|
||||
mediump vec4 _505 = ((EAGLER_TEXTURE_2D_LOD(u_screenTexture, mp_copy_615 * _484 + _290, 0.0) + EAGLER_TEXTURE_2D_LOD(u_screenTexture, _481 * _484 + _290, 0.0)) * 0.25) + (_498 * 0.25);
|
||||
mediump float _576 = dot(_505.xyz * _505.xyz, vec3(0.2989999949932098388671875, 0.58700001239776611328125, 0.114000000059604644775390625));
|
||||
mediump vec4 _607;
|
||||
if ((_576 < _412) || (_576 > _409))
|
||||
|
@ -367,7 +363,7 @@ void main()
|
|||
_608 = _607;
|
||||
break;
|
||||
}
|
||||
output4f = vec4(_608.xyz, 1.0);
|
||||
EAGLER_FRAG_COLOR = vec4(_608.xyz, 1.0);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2023 lax1dude. All Rights Reserved.
|
||||
* Copyright (c) 2023-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
|
||||
|
@ -16,14 +16,10 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision highp float;
|
||||
precision highp sampler2D;
|
||||
|
||||
in vec2 v_texCoords2f;
|
||||
EAGLER_IN(vec2, v_texCoords2f)
|
||||
|
||||
#ifndef COMPILE_BLIT_DEPTH
|
||||
layout(location = 0) out vec4 output4f;
|
||||
EAGLER_FRAG_OUT()
|
||||
#endif
|
||||
|
||||
uniform sampler2D u_inputTexture;
|
||||
|
@ -40,8 +36,8 @@ void main() {
|
|||
uv2f = (floor(uv2f * u_pixelAlignmentSizes4f.xy) + u_pixelAlignmentOffset2f) * u_pixelAlignmentSizes4f.zw;
|
||||
#endif
|
||||
#ifndef COMPILE_BLIT_DEPTH
|
||||
output4f = textureLod(u_inputTexture, uv2f, u_textureLod1f);
|
||||
EAGLER_FRAG_COLOR = EAGLER_TEXTURE_2D_LOD(u_inputTexture, uv2f, u_textureLod1f);
|
||||
#else
|
||||
gl_FragDepth = textureLod(u_inputTexture, uv2f, u_textureLod1f).r;
|
||||
EAGLER_FRAG_DEPTH = EAGLER_TEXTURE_2D_LOD(u_inputTexture, uv2f, u_textureLod1f).r;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2023 lax1dude. All Rights Reserved.
|
||||
* Copyright (c) 2023-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
|
||||
|
@ -16,13 +16,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision lowp float;
|
||||
precision lowp sampler2D;
|
||||
EAGLER_VSH_LAYOUT_BEGIN()
|
||||
EAGLER_IN(0, vec2, a_position2f)
|
||||
EAGLER_VSH_LAYOUT_END()
|
||||
|
||||
layout(location = 0) in vec2 a_position2f;
|
||||
|
||||
out vec2 v_texCoords2f;
|
||||
EAGLER_OUT(vec2, v_texCoords2f)
|
||||
|
||||
uniform vec4 u_srcCoords4f;
|
||||
uniform vec4 u_dstCoords4f;
|
||||
|
@ -30,5 +28,5 @@ uniform vec4 u_dstCoords4f;
|
|||
void main() {
|
||||
vec2 uv = a_position2f * 0.5 + 0.5;
|
||||
v_texCoords2f = u_srcCoords4f.xy + u_srcCoords4f.zw * uv;
|
||||
gl_Position = vec4(u_dstCoords4f.xy + u_dstCoords4f.zw * uv, 0.0, 1.0);
|
||||
EAGLER_VERT_POSITION = vec4(u_dstCoords4f.xy + u_dstCoords4f.zw * uv, 0.0, 1.0);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#line 2
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
|
||||
* 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
|
||||
|
@ -16,13 +16,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
precision lowp int;
|
||||
precision highp float;
|
||||
precision highp sampler2D;
|
||||
EAGLER_IN(vec2, v_position2f)
|
||||
|
||||
in vec2 v_position2f;
|
||||
|
||||
layout(location = 0) out vec4 output4f;
|
||||
EAGLER_FRAG_OUT()
|
||||
|
||||
uniform sampler2D u_inputTexture;
|
||||
uniform float u_textureLod1f;
|
||||
|
@ -32,6 +28,6 @@ uniform mat3 u_matrixTransform;
|
|||
|
||||
void main() {
|
||||
vec3 coords = u_matrixTransform * vec3(v_position2f, 1.0);
|
||||
vec4 color4f = textureLod(u_inputTexture, coords.xy, u_textureLod1f);
|
||||
output4f = color4f * u_blendFactor4f + u_blendBias4f;
|
||||
vec4 color4f = EAGLER_TEXTURE_2D_LOD(u_inputTexture, coords.xy, u_textureLod1f);
|
||||
EAGLER_FRAG_COLOR = color4f * u_blendFactor4f + u_blendBias4f;
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 13 KiB |
|
@ -15,11 +15,6 @@ gui.no=No
|
|||
gui.none=None
|
||||
gui.all=All
|
||||
|
||||
eaglercraft.recording.unsupported=Recording Unsupported!
|
||||
eaglercraft.recording.stop=Stop Recording
|
||||
eaglercraft.recording.start=Record Screen...
|
||||
eaglercraft.soundCategory.voice=Recording Voice
|
||||
|
||||
eaglercraft.resourcePack.prompt.title=What do you want to do with '%s'?
|
||||
eaglercraft.resourcePack.prompt.text=Tip: Hold Shift to skip this screen when selecting a resource pack!
|
||||
eaglercraft.resourcePack.prompt.delete=Delete this resource pack
|
||||
|
@ -246,6 +241,7 @@ eaglercraft.shaders.gui.option.POST_FXAA.desc.5=OFF: disable fxaa (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!
|
||||
|
||||
eaglercraft.shaders.debugMenuTip=Press %s+4 to access the shader debug menu
|
||||
|
||||
|
@ -253,7 +249,7 @@ eaglercraft.command.skull.tip=Use /eagskull to create custom skulls
|
|||
eaglercraft.command.skull.usage=/eagskull
|
||||
eaglercraft.command.skull.nopermission=Cheats are not enabled!
|
||||
eaglercraft.command.skull.feedback=Created new skull: "%s"
|
||||
eaglercraft.command.skull.error.invalid.png=Invalid PNG file!
|
||||
eaglercraft.command.skull.error.invalid.format=Invalid or unsupported image file!
|
||||
eaglercraft.command.skull.error.invalid.skin=Image with size %dx%d is not a valid minecraft skin!
|
||||
|
||||
eaglercraft.command.clientStub=This command is client side!
|
||||
|
@ -428,13 +424,14 @@ eaglercraft.singleplayer.busy.confirmCancel=Confirm Cancel
|
|||
eaglercraft.singleplayer.crashed.title=Recieved a crash report from integrated server!
|
||||
eaglercraft.singleplayer.crashed.checkConsole=Check the console for more details
|
||||
eaglercraft.singleplayer.crashed.continue=Continue
|
||||
eaglercraft.singleplayer.crashed.singleThreadCont=Single Thread Mode
|
||||
|
||||
eaglercraft.singleplayer.failed.title=Singleplayer Task Failed!
|
||||
eaglercraft.singleplayer.failed.killed=The worker process was killed
|
||||
eaglercraft.singleplayer.failed.notStarted=The worker process could not start
|
||||
|
||||
eaglercraft.singleplayer.failed.singleThreadWarning.1=Worker Thread Startup Failure!
|
||||
eaglercraft.singleplayer.failed.singleThreadWarning.2=The integrated server will run in single-threaded mode
|
||||
eaglercraft.singleplayer.failed.singleThreadWarning.1=Worker Thread Issue Detected
|
||||
eaglercraft.singleplayer.failed.singleThreadWarning.2=The integrated server is running in single-threaded mode
|
||||
|
||||
eaglercraft.singleplayer.busy.listingworlds=Loading worlds
|
||||
eaglercraft.singleplayer.failed.listingworlds=Could not fetch worlds list!
|
||||
|
@ -508,11 +505,21 @@ eaglercraft.singleplayer.backup.clearPlayerData.tooltip=Clears the inventories o
|
|||
eaglercraft.singleplayer.backup.clearPlayerData.warning1=Are you sure you want to delete all player data?
|
||||
eaglercraft.singleplayer.backup.clearPlayerData.warning2=All players in '%s' will lose their inventories (besides %s)
|
||||
|
||||
eaglercraft.singleplayer.ramdiskdetected.title=Worker Issues Detected
|
||||
eaglercraft.singleplayer.ramdiskdetected.text0=Running in "RAMDisk mode", worlds cannot be saved!
|
||||
eaglercraft.singleplayer.ramdiskdetected.text1=Single thread mode may solve this issue
|
||||
eaglercraft.singleplayer.ramdiskdetected.continue=Continue
|
||||
eaglercraft.singleplayer.ramdiskdetected.singleThreadCont=Single Thread Mode
|
||||
|
||||
eaglercraft.selectWorld.backup=Backup
|
||||
|
||||
eaglercraft.selectWorld.duplicate=Duplicate World:
|
||||
eaglercraft.selectWorld.duplicateButton=Duplicate
|
||||
|
||||
eaglercraft.selectWorld.ramdiskWarning=WARNING: Running in "RAMDisk mode", worlds will NOT be saved to local storage!
|
||||
|
||||
eaglercraft.singleplayer.tpscounter.singleThreadMode=Single Thread Mode
|
||||
|
||||
eaglercraft.networkSettings.title=Shared World Relay Servers
|
||||
eaglercraft.networkSettings.add=Add Relay
|
||||
eaglercraft.networkSettings.delete=Delete Relay
|
||||
|
@ -613,6 +620,27 @@ eaglercraft.updateList.refresh=Refresh
|
|||
eaglercraft.updateList.note.0=Note: Updates are digitally signed, EaglercraftX will block any
|
||||
eaglercraft.updateList.note.1=updates that were not created by lax1dude or ayunami2000
|
||||
|
||||
eaglercraft.updateSuccess.title=Update Successful
|
||||
eaglercraft.updateSuccess.installToBootMenu=Install to Boot Menu
|
||||
eaglercraft.updateSuccess.downloadOffline=Download Offline
|
||||
|
||||
eaglercraft.updateSuccess.downloading=Downloading Offline...
|
||||
eaglercraft.updateSuccess.installing=Installing Client...
|
||||
|
||||
eaglercraft.updateFailed.title=Update Failed
|
||||
|
||||
eaglercraft.installFailed.title=Installation Failed
|
||||
|
||||
eaglercraft.updateInstall.title=Install to Boot Menu
|
||||
eaglercraft.updateInstall.setDefault=Make Default
|
||||
eaglercraft.updateInstall.setCountdown=Enable Countdown
|
||||
eaglercraft.updateInstall.install=Install
|
||||
|
||||
eaglercraft.options.pressDeleteText=Press DEL to enter boot menu
|
||||
|
||||
eaglercraft.enterBootMenu.title=Enter Boot Menu
|
||||
eaglercraft.enterBootMenu.text0=Refresh the page to enter the boot menu
|
||||
|
||||
eaglercraft.voice.title=Voice Channel
|
||||
eaglercraft.voice.titleNoVoice=Voice is disabled on this server
|
||||
eaglercraft.voice.titleVoiceUnavailable=Voice is unavailable
|
||||
|
@ -643,14 +671,15 @@ eaglercraft.voice.volumeSpeakerLabel=Speakers:
|
|||
eaglercraft.voice.volumeMicrophoneLabel=Microphone:
|
||||
|
||||
eaglercraft.voice.unsupportedWarning1=Voice Warning
|
||||
eaglercraft.voice.unsupportedWarning2=Your network's firewall may not support
|
||||
eaglercraft.voice.unsupportedWarning2=Your network configuration may not support
|
||||
eaglercraft.voice.unsupportedWarning3=eaglercraft's voice chat.
|
||||
eaglercraft.voice.unsupportedWarning4=If your game doesn't work it's your issue
|
||||
eaglercraft.voice.unsupportedWarning5=to solve, not ayunami2000's or lax1dude's.
|
||||
eaglercraft.voice.unsupportedWarning6=Don't ask them to 'fix' it for you because
|
||||
eaglercraft.voice.unsupportedWarning7=they won't help you fix a problem that only
|
||||
eaglercraft.voice.unsupportedWarning8=you or your network's administrator has the
|
||||
eaglercraft.voice.unsupportedWarning9=ability to correctly resolve.
|
||||
eaglercraft.voice.unsupportedWarning4=Voice chat is based on WebRTC and is
|
||||
eaglercraft.voice.unsupportedWarning5=normally meant to be peer-to-peer, if your
|
||||
eaglercraft.voice.unsupportedWarning6=firewall blocks peer-to-peer connections
|
||||
eaglercraft.voice.unsupportedWarning7=a TURN server will be required.
|
||||
eaglercraft.voice.unsupportedWarning8=The default OpenRelayProject TURN servers
|
||||
eaglercraft.voice.unsupportedWarning9=are no longer working in 2024!
|
||||
|
||||
eaglercraft.voice.unsupportedWarning10=Continue
|
||||
eaglercraft.voice.unsupportedWarning11=Cancel
|
||||
|
||||
|
@ -660,12 +689,115 @@ eaglercraft.voice.ipGrabWarning3=IP address to be logged by other players
|
|||
eaglercraft.voice.ipGrabWarning4=also using voice on the server.
|
||||
eaglercraft.voice.ipGrabWarning5=This issue will not be fixed, it is an
|
||||
eaglercraft.voice.ipGrabWarning6=internal browser issue, not a mistake in the
|
||||
eaglercraft.voice.ipGrabWarning7=game. Fortunately, this can only be done if
|
||||
eaglercraft.voice.ipGrabWarning8=the other player uses a hacked web browser
|
||||
eaglercraft.voice.ipGrabWarning9=or has Wireshark to capture the voice
|
||||
eaglercraft.voice.ipGrabWarning10=packets, as there exists no real javascript
|
||||
eaglercraft.voice.ipGrabWarning11=method to log IPs using a normal skidded
|
||||
eaglercraft.voice.ipGrabWarning12=eaglercraft hacked client.
|
||||
eaglercraft.voice.ipGrabWarning7=game. Sorry about that.
|
||||
|
||||
eaglercraft.revokeSessionToken.button=Revoke Session Token
|
||||
eaglercraft.revokeSessionToken.title=Select session to revoke:
|
||||
eaglercraft.revokeSessionToken.inspect=Inspect
|
||||
eaglercraft.revokeSessionToken.revoke=Revoke
|
||||
eaglercraft.revokeSessionToken.note.0=Use this tool when you believe someone has stolen your cookies
|
||||
eaglercraft.revokeSessionToken.note.1=Eagler will request the server invalidate all session tokens
|
||||
|
||||
eaglercraft.inspectSessionToken.title=Cookie Details
|
||||
eaglercraft.inspectSessionToken.details.server=Server Address:
|
||||
eaglercraft.inspectSessionToken.details.expires=Expires At:
|
||||
eaglercraft.inspectSessionToken.details.length=Byte Length:
|
||||
|
||||
eaglercraft.errorNoSessions.title=No Sessions Active!
|
||||
eaglercraft.errorNoSessions.desc=There are no revokable sessions
|
||||
|
||||
eaglercraft.revokeSendingScreen.title=Revoking Session
|
||||
eaglercraft.revokeSendingScreen.message.opening=Connecting to %s...
|
||||
eaglercraft.revokeSendingScreen.message.sending=Sending Request...
|
||||
|
||||
eaglercraft.revokeSuccess.title=Revoke Success
|
||||
eaglercraft.revokeSuccess.desc=The session was revoked sucessfully!
|
||||
|
||||
eaglercraft.revokeFailure.title=Revoke Failed
|
||||
eaglercraft.revokeFailure.desc.notSupported=The server does not support this feature!
|
||||
eaglercraft.revokeFailure.desc.notAllowed=The server does not allow revoking this token!
|
||||
eaglercraft.revokeFailure.desc.notFound=The session was not found on the server!
|
||||
eaglercraft.revokeFailure.desc.serverError=Internal server error!
|
||||
eaglercraft.revokeFailure.desc.clientError=Error handling server's response!
|
||||
eaglercraft.revokeFailure.desc.genericCode=Error code received! (Check Console)
|
||||
eaglercraft.revokeFailure.desc.connectionError=Failed to connect to the server!
|
||||
eaglercraft.revokeFailure.desc.cancelled=Connection closed
|
||||
|
||||
eaglercraft.recieveServerInfo.title=Retrieving Server Info
|
||||
eaglercraft.recieveServerInfo.checkingCache=Checking Cache
|
||||
eaglercraft.recieveServerInfo.contactingServer=Contacting Server
|
||||
eaglercraft.recieveServerInfo.recievingData=Recieving Data
|
||||
eaglercraft.recieveServerInfo.decompressing=Decompressing + Verifying
|
||||
|
||||
eaglercraft.serverInfoFailure.title=Retrieval Failed
|
||||
eaglercraft.serverInfoFailure.desc=Failed to retrieve server info!
|
||||
|
||||
eaglercraft.webviewNotSupported.title=WebView Error
|
||||
eaglercraft.webviewNotSupported.desc=WebView is not supported on this platform!
|
||||
|
||||
eaglercraft.webviewInvalidURL.title=WebView Error
|
||||
eaglercraft.webviewInvalidURL.desc=Server provided an invalid URL!
|
||||
|
||||
eaglercraft.fallbackWebViewScreen.text0=View in your browser at:
|
||||
eaglercraft.fallbackWebViewScreen.startingUp=Starting Up...
|
||||
eaglercraft.fallbackWebViewScreen.pleaseWait=Please Wait...
|
||||
eaglercraft.fallbackWebViewScreen.exited=(exited)
|
||||
eaglercraft.fallbackWebViewScreen.openButton=Open
|
||||
eaglercraft.fallbackWebViewScreen.exitButton=Exit
|
||||
|
||||
eaglercraft.webviewPhishingWaring.title=WARNING!!!
|
||||
eaglercraft.webviewPhishingWaring.text0=If you see a login page, think before you enter a password
|
||||
eaglercraft.webviewPhishingWaring.text1=Passwords can be stolen by the owner of this server or website
|
||||
eaglercraft.webviewPhishingWaring.text2=Do not log in to accounts you don't want hackers to steal
|
||||
eaglercraft.webviewPhishingWaring.dontShowAgain=Do not show this message again
|
||||
eaglercraft.webviewPhishingWaring.continue=Continue
|
||||
|
||||
eaglercraft.notifications.title=Notifications
|
||||
eaglercraft.notifications.priority=Priority: %s
|
||||
eaglercraft.notifications.priority.low=All
|
||||
eaglercraft.notifications.priority.normal=Info
|
||||
eaglercraft.notifications.priority.higher=Warning
|
||||
eaglercraft.notifications.priority.highest=Severe
|
||||
eaglercraft.notifications.clearAll=Clear All
|
||||
|
||||
eaglercraft.options.touchControlOpacity=Touch Ctrls Opacity
|
||||
|
||||
eaglercraft.options.profanityFilterButton=Profanity Filter
|
||||
|
||||
eaglercraft.profanityFilterWarning.title=Content Warning
|
||||
eaglercraft.profanityFilterWarning.text0=If you are streaming this game on Twitch, or
|
||||
eaglercraft.profanityFilterWarning.text1=are under the wise old age of 14, please enable
|
||||
eaglercraft.profanityFilterWarning.text2=the profanity filter before playing Multiplayer
|
||||
eaglercraft.profanityFilterWarning.text4=(Disable in the 'Options' -> 'Chat Settings' menu)
|
||||
|
||||
eaglercraft.options.screenRecording.unsupported=Recording Unsupported!
|
||||
eaglercraft.options.screenRecording.button=Record Screen...
|
||||
|
||||
eaglercraft.options.screenRecording.title=Screen Recording
|
||||
eaglercraft.options.screenRecording.codec=Output Format: %s
|
||||
eaglercraft.options.screenRecording.codecButton=Change...
|
||||
eaglercraft.options.screenRecording.start=Start Recording
|
||||
eaglercraft.options.screenRecording.stop=Stop Recording
|
||||
eaglercraft.options.screenRecording.status=Status: %s
|
||||
eaglercraft.options.screenRecording.status.0=Not Recording
|
||||
eaglercraft.options.screenRecording.status.1=Recording!
|
||||
eaglercraft.options.screenRecording.audioBitrate=Audio Bitrate
|
||||
eaglercraft.options.screenRecording.videoBitrate=Video Bitrate
|
||||
eaglercraft.options.screenRecording.videoResolution=Video Resolution
|
||||
eaglercraft.options.screenRecording.microphoneVolume=Microphone Volume
|
||||
eaglercraft.options.screenRecording.gameVolume=Game Volume
|
||||
eaglercraft.options.screenRecording.videoFPS=Video Frame Rate
|
||||
eaglercraft.options.screenRecording.onVSync=VSync
|
||||
eaglercraft.options.screenRecording.failed=Failed to begin recording!
|
||||
|
||||
eaglercraft.options.recordingCodec.title=Select Codec
|
||||
eaglercraft.options.recordingCodec.showAdvancedCodecs=Show Advanced: %s
|
||||
|
||||
eaglercraft.options.recordingNote.title=Recording Note
|
||||
eaglercraft.options.recordingNote.text0=If the recorded video does not play,
|
||||
eaglercraft.options.recordingNote.text1=try opening the file in your browser
|
||||
|
||||
eaglercraft.touch.interact.entity=Interact
|
||||
|
||||
selectServer.title=Select Server
|
||||
selectServer.empty=empty
|
||||
|
@ -685,10 +817,14 @@ addServer.enterName=Server Name
|
|||
addServer.enterIp=Server Address
|
||||
addServer.add=Done
|
||||
addServer.hideAddress=Hide Address
|
||||
eaglercraft.addServer.hideAddr=Hide Addr
|
||||
addServer.resourcePack=Server Resource Packs
|
||||
addServer.resourcePack.enabled=Enabled
|
||||
addServer.resourcePack.disabled=Disabled
|
||||
addServer.resourcePack.prompt=Prompt
|
||||
eaglercraft.addServer.enableCookies=Cookies
|
||||
eaglercraft.addServer.enableCookies.enabled=Enabled
|
||||
eaglercraft.addServer.enableCookies.disabled=Disabled
|
||||
lanServer.title=Shared World
|
||||
lanServer.scanning=Scanning for games on your local network
|
||||
lanServer.start=Start Shared World
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"pluginName":"EaglercraftXBungee","pluginVersion":"1.2.6","pluginButton":"Download \"EaglerXBungee-1.2.6.jar\"","pluginFilename":"EaglerXBungee.zip"}
|
||||
{"pluginName":"EaglercraftXBungee","pluginVersion":"1.3.0","pluginButton":"Download \"EaglerXBungee-1.3.0.jar\"","pluginFilename":"EaglerXBungee.zip"}
|
|
@ -0,0 +1,740 @@
|
|||
1488
|
||||
a55hole
|
||||
ahole
|
||||
ainujin
|
||||
ainuzin
|
||||
akimekura
|
||||
anal
|
||||
anus
|
||||
anuses
|
||||
anushead
|
||||
anuslick
|
||||
anuss
|
||||
aokan
|
||||
arsch
|
||||
arschloch
|
||||
arse
|
||||
arsed
|
||||
arsehole
|
||||
arseholed
|
||||
arseholes
|
||||
arseholing
|
||||
arselicker
|
||||
arses
|
||||
ass
|
||||
asshat
|
||||
asshole
|
||||
assholed
|
||||
assholes
|
||||
assholing
|
||||
asslick
|
||||
asslicker
|
||||
asses
|
||||
auschwitz
|
||||
b00bs
|
||||
b00bz
|
||||
b1tc
|
||||
baise
|
||||
bakachon
|
||||
bakatyon
|
||||
ballsack
|
||||
ballzack
|
||||
bamf
|
||||
beaner
|
||||
beeatch
|
||||
beeeyotch
|
||||
beefwhistle
|
||||
beeotch
|
||||
beetch
|
||||
beeyotch
|
||||
bellend
|
||||
bestiality
|
||||
beyitch
|
||||
beyotch
|
||||
biach
|
||||
biotch
|
||||
bitch
|
||||
bitches
|
||||
bitching
|
||||
blad
|
||||
bladt
|
||||
blowjob
|
||||
blow job
|
||||
blowme
|
||||
blow me
|
||||
blyad
|
||||
blyadt
|
||||
bon3r
|
||||
boner
|
||||
boobs
|
||||
boobz
|
||||
btch
|
||||
bukakke
|
||||
bullshit
|
||||
bung
|
||||
butagorosi
|
||||
butthead
|
||||
butthole
|
||||
buttplug
|
||||
c0ck
|
||||
cabron
|
||||
cacca
|
||||
cadela
|
||||
cagada
|
||||
cameljockey
|
||||
caralho
|
||||
castrate
|
||||
cazzo
|
||||
ceemen
|
||||
ch1nk
|
||||
chankoro
|
||||
chieokure
|
||||
chikusatsu
|
||||
ching chong
|
||||
chinga
|
||||
chingada madre
|
||||
chingado
|
||||
chingate
|
||||
chink
|
||||
chinpo
|
||||
chlamydia
|
||||
choad
|
||||
chode
|
||||
chonga
|
||||
chonko
|
||||
chonkoro
|
||||
chourimbo
|
||||
chourinbo
|
||||
chourippo
|
||||
chuurembo
|
||||
chuurenbo
|
||||
circlejerk
|
||||
cl1t
|
||||
cli7
|
||||
clit
|
||||
clitoris
|
||||
cocain
|
||||
cocaine
|
||||
cock
|
||||
cocksucker
|
||||
coglione
|
||||
coglioni
|
||||
coitus
|
||||
coituss
|
||||
cojelon
|
||||
cojones
|
||||
condom
|
||||
coon
|
||||
coon hunt
|
||||
coon kill
|
||||
coonhunt
|
||||
coonkill
|
||||
cooter
|
||||
cotton pic
|
||||
cotton pik
|
||||
cottonpic
|
||||
cottonpik
|
||||
culear
|
||||
culero
|
||||
culo
|
||||
cum
|
||||
cumming
|
||||
cun7
|
||||
cunt
|
||||
cvn7
|
||||
cvnt
|
||||
cyka
|
||||
d1kc
|
||||
d4go
|
||||
dago
|
||||
darkie
|
||||
dickhead
|
||||
dick
|
||||
dicks
|
||||
dikc
|
||||
dildo
|
||||
dio bestia
|
||||
dumass
|
||||
dumbass
|
||||
durka durka
|
||||
dyke
|
||||
ejaculate
|
||||
encule
|
||||
enjokousai
|
||||
enzyokousai
|
||||
etahinin
|
||||
etambo
|
||||
etanbo
|
||||
f0ck
|
||||
f0kc
|
||||
f3lch
|
||||
facking
|
||||
fag
|
||||
faggot
|
||||
fags
|
||||
faggots
|
||||
fanculo
|
||||
fatass
|
||||
fcuk
|
||||
fcuuk
|
||||
felch
|
||||
fellatio
|
||||
fetish
|
||||
fickdich
|
||||
figlio di puttana
|
||||
fku
|
||||
fock
|
||||
fokc
|
||||
foreskin
|
||||
fotze
|
||||
foutre
|
||||
fucc
|
||||
fuck
|
||||
fucks
|
||||
fuckd
|
||||
fucked
|
||||
fucker
|
||||
fuckers
|
||||
fucking
|
||||
fuckr
|
||||
fuct
|
||||
fujinoyamai
|
||||
fukashokumin
|
||||
fupa
|
||||
fuuck
|
||||
fuuckd
|
||||
fuucked
|
||||
fuucker
|
||||
fuucking
|
||||
fuuckr
|
||||
fuuuck
|
||||
fuuuckd
|
||||
fuuucked
|
||||
fuuucker
|
||||
fuuucking
|
||||
fuuuckr
|
||||
fuuuuck
|
||||
fuuuuckd
|
||||
fuuuucked
|
||||
fuuuucker
|
||||
fuuuucking
|
||||
fuuuuckr
|
||||
fuuuuuck
|
||||
fuuuuuckd
|
||||
fuuuuucked
|
||||
fuuuuucker
|
||||
fuuuuucking
|
||||
fuuuuuckr
|
||||
fuuuuuuck
|
||||
fuuuuuuckd
|
||||
fuuuuuucked
|
||||
fuuuuuucker
|
||||
fuuuuuucking
|
||||
fuuuuuuckr
|
||||
fuuuuuuuck
|
||||
fuuuuuuuckd
|
||||
fuuuuuuucked
|
||||
fuuuuuuucker
|
||||
fuuuuuuucking
|
||||
fuuuuuuuckr
|
||||
fuuuuuuuuck
|
||||
fuuuuuuuuckd
|
||||
fuuuuuuuucked
|
||||
fuuuuuuuucker
|
||||
fuuuuuuuucking
|
||||
fuuuuuuuuckr
|
||||
fuuuuuuuuuck
|
||||
fuuuuuuuuuckd
|
||||
fuuuuuuuuucked
|
||||
fuuuuuuuuucker
|
||||
fuuuuuuuuucking
|
||||
fuuuuuuuuuckr
|
||||
fuuuuuuuuuu
|
||||
fvck
|
||||
fxck
|
||||
fxuxcxk
|
||||
g000k
|
||||
g00k
|
||||
g0ok
|
||||
gestapo
|
||||
go0k
|
||||
god damn
|
||||
goddamn
|
||||
goldenshowers
|
||||
golliwogg
|
||||
gollywog
|
||||
gooch
|
||||
gook
|
||||
goook
|
||||
gyp
|
||||
h0m0
|
||||
h0mo
|
||||
h1tl3
|
||||
h1tle
|
||||
hairpie
|
||||
hakujakusha
|
||||
hakuroubyo
|
||||
hakuzyakusya
|
||||
hantoujin
|
||||
hantouzin
|
||||
herpes
|
||||
hitl3r
|
||||
hitler
|
||||
hitlr
|
||||
holocaust
|
||||
hom0
|
||||
homo
|
||||
honky
|
||||
hooker
|
||||
hor3
|
||||
hore
|
||||
hukasyokumin
|
||||
hure
|
||||
hurensohn
|
||||
huzinoyamai
|
||||
hymen
|
||||
inc3st
|
||||
incest
|
||||
inculato
|
||||
injun
|
||||
intercourse
|
||||
inugoroshi
|
||||
inugorosi
|
||||
j1g4b0
|
||||
j1g4bo
|
||||
j1gab0
|
||||
j1gabo
|
||||
jack off
|
||||
jackass
|
||||
jap
|
||||
jerkoff
|
||||
jig4b0
|
||||
jig4bo
|
||||
jigabo
|
||||
jigaboo
|
||||
jiggaboo
|
||||
jizz
|
||||
joder
|
||||
joto
|
||||
jungle bunny
|
||||
junglebunny
|
||||
k k k
|
||||
k1k3
|
||||
kichigai
|
||||
kik3
|
||||
kike
|
||||
kikeiji
|
||||
kikeizi
|
||||
kilurself
|
||||
kitigai
|
||||
kkk
|
||||
klu klux
|
||||
klu klux klan
|
||||
kluklux
|
||||
knobhead
|
||||
koon hunt
|
||||
koon kill
|
||||
koonhunt
|
||||
koonkill
|
||||
koroshiteyaru
|
||||
koumoujin
|
||||
koumouzin
|
||||
ku klux klan
|
||||
kun7
|
||||
kurombo
|
||||
kurva
|
||||
kurwa
|
||||
kxkxk
|
||||
l3sb0
|
||||
lesbo
|
||||
lezbo
|
||||
lezzie
|
||||
m07th3rfukr
|
||||
m0th3rfvk3r
|
||||
m0th3rfvker
|
||||
madonna puttana
|
||||
manberries
|
||||
manko
|
||||
manshaft
|
||||
maricon
|
||||
masterbat
|
||||
masterbate
|
||||
masturbacion
|
||||
masturbait
|
||||
masturbare
|
||||
masturbate
|
||||
masturbazione
|
||||
merda
|
||||
merde
|
||||
meth
|
||||
mierda
|
||||
milf
|
||||
minge
|
||||
miststück
|
||||
mitsukuchi
|
||||
mitukuti
|
||||
molest
|
||||
molester
|
||||
molestor
|
||||
mong
|
||||
moon cricket
|
||||
moth3rfucer
|
||||
moth3rfvk3r
|
||||
moth3rfvker
|
||||
motherfucker
|
||||
mulatto
|
||||
n1663r
|
||||
n1664
|
||||
n166a
|
||||
n166er
|
||||
n1g3r
|
||||
n1german
|
||||
n1gg3r
|
||||
n1ggerman
|
||||
n3gro
|
||||
n4g3r
|
||||
n4gg3r
|
||||
n4ggerman
|
||||
n4z1
|
||||
nag3r
|
||||
nagg3r
|
||||
naggerman
|
||||
natzi
|
||||
naz1
|
||||
nazi
|
||||
nazl
|
||||
negerman
|
||||
nggerman
|
||||
nggr
|
||||
nhiggerman
|
||||
ni666
|
||||
ni66a
|
||||
ni66er
|
||||
ni66g
|
||||
ni6g
|
||||
ni6g6
|
||||
ni6gg
|
||||
nig
|
||||
nig66
|
||||
nig6g
|
||||
nigar
|
||||
nigerman
|
||||
nigg3
|
||||
nigg6
|
||||
nigga
|
||||
niggaz
|
||||
niggerman
|
||||
nigger
|
||||
nigglet
|
||||
niggr
|
||||
nigguh
|
||||
niggur
|
||||
niggy
|
||||
niglet
|
||||
nignog
|
||||
nimpinin
|
||||
ninpinin
|
||||
nipples
|
||||
niqqa
|
||||
niqqer
|
||||
nonce
|
||||
nugga
|
||||
nutsack
|
||||
nutted
|
||||
nyggerman
|
||||
omeko
|
||||
orgy
|
||||
p3n15
|
||||
p3n1s
|
||||
p3ni5
|
||||
p3nis
|
||||
p3nl5
|
||||
p3nls
|
||||
paki
|
||||
panties
|
||||
pedo
|
||||
pedoph
|
||||
pedophile
|
||||
pen15
|
||||
pen1s
|
||||
pendejo
|
||||
peni5
|
||||
penile
|
||||
penis
|
||||
penis
|
||||
penl5
|
||||
penls
|
||||
penus
|
||||
perra
|
||||
phag
|
||||
phaggot
|
||||
phagot
|
||||
phuck
|
||||
pikey
|
||||
pinche
|
||||
pizda
|
||||
polla
|
||||
porca madonna
|
||||
porch monkey
|
||||
porn
|
||||
pornhub
|
||||
porra
|
||||
pu555y
|
||||
pu55y
|
||||
pub1c
|
||||
pube
|
||||
pubic
|
||||
pun4ni
|
||||
pun4nl
|
||||
punal
|
||||
punan1
|
||||
punani
|
||||
punanl
|
||||
puss1
|
||||
puss3
|
||||
puss5
|
||||
pusse
|
||||
pussi
|
||||
pussy
|
||||
pussys
|
||||
pussies
|
||||
pusss1
|
||||
pussse
|
||||
pusssi
|
||||
pusssl
|
||||
pusssy
|
||||
pussy
|
||||
puta
|
||||
putain
|
||||
pute
|
||||
puto
|
||||
puttana
|
||||
puttane
|
||||
puttaniere
|
||||
puzzy
|
||||
pvssy
|
||||
queef
|
||||
r3c7um
|
||||
r4p15t
|
||||
r4p1st
|
||||
r4p3
|
||||
r4pi5t
|
||||
r4pist
|
||||
raape
|
||||
raghead
|
||||
raibyo
|
||||
raip
|
||||
rap15t
|
||||
rap1st
|
||||
rapage
|
||||
rape
|
||||
raped
|
||||
rapi5t
|
||||
raping
|
||||
rapist
|
||||
red tube
|
||||
reggin
|
||||
reipu
|
||||
retard
|
||||
ricchione
|
||||
rimjob
|
||||
rimming
|
||||
rizzape
|
||||
rompari
|
||||
salaud
|
||||
salope
|
||||
sangokujin
|
||||
sangokuzin
|
||||
santorum
|
||||
scheiße
|
||||
schlampe
|
||||
schlampe
|
||||
schlong
|
||||
schwuchtel
|
||||
scrote
|
||||
secks
|
||||
seishinhakujaku
|
||||
seishinijo
|
||||
seisinhakuzyaku
|
||||
seisinizyo
|
||||
semen
|
||||
semushiotoko
|
||||
semusiotoko
|
||||
sh|t
|
||||
sh|thead
|
||||
sh|tstain
|
||||
sh17
|
||||
sh17head
|
||||
sh17stain
|
||||
sh1t
|
||||
sh1thead
|
||||
sh1tstain
|
||||
shat
|
||||
shemale
|
||||
shi7
|
||||
shi7head
|
||||
shi7stain
|
||||
shinajin
|
||||
shinheimin
|
||||
shirakko
|
||||
shit
|
||||
shithead
|
||||
shitstain
|
||||
shitting
|
||||
shitty
|
||||
shokubutsuningen
|
||||
sinazin
|
||||
sinheimin
|
||||
skank
|
||||
slut
|
||||
smd
|
||||
sodom
|
||||
sofa king
|
||||
sofaking
|
||||
spanishick
|
||||
spanishook
|
||||
spanishunk
|
||||
succhia cazzi
|
||||
syokubutuningen
|
||||
taint
|
||||
tapatte
|
||||
tapette
|
||||
tarlouse
|
||||
tea bag
|
||||
teabag
|
||||
teebag
|
||||
teensex
|
||||
teino
|
||||
testa di cazzo
|
||||
testicles
|
||||
thot
|
||||
tieokure
|
||||
tinpo
|
||||
tits
|
||||
titz
|
||||
titties
|
||||
tittiez
|
||||
tokushugakkyu
|
||||
tokusyugakkyu
|
||||
torukoburo
|
||||
torukojo
|
||||
torukozyo
|
||||
tosatsu
|
||||
tosatu
|
||||
towelhead
|
||||
trannie
|
||||
tranny
|
||||
tunbo
|
||||
tw47
|
||||
tw4t
|
||||
twat
|
||||
tyankoro
|
||||
tyonga
|
||||
tyonko
|
||||
tyonkoro
|
||||
tyourinbo
|
||||
tyourippo
|
||||
tyurenbo
|
||||
ushigoroshi
|
||||
usigorosi
|
||||
v461n4
|
||||
v461na
|
||||
v46in4
|
||||
v46ina
|
||||
v4g1n4
|
||||
v4g1na
|
||||
v4gin4
|
||||
v4gina
|
||||
va61n4
|
||||
va61na
|
||||
va6in4
|
||||
va6ina
|
||||
vaccagare
|
||||
vaffanculo
|
||||
vag
|
||||
vag1n4
|
||||
vag1na
|
||||
vagin4
|
||||
vagina
|
||||
vatefaire
|
||||
vvhitepower
|
||||
w3tb4ck
|
||||
w3tback
|
||||
wank
|
||||
wanker
|
||||
wetb4ck
|
||||
wetback
|
||||
wh0r3
|
||||
wh0re
|
||||
white power
|
||||
whitepower
|
||||
whor3
|
||||
whore
|
||||
whores
|
||||
wog
|
||||
wop
|
||||
x8lp3t
|
||||
xbl pet
|
||||
xblpet
|
||||
xblrewards
|
||||
xl3lpet
|
||||
yabunirami
|
||||
zipperhead
|
||||
блядь
|
||||
сука
|
||||
アオカン
|
||||
あおかん
|
||||
イヌゴロシ
|
||||
いぬごろし
|
||||
インバイ
|
||||
いんばい
|
||||
オナニー
|
||||
おなにー
|
||||
オメコ
|
||||
カワラコジキ
|
||||
かわらこじき
|
||||
カワラモノ
|
||||
かわらもの
|
||||
キケイジ
|
||||
きけいじ
|
||||
キチガイ
|
||||
きちがい
|
||||
キンタマ
|
||||
きんたま
|
||||
クロンボ
|
||||
くろんぼ
|
||||
コロシテヤル
|
||||
ころしてやる
|
||||
シナジン
|
||||
しなじん
|
||||
タチンボ
|
||||
たちんぼ
|
||||
チョンコウ
|
||||
ちょんこう
|
||||
チョンコロ
|
||||
ちょんころ
|
||||
ちょん公
|
||||
チンポ
|
||||
ちんぽ
|
||||
ツンボ
|
||||
つんぼ
|
||||
とるこじょう
|
||||
とるこぶろ
|
||||
トルコ嬢
|
||||
トルコ風呂
|
||||
ニガー
|
||||
ニグロ
|
||||
にんぴにん
|
||||
はんとうじん
|
||||
マンコ
|
||||
まんこ
|
||||
レイプ
|
||||
れいぷ
|
||||
低能
|
||||
屠殺
|
||||
強姦
|
||||
援交
|
||||
支那人
|
||||
精薄
|
||||
精薄者
|
||||
輪姦
|
|
@ -37,11 +37,13 @@
|
|||
5. Type `./CompileLatestClient.sh` and hit enter, a GUI resembling a classic windows installer should open
|
||||
6. Follow the steps shown to you in the new window to finish compiling
|
||||
|
||||
## Browser Compatibility
|
||||
|
||||
EaglercraftX 1.8 is currently known to work on browsers as old as Chrome 38 on Windows XP, the game supports both WebGL 1.0 and WebGL 2.0 however features such as dynamic lighting and PBR shaders require WebGL 2.0. The game also supports mobile browsers that don't have a keyboard or mouse, the game will enter touch screen mode automatically when touch input is detected. The game also includes an embedded OGG codec (JOrbis) for loading audio files on iOS where the browsers don't support loading OGG files in an AudioContext.
|
||||
|
||||
## Singleplayer
|
||||
|
||||
As of January 2024, singleplayer and shared worlds have been added to EaglercraftX 1.8.
|
||||
|
||||
Worlds are saved to your browser's local storage and are available even if your device does not have an internet connection. You can also import and export worlds in EaglercraftX as EPK files to copy them between devices and send them to your friends.
|
||||
EaglercraftX 1.8 fully supports singleplayer mode through an integrated server. Worlds are saved to your browser's local storage and are available even if your device does not have an internet connection. You can also import and export worlds in EaglercraftX as EPK files to copy them between devices and send them to your friends.
|
||||
|
||||
You can also import and export your existing vanilla Minecraft 1.8 worlds into EaglercraftX using ZIP files if you want to try playing all your old 1.8 maps in a modern browser. The glitch that caused some chunks to become corrupt when exporting worlds as vanilla in Eaglercraft 1.5.2 no longer happens in EaglercraftX 1.8, its perfect now. Beware that the inventories of LAN world players are not saved when the world is converted to vanilla, and pets (dogs, cats, horses, etc) might sometimes forget their owners due to the UUID changes.
|
||||
|
||||
|
@ -57,7 +59,7 @@ If you would like to host your own relay, the JAR file and instructions can be d
|
|||
|
||||
## PBR Shaders
|
||||
|
||||
EaglercraftX 1.8 includes a deferred physically-based renderer modeled after the GTA V rendering engine with many new improvements and a novel raytracing technique for fast realistic reflections. It can be enabled in the "Shaders" menu in the game's options screen. Shader packs in EaglercraftX are just a component of resource packs, so any custom shaders you install will be in the form of a resource pack. EaglercraftX also comes with a very well optimized built-in PBR shader pack and also a built-in PBR material texture pack to give all blocks and items in the game realistic lighting and materials that looks better than most vanilla Minecraft shader packs. The default shader and texture packs were created from scratch by lax1dude, shaders packs made for vanilla Minecraft will not work in EaglercraftX and no shaders in EaglercraftX were taken from vanilla Minecraft shader packs.
|
||||
EaglercraftX 1.8 includes a deferred physically-based renderer modeled after the GTA V rendering engine with many new improvements and a novel raytracing technique for fast realistic reflections. It can be enabled in the "Shaders" menu in the game's options screen. Shader packs in EaglercraftX are just a component of resource packs, so any custom shaders you install will be in the form of a resource pack. EaglercraftX also comes with a very well optimized built-in PBR shader pack and also a built-in PBR material texture pack to give all blocks and items in the game realistic lighting and materials that looks better than most vanilla Minecraft shader packs. The default shader and texture packs were created from scratch by lax1dude, shaders packs made for vanilla Minecraft will not work in EaglercraftX and no shaders in EaglercraftX were taken from vanilla Minecraft shader packs. The shaders are not available in WebGL 1.0 mode or if floating point HDR render targets are not fully supported.
|
||||
|
||||
## Voice Chat
|
||||
|
||||
|
@ -75,6 +77,12 @@ To make a server for EaglercraftX 1.8 the recommended software to use is Eaglerc
|
|||
|
||||
There is an experimental velocity plugin available in `gateway/EaglercraftXVelocity` but it is still in development and not recommended for public servers, so be sure to check for updates regularly if you use it. Configuration files are basically identical to EaglercraftXBungee so its safe to just directy copy in your old EaglercraftXBungee config files to the `plugins/eaglerxvelocity` folder and they should work with a minimal number of edits if you are migrating your network from BungeeCord to Velocity.
|
||||
|
||||
### Detailed READMEs
|
||||
|
||||
- [**EaglerXBungee README**](README_EAGLERXBUNGEE.md)
|
||||
- [**EaglerXVelocity README**](README_EAGLERXVELOCITY.md)
|
||||
- [**EaglerXBukkitAPI README**](README_EAGLERXBUKKITAPI.md)
|
||||
|
||||
### Installation
|
||||
|
||||
Obtain the latest version of the EaglerXBungee JAR file (it can be downloaded in the client from the "Multiplayer" screen) and place it in the "plugins" folder of your BungeeCord server. It's recommended to only join native Minecraft 1.8 servers through an EaglerXBungee server but plugins like ProtocolSupport have allowed some people to join newer servers too.
|
||||
|
@ -163,9 +171,36 @@ The default eaglercraftXOpts values is this:
|
|||
- `allowFNAWSkins:` can be used to disable the high poly FNAW skins
|
||||
- `localStorageNamespace:` can be used to change the prefix of the local storage keys (Default: `"_eaglercraftX"`)
|
||||
- `enableMinceraft:` can be used to disable the "Minceraft" title screen
|
||||
- `crashOnUncaughtExceptions:` display crash reports when `window.onerror` is fired
|
||||
- `openDebugConsoleOnLaunch:` open debug console automatically at launch
|
||||
- `fixDebugConsoleUnloadListener:` close debug console beforeunload instead of unload
|
||||
- `forceWebViewSupport:` if the server info webview should be allowed even on browsers without the required safety features
|
||||
- `enableWebViewCSP:` if the `csp` attibute should be set on the server info webview for extra security
|
||||
- `enableServerCookies:` can be used to disable server cookies
|
||||
- `allowServerRedirects:` if servers should be allowed to make the client reconnect to a different address
|
||||
- `autoFixLegacyStyleAttr:` if the viewport meta tag and style attributes on old offline downloads and websites should be automatically patched
|
||||
- `showBootMenuOnLaunch:` if the client should always show the boot menu on every launch
|
||||
- `bootMenuBlocksUnsignedClients:` if the boot menu should only be allowed to launch signed clients
|
||||
- `allowBootMenu:` can be used to disable the boot menu entirely
|
||||
- `forceProfanityFilter:` if the profanity filter should be forced enabled
|
||||
- `forceWebGL1:` if the game should force the browser to only use WebGL 1.0 for the canvas
|
||||
- `forceWebGL2:` if the game should force the browser to only use WebGL 2.0 for the canvas
|
||||
- `allowExperimentalWebGL1:` if the game should be allowed to create an `experimental-webgl` context
|
||||
- `useWebGLExt:` can be used to disable all OpenGL ES extensions to test the game on a pure WebGL 1.0/2.0 context
|
||||
- `useDelayOnSwap:` if the game should `setTimeout(..., 0)` every frame instead of using MessageChannel hacks
|
||||
- `useJOrbisAudioDecoder:` if OGG vorbis files should be decoded using the JOrbis Java OGG decoder instead of using the browser
|
||||
- `useXHRFetch:` if the game should use XMLHttpRequest for downloading resources instead of the fetch API
|
||||
- `useVisualViewport:` if the game should resize some GUIs relative to `window.visualViewport` (needed on mobile browsers when the keyboard is open)
|
||||
- `deobfStackTraces:` can be used to disable the runtime stack-trace deobfuscation, reduces micro stutters if the game is logging errors
|
||||
- `disableBlobURLs:` if the game should use `data:` URLs instead of `blob:` URLs for loading certain resources
|
||||
- `eaglerNoDelay:` can be used to disable "Vigg's Algorithm", an algorithm that delays and combines multiple EaglercraftX packets together if they are sent in the same tick (does not affect regular Minecraft 1.8 packets)
|
||||
- `ramdiskMode:` if worlds and resource packs should be stored in RAM instead of IndexedDB
|
||||
- `singleThreadMode:` if the game should run the client and integrated server in the same context instead of creating a worker object
|
||||
- `hooks:` can be used to define JavaScript callbacks for certain events
|
||||
* `localStorageSaved:` JavaScript callback to save local storage keys
|
||||
* `localStorageLoaded:` JavaScript callback to load local storage keys
|
||||
* `localStorageSaved:` JavaScript callback to save local storage keys (key, data)
|
||||
* `localStorageLoaded:` JavaScript callback to load local storage keys (key) returns data
|
||||
* `crashReportShow:` JavaScript callback when a crash report is shown (report, customMessageCB)
|
||||
* `screenChanged:` JavaScript callback when the screen changes/resizes (screenName, scaledWidth, scaledHeight, realWidth, realHeight, scaleFactor)
|
||||
|
||||
### Using Hooks
|
||||
|
||||
|
@ -193,6 +228,17 @@ Be aware that the client will still save the key to the browser's local storage
|
|||
|
||||
On a normal client you will only ever need to handle local storage keys called `p` (profile), `g` (game settings), `s` (server list), `r` (shared world relays), in your hooks functions. Feel free to just ignore any other keys. It is guaranteed that the data the client stores will always be valid base64, so it is best practice to decode it to raw binary first if possible to reduce it's size before saving it to something like a MySQL database in your backend if you are trying to implement some kind of profile syncing system for your website. The keys already have GZIP compression applied to them by default so don't bother trying to compress them yourself a second time because it won't reduce their size.
|
||||
|
||||
### Crash Report Hook
|
||||
|
||||
The `crashReportShow` hook can be used to capture crash reports and append additional text to them. It takes two parameters, the crash report as a string and a callback function for appending text. Do not use the callback function outside the body of the hook.
|
||||
|
||||
hooks: {
|
||||
crashReportShow: function(report, customMessageCB) {
|
||||
// 'report' is crash report as a string
|
||||
customMessageCB("Hello from crashReportShow hook!");
|
||||
}
|
||||
}
|
||||
|
||||
## Developing a Client
|
||||
|
||||
There is currently no system in place to make forks of 1.8 and merge commits made to the patch files in this repository with the patch files or workspace of the fork, you're on your own if you try to keep a fork of this repo for reasons other than to contribute to it
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html style="width:100%;height:100%;background-color:black;">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" />
|
||||
<meta name="description" content="Play minecraft 1.8 in your browser" />
|
||||
<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" />
|
||||
<title>EaglercraftX 1.8</title>
|
||||
|
@ -15,14 +15,14 @@
|
|||
<script type="text/javascript" src="classes.js"></script>
|
||||
<script type="text/javascript">
|
||||
"use strict";
|
||||
window.addEventListener("load", () => {
|
||||
if(document.location.href.startsWith("file:")) {
|
||||
window.addEventListener("load", function() {
|
||||
if(window.location.href.indexOf("file:") === 0) {
|
||||
alert("HTTP please, do not open this file locally, run a local HTTP server and load it via HTTP");
|
||||
}else {
|
||||
|
||||
// %%%%%%%%% launch options %%%%%%%%%%%%
|
||||
|
||||
const relayId = Math.floor(Math.random() * 3);
|
||||
var relayId = Math.floor(Math.random() * 3);
|
||||
window.eaglercraftXOpts = {
|
||||
demoMode: false,
|
||||
container: "game_frame",
|
||||
|
@ -42,8 +42,8 @@
|
|||
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
var q = window.location.search;
|
||||
if(typeof q === "string" && q.startsWith("?")) {
|
||||
q = new URLSearchParams(q);
|
||||
if((typeof q === "string") && q[0] === "?" && (typeof window.URLSearchParams !== "undefined")) {
|
||||
q = new window.URLSearchParams(q);
|
||||
var s = q.get("server");
|
||||
if(s) window.eaglercraftXOpts.joinServer = s;
|
||||
}
|
||||
|
@ -54,6 +54,6 @@
|
|||
});
|
||||
</script>
|
||||
</head>
|
||||
<body style="margin:0px;width:100vw;height:100vh;overflow:hidden;" id="game_frame">
|
||||
<body style="margin:0px;width:100%;height:100%;overflow:hidden;background-color:black;" id="game_frame">
|
||||
</body>
|
||||
</html>
|