本机地址:127.0.0.1
mc中 按T 说话
# 导入Minecraft Pi的Python API模块并创建连接
import mcpi.minecraft as mmc
mc = mmc.Minecraft.create() # 连接到游戏
# 初始化变量
lst = [] # 用于存储玩家点击的两个坐标点
block_lst = [] # 用于存储区域内的方块信息
count = 1 # 点击计数器(1表示等待开始,2表示等待第二个点)
n = 1 # 主循环控制标志(0退出程序)
# 主程序循环
while n:
# 检查聊天栏事件(玩家输入的内容)
for e in mc.events.pollChatPosts():
if e.message == '1': # 当玩家输入1时开始选点流程
count = 1 # 重置点击计数器
mc.postToChat('请点击第一个方块')
# 开始收集两个坐标点
while count < 3: # 需要收集2个点(count从1到3)
# 检查方块点击事件
for e in mc.events.pollBlockHits():
if e: # 如果检测到点击事件
# 获取点击位置的坐标
x,y,z = e.pos.x,e.pos.y,e.pos.z
lst.append((x,y,z)) # 存储坐标到列表
count += 1 # 点击计数器+1
# 根据点击次数显示提示信息
if count == 2: # 第一次点击后
mc.postToChat(f'请点击第二个方块已存储坐标:,{x},{y},{z}')
elif count == 3: # 第二次点击后
mc.postToChat(f'两个坐标已经获取:,{lst[0][0]},{lst[0][1]},{lst[0][2]},和,{lst[1][0]},{lst[1][1]},{lst[1][2]}')
break # 退出当前循环
elif e.message == '0': # 当玩家输入0时退出程序
n = 0
# 计算两个坐标点的最小和最大坐标(确定立方体区域)
minx = miny = minz = maxx = maxy = maxz = 0
# 比较X坐标
if lst[0][0] < lst[1][0]:
minx, maxx = lst[0][0], lst[1][0]
else:
minx, maxx = lst[1][0], lst[0][0]
# 比较Y坐标
if lst[0][1] < lst[1][1]:
miny, maxy = lst[0][1], lst[1][1]
else:
miny, maxy = lst[1][1], lst[0][1]
# 比较Z坐标
if lst[0][2] < lst[1][2]:
minz, maxz = lst[0][2], lst[1][2]
else:
minz, maxz = lst[1][2], lst[0][2]
# 遍历立方体区域内的所有方块
for x in range(minx, maxx+1): # X轴范围(+1包含终点)
for y in range(miny, maxy+1): # Y轴范围
for z in range(minz, maxz+1): # Z轴范围
# 获取方块的类型ID和附加数据(比如羊毛颜色)
block_msg = mc.getBlockWithData(x,y,z)
bid = block_msg.id # 方块ID(比如1是石头,2是草)
bdata = block_msg.data # 附加数据(比如羊毛颜色值)
block_lst.append((bid,bdata)) # 存储方块信息
mc.postToChat('方块信息已获取')
print(block_lst)
# 将方块信息发送到聊天栏
#! 将所有的xyz的差距记录
if lst[0][0] > lst[1][0]:
xlen = lst[0][0] - lst[1][0]
else:
xlen = lst[1][0] - lst[0][0]
if lst[0][1] > lst[1][1]:
ylen = lst[0][1] - lst[1][1]
else:
ylen = lst[1][1] - lst[0][1]
if lst[0][2] > lst[1][2]:
zlen = lst[0][2] - lst[1][2]
else:
zlen = lst[1][2] - lst[0][2]
dx = dy = dz = 0
mc.postToChat('请敲击一个方块,接下来会从这个方块开始建造')
count = 0
while 1:
for e in mc.events.pollBlockHits():
if e :
dx,dy,dz = e.pos.x,e.pos.y,e.pos.z #! 建造位置
break
if dx :
for j in range(dx,dx+xlen+1): #! dx为初始建造位置
for k in range(dy,dy+ylen+1):
for l in range(dz,dz+zlen+1):
mc.setBlock(j,k,l,block_lst[count][0],block_lst[count][1])
count += 1
mc.postToChat('建造完成')
break