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

如何用Python开发Minecraft客户端聊天模组及相关API咨询

嘿,我完全理解你想用Python开发Minecraft客户端聊天模组的需求——毕竟Java不是每个人都顺手,而你已经熟悉Python,还关注到了RaspberryJamMod,这点真的很棒!针对你提到的几个核心功能,我来给你梳理下可行的方案和具体实现思路,帮你绕开文档不完善的坑:

核心API选择:RaspberryJamMod

虽然官方文档略显简略,但RaspberryJamMod确实是目前连接Python和Minecraft Java版的最佳选择,它基于mcpi(Minecraft Pi版API)做了扩展,完全能覆盖你的所有需求。首先确保你已经安装了模组,并且Python环境里装了mcpi库(用pip install mcpi即可)。

1. 获取自身Minecraft用户名

RaspberryJamMod扩展了mcpi的player对象,提供了直接获取当前玩家名称的方法,代码很简单:

from mcpi.minecraft import Minecraft

# 建立与本地Minecraft客户端的连接
mc = Minecraft.create()
my_username = mc.player.getName()
print(f"当前登录的用户名:{my_username}")

这个方法会直接返回你当前游戏账号的名称,无需额外配置。

2. 获取游戏内玩家名称列表

要获取所有在线玩家,你需要先拿到所有玩家的实体ID,再通过ID反查用户名:

# 获取所有在线玩家的实体ID
player_ids = mc.getPlayerEntityIds()
player_names = []

for pid in player_ids:
    # 通过实体ID获取对应玩家的名称
    player_names.append(mc.entity.getName(pid))

print(f"当前在线玩家:{', '.join(player_names)}")

如果服务器玩家较多,这个调用可能有轻微延迟,建议按需调用(比如用户触发指令时再执行),不要放在高频循环里。

3. 在本地客户端显示聊天消息

发送消息到聊天框

mc.postToChat()方法可以直接把自定义消息显示在游戏的聊天界面:

# 发送全局消息
mc.postToChat("这是来自Python脚本的提示!")

# 也可以发送带格式的消息,比如用颜色代码(注意Minecraft的颜色代码格式)
mc.postToChat("§a这是绿色的提示消息!")

监听游戏内的聊天消息

RaspberryJamMod提供了pollChatPosts()方法来监听新的聊天内容,这个在官方文档里提得不多,但非常实用:

import time

while True:
    # 拉取新的聊天事件
    chat_events = mc.events.pollChatPosts()
    for event in chat_events:
        # event对象包含sender(发送者名称)和message(消息内容)
        print(f"收到消息:{event.sender} 说:{event.message}")
        # 也可以把消息转发到客户端聊天框
        mc.postToChat(f"[监听] {event.sender}: {event.message}")
    # 加个小延迟,避免占用过多CPU
    time.sleep(0.1)

4. 添加自定义指令(如"/L")

RaspberryJamMod没有直接注册指令的API,但可以通过监听聊天消息来模拟自定义指令。比如实现一个/L指令,触发后显示在线玩家列表:

import time
from mcpi.minecraft import Minecraft

mc = Minecraft.create()

while True:
    chat_events = mc.events.pollChatPosts()
    for event in chat_events:
        message = event.message.strip()
        sender = event.sender

        # 判断是否触发/L指令
        if message == "/L":
            # 获取在线玩家列表
            player_ids = mc.getPlayerEntityIds()
            player_names = [mc.entity.getName(pid) for pid in player_ids]
            # 发送结果到聊天框
            mc.postToChat(f"[指令] 当前在线玩家共{len(player_names)}人:{', '.join(player_names)}")
        
        # 可以继续添加其他指令,比如/hello
        elif message == "/hello":
            mc.postToChat(f"[指令] 你好呀,{sender}!")
    
    time.sleep(0.1)

5. 为玩家创建相关指令(如私聊、传送类指令)

针对特定玩家的指令,同样通过解析聊天消息实现。比如做一个/msg <玩家名> <内容>的私聊指令:

# 接上面的循环逻辑
elif message.startswith("/msg"):
    # 拆分指令参数
    parts = message.split(maxsplit=2)
    # 检查参数是否完整
    if len(parts) >= 3:
        target_player = parts[1]
        msg_content = parts[2]
        
        # 查找目标玩家是否在线
        player_ids = mc.getPlayerEntityIds()
        target_found = False
        for pid in player_ids:
            if mc.entity.getName(pid) == target_player:
                # 仅向目标玩家发送私聊消息(通过entityId指定接收者)
                mc.postToChat(f"[私聊] {sender}: {msg_content}", entityId=pid)
                # 给发送者反馈
                mc.postToChat(f"[指令] 已向{target_player}发送私聊")
                target_found = True
                break
        
        if not target_found:
            mc.postToChat(f"[指令] 玩家{target_player}不在线或不存在!")

这里的关键是postToChatentityId参数,指定后消息只会发送给对应的玩家,实现私聊效果。

一些额外注意事项
  • 确保Minecraft客户端已经加载了RaspberryJamMod,并且脚本和游戏运行在同一台机器上(默认连接本地25565端口)。
  • 如果遇到功能异常,可以检查RaspberryJamMod的版本是否与你的Minecraft版本匹配。
  • 想要更深入的用法,可以去RaspberryJamMod的代码仓库看示例脚本,里面有很多官方文档没提到的细节。

内容的提问来源于stack exchange,提问作者Judi Treebuckle

火山引擎 最新活动