开启左侧

【发布】MTR音频追加包生成器

[复制链接]
BG2GWD 昨天 21:55

还没有账号?赶快去注册吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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()


楼主 BG2GWD 昨天 21:57
似乎文件大小有限制 先这样吧
楼主 BG2GWD 昨天 21:57
我过几天传蓝奏云
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表