forked from phenom/healer-man
Release Healer Man 0.1.46
This commit is contained in:
1 parent
f82daf1c13
commit
9ff574ac0b
73 files changed
+33486
-174
No files matched your search
+27
-13
@@ -131,11 +131,18 @@ const mouseLookBuffer = createMouseLookBuffer();
|
||||
let mouseLookDragActive = false;
|
||||
let previousMousePosition: { x: number; y: number } | null = null;
|
||||
|
||||
/** Clears browser text selection before gameplay takes ownership of a mouse drag. */
|
||||
export function clearBrowserSelection(): void {
|
||||
if (typeof window === "undefined") return;
|
||||
window.getSelection?.()?.removeAllRanges();
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts popup-free desktop camera look. Unlike Pointer Lock, this retains the
|
||||
* normal browser cursor and only consumes movement while right mouse is held.
|
||||
*/
|
||||
export function beginMouseLookDrag(clientX: number, clientY: number): void {
|
||||
clearBrowserSelection();
|
||||
mouseLookDragActive = true;
|
||||
previousMousePosition = Number.isFinite(clientX) && Number.isFinite(clientY)
|
||||
? { x: clientX, y: clientY }
|
||||
@@ -317,20 +324,20 @@ export function installInput(nextActions: InputActions): () => void {
|
||||
}
|
||||
publishActionLayer();
|
||||
};
|
||||
const onPointerMove = (event: PointerEvent) => {
|
||||
if (!mouseLookDragActive || event.pointerType !== "mouse") return;
|
||||
const current = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)
|
||||
? { x: event.clientX, y: event.clientY }
|
||||
: null;
|
||||
if (!current) return;
|
||||
const previous = previousMousePosition;
|
||||
previousMousePosition = current;
|
||||
if (
|
||||
previous
|
||||
&& mouseLookBuffer.push(current.x - previous.x, current.y - previous.y)
|
||||
) actions?.setInputMode("keyboard");
|
||||
};
|
||||
const onMouseMove = (event: MouseEvent) => {
|
||||
if (mouseLookDragActive) {
|
||||
const current = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)
|
||||
? { x: event.clientX, y: event.clientY }
|
||||
: null;
|
||||
if (!current) return;
|
||||
const previous = previousMousePosition;
|
||||
previousMousePosition = current;
|
||||
if (
|
||||
previous
|
||||
&& mouseLookBuffer.push(current.x - previous.x, current.y - previous.y)
|
||||
) actions?.setInputMode("keyboard");
|
||||
return;
|
||||
}
|
||||
if (
|
||||
document.pointerLockElement
|
||||
&& mouseLookBuffer.push(event.movementX, event.movementY)
|
||||
@@ -341,6 +348,9 @@ export function installInput(nextActions: InputActions): () => void {
|
||||
mouseLookBuffer.reset(locked ? POINTER_LOCK_MOUSE_GRACE_MS : 0);
|
||||
nextActions.setCameraLookActive(locked || mouseLookDragActive);
|
||||
};
|
||||
const onSelectStart = (event: Event) => {
|
||||
if (mouseLookDragActive) event.preventDefault();
|
||||
};
|
||||
const clear = () => {
|
||||
keys.clear();
|
||||
keyboardModifiers.clear();
|
||||
@@ -355,15 +365,19 @@ export function installInput(nextActions: InputActions): () => void {
|
||||
window.addEventListener("keydown", onKeyDown);
|
||||
window.addEventListener("keyup", onKeyUp);
|
||||
window.addEventListener("blur", clear);
|
||||
document.addEventListener("pointermove", onPointerMove);
|
||||
document.addEventListener("mousemove", onMouseMove);
|
||||
document.addEventListener("pointerlockchange", onPointerLockChange);
|
||||
document.addEventListener("selectstart", onSelectStart);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener("keydown", onKeyDown);
|
||||
window.removeEventListener("keyup", onKeyUp);
|
||||
window.removeEventListener("blur", clear);
|
||||
document.removeEventListener("pointermove", onPointerMove);
|
||||
document.removeEventListener("mousemove", onMouseMove);
|
||||
document.removeEventListener("pointerlockchange", onPointerLockChange);
|
||||
document.removeEventListener("selectstart", onSelectStart);
|
||||
unsubscribeController();
|
||||
clear();
|
||||
actions = null;
|
||||
|
||||
Reference in new issue
Block a user