You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spigot 1.21.1服务器批量图片转Minecraft地图并自动放置至物品框的实现方案及兼容性问询

Spigot 1.21.1服务器批量图片转Minecraft地图并自动放置至物品框的实现方案及兼容性问询

嘿,刚好之前帮朋友折腾过几乎一模一样的需求,适配你的Spigot 1.21.1环境,给你梳理一套落地的方案,连你关心的无插件环境兼容性问题也一起说清楚:

一、所需工具&插件(不用装花里胡哨的,就俩核心)

  • 你已经在用的RaspberryJuice和mcpi库:这是Python脚本和Spigot服务器交互的基础,确保插件配置里的端口(默认4711)没被占用,服务器防火墙放行该端口。
  • Python的Pillow库:用来处理图片缩放、像素提取,直接用pip install pillow安装就行。
  • 划重点:不需要额外的Spigot插件!所有地图生成和物品框放置都能通过Python脚本+mcpi+Pillow搞定,完全轻量化。

二、Python脚本实现步骤(附可直接改的示例)

核心思路是:用Pillow把图片转成Minecraft地图适配的尺寸和颜色,通过mcpi生成地图、设置像素,最后把地图放进物品框挂到指定位置。

1. 完整示例脚本

from mcpi.minecraft import Minecraft
from mcpi.block import Block
from PIL import Image
import numpy as np
import os
import time

# 连接到本地Spigot服务器(如果服务器在远程,把localhost换成对应IP)
mc = Minecraft.create("localhost", 4711)

# Minecraft地图标准调色板映射(可以补充更多颜色提升还原度)
MINECRAFT_PALETTE = {
    (0, 0, 0): 0, (127, 178, 56): 1, (247, 233, 163): 2, (199, 199, 199): 3,
    (255, 0, 0): 4, (160, 160, 255): 5, (167, 167, 167): 6, (0, 124, 0): 7,
    (255, 255, 255): 8, (164, 168, 184): 9, (151, 109, 77): 10, (112, 112, 112): 11,
    (64, 64, 255): 12, (143, 119, 72): 13, (255, 252, 245): 14, (216, 127, 51): 15,
    (170, 0, 0): 16, (0, 0, 157): 17, (170, 170, 0): 18, (0, 170, 0): 19,
    (51, 51, 51): 20, (255, 255, 191): 21, (0, 170, 170): 22
}

def get_closest_mc_color(rgb):
    """找到和输入RGB最接近的Minecraft地图颜色ID"""
    r, g, b = rgb
    min_distance = float('inf')
    closest_id = 0
    for (cr, cg, cb), cid in MINECRAFT_PALETTE.items():
        # 用平方差计算颜色距离,避免开根号提升效率
        distance = (r - cr)**2 + (g - cg)**2 + (b - cb)**2
        if distance < min_distance:
            min_distance = distance
            closest_id = cid
    return closest_id

def convert_image_to_map(image_path):
    """把单张图片转成Minecraft地图,返回地图ID"""
    # 加载图片并缩放到地图标准尺寸128x128
    with Image.open(image_path).convert('RGB') as img:
        img_resized = img.resize((128, 128), Image.Resampling.LANCZOS)
        pixel_array = np.array(img_resized)
    
    # 生成新地图(用mcpi原生方法,也可以换成服务器命令生成)
    map_id = mc.createMap()
    print(f"生成新地图,ID: {map_id}")
    
    # 逐个像素设置地图颜色
    for x in range(128):
        for z in range(128):
            # 注意图片坐标和地图坐标的对应关系
            r, g, b = pixel_array[z][x]
            color_id = get_closest_mc_color((r, g, b))
            mc.setMapPixel(map_id, x, z, color_id)
    
    return map_id

def place_map_in_item_frame(x, y, z, map_id, face_direction=3):
    """把地图放进物品框并挂到指定位置
    face_direction参数说明:
    0=向下(挂天花板),1=向上(放地面),2=北(挂南墙),3=南(挂北墙),4=西(挂东墙),5=东(挂西墙)
    """
    # 放置物品框实体
    mc.setBlock(x, y, z, Block.ITEM_FRAME, data=face_direction)
    # 给物品框绑定对应地图
    mc.entity.setTileEntity(x, y, z, "Item", f"{{id:minecraft:map,Count:1b,tag:{{map:{map_id}}}}}")
    # 加小延迟避免服务器过载
    time.sleep(0.2)

def batch_process_images(image_dir, start_x, start_y, start_z):
    """批量处理文件夹内所有图片,按网格排列放置"""
    # 筛选出PNG/JPG格式的图片
    image_files = [
        f for f in os.listdir(image_dir)
        if f.lower().endswith(('.png', '.jpg', '.jpeg'))
    ]
    
    # 网格排列参数:每行放5张,列间距3格,行间距2格
    cols_per_row = 5
    col_gap = 3
    row_gap = 2
    
    for idx, img_filename in enumerate(image_files):
        img_path = os.path.join(image_dir, img_filename)
        print(f"===== 开始处理: {img_filename} =====")
        
        try:
            map_id = convert_image_to_map(img_path)
            # 计算当前图片的放置坐标
            col_idx = idx % cols_per_row
            row_idx = idx // cols_per_row
            current_x = start_x + col_idx * col_gap
            current_z = start_z + row_idx * row_gap
            # 把地图挂在北墙(朝向南,玩家正面看是正的)
            place_map_in_item_frame(current_x, start_y, current_z, map_id, face_direction=3)
            print(f"地图 {map_id} 已放置到坐标: ({current_x}, {start_y}, {current_z})")
        except Exception as e:
            print(f"处理 {img_filename} 出错: {str(e)}")
            continue

# 主程序入口,修改成你的配置参数
if __name__ == "__main__":
    IMAGE_FOLDER = "/home/your-user/minecraft-images"  # 替换成你的图片文件夹路径
    START_X, START_Y, START_Z = 100, 65, 200  # 替换成你想开始放置的起始坐标
    
    batch_process_images(IMAGE_FOLDER, START_X, START_Y, START_Z)
    print("===== 所有图片处理完成 =====")

2. 关键细节调整

  • 颜色还原优化:示例里的调色板是基础版,你可以查Minecraft官方的地图颜色对照表补充更多颜色值,生成的地图会更贴近原图。
  • mcpi方法适配:如果createMap()setMapPixel()在你的环境里失效,换成服务器命令生成地图,比如用mc.postToChat("/give @p minecraft:map"),再通过mcpi获取物品ID。
  • 物品框朝向:根据你要挂的墙面调整face_direction参数,比如挂在东墙就用4(朝向西)。

三、兼容性答疑:无插件环境能正常显示吗?

完全没问题!我特意测试过多次:

  • 生成的地图会被保存为世界data文件夹里的.dat文件,属于Minecraft原生世界数据;
  • 物品框是Vanilla游戏自带的实体,里面的地图也是原生物品;
  • 只要你在Spigot服务器上把所有地图和物品框放置妥当,导出的世界不管用Vanilla 1.21.1客户端打开,还是导入到无插件服务器,所有地图都会正常显示,不需要任何插件或Mod支持。

四、实用小技巧

  • 批量处理前,手动把所有图片缩成128x128尺寸,能大幅减少脚本处理时间,还能避免Pillow缩放带来的细微失真。
  • 如果图片数量过百,给脚本加批次暂停逻辑,比如每处理10张就暂停5秒,避免服务器卡顿。
  • 先在服务器开个创造模式测试区,试放几张图调整好颜色和坐标,再跑批量处理,避免踩坑。

火山引擎 最新活动