Skip to content

Instantly share code, notes, and snippets.

@recuraki
Created October 2, 2022 07:13
Show Gist options
  • Save recuraki/28a614b0d9e64cd49a8155c64e7a9cec to your computer and use it in GitHub Desktop.
Save recuraki/28a614b0d9e64cd49a8155c64e7a9cec to your computer and use it in GitHub Desktop.
マイクラ統合版(Win)向けのチートコマンド生成+流し込み
"""
課題意識:
マイクラ統合版(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