Created
October 2, 2022 07:13
-
-
Save recuraki/28a614b0d9e64cd49a8155c64e7a9cec to your computer and use it in GitHub Desktop.
マイクラ統合版(Win)向けのチートコマンド生成+流し込み
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
課題意識: | |
マイクラ統合版(Win)ではチャットウィンドウに複数行送れない | |
建物を立てるためのコマンドを生成しても、1行ずつコピペしないとならず苦行 | |
アプローチ: | |
キーボードエミュレートして生成したコマンドを流し込む. | |
キーを流し込む際にはマイクラにフォーカスがないとならないのでキーボードのフックもする。 | |
使い方: | |
- チートオンにして"/tp @s 236 126 -328" | |
- "/fill 226 116 -338 256 146 -308 air"などして空間を切り取る | |
- このプログラムを起動してチャットウィンドウを開かない状態で"F10"を押す | |
- プログラムが終わるまで待つ | |
うまく動かないときは? | |
各所のsleepを少し増やすと動くかもしれない。 | |
使っているコマンド: | |
/fill x1 y1 z1 x2 y2 z2 block_type | |
指定したx,y,zの1と2の区間の3次元をblock_typeで埋めつくす | |
block_typeは"マイクラ チート ブロック名称"などでgoogle | |
⇒ fill(x, y, z, sizex, sizey, sizez, block) というwrapperでサイズ指定できるようにしている | |
以下詳細: | |
マイクラの建物建築を自動化したい。 | |
STEP1: コマンドを自動生成する(ここは頑張って作る) | |
STEP2: ユーザがマイクラにフォーカスを移してから「F10」を押すのを待つ | |
STEP3: STEP1で作ったチートコマンドを流し込む | |
1行ずつチャットウィンドウを開いて少し待つ | |
仕組み: | |
STEP2: keyboardモジュールを用いる。 | |
pyhookedというものもあるが、メンテされていないらしい。 | |
STEP3: pyautoguiを使って流し込む | |
チャットウィンドウを開いてコマンドを流す | |
typewrite(["a", "b", "c"]) などのようにリストを渡す. | |
リターンキー等は"enter"と渡す | |
hotkey()を使うと"ctrl + v"等も渡せるのだが, キーエミュレートの方がうまく動いた。 | |
ctrl + vする場合はpyperclipでクリップボード操作できる。 | |
""" | |
import pyautogui as pgui | |
import keyboard | |
from time import sleep | |
WAITTIME = 0.5 | |
from pprint import pprint | |
AIR="air" | |
TNT="tnt" | |
IRONBAR="iron_bars" | |
GLASS="glass" | |
LAPIS="lapis_block" | |
IRONDOOR="iron_door" | |
MAGMA="magma" | |
data = [] | |
def fill(x, y, z, sizex, sizey, sizez, block): | |
sizex += x | |
sizey += y | |
sizez += z | |
return "/fill {0} {1} {2} {3} {4} {5} {6}".format(x, y, z, sizex, sizey, sizez, block) | |
def air(x, y, z, sizex, sizey, sizez): | |
data.append(fill(x, y, z, sizex, sizey, sizez, AIR)) | |
def prison(x, y, z, sizex, sizey, sizez, WALL=IRONBAR, FLOOR=LAPIS, CEIL=GLASS): | |
#data.append(fill(x, y, z, sizex, sizey, sizez, AIR)) | |
data.append(fill(x, y, z, sizex, sizey, sizez, WALL)) | |
data.append(fill(x + 1, y + 1, z + 1, sizex - 2, sizey - 2, sizez - 2, AIR)) | |
data.append(fill(x, y, z, sizex, 0, sizez, FLOOR)) | |
data.append(fill(x, y + sizey, z, sizex, 0, sizez, CEIL)) | |
a, b, c = x + (sizex // 2), y + 1, z | |
data.append(fill(a, b, c, 0, 0, 0, IRONDOOR)) | |
pprint(data) | |
x, y, z = 236, 126, -328 | |
air(x-10, y-10, z-10, 30, 30, 30) | |
prison(x + 5*0, y, z, 5,5,5) | |
#prison(x + 5*1, y, z, 5,5,5, FLOOR=MAGMA) | |
prison(x + 5*1, y, z, 5,5,5, WALL=GLASS, FLOOR=MAGMA, CEIL=LAPIS) | |
prison(x + 5*2, y, z, 5,5,5, WALL=LAPIS, FLOOR=MAGMA, CEIL=MAGMA) | |
print("PRESS F10...") | |
while True: | |
if keyboard.is_pressed("F9"): | |
break | |
if keyboard.is_pressed("F10"): | |
if keyboard.is_pressed("F9"): break | |
sleep(0.1) | |
print("!") | |
pgui.typewrite(["return"]) | |
sleep(0.1) | |
pgui.typewrite(["return"]) | |
sleep(0.1) | |
for l in data: | |
if l[0] == "/": l = l[1:] | |
print(">", l) | |
sleep(0.1) | |
pgui.typewrite(["backspace"]) | |
pgui.typewrite(["/"]) | |
sleep(0.1) | |
pgui.typewrite(l) | |
sleep(0.1) | |
pgui.typewrite(["return"]) | |
sleep(WAITTIME) | |
pgui.typewrite(["return"]) | |
sleep(0.1) | |
pgui.typewrite(["return"]) | |
break | |
print("EXIT...") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment