BG2GWD 发表于 2025-11-12 21:55:50

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

本帖最后由 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 发表于 2025-11-12 21:57:26

似乎文件大小有限制 先这样吧

BG2GWD 发表于 2025-11-12 21:57:47

我过几天传蓝奏云
页: [1]
查看完整版本: 【发布】MTR音频追加包生成器