mirror of
https://github.com/FlamedDogo99/EaglerMobile.git
synced 2024-12-22 15:24:14 -08:00
Compare commits
No commits in common. "04699b19aad8e7c00c779a06a914c8fa29ae619c" and "0bda17325d835447e1b7a6ed4a45ac864aec6872" have entirely different histories.
04699b19aa
...
0bda17325d
6
.github/CONTRIBUTING.md
vendored
6
.github/CONTRIBUTING.md
vendored
|
@ -3,7 +3,7 @@
|
|||
Whether you want to send us feedback, fix a problem, or something else, you are welcome to contribute! Our code is open source.
|
||||
|
||||
|
||||
Be sure to follow our [code of conduct](https://github.com/FlamedDogo99/EaglerMobile/blob/main/.github/CODE_OF_CONDUCT.md).
|
||||
Be sure to follow our [code of conduct](https://github.com/FlamedDogo99/EaglerMobile/blob/master/.github/CODE_OF_CONDUCT.md).
|
||||
|
||||
## Reporting bugs and suggesting features
|
||||
|
||||
|
@ -28,9 +28,9 @@ Looking for a code editor? We recommend [Visual Studio Code](https://code.visual
|
|||
1. **If you have something in mind, it's best if you create or find an issue first (see above). That way, we can discuss it before you start a pull request.**
|
||||
2. [Fork this repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo) if you haven't already.
|
||||
3. [Clone your fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo#cloning-your-forked-repository) and load it in your browser so you can make and test your changes.
|
||||
4. [Create a new branch](https://docs.github.com/en/get-started/quickstart/contributing-to-projects#creating-a-branch-to-work-on), specifying `upstream/main` as the source branch:
|
||||
4. [Create a new branch](https://docs.github.com/en/get-started/quickstart/contributing-to-projects#creating-a-branch-to-work-on), specifying `upstream/master` as the source branch:
|
||||
```shell
|
||||
git checkout -b BRANCH-NAME upstream/main
|
||||
git checkout -b BRANCH-NAME upstream/master
|
||||
```
|
||||
Branching makes things easier later on if you have multiple pull requests open at once or ever want to contribute again. You can always delete a branch.
|
||||
5. Make and test your changes.
|
||||
|
|
|
@ -2,9 +2,8 @@
|
|||
|
||||
|
||||
|
||||
[![Releases](https://img.shields.io/github/v/release/FlamedDogo99/EaglerMobile?style=flat-square&logo=github&logoColor=white&label=GitHub&color=181716)](https://github.com/FlamedDogo99/EaglerMobile/releases)
|
||||
[![Eaglercraft.com](https://img.shields.io/endpoint?url=https%3A%2F%2Fcellshield.info%2Fgs%3FspreadSheetId%3D1rkNuoBtzxp2m_psnMBCyaWw2BujITghrqE_2cKB6eW0%26cellRange%3DB3&style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABAlBMVEUAAAAAAAAwIRZPNyYkGRA6KBs9LB5jRjB5VzxLNiVoqD4%2FaCVsrEJbQCwrRBqXxmdmpzwnQBZ3t01zs0lxsUdwr0Zqqj9fnzRblzSGtVZlpTtjozhhoTdDbChHMSIuSR11tUssLCygz3CUw2SSwWGKuVp8vFJggEFgmzhcnDI7Tic1JRij03ONvF1YWFiBsFF5uU56p0xGRkZvUDdWdDZLdi9KdC5AUyxVlStGcCs0SCEkPRWcyW2IyF6Is1uDw1mHtleDrlZ9rE10okZnhUZYmC5Xly0%2BUSo5Yx2q2XqRvGSPvl9uqUdurkRvm0NAQEBZdTxaeTtUfjc3NzdPiig4SyTTBcNjAAAAAnRSTlMAJEqQKekAAAIRSURBVDjLfI7nbsIwFIUxxKKKrWzbmU1ISEIoCJDYo%2BzRPdS%2B%2F6vUJW3VJc79%2BX333lP4FQAKpwIug2QJTmBbruIFMcH%2F2HQVhbE4SYJgCv7ie8ZW9t3MmWHDiGNdBD9xjYlbQ3YVJzKUqxU1bMO9Bt%2FwbkdItSqGiqxZVhSFoaZROnwBOe4Mqavzds6woViMzjNXxvhG47Img3cBoVqHBhHTSZat5cA1CF6ElqMlRFVz4anr1USMRR5qaI68bVuMkI4kSZOjcLHpdj1kiqKitFr2lNrOvG3dqmrd93PhYeONPIQeTRHreowbzWbbVCUu7PfCUTiHsN%2BHvTT1zFam63ZzORkLkuDXBaGYvyif9SHsPac9hNZ6w1Rfx2PBF7jzJZRhuYTgKIUHD%2FFqA5UznkrlQyiV%2BUA4gvCAoC8MBny%2FyNc%2FL7wVTja3DsMwDAZM%2FVCHrBCgC%2BSQjvL23%2BVRtg9FgbZCYh%2F0kYyA6Elc6aobOpSsGkNP1QIOMgEHbqTDHhYlpEZFbGBGEPQJjFBJbTHGBqRvCxIAw9RWRV%2FnBgiHp0%2BjDv9rpF%2FfEWwCmdBR1uHC%2BlrAqQ4VTzRXrbWKxwzaDhIyb6qAFtcQoPb%2BhickTkGqK%2BcEpabZdmhkzdEMBEREhQh%2F%2BSuPy%2BEU4WuAsK1%2BQQAKYVi0%2B1K%2FI05yWOd%2F2K0TSLmfX7bzyHjL%2Frn%2B%2FymZL56MQephAAAAAElFTkSuQmCC&label=eaglercraft.com&color=%237fad55)](https://eaglercraft.com)
|
||||
[![License](https://img.shields.io/github/license/FlamedDogo99/EaglerMobile?style=flat-square)](https://github.com/FlamedDogo99/EaglerMobile/blob/main/LICENSE)
|
||||
[![](https://img.shields.io/github/v/release/FlamedDogo99/EaglerMobile?style=flat-square&logo=github&logoColor=white&label=GitHub&color=181717)](https://github.com/FlamedDogo99/EaglerMobile/releases)
|
||||
[![](https://img.shields.io/github/license/FlamedDogo99/EaglerMobile?style=flat-square)](https://github.com/FlamedDogo99/EaglerMobile/blob/master/LICENSE)
|
||||
|
||||
## About
|
||||
|
||||
|
@ -64,7 +63,7 @@ If you found a bug or have a suggestion [create an issue](https://github.com/Fla
|
|||
|
||||
### Code
|
||||
|
||||
Before contributing code, please read our [contributing guidelines](https://github.com/FlamedDogo99/EaglerMobile/blob/main/.github/CONTRIBUTING.md).
|
||||
Before contributing code, please read our [contributing guidelines](https://github.com/FlamedDogo99/EaglerMobile/blob/master/.github/CONTRIBUTING.md).
|
||||
|
||||
### Features and documentation
|
||||
#### Fake API's
|
||||
|
|
|
@ -6,24 +6,11 @@
|
|||
// @downloadURL https://raw.githubusercontent.com/FlamedDogo99/EaglerMobile/main/eaglermobile.user.js
|
||||
// @license Apache License 2.0 - http://www.apache.org/licenses/
|
||||
// @match https://eaglercraft.com/mc/*
|
||||
// @version 3.0.3
|
||||
// @version 3.0.2
|
||||
// @updateURL https://raw.githubusercontent.com/FlamedDogo99/EaglerMobile/main/eaglermobile.user.js
|
||||
// @run-at document-start
|
||||
// @grant unsafeWindow
|
||||
// ==/UserScript==
|
||||
|
||||
// This is generally a bad practice, but we need to run scripts in the main context before the DOM loads. Because we are only matching eaglercraft.com, the use of unsafeWindow should be safe to use.
|
||||
// If someone knows a better way of doing this, please create an issue
|
||||
try {
|
||||
unsafeWindow.console.warn("DANGER: This userscript is using unsafeWindow. Unsafe websites could potentially use this to gain access to data and other content that the browser normally wouldn't allow!")
|
||||
Object.defineProperty(window, "clientWindow", {
|
||||
value: unsafeWindow
|
||||
});
|
||||
} catch {
|
||||
Object.defineProperty(window, "clientWindow", {
|
||||
value: window
|
||||
});
|
||||
}
|
||||
|
||||
function isMobile() {
|
||||
try {
|
||||
|
@ -36,22 +23,17 @@ function isMobile() {
|
|||
if(!isMobile()) {
|
||||
alert("WARNING: This script was created for mobile, and may break functionality in non-mobile browsers!");
|
||||
}
|
||||
|
||||
clientWindow.keyboardEnabled = false;
|
||||
clientWindow.crouchLock = false;
|
||||
clientWindow.sprintLock = false;
|
||||
clientWindow.keyboardFix = false;
|
||||
clientWindow.inputFix = false;
|
||||
clientWindow.blockNextInput = false;
|
||||
window.keyboardEnabled = false;
|
||||
window.crouchLock = false;
|
||||
window.sprintLock = false;
|
||||
window.keyboardFix = false; // temporarily set to true until I can figure out whats going wrong with the event listener in charge of switching it
|
||||
// Used for changing touchmove events to mousemove events
|
||||
var previousTouchX = null;
|
||||
var previousTouchY = null;
|
||||
var startTouchX = null;
|
||||
|
||||
// better charCodeAt function
|
||||
String.prototype.toKeyCode = function() {
|
||||
const keyCodeList = {"0": 48, "1": 49, "2": 50, "3": 51, "4": 52, "5": 53, "6": 54, "7": 55, "8": 56, "9": 57, "backspace": 8, "tab": 9, "enter": 13, "shift": 16, "ctrl": 17, "alt": 18, "pause_break": 19, "caps_lock": 20, "escape": 27, " ": 32, "page_up": 33, "page_down": 34, "end": 35, "home": 36, "left_arrow": 37, "up_arrow": 38, "right_arrow": 39, "down_arrow": 40, "insert": 45, "delete": 46, "a": 65, "b": 66, "c": 67, "d": 68, "e": 69, "f": 70, "g": 71, "h": 72, "i": 73, "j": 74, "k": 75, "l": 76, "m": 77, "n": 78, "o": 79, "p": 80, "q": 81, "r": 82, "s": 83, "t": 84, "u": 85, "v": 86, "w": 87, "x": 88, "y": 89, "z": 90, "left_window_key": 91, "right_window_key": 92, "select_key": 93, "numpad_0": 96, "numpad_1": 97, "numpad_2": 98, "numpad_3": 99, "numpad_4": 100, "numpad_5": 101, "numpad_6": 102, "numpad_7": 103, "numpad_8": 104, "numpad_9": 105, "*": 106, "+": 107, "-": 109, ".": 110, "/": 111, "f1": 112, "f2": 113, "f3": 114, "f4": 115, "f5": 116, "f6": 117, "f7": 118, "f8": 119, "f9": 120, "f10": 121, "f11": 122, "f12": 123, "num_lock": 144, "scroll_lock": 145, ";": 186, "=": 187, ",": 188, "-": 189, ".": 190, "/": 191, "\u0060": 192, "[": 219, "\u005C": 220, "]": 221, "\u0022": 222};
|
||||
|
||||
const keyCodeList = {"0": 48, "1": 49, "2": 50, "3": 51, "4": 52, "5": 53, "6": 54, "7": 55, "8": 56, "9": 57, "backspace": 8, "tab": 9, "enter": 13, "shift": 16, "ctrl": 17, "alt": 18, "pause_break": 19, "caps_lock": 20, "escape": 27, " ": 32, "page_up": 33, "page_down": 34, "end": 35, "home": 36, "left_arrow": 37, "up_arrow": 38, "right_arrow": 39, "down_arrow": 40, "insert": 45, "delete": 46, "a": 65, "b": 66, "c": 67, "d": 68, "e": 69, "f": 70, "g": 71, "h": 72, "i": 73, "j": 74, "k": 75, "l": 76, "m": 77, "n": 78, "o": 79, "p": 80, "q": 81, "r": 82, "s": 83, "t": 84, "u": 85, "v": 86, "w": 87, "x": 88, "y": 89, "z": 90, "left_window_key": 91, "right_window_key": 92, "select_key": 93, "numpad_0": 96, "numpad_1": 97, "numpad_2": 98, "numpad_3": 99, "numpad_4": 100, "numpad_5": 101, "numpad_6": 102, "numpad_7": 103, "numpad_8": 104, "numpad_9": 105, "*": 106, "+": 107, "-": 109, ".": 110, "/": 111, "f1": 112, "f2": 113, "f3": 114, "f4": 115, "f5": 116, "f6": 117, "f7": 118, "f8": 119, "f9": 120, "f10": 121, "f11": 122, "f12": 123, "num_lock": 144, "scroll_lock": 145, ";": 186, "=": 187, ",": 188, "-": 189, ".": 190, "/": 191, "`": 192, "[": 219, "\\": 220, "]": 221, "\"": 222};
|
||||
return keyCodeList[this];
|
||||
}
|
||||
// Ignores keydown events that don't have the isValid parameter set to true
|
||||
|
@ -60,7 +42,7 @@ Object.defineProperty(EventTarget.prototype, "addEventListener", {
|
|||
value: function (type, fn, ...rest) {
|
||||
if(type == 'keydown') {
|
||||
_addEventListener.call(this, type, function(...args) {
|
||||
if(!args[0].isValid && clientWindow.keyboardFix) {
|
||||
if(!args[0].isValid && window.keyboardFix) {
|
||||
return;
|
||||
}
|
||||
return fn.apply(this, args);
|
||||
|
@ -72,8 +54,8 @@ Object.defineProperty(EventTarget.prototype, "addEventListener", {
|
|||
});
|
||||
// Allows typing in #hiddenInput
|
||||
const _preventDefault = Event.prototype.preventDefault;
|
||||
Event.prototype.preventDefault = function(shouldBypass) {
|
||||
if(document.activeElement.id != "hiddenInput" || shouldBypass) {
|
||||
Event.prototype.preventDefault = function() {
|
||||
if(document.activeElement.id != "hiddenInput") {
|
||||
this._preventDefault = _preventDefault;
|
||||
this._preventDefault();
|
||||
}
|
||||
|
@ -91,7 +73,7 @@ function keyEvent(name, state) {
|
|||
which: charCode
|
||||
});
|
||||
evt.isValid = true; // Disables fix for bad keyboard input
|
||||
clientWindow.dispatchEvent(evt);
|
||||
window.dispatchEvent(evt);
|
||||
}
|
||||
function mouseEvent(number, state, canvas) {
|
||||
canvas.dispatchEvent(new PointerEvent(state, {"button": number}))
|
||||
|
@ -108,56 +90,56 @@ function setButtonVisibility(pointerLocked) {
|
|||
inMenuStyle.disabled = !pointerLocked;
|
||||
}
|
||||
// POINTERLOCK
|
||||
// When requestpointerlock is called, this dispatches an event, saves the requested element to clientWindow.fakelock, and unhides the touch controls
|
||||
clientWindow.fakelock = null;
|
||||
// When requestpointerlock is called, this dispatches an event, saves the requested element to window.fakelock, and unhides the touch controls
|
||||
window.fakelock = null;
|
||||
|
||||
Object.defineProperty(Element.prototype, "requestPointerLock", {
|
||||
value: function() {
|
||||
clientWindow.fakelock = this
|
||||
document.dispatchEvent(new Event('pointerlockchange'));
|
||||
setButtonVisibility(true);
|
||||
return true
|
||||
}
|
||||
value: function() {
|
||||
window.fakelock = this
|
||||
document.dispatchEvent(new Event('pointerlockchange'));
|
||||
setButtonVisibility(true);
|
||||
return true
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Makes pointerLockElement return clientWindow.fakelock
|
||||
// Makes pointerLockElement return window.fakelock
|
||||
Object.defineProperty(Document.prototype, "pointerLockElement", {
|
||||
get: function() {
|
||||
return clientWindow.fakelock;
|
||||
return window.fakelock;
|
||||
}
|
||||
});
|
||||
// When exitPointerLock is called, this dispatches an event, clears the
|
||||
Object.defineProperty(Document.prototype, "exitPointerLock", {
|
||||
value: function() {
|
||||
clientWindow.fakelock = null
|
||||
document.dispatchEvent(new Event('pointerlockchange'));
|
||||
setButtonVisibility(false);
|
||||
return true
|
||||
}
|
||||
value: function() {
|
||||
window.fakelock = null
|
||||
document.dispatchEvent(new Event('pointerlockchange'));
|
||||
setButtonVisibility(false);
|
||||
return true
|
||||
}
|
||||
});
|
||||
|
||||
// FULLSCREEN
|
||||
clientWindow.fakefull = null;
|
||||
window.fakefull = null;
|
||||
// Stops the client from crashing when fullscreen is requested
|
||||
Object.defineProperty(Element.prototype, "requestFullscreen", {
|
||||
value: function() {
|
||||
clientWindow.fakefull = this
|
||||
document.dispatchEvent(new Event('fullscreenchange'));
|
||||
return true
|
||||
}
|
||||
value: function() {
|
||||
window.fakefull = this
|
||||
document.dispatchEvent(new Event('fullscreenchange'));
|
||||
return true
|
||||
}
|
||||
});
|
||||
Object.defineProperty(document, "fullscreenElement", {
|
||||
get: function() {
|
||||
return clientWindow.fakefull;
|
||||
return window.fakefull;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(Document.prototype, "exitFullscreen", {
|
||||
value: function() {
|
||||
clientWindow.fakefull = null
|
||||
document.dispatchEvent(new Event('fullscreenchange'));
|
||||
return true
|
||||
}
|
||||
value: function() {
|
||||
window.fakefull = null
|
||||
document.dispatchEvent(new Event('fullscreenchange'));
|
||||
return true
|
||||
}
|
||||
});
|
||||
|
||||
// FILE UPLOADING
|
||||
|
@ -168,16 +150,16 @@ document.createElement = function(type, ignore) {
|
|||
this._createElement = _createElement;
|
||||
var element = this._createElement(type);
|
||||
if(type == "input" && !ignore) {
|
||||
document.querySelectorAll('#fileUpload').forEach(e => e.parentNode.removeChild(e));
|
||||
element.id = "fileUpload";
|
||||
element.addEventListener('change', function(e) {
|
||||
element.hidden = true;
|
||||
element.style.display = "none";
|
||||
}, {passive: false, once: true});
|
||||
clientWindow.addEventListener('focus', function(e) {
|
||||
document.querySelectorAll('#fileUpload').forEach(e => e.parentNode.removeChild(e));
|
||||
element.id = "fileUpload";
|
||||
element.addEventListener('change', function(e) {
|
||||
element.hidden = true;
|
||||
element.style.display = "none";
|
||||
}, {passive: false, once: true});
|
||||
window.addEventListener('focus', function(e) {
|
||||
setTimeout(() => {
|
||||
element.hidden = true;
|
||||
element.style.display = "none";
|
||||
element.style.display = "none";
|
||||
}, 300)
|
||||
}, { once: true })
|
||||
document.body.appendChild(element);
|
||||
|
@ -227,17 +209,16 @@ function createTouchButton(buttonClass, buttonDisplay, elementName) {
|
|||
touchButton.classList.add(buttonDisplay);
|
||||
touchButton.classList.add("mobileControl");
|
||||
touchButton.addEventListener("touchmove", function(e){e.preventDefault()}, false);
|
||||
touchButton.addEventListener("contextmenu", function(e){e.preventDefault()});
|
||||
return touchButton;
|
||||
}
|
||||
|
||||
function toggleKeyboard() {
|
||||
const keyboardInput = document.getElementById('hiddenInput');
|
||||
if (clientWindow.keyboardEnabled) {
|
||||
clientWindow.keyboardEnabled = false;
|
||||
if (window.keyboardEnabled) {
|
||||
window.keyboardEnabled = false;
|
||||
keyboardInput.blur();
|
||||
} else {
|
||||
clientWindow.keyboardEnabled = true;
|
||||
window.keyboardEnabled = true;
|
||||
keyboardInput.select();
|
||||
}
|
||||
}
|
||||
|
@ -256,7 +237,7 @@ function insertCanvasElements() {
|
|||
}
|
||||
e.movementX = touch.pageX - previousTouchX;
|
||||
e.movementY = touch.pageY - previousTouchY;
|
||||
var evt = clientWindow.fakelock ? new MouseEvent("mousemove", {movementX: e.movementX, movementY: e.movementY}) : new WheelEvent("wheel", {"wheelDeltaY": e.movementY});
|
||||
var evt = window.fakelock ? new MouseEvent("mousemove", {movementX: e.movementX, movementY: e.movementY}) : new WheelEvent("wheel", {"wheelDeltaY": e.movementY});
|
||||
canvas.dispatchEvent(evt);
|
||||
previousTouchX = touch.pageX;
|
||||
previousTouchY = touch.pageY;
|
||||
|
@ -267,7 +248,7 @@ function insertCanvasElements() {
|
|||
previousTouchY = null;
|
||||
}, false)
|
||||
//Updates button visibility on load
|
||||
setButtonVisibility(clientWindow.fakelock != null);
|
||||
setButtonVisibility(window.fakelock != null);
|
||||
// Adds all of the touch screen controls
|
||||
// Theres probably a better way to do this but this works for now
|
||||
let strafeRightButton = createTouchButton("strafeRightButton", "inGame", "div");
|
||||
|
@ -293,13 +274,13 @@ function insertCanvasElements() {
|
|||
startTouchX = touch.pageX;
|
||||
}
|
||||
let movementX = touch.pageX - startTouchX;
|
||||
if((movementX * 10) > clientWindow.innerHeight) {
|
||||
if((movementX * 10) > window.innerHeight) {
|
||||
strafeRightButton.classList.add("active");
|
||||
strafeLeftButton.classList.remove("active");
|
||||
keyEvent("d", "keydown");
|
||||
keyEvent("a", "keyup");
|
||||
|
||||
} else if ((movementX * 10) < (0 - clientWindow.innerHeight)) {
|
||||
} else if ((movementX * 10) < (0 - window.innerHeight)) {
|
||||
strafeLeftButton.classList.add("active");
|
||||
strafeRightButton.classList.remove("active");
|
||||
keyEvent("a", "keydown");
|
||||
|
@ -352,20 +333,20 @@ function insertCanvasElements() {
|
|||
crouchButton.style.cssText = "left:10vh;bottom:10vh;"
|
||||
crouchButton.addEventListener("touchstart", function(e){
|
||||
keyEvent("shift", "keydown")
|
||||
clientWindow.crouchLock = clientWindow.crouchLock ? null : false
|
||||
clientWindow.crouchTimer = setTimeout(function(e) {
|
||||
clientWindow.crouchLock = (clientWindow.crouchLock != null);
|
||||
window.crouchLock = window.crouchLock ? null : false
|
||||
crouchTimer = setTimeout(function(e) {
|
||||
window.crouchLock = (window.crouchLock != null);
|
||||
crouchButton.classList.toggle('active');
|
||||
}, 1000);
|
||||
}, false);
|
||||
|
||||
crouchButton.addEventListener("touchend", function(e) {
|
||||
if(!clientWindow.crouchLock) {
|
||||
if(!window.crouchLock) {
|
||||
keyEvent("shift", "keyup")
|
||||
crouchButton.classList.remove('active');
|
||||
clientWindow.crouchLock = false
|
||||
window.crouchLock = false
|
||||
}
|
||||
clearTimeout(clientWindow.crouchTimer);
|
||||
clearTimeout(crouchTimer);
|
||||
}, false);
|
||||
document.body.appendChild(crouchButton);
|
||||
let inventoryButton = createTouchButton("inventoryButton", "inGame");
|
||||
|
@ -386,51 +367,34 @@ function insertCanvasElements() {
|
|||
hiddenInput.style.cssText = "position:absolute;top: 0vh; margin: auto; left: 8vh; right:0vh; width: 8vh; height: 8vh;font-size:20px;z-index:-10;color: transparent;text-shadow: 0 0 0 black;";
|
||||
hiddenInput.value = " " //Allows delete to be detected before input is changed
|
||||
hiddenInput.addEventListener("input", function(e) {
|
||||
e.stopImmediatePropagation();
|
||||
e.preventDefault(true);
|
||||
let inputData = e.data == null ? "delete" : e.data.slice(-1);
|
||||
if(!clientWindow.lastKey) { // If we get an event before any keys have been pressed, we know that setting the hiddenInput creates duplicate input events, so we can apply the fix
|
||||
clientWindow.console.warn("Enabling blocking duplicate key events. Some functionality may be lost.")
|
||||
clientWindow.inputFix = true;
|
||||
}
|
||||
clientWindow.console.log(`Received input by ${e.inputType}: ${e.data} -> ${inputData}`);
|
||||
|
||||
hiddenInput.value = " ";
|
||||
if(clientWindow.keyboardFix) {
|
||||
const sliceInputType = e.inputType.slice(0,1); // This is a really dumb way to do this because it's not future-proof, but its the easiest way to deal with Android
|
||||
if(sliceInputType== 'i') {
|
||||
const isDuplicate = (clientWindow.lastKey == inputData) && clientWindow.blockNextInput && clientWindow.inputFix;
|
||||
if(isDuplicate) {
|
||||
clientWindow.blockNextInput = false;
|
||||
let inputData = e.data ?? "delete"; // backspace makes null
|
||||
window.lastKey = inputData
|
||||
hiddenInput.value = " "; // We need a character to detect deleting
|
||||
if(window.keyboardFix) {
|
||||
if(e.inputType == 'insertText') {
|
||||
let isShift = (inputData.toLowerCase() != inputData);
|
||||
if(isShift) {
|
||||
keyEvent("shift", "keydown")
|
||||
keyEvent(inputData, "keydown");
|
||||
keyEvent(inputData, "keyup");
|
||||
keyEvent("shift", "keyup")
|
||||
} else {
|
||||
let isShift = (inputData.toLowerCase() != inputData);
|
||||
if(isShift) {
|
||||
keyEvent("shift", "keydown")
|
||||
keyEvent(inputData, "keydown");
|
||||
keyEvent(inputData, "keyup");
|
||||
keyEvent("shift", "keyup")
|
||||
} else {
|
||||
keyEvent(inputData, "keydown");
|
||||
keyEvent(inputData, "keyup");
|
||||
}
|
||||
clientWindow.blockNextInput = true;
|
||||
keyEvent(inputData, "keydown");
|
||||
keyEvent(inputData, "keyup");
|
||||
}
|
||||
} else if (sliceInputType == 'd') {
|
||||
keyEvent("backspace", "keydown");
|
||||
keyEvent("backspace", "keyup");
|
||||
clientWindow.blockNextInput = false;
|
||||
} else if (e.inputType == 'deleteContentForward' || e.inputType == 'deleteContentBackward') {
|
||||
keyEvent("backspace", "keydown")
|
||||
keyEvent("backspace", "keyup")
|
||||
}
|
||||
}
|
||||
clientWindow.lastKey = inputData
|
||||
|
||||
}, false);
|
||||
hiddenInput.addEventListener("keydown", function(e) {
|
||||
if((e.keyCode == 229 || e.which == 229) && !clientWindow.keyboardFix) {
|
||||
clientWindow.console.warn("Switching from keydown to input events due to invalid KeyboardEvent. Some functionality will be lost.")
|
||||
clientWindow.keyboardFix = true;
|
||||
if(clientWindow.lastKey) {
|
||||
keyEvent(clientWindow.lastKey, "keydown");
|
||||
keyEvent(clientWindow.lastKey, "keyup");
|
||||
if(!(e.key && e.keyCode && e.which) && !window.keyboardFix) {
|
||||
console.warn("Switching from keydown to input events due to invalid KeyboardEvent. Some functionality will be lost.")
|
||||
window.keyboardFix = true;
|
||||
if(window.lastKey) {
|
||||
keyEvent(window.lastKey, "keydown")
|
||||
keyEvent(window.lastKey, "keyup")
|
||||
}
|
||||
}
|
||||
}, false);
|
||||
|
@ -472,20 +436,20 @@ function insertCanvasElements() {
|
|||
sprintButton.style.cssText = "right:0vh;bottom:10vh;"
|
||||
sprintButton.addEventListener("touchstart", function(e) {
|
||||
keyEvent("r", "keydown");
|
||||
clientWindow.sprintLock = clientWindow.sprintLock ? null : false
|
||||
clientWindow.sprintTimer = setTimeout(function(e) {
|
||||
clientWindow.sprintLock = (clientWindow.sprintLock != null);
|
||||
window.sprintLock = window.sprintLock ? null : false
|
||||
sprintTimer = setTimeout(function(e) {
|
||||
window.sprintLock = (window.sprintLock != null);
|
||||
sprintButton.classList.toggle('active');
|
||||
}, 1000);
|
||||
}, false);
|
||||
|
||||
sprintButton.addEventListener("touchend", function(e) {
|
||||
if(!clientWindow.sprintLock) {
|
||||
if(!window.sprintLock) {
|
||||
keyEvent("r", "keyup");
|
||||
sprintButton.classList.remove('active');
|
||||
clientWindow.sprintLock = false
|
||||
window.sprintLock = false
|
||||
}
|
||||
clearTimeout(clientWindow.sprintTimer);
|
||||
clearTimeout(sprintTimer);
|
||||
}, false);
|
||||
document.body.appendChild(sprintButton);
|
||||
let pauseButton = createTouchButton("pauseButton", "inGame");
|
||||
|
@ -520,7 +484,7 @@ function insertCanvasElements() {
|
|||
}, false);
|
||||
document.body.appendChild(screenshotButton);
|
||||
let coordinatesButton = createTouchButton("coordinatesButton", "inGame");
|
||||
coordinatesButton.style.cssText = ""
|
||||
coordinatesButton.style.cssText = "top: 0vh; margin: auto; left: 32vh; right: 0vh; width: 8vh; height: 8vh;"
|
||||
coordinatesButton.addEventListener("touchstart", function(e) {
|
||||
keyEvent("f", "keydown");
|
||||
keyEvent("3", "keydown");
|
||||
|
@ -551,7 +515,6 @@ customStyle.textContent = `
|
|||
outline:none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
pointer-events: none !important;
|
||||
}
|
||||
.mobileControl:active, .mobileControl.active {
|
||||
position: absolute;
|
||||
|
@ -572,32 +535,24 @@ customStyle.textContent = `
|
|||
outline:none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
pointer-events: none !important;
|
||||
|
||||
}
|
||||
html, body, canvas {
|
||||
html, body {
|
||||
height: -webkit-fill-available !important;
|
||||
touch-action: pan-x pan-y;
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
outline: none;
|
||||
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
|
||||
}
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
#fileUpload {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 100vw;
|
||||
top: 0;
|
||||
bottom: 100vh;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background-color:rgba(255,255,255,0.5);
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 100vw;
|
||||
top: 0;
|
||||
bottom: 100vh;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background-color:rgba(255,255,255,0.5);
|
||||
}
|
||||
.strafeRightButton {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAUGVYSWZNTQAqAAAACAACARIAAwAAAAEAAQAAh2kABAAAAAEAAAAmAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAAWoAMABAAAAAEAAAAWAAAAAA78HUQAAAIwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4yMjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yMjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KhDb0tQAAANRJREFUOBHVlMENwyAMRWnVHcqIjMEYzJAemlUidQh6aFZIApIt20FgUC/JxTb8/2wRgTFX+25i4E3UvSXyMDkIGeqc64VlfQgBfJnJwAC11oJIFWOMFJ6Zd+nshSZ/yXMCy0aj9aPH6L1HOc1xkSQqcAtCeJhWwSNAIA+dsaZhFawBwIQyVsFJLOGylkCom+ASHMy1WP151KidFDynieF6gkATSx42cYzf43o+TUnYajBNLyZh4LSzLB8mGC3YUczze5Rj1vXHvPTZTBt/e+hZl0sUO9qPMTJ6UlWFAAAAAElFTkSuQmCC");
|
||||
|
|
Loading…
Reference in New Issue
Block a user