Compare commits

...

34 Commits

Author SHA1 Message Date
FlamedDogo99
04699b19aa Quick fix: bad quote 2024-06-15 19:35:18 -06:00
FlamedDogo
dcfe79b99a
Update README.md
Updated release number
2024-06-15 19:30:34 -06:00
FlamedDogo
af4f94ae7a
Merge pull request #17 from FlamedDogo99/input-fix
Fixes for Android keyboard input, and mobile selection
2024-06-15 19:25:23 -06:00
FlamedDogo
57b1aec738
Merge branch 'main' into input-fix 2024-06-15 19:24:28 -06:00
FlamedDogo99
e4b4a0be61 Fixed formatting issues
Detabbed
2024-06-15 19:22:49 -06:00
FlamedDogo99
275ed42602 Update eaglermobile.user.js 2024-06-15 19:06:14 -06:00
FlamedDogo
1a4f140752
Fixed badge issue? 2024-06-15 18:59:37 -06:00
FlamedDogo99
6f34ca6a76 Remove temp scripts 2024-06-15 17:00:21 -06:00
FlamedDogo99
5c6b049c39 Testing duplicate input blocking 2024-06-15 16:38:50 -06:00
FlamedDogo
bd4cf5151d
Update README.md
Eaglercraft.com is now directly hosting this project! This adds a version check for that hosted version.
2024-06-15 15:21:21 -06:00
FlamedDogo
681d60dc64
Merge pull request #16 from FlamedDogo99/repo-link-fix
Fixes incorrect link and directions on `readme.md` and `contributing.md`
2024-06-15 13:54:15 -06:00
FlamedDogo
eef626f9d2
Update CONTRIBUTING.md
Changed branch name in link
2024-06-15 13:50:24 -06:00
FlamedDogo
211d8a1505
Update README.md
Updated another link
2024-06-15 13:48:31 -06:00
FlamedDogo
3040ab6432
Update README.md
Changed link
2024-06-15 13:46:46 -06:00
FlamedDogo
bb077e1404
Update CONTRIBUTING.md
Fixed link to main branch
2024-06-15 12:04:12 -06:00
FlamedDogo99
693b37b7ef Trying to fix crash 2024-06-10 09:52:11 -06:00
FlamedDogo99
148885566a Removed moz-fill 2024-06-10 09:50:52 -06:00
FlamedDogo99
e58d77cf02 Removed dvh units 2024-06-10 09:47:34 -06:00
FlamedDogo99
4a786ae25c Fix for double input and view height 2024-06-10 09:44:12 -06:00
FlamedDogo99
9b19b2c01f Added warning for testing 2024-06-09 21:52:05 -06:00
FlamedDogo99
54b32e6034 Fixed type check error 2024-06-09 21:10:56 -06:00
FlamedDogo99
e4411c09a8 Detecting 229 code 2024-06-09 21:07:31 -06:00
FlamedDogo99
dc446b3176 Unethically unsafe tampermonkey hack
This is horrible and its only to test a check on Android
This will be changed to simply injecting the script, I hope
2024-06-09 20:54:38 -06:00
FlamedDogo99
2a04b33729 Reverted injection, trying unsafeWindow again 2024-06-09 20:28:00 -06:00
FlamedDogo99
42a2e8b768 Fix for escaping quotes 2024-06-09 20:19:44 -06:00
FlamedDogo99
f81d92da9d Temp fix for sandboxing 2024-06-09 20:08:00 -06:00
FlamedDogo99
3a21f56e26 Hack for unsafeWindow 2024-06-09 20:00:32 -06:00
FlamedDogo99
d1e5364bac Logger attempt 2 2024-06-09 19:39:23 -06:00
FlamedDogo99
f561557c3e Updated temp log
Sorry for the spam
2024-06-09 19:32:16 -06:00
FlamedDogo99
71571b3771 Update eaglermobile.user.js
Styling
2024-06-09 19:25:00 -06:00
FlamedDogo99
8afdb52f42 Updated height 2024-06-09 19:20:50 -06:00
FlamedDogo99
0d1e55f588 Update eaglermobile.user.js
Added temporary DOM log for troubleshooting
2024-06-09 19:12:00 -06:00
FlamedDogo99
c45e5da373 Update eaglermobile.user.js
Added console logs so I can see what is happening on Android
2024-06-09 18:05:56 -06:00
FlamedDogo99
243664634a Update eaglermobile.user.js 2024-06-09 17:51:02 -06:00
3 changed files with 150 additions and 104 deletions

View File

@ -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. 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/master/.github/CODE_OF_CONDUCT.md). Be sure to follow our [code of conduct](https://github.com/FlamedDogo99/EaglerMobile/blob/main/.github/CODE_OF_CONDUCT.md).
## Reporting bugs and suggesting features ## 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.** 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. 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. 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/master` 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/main` as the source branch:
```shell ```shell
git checkout -b BRANCH-NAME upstream/master git checkout -b BRANCH-NAME upstream/main
``` ```
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. 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. 5. Make and test your changes.

View File

@ -2,8 +2,9 @@
[![](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) [![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)
[![](https://img.shields.io/github/license/FlamedDogo99/EaglerMobile?style=flat-square)](https://github.com/FlamedDogo99/EaglerMobile/blob/master/LICENSE) [![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)
## About ## About
@ -63,7 +64,7 @@ If you found a bug or have a suggestion [create an issue](https://github.com/Fla
### Code ### Code
Before contributing code, please read our [contributing guidelines](https://github.com/FlamedDogo99/EaglerMobile/blob/master/.github/CONTRIBUTING.md). Before contributing code, please read our [contributing guidelines](https://github.com/FlamedDogo99/EaglerMobile/blob/main/.github/CONTRIBUTING.md).
### Features and documentation ### Features and documentation
#### Fake API's #### Fake API's

View File

@ -6,11 +6,24 @@
// @downloadURL https://raw.githubusercontent.com/FlamedDogo99/EaglerMobile/main/eaglermobile.user.js // @downloadURL https://raw.githubusercontent.com/FlamedDogo99/EaglerMobile/main/eaglermobile.user.js
// @license Apache License 2.0 - http://www.apache.org/licenses/ // @license Apache License 2.0 - http://www.apache.org/licenses/
// @match https://eaglercraft.com/mc/* // @match https://eaglercraft.com/mc/*
// @version 3.0.2 // @version 3.0.3
// @updateURL https://raw.githubusercontent.com/FlamedDogo99/EaglerMobile/main/eaglermobile.user.js // @updateURL https://raw.githubusercontent.com/FlamedDogo99/EaglerMobile/main/eaglermobile.user.js
// @run-at document-start // @run-at document-start
// @grant unsafeWindow
// ==/UserScript== // ==/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() { function isMobile() {
try { try {
@ -23,17 +36,22 @@ function isMobile() {
if(!isMobile()) { if(!isMobile()) {
alert("WARNING: This script was created for mobile, and may break functionality in non-mobile browsers!"); alert("WARNING: This script was created for mobile, and may break functionality in non-mobile browsers!");
} }
window.keyboardEnabled = false;
window.crouchLock = false; clientWindow.keyboardEnabled = false;
window.sprintLock = false; clientWindow.crouchLock = 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 clientWindow.sprintLock = false;
clientWindow.keyboardFix = false;
clientWindow.inputFix = false;
clientWindow.blockNextInput = false;
// Used for changing touchmove events to mousemove events // Used for changing touchmove events to mousemove events
var previousTouchX = null; var previousTouchX = null;
var previousTouchY = null; var previousTouchY = null;
var startTouchX = null; var startTouchX = null;
// better charCodeAt function // better charCodeAt function
String.prototype.toKeyCode = 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, "`": 192, "[": 219, "\\": 220, "]": 221, "\"": 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, "\u0060": 192, "[": 219, "\u005C": 220, "]": 221, "\u0022": 222};
return keyCodeList[this]; return keyCodeList[this];
} }
// Ignores keydown events that don't have the isValid parameter set to true // Ignores keydown events that don't have the isValid parameter set to true
@ -42,7 +60,7 @@ Object.defineProperty(EventTarget.prototype, "addEventListener", {
value: function (type, fn, ...rest) { value: function (type, fn, ...rest) {
if(type == 'keydown') { if(type == 'keydown') {
_addEventListener.call(this, type, function(...args) { _addEventListener.call(this, type, function(...args) {
if(!args[0].isValid && window.keyboardFix) { if(!args[0].isValid && clientWindow.keyboardFix) {
return; return;
} }
return fn.apply(this, args); return fn.apply(this, args);
@ -54,8 +72,8 @@ Object.defineProperty(EventTarget.prototype, "addEventListener", {
}); });
// Allows typing in #hiddenInput // Allows typing in #hiddenInput
const _preventDefault = Event.prototype.preventDefault; const _preventDefault = Event.prototype.preventDefault;
Event.prototype.preventDefault = function() { Event.prototype.preventDefault = function(shouldBypass) {
if(document.activeElement.id != "hiddenInput") { if(document.activeElement.id != "hiddenInput" || shouldBypass) {
this._preventDefault = _preventDefault; this._preventDefault = _preventDefault;
this._preventDefault(); this._preventDefault();
} }
@ -73,7 +91,7 @@ function keyEvent(name, state) {
which: charCode which: charCode
}); });
evt.isValid = true; // Disables fix for bad keyboard input evt.isValid = true; // Disables fix for bad keyboard input
window.dispatchEvent(evt); clientWindow.dispatchEvent(evt);
} }
function mouseEvent(number, state, canvas) { function mouseEvent(number, state, canvas) {
canvas.dispatchEvent(new PointerEvent(state, {"button": number})) canvas.dispatchEvent(new PointerEvent(state, {"button": number}))
@ -90,56 +108,56 @@ function setButtonVisibility(pointerLocked) {
inMenuStyle.disabled = !pointerLocked; inMenuStyle.disabled = !pointerLocked;
} }
// POINTERLOCK // POINTERLOCK
// When requestpointerlock is called, this dispatches an event, saves the requested element to window.fakelock, and unhides the touch controls // When requestpointerlock is called, this dispatches an event, saves the requested element to clientWindow.fakelock, and unhides the touch controls
window.fakelock = null; clientWindow.fakelock = null;
Object.defineProperty(Element.prototype, "requestPointerLock", { Object.defineProperty(Element.prototype, "requestPointerLock", {
value: function() { value: function() {
window.fakelock = this clientWindow.fakelock = this
document.dispatchEvent(new Event('pointerlockchange')); document.dispatchEvent(new Event('pointerlockchange'));
setButtonVisibility(true); setButtonVisibility(true);
return true return true
} }
}); });
// Makes pointerLockElement return window.fakelock // Makes pointerLockElement return clientWindow.fakelock
Object.defineProperty(Document.prototype, "pointerLockElement", { Object.defineProperty(Document.prototype, "pointerLockElement", {
get: function() { get: function() {
return window.fakelock; return clientWindow.fakelock;
} }
}); });
// When exitPointerLock is called, this dispatches an event, clears the // When exitPointerLock is called, this dispatches an event, clears the
Object.defineProperty(Document.prototype, "exitPointerLock", { Object.defineProperty(Document.prototype, "exitPointerLock", {
value: function() { value: function() {
window.fakelock = null clientWindow.fakelock = null
document.dispatchEvent(new Event('pointerlockchange')); document.dispatchEvent(new Event('pointerlockchange'));
setButtonVisibility(false); setButtonVisibility(false);
return true return true
} }
}); });
// FULLSCREEN // FULLSCREEN
window.fakefull = null; clientWindow.fakefull = null;
// Stops the client from crashing when fullscreen is requested // Stops the client from crashing when fullscreen is requested
Object.defineProperty(Element.prototype, "requestFullscreen", { Object.defineProperty(Element.prototype, "requestFullscreen", {
value: function() { value: function() {
window.fakefull = this clientWindow.fakefull = this
document.dispatchEvent(new Event('fullscreenchange')); document.dispatchEvent(new Event('fullscreenchange'));
return true return true
} }
}); });
Object.defineProperty(document, "fullscreenElement", { Object.defineProperty(document, "fullscreenElement", {
get: function() { get: function() {
return window.fakefull; return clientWindow.fakefull;
} }
}); });
Object.defineProperty(Document.prototype, "exitFullscreen", { Object.defineProperty(Document.prototype, "exitFullscreen", {
value: function() { value: function() {
window.fakefull = null clientWindow.fakefull = null
document.dispatchEvent(new Event('fullscreenchange')); document.dispatchEvent(new Event('fullscreenchange'));
return true return true
} }
}); });
// FILE UPLOADING // FILE UPLOADING
@ -150,16 +168,16 @@ document.createElement = function(type, ignore) {
this._createElement = _createElement; this._createElement = _createElement;
var element = this._createElement(type); var element = this._createElement(type);
if(type == "input" && !ignore) { if(type == "input" && !ignore) {
document.querySelectorAll('#fileUpload').forEach(e => e.parentNode.removeChild(e)); document.querySelectorAll('#fileUpload').forEach(e => e.parentNode.removeChild(e));
element.id = "fileUpload"; element.id = "fileUpload";
element.addEventListener('change', function(e) { element.addEventListener('change', function(e) {
element.hidden = true; element.hidden = true;
element.style.display = "none"; element.style.display = "none";
}, {passive: false, once: true}); }, {passive: false, once: true});
window.addEventListener('focus', function(e) { clientWindow.addEventListener('focus', function(e) {
setTimeout(() => { setTimeout(() => {
element.hidden = true; element.hidden = true;
element.style.display = "none"; element.style.display = "none";
}, 300) }, 300)
}, { once: true }) }, { once: true })
document.body.appendChild(element); document.body.appendChild(element);
@ -209,16 +227,17 @@ function createTouchButton(buttonClass, buttonDisplay, elementName) {
touchButton.classList.add(buttonDisplay); touchButton.classList.add(buttonDisplay);
touchButton.classList.add("mobileControl"); touchButton.classList.add("mobileControl");
touchButton.addEventListener("touchmove", function(e){e.preventDefault()}, false); touchButton.addEventListener("touchmove", function(e){e.preventDefault()}, false);
touchButton.addEventListener("contextmenu", function(e){e.preventDefault()});
return touchButton; return touchButton;
} }
function toggleKeyboard() { function toggleKeyboard() {
const keyboardInput = document.getElementById('hiddenInput'); const keyboardInput = document.getElementById('hiddenInput');
if (window.keyboardEnabled) { if (clientWindow.keyboardEnabled) {
window.keyboardEnabled = false; clientWindow.keyboardEnabled = false;
keyboardInput.blur(); keyboardInput.blur();
} else { } else {
window.keyboardEnabled = true; clientWindow.keyboardEnabled = true;
keyboardInput.select(); keyboardInput.select();
} }
} }
@ -237,7 +256,7 @@ function insertCanvasElements() {
} }
e.movementX = touch.pageX - previousTouchX; e.movementX = touch.pageX - previousTouchX;
e.movementY = touch.pageY - previousTouchY; e.movementY = touch.pageY - previousTouchY;
var evt = window.fakelock ? new MouseEvent("mousemove", {movementX: e.movementX, movementY: e.movementY}) : new WheelEvent("wheel", {"wheelDeltaY": e.movementY}); var evt = clientWindow.fakelock ? new MouseEvent("mousemove", {movementX: e.movementX, movementY: e.movementY}) : new WheelEvent("wheel", {"wheelDeltaY": e.movementY});
canvas.dispatchEvent(evt); canvas.dispatchEvent(evt);
previousTouchX = touch.pageX; previousTouchX = touch.pageX;
previousTouchY = touch.pageY; previousTouchY = touch.pageY;
@ -248,7 +267,7 @@ function insertCanvasElements() {
previousTouchY = null; previousTouchY = null;
}, false) }, false)
//Updates button visibility on load //Updates button visibility on load
setButtonVisibility(window.fakelock != null); setButtonVisibility(clientWindow.fakelock != null);
// Adds all of the touch screen controls // Adds all of the touch screen controls
// Theres probably a better way to do this but this works for now // Theres probably a better way to do this but this works for now
let strafeRightButton = createTouchButton("strafeRightButton", "inGame", "div"); let strafeRightButton = createTouchButton("strafeRightButton", "inGame", "div");
@ -274,13 +293,13 @@ function insertCanvasElements() {
startTouchX = touch.pageX; startTouchX = touch.pageX;
} }
let movementX = touch.pageX - startTouchX; let movementX = touch.pageX - startTouchX;
if((movementX * 10) > window.innerHeight) { if((movementX * 10) > clientWindow.innerHeight) {
strafeRightButton.classList.add("active"); strafeRightButton.classList.add("active");
strafeLeftButton.classList.remove("active"); strafeLeftButton.classList.remove("active");
keyEvent("d", "keydown"); keyEvent("d", "keydown");
keyEvent("a", "keyup"); keyEvent("a", "keyup");
} else if ((movementX * 10) < (0 - window.innerHeight)) { } else if ((movementX * 10) < (0 - clientWindow.innerHeight)) {
strafeLeftButton.classList.add("active"); strafeLeftButton.classList.add("active");
strafeRightButton.classList.remove("active"); strafeRightButton.classList.remove("active");
keyEvent("a", "keydown"); keyEvent("a", "keydown");
@ -333,20 +352,20 @@ function insertCanvasElements() {
crouchButton.style.cssText = "left:10vh;bottom:10vh;" crouchButton.style.cssText = "left:10vh;bottom:10vh;"
crouchButton.addEventListener("touchstart", function(e){ crouchButton.addEventListener("touchstart", function(e){
keyEvent("shift", "keydown") keyEvent("shift", "keydown")
window.crouchLock = window.crouchLock ? null : false clientWindow.crouchLock = clientWindow.crouchLock ? null : false
crouchTimer = setTimeout(function(e) { clientWindow.crouchTimer = setTimeout(function(e) {
window.crouchLock = (window.crouchLock != null); clientWindow.crouchLock = (clientWindow.crouchLock != null);
crouchButton.classList.toggle('active'); crouchButton.classList.toggle('active');
}, 1000); }, 1000);
}, false); }, false);
crouchButton.addEventListener("touchend", function(e) { crouchButton.addEventListener("touchend", function(e) {
if(!window.crouchLock) { if(!clientWindow.crouchLock) {
keyEvent("shift", "keyup") keyEvent("shift", "keyup")
crouchButton.classList.remove('active'); crouchButton.classList.remove('active');
window.crouchLock = false clientWindow.crouchLock = false
} }
clearTimeout(crouchTimer); clearTimeout(clientWindow.crouchTimer);
}, false); }, false);
document.body.appendChild(crouchButton); document.body.appendChild(crouchButton);
let inventoryButton = createTouchButton("inventoryButton", "inGame"); let inventoryButton = createTouchButton("inventoryButton", "inGame");
@ -367,34 +386,51 @@ 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.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.value = " " //Allows delete to be detected before input is changed
hiddenInput.addEventListener("input", function(e) { hiddenInput.addEventListener("input", function(e) {
let inputData = e.data ?? "delete"; // backspace makes null e.stopImmediatePropagation();
window.lastKey = inputData e.preventDefault(true);
hiddenInput.value = " "; // We need a character to detect deleting let inputData = e.data == null ? "delete" : e.data.slice(-1);
if(window.keyboardFix) { 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
if(e.inputType == 'insertText') { clientWindow.console.warn("Enabling blocking duplicate key events. Some functionality may be lost.")
let isShift = (inputData.toLowerCase() != inputData); clientWindow.inputFix = true;
if(isShift) { }
keyEvent("shift", "keydown") clientWindow.console.log(`Received input by ${e.inputType}: ${e.data} -> ${inputData}`);
keyEvent(inputData, "keydown");
keyEvent(inputData, "keyup"); hiddenInput.value = " ";
keyEvent("shift", "keyup") 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;
} else { } else {
keyEvent(inputData, "keydown"); let isShift = (inputData.toLowerCase() != inputData);
keyEvent(inputData, "keyup"); if(isShift) {
keyEvent("shift", "keydown")
keyEvent(inputData, "keydown");
keyEvent(inputData, "keyup");
keyEvent("shift", "keyup")
} else {
keyEvent(inputData, "keydown");
keyEvent(inputData, "keyup");
}
clientWindow.blockNextInput = true;
} }
} else if (e.inputType == 'deleteContentForward' || e.inputType == 'deleteContentBackward') { } else if (sliceInputType == 'd') {
keyEvent("backspace", "keydown") keyEvent("backspace", "keydown");
keyEvent("backspace", "keyup") keyEvent("backspace", "keyup");
clientWindow.blockNextInput = false;
} }
} }
clientWindow.lastKey = inputData
}, false); }, false);
hiddenInput.addEventListener("keydown", function(e) { hiddenInput.addEventListener("keydown", function(e) {
if(!(e.key && e.keyCode && e.which) && !window.keyboardFix) { if((e.keyCode == 229 || e.which == 229) && !clientWindow.keyboardFix) {
console.warn("Switching from keydown to input events due to invalid KeyboardEvent. Some functionality will be lost.") clientWindow.console.warn("Switching from keydown to input events due to invalid KeyboardEvent. Some functionality will be lost.")
window.keyboardFix = true; clientWindow.keyboardFix = true;
if(window.lastKey) { if(clientWindow.lastKey) {
keyEvent(window.lastKey, "keydown") keyEvent(clientWindow.lastKey, "keydown");
keyEvent(window.lastKey, "keyup") keyEvent(clientWindow.lastKey, "keyup");
} }
} }
}, false); }, false);
@ -436,20 +472,20 @@ function insertCanvasElements() {
sprintButton.style.cssText = "right:0vh;bottom:10vh;" sprintButton.style.cssText = "right:0vh;bottom:10vh;"
sprintButton.addEventListener("touchstart", function(e) { sprintButton.addEventListener("touchstart", function(e) {
keyEvent("r", "keydown"); keyEvent("r", "keydown");
window.sprintLock = window.sprintLock ? null : false clientWindow.sprintLock = clientWindow.sprintLock ? null : false
sprintTimer = setTimeout(function(e) { clientWindow.sprintTimer = setTimeout(function(e) {
window.sprintLock = (window.sprintLock != null); clientWindow.sprintLock = (clientWindow.sprintLock != null);
sprintButton.classList.toggle('active'); sprintButton.classList.toggle('active');
}, 1000); }, 1000);
}, false); }, false);
sprintButton.addEventListener("touchend", function(e) { sprintButton.addEventListener("touchend", function(e) {
if(!window.sprintLock) { if(!clientWindow.sprintLock) {
keyEvent("r", "keyup"); keyEvent("r", "keyup");
sprintButton.classList.remove('active'); sprintButton.classList.remove('active');
window.sprintLock = false clientWindow.sprintLock = false
} }
clearTimeout(sprintTimer); clearTimeout(clientWindow.sprintTimer);
}, false); }, false);
document.body.appendChild(sprintButton); document.body.appendChild(sprintButton);
let pauseButton = createTouchButton("pauseButton", "inGame"); let pauseButton = createTouchButton("pauseButton", "inGame");
@ -484,7 +520,7 @@ function insertCanvasElements() {
}, false); }, false);
document.body.appendChild(screenshotButton); document.body.appendChild(screenshotButton);
let coordinatesButton = createTouchButton("coordinatesButton", "inGame"); let coordinatesButton = createTouchButton("coordinatesButton", "inGame");
coordinatesButton.style.cssText = "top: 0vh; margin: auto; left: 32vh; right: 0vh; width: 8vh; height: 8vh;" coordinatesButton.style.cssText = ""
coordinatesButton.addEventListener("touchstart", function(e) { coordinatesButton.addEventListener("touchstart", function(e) {
keyEvent("f", "keydown"); keyEvent("f", "keydown");
keyEvent("3", "keydown"); keyEvent("3", "keydown");
@ -515,6 +551,7 @@ customStyle.textContent = `
outline:none; outline:none;
box-shadow: none; box-shadow: none;
border: none; border: none;
pointer-events: none !important;
} }
.mobileControl:active, .mobileControl.active { .mobileControl:active, .mobileControl.active {
position: absolute; position: absolute;
@ -535,24 +572,32 @@ customStyle.textContent = `
outline:none; outline:none;
box-shadow: none; box-shadow: none;
border: none; border: none;
pointer-events: none !important;
} }
html, body { html, body, canvas {
height: -webkit-fill-available !important; height: -webkit-fill-available !important;
touch-action: pan-x pan-y; 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 { .hide {
display: none; display: none;
} }
#fileUpload { #fileUpload {
position: absolute; position: absolute;
left: 0; left: 0;
right: 100vw; right: 100vw;
top: 0; top: 0;
bottom: 100vh; bottom: 100vh;
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;
background-color:rgba(255,255,255,0.5); background-color:rgba(255,255,255,0.5);
} }
.strafeRightButton { .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"); 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");