如何使用 Python 在 Minecraft 中控制鼠标



总而言之,我试图以编程方式和外部方式控制Minecraft玩家的方向。

没有

API,没有Java模组到游戏环境

通常,这需要鼠标的移动,但是我尝试过的每一个模拟python3库的鼠标移动都不会在游戏中移动玩家的头部。每个库也做一些不同的事情。

例如,pyautogui 不会执行任何操作,直到您在脚本完成后手动移动鼠标。这样做会将玩家的视图转移到程序应该移动到的位置,然后继续跟踪您当前的鼠标移动。两个鼠标命令都会发生这种情况。

import pyautogui
pyautogui.moveTo(500, 500)
pyautogui.moveRel(100, 100)  

pynput 库有与 pyautogui 相同的奇怪结果:

from pynput.mouse import Controller
mouse = Controller()
mouse.position = (100, 200)
mouse.move(200, -100)

石英根本不做任何事情:

import Quartz
class Mouse():
down = [Quartz.kCGEventLeftMouseDown, Quartz.kCGEventRightMouseDown, Quartz.kCGEventOtherMouseDown]
up = [Quartz.kCGEventLeftMouseUp, Quartz.kCGEventRightMouseUp, Quartz.kCGEventOtherMouseUp]
[LEFT, RIGHT, OTHER] = [0, 1, 2]
def click_pos(self, x, y, button=LEFT):
self.move(x, y)
self.click(button)
def to_relative(self, x, y):
curr_pos = Quartz.CGEventGetLocation( Quartz.CGEventCreate(None) )
x += curr_pos.x;
y += curr_pos.y;

mouse = Mouse()
mouse.to_relative(200, 200)

而且python鼠标库已经过时了:错误显示它只能在达尔文上运行(我在macOS High Sierra上运行)。由于Github页面上的描述,我得知这一点感到很难过。它说"所有鼠标设备上的全局事件挂钩(捕获事件,无论焦点如何)"。然后我想,不知何故,Minecraft正在自己吸收所有模拟的鼠标运动。无论哪种方式,我都没有为这款游戏使用正确的界面,我需要一些可以绕过 Minecraft 有趣的鼠标控制来获得我想要的动作的东西。

我甚至尝试使用鼠标键(mac的鼠标移动辅助功能,可让您仅使用键控制鼠标)以及pyautogui。

import pyautogui # with mouse keys on
import time
# mouse keys is an accessibility feature on mac that controls the mouse with the keyboard
print("[ALERT]: Make sure mouse keys is on! (press option 5 times if shortcut is enabled)")
pyautogui.keyDown('8')  # up in mouse keys
time.sleep(5)
pyautogui.keyUp('8')

我对最后一个不起作用并不特别惊讶,但我认为我已经没有办法尝试绕过使 Minecraft 不接受我的 python-mouse 输入的东西了。在这一点上,我很确定我给计算机的输入类型一定有一些区别。Minecraft作为一个程序不像其他程序那样使用鼠标,而python鼠标不像其他来源那样控制鼠标,因此存在断开连接。

我在我的macOS High Sierra上以全屏和窗口模式运行Minecraft,尽我所能让它正常运行。我将在 PyCharm 中启动测试脚本(python 3.6),将窗口(或窗口焦点)更改为 Minecraft(在程序中具有足够的延迟时间),然后见证会发生什么。鼠标点击,键盘按下,甚至涉及命令和转义键的热键在带有pyautogui的Minecraft中都可以正常工作,所以我根本不担心这些。从字面上看,这只是鼠标移动,什么也没做。

首先,这是问这个问题的正确地方吗?还有什么可以尝试的,或者我缺少一些关键的东西,可以让我的鼠标输入得到正确的响应?

我正在尝试做同样的事情,我让我在 Minecraft(Java 版)中移动视图。

对我有用的是将 pynput 与相对鼠标命令一起使用。它还需要在Minecraft设置中关闭"原始输入"。[电调 -> 选项... -> 控制... -> 鼠标设置... -> 原始输入:关闭]

import pynput
mouse = pynput.mouse.Controller()
mouse.move(10, 10)

此外,如果有人想要,这是鼠标平稳移动的开始:

def move_smooth(xm, ym, t):
for i in range(t):
if i < t/2:
h = i
else:
h = t - i
mouse.move(h*xm, h*ym)
time.sleep(1/60)
move_smooth(2, 2, 40)

现在,尝试使键盘工作:P

这个问题也困扰了我一段时间,我终于找到了这个问题的解决方案。macOS 蒙特雷 12.2,M1 芯片 2020)

我尝试了多个 python 库和宏应用程序,但没有一个有效,rawinput 也没有帮助。但是,系统偏好设置中的指针控制适用于 Minecraft 鼠标移动。鼠标键选项允许您通过击键控制鼠标移动,

在系统偏好设置中的位置可以找到鼠标键

系统偏好设置 ->辅助功能 -> 指针控制(在电机下) ->启用鼠标键

所以我尝试模拟键盘来移动鼠标。出于某种原因,除了苹果脚本之外,没有任何 python 库或宏应用程序可以使用鼠标键。所以我写了一个苹果脚本并将其嵌入到 python 中,当鼠标键选项打开时,它可以在 Minecraft 中移动鼠标。

鼠标键选项将允许您使用数字键来控制鼠标。 https://eastmanreference.com/complete-list-of-applescript-key-codes 此链接将告诉您要按下的击键的键代码。

import os
cmd=""" osascript -e '
repeat 500 times
tell application "System Events" to key code 88 --right
end repeat'
"""
os.system(cmd)

在脚本键代码 88 中匹配小键盘键 6,这将向右移动光标,更改键代码以自定义光标移动的位置。

我设法让它与鼠标库一起使用。我没有使用mouse.move(x,y,absolute,duration)而是使用mouse._os_mouse.move_to(x,y)mouse._os_mouse.move_relative(x,y)。考虑到如果您想要平滑的效果,则必须使用类似的东西自己实现它time.sleep(s).

我的情况和你差不多。我也无法找到在诸如Minecraft之类的游戏中注册鼠标移动的方法。

但是,我了解到您可以使用Java和内置的机器人库来实现所需的鼠标移动。我不知道你是否设置了python,但如果不是,值得一试。

在 Minecraft 中Options...转到Controls...转到Mouse Settings...,然后关闭Raw Input

这应该可以做到(你在 mac 上,我不知道此设置是否打开 我的世界的Mac版本)

我也在为此苦苦挣扎,我发现了以下发现(在 Ubuntu 20.04 上测试):

如果你激活RawInput,你可以使用mouse.position=(dx, dy)它(尽管它是绝对的)导致头部的相对运动!它也适用于 dx 和 dy 的负值。

这更快、更准确。您可以为实例链

mouse.position = (0, -100000) # turn head all the way up
mouse.position = (0, 600) # turn head exactly to horizon level

当鼠标灵敏度设置为 100% 时,地平线从直立向下 600"俯仰像素"。你不需要在通话之间有任何延迟,而且它们发生得如此之快,以至于在绝大多数情况下,玩家似乎不会在两者之间抬头,而是立即看向地平线。当我在关闭原始输入的情况下使用相对运动时,我需要在两者之间休眠,并且速度也限制在某个值。

唯一的问题是,您需要在这种控制鼠标的黑客方式和使用mouse.move(dx, dy)或使用实际绝对屏幕坐标的正常方式之间切换,mouse.position=(x, y)当您在制作屏幕/菜单中时。但我发现,如果您还创建一个 pynput 鼠标侦听器,您会看到 Minecraft 每次进入菜单时都会将鼠标位置设置为其窗口的中心,当您返回游戏时,它会再这样做两次。所以我用这些作为触发器。

尝试以管理员身份运行 python 并在窗口模式下运行游戏。Pyautogui应该可以工作了。

最新更新