Python提取Minecraft玩家信息

Python笔记 开服日志 Minecraft Python 字符截取 我的世界统计信息 2020-03-14 阅读:443

1月份开了一个1.15.2版本的生存服,用的官方核心,纯净生存,就没安装mod/插件。

AG说,如果有个玩家数据排行榜就好了。

我试着去找插件,没找到能用的。

感觉国内的一些论坛很少有比较全Minecraft资料,国外的又看不懂

--论坛我只知道mcbbs


在找到可用的排行榜插件前,我想动手弄个排行榜出来。

Minecraft自带计分板,使用指令(不要花括号‘}’):scoreboard objectives add {计分板名字} {计分类别}

自带的计分板,统计的信息很全。

但是可能不尽人意。比如:如果现在记录死亡的次数,计分板会从0开始,不会加上开启计分板之前的死亡次数。

所以我打算自己把历史数据提取出来,加载到计分板中。

手动提取玩家统计信息过程:

首先,需要从服务器中提取玩家的统计数据。

  1. 在Minecraft服务端文件中,找到world文件夹。
  2. 进入world文件夹,找到stats文件夹,stats文件夹存储的是所有玩家的统计信息。
  3. 玩家统计数据是 json 格式的文件,我使用Python字符串截取的方式得到想要的数据。
# -*- coding: utf-8 -*-
# @Time    : 2020/3/13 12:22
# @Author  : Tooler
# @File    : getPlayerdata.py
# @Software: PyCharm
import re
import xlwt
import time
import pandas as pd
import xlsxwriter


player_filename = 'whitelist.json'
uuid_list = []  # 玩家uuid
name_list = []  # 玩家name
player_dic = {}  # 玩家uuid和name字典
mined_list = []  # 采集方块的数据


'''读取玩家uuid和name,方便通过确定统计数据属于哪个玩家'''
with open(player_filename, "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines:
        if "uuid" in line:
            # uuid = line.translate(str.maketrans('', '', 'uuid' + ':' + '"' + ',' + " " + "\n"))此方法导致有个字符'a'变成了数字'7',所以弃用
            uuid = line[13:-3]
            uuid_list.append(uuid)
        if "name" in line:
            name = line[13:-2]
            name_list.append(name)
player_dic = dict(zip(uuid_list, name_list))


def get_data(file_name):
    file = open('./stats/' + file_name + '.json')
    keyStart = 'mined":{' # 【开采方块数据】
    keyEnd = '}'
    buff = file.read()
    pat = re.compile(keyStart + '(.*?)' + keyEnd, re.S)
    result = pat.findall(buff)
    use_block = ''.join(result[0].split())
    s = use_block
    new_str = ""  # 创建一个空字符串
    for ch in s:
        if ch.isdigit():  # 字符串中的方法,可以直接判断ch是否是数字
            new_str += ch
        else:
            new_str += " "
    sub_list = new_str.split()  # 对新的字符串切片
    num_list = list(map(int, sub_list))  # map方法,使列表中的元素按照指定方式转变
    res = sum(num_list)  # 得到【开采方块】总数
    file.close()
    return res


def add_dict(d1,d2):
    result = d1.copy()
    result.update(d2)
    return result


def write_for_excel(data):
    '''将数据写入Excel表文件'''
    df=pd.DataFrame(all_info)

    workbook=xlsxwriter.Workbook('Minecraft-Player-Mined.xlsx')

    worksheet=workbook.add_worksheet()

    format_columname=workbook.add_format({'bold':True,'font_color':'red'}) #字体加粗,蓝色背景,紫色背景
    format_price=workbook.add_format({'num_format': '$#,##0','underline':True})#设置价格的数值格式,并添加下划线
    format_products=workbook.add_format({'font_name':'Times New Roman'})#设置字体

    for col in range(len(df.columns)):
        worksheet.write(0,col,df.columns[col],format_columname)


    for row in range(len(name_list)):  # 行数由玩家数量决定
        worksheet.write(row+1,0,df.playername[row])

    for row in range(len(name_list)):  # 行数由玩家数量决定
        worksheet.write(row + 1, 1, df.mined_data[row],format_products)

    workbook.close()

if __name__ == '__main__':
    '''循环得出玩家数据'''
    for i in range(len(uuid_list)):
        mined_list.append(get_data(uuid_list[i]))
    player_name = {'playername': name_list}
    mined_data = {'mined_data': mined_list}
    all_info = add_dict(player_name, mined_data)
    write_for_excel(all_info) # 数据写入excel表

然后,把数据添加到计分板中:

上面的代码中获取的是玩家开采物品的总数(游戏的计分板由统计物品开采,但没有统计总数)

举个例子:服务器开启了一个死亡次数计分板,但分数是0开始记录,没有之前的玩家死亡数据。那么就可以用Python提取玩家的死亡数据,然后将死亡数据加到死亡次数计分板中。

我用的手动输入指令,去更改计分板数据。(没去找计分板文件在哪,能找到也许可以直接写进去)

计分板数据更改指令(不要花括号‘}’):scoreboard players set {玩家昵称} {计分板name} {增加的数据值}


写的可能有些乱糟糟的

Minecraft是有排行榜计分插件的,但是我懒得去折腾,游戏存档已经7G+,不想去碰它了。

版权声明

本文基于《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
文章链接:https://tooler.club/archives/python-get-minecraft-playrestats.html (转载时请注明本文出处及文章链接)

如果觉得我的文章对你有用,请随意赞赏

1条评论

    Ancient_god

    游客 安卓派 248 天前回复