还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 BG2GWD 于 2025-11-12 21:59 编辑
首先,这是我第一次制作mtr相关资源包,如有错误还请多多包涵
如题,这是一个追加包生成器 但事实我不懂mtr音频追加包具体添加逻辑,如果有懂的可以指导一下我 然后我会在新的版本中修复 然后是有问题还请各位通过评论提出建议。我会在文后附上代码和程序 欢迎大家提出建议或者直接使用我的代码修改。本文涉及到的源码和程序适用GPL协议
https://wwva.lanzouq.com/ijKyh3awolja
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import json
import os
from pathlib import Path
import shutil
class MTRResourcePackGenerator:
def __init__(self, root):
self.root = root
self.root.title("MTR资源包生成器")
self.root.geometry("600x700")
# 存储音频文件路径
self.audio_files = []
self.setup_ui()
def setup_ui(self):
# 主框架
main_frame = ttk.Frame(self.root, padding="20")
main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 标题
title_label = ttk.Label(main_frame, text="MTR资源包生成器", font=("Arial", 16, "bold"))
title_label.grid(row=0, column=0, columnspan=2, pady=(0, 20))
# 版本号输入
ttk.Label(main_frame, text="版本号 (必填):").grid(row=1, column=0, sticky=tk.W, pady=5)
self.version_entry = ttk.Entry(main_frame, width=50)
self.version_entry.grid(row=1, column=1, sticky=(tk.W, tk.E), pady=5)
# 版本号说明
version_help = ttk.Label(main_frame, text="版本号说明: 填入数字9就表示1.19, 8是1.18",
foreground="gray", font=("Arial", 9))
version_help.grid(row=2, column=0, columnspan=2, sticky=tk.W, pady=(0, 10))
# 简介输入
ttk.Label(main_frame, text="简介 (选填):").grid(row=3, column=0, sticky=tk.W, pady=5)
self.description_entry = ttk.Entry(main_frame, width=50)
self.description_entry.grid(row=3, column=1, sticky=(tk.W, tk.E), pady=5)
self.description_entry.insert(0, "简介")
# 音频文件管理
ttk.Label(main_frame, text="音频文件:", font=("Arial", 11, "bold")).grid(row=4, column=0, sticky=tk.W, pady=(20, 10))
# 音频文件列表框架
audio_frame = ttk.Frame(main_frame)
audio_frame.grid(row=5, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=5)
# 列表和滚动条
self.audio_listbox = tk.Listbox(audio_frame, height=8)
scrollbar = ttk.Scrollbar(audio_frame, orient=tk.VERTICAL, command=self.audio_listbox.yview)
self.audio_listbox.configure(yscrollcommand=scrollbar.set)
self.audio_listbox.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S))
# 音频文件操作按钮
audio_buttons_frame = ttk.Frame(main_frame)
audio_buttons_frame.grid(row=6, column=0, columnspan=2, pady=10)
ttk.Button(audio_buttons_frame, text="添加音频文件",
command=self.add_audio_files).pack(side=tk.LEFT, padx=5)
ttk.Button(audio_buttons_frame, text="移除选中",
command=self.remove_audio_file).pack(side=tk.LEFT, padx=5)
ttk.Button(audio_buttons_frame, text="清空列表",
command=self.clear_audio_files).pack(side=tk.LEFT, padx=5)
# 输出路径选择
ttk.Label(main_frame, text="输出文件夹:", font=("Arial", 11, "bold")).grid(row=7, column=0, sticky=tk.W, pady=(20, 10))
output_frame = ttk.Frame(main_frame)
output_frame.grid(row=8, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=5)
self.output_path = tk.StringVar()
ttk.Entry(output_frame, textvariable=self.output_path, width=40).pack(side=tk.LEFT, fill=tk.X, expand=True)
ttk.Button(output_frame, text="浏览",
command=self.select_output_folder).pack(side=tk.RIGHT, padx=(5, 0))
# 生成按钮
ttk.Button(main_frame, text="生成资源包",
command=self.generate_resource_pack,
style="Accent.TButton").grid(row=9, column=0, columnspan=2, pady=30)
# 配置网格权重
main_frame.columnconfigure(1, weight=1)
main_frame.rowconfigure(5, weight=1)
audio_frame.columnconfigure(0, weight=1)
audio_frame.rowconfigure(0, weight=1)
def add_audio_files(self):
files = filedialog.askopenfilenames(
title="选择音频文件",
filetypes=[("OGG音频文件", "*.ogg"), ("所有文件", "*.*")]
)
for file in files:
if file not in self.audio_files:
self.audio_files.append(file)
filename = os.path.basename(file)
self.audio_listbox.insert(tk.END, filename)
def remove_audio_file(self):
selection = self.audio_listbox.curselection()
if selection:
index = selection[0]
self.audio_listbox.delete(index)
self.audio_files.pop(index)
def clear_audio_files(self):
self.audio_listbox.delete(0, tk.END)
self.audio_files.clear()
def select_output_folder(self):
folder = filedialog.askdirectory(title="选择输出文件夹")
if folder:
self.output_path.set(folder)
def generate_resource_pack(self):
# 验证输入
version = self.version_entry.get().strip()
if not version:
messagebox.showerror("错误", "请填写版本号!")
return
if not version.isdigit():
messagebox.showerror("错误", "版本号必须是数字!")
return
output_folder = self.output_path.get().strip()
if not output_folder:
messagebox.showerror("错误", "请选择输出文件夹!")
return
description = self.description_entry.get().strip()
if not description:
description = "简介"
try:
# 创建资源包文件夹结构
pack_folder = Path(output_folder) / "mtr_resource_pack"
assets_folder = pack_folder / "assets" / "mtr"
sounds_folder = assets_folder / "sounds"
# 创建文件夹
sounds_folder.mkdir(parents=True, exist_ok=True)
# 创建pack.png空文件
with open(pack_folder / "pack.png", "wb") as f:
pass
# 创建pack.mcmeta文件
pack_meta = {
"pack": {
"pack_format": int(version),
"description": description
}
}
with open(pack_folder / "pack.mcmeta", "w", encoding="utf-8") as f:
json.dump(pack_meta, f, ensure_ascii=False, indent=2)
# 创建sounds.json文件
sounds_json = {}
for audio_file in self.audio_files:
filename = os.path.basename(audio_file)
audio_name = os.path.splitext(filename)[0]
# 复制音频文件到sounds文件夹
shutil.copy2(audio_file, sounds_folder / filename)
# 添加到sounds.json
sounds_json[audio_name] = {
"sounds": [
{
"name": f"mtr:{audio_name}",
"pitch": 0.5
}
]
}
# 写入sounds.json
with open(assets_folder / "sounds.json", "w", encoding="utf-8") as f:
json.dump(sounds_json, f, ensure_ascii=False, indent=2)
messagebox.showinfo("成功", f"资源包已生成到:\n{pack_folder}")
except Exception as e:
messagebox.showerror("错误", f"生成资源包时出错:\n{str(e)}")
def main():
root = tk.Tk()
app = MTRResourcePackGenerator(root)
root.mainloop()
if __name__ == "__main__":
main()
|