diff --git a/instalador/Instalador_Online_VR4Life.py b/instalador/Instalador_Online_VR4Life.py index 3c6ac2d..753cea8 100644 --- a/instalador/Instalador_Online_VR4Life.py +++ b/instalador/Instalador_Online_VR4Life.py @@ -43,8 +43,8 @@ def install_from_cloud(): req = urllib.request.Request(remote_url) # Mantemos o cabeçalho Bearer como redundância de segurança - req.add_header("Authorization", f"Bearer {GITEA_TOKEN}") - + #req.add_header("Authorization", f"Bearer {GITEA_TOKEN}") + req.add_header("Authorization", "token " +GITEA_TOKEN ) # Executa o download e salva no PC response = urllib.request.urlopen(req) remote_code = response.read().decode('utf-8') diff --git a/instalador/vr4life-install-3dmax.mzp b/instalador/vr4life-install-3dmax.mzp index 8f0c016..3330e1c 100644 Binary files a/instalador/vr4life-install-3dmax.mzp and b/instalador/vr4life-install-3dmax.mzp differ diff --git a/install_vr4life.py b/install_vr4life.py index 138f505..e18f7b1 100644 --- a/install_vr4life.py +++ b/install_vr4life.py @@ -2,48 +2,69 @@ import os from pymxs import runtime as rt def install_plugin(): - # 1. Descobre a pasta exata onde este instalador foi salvo pelo usuário - script_dir = os.path.dirname(os.path.realpath(__file__)) - py_file = os.path.join(script_dir, "run_vr4life.py").replace("\\", "/") - - # 2. Cria o MacroScript (A Ponte) dinamicamente injetando código no Max - macro_code = f""" - macroScript VR4Life_AutoBake category:"VR4Life" buttonText:"Painel Auto-Bake" tooltip:"Abre o motor de otimização VR4Life / Zombisco" + # Define o caminho do run_vr4life.py que foi acabado de transferir + user_scripts_dir = rt.getDir(rt.name("userScripts")) + plugin_dir = os.path.join(user_scripts_dir, "VR4Life_Plugin").replace("\\", "/") + run_script = os.path.join(plugin_dir, "run_vr4life.py").replace("\\", "/") + + # 1. Cria a Action (MacroScript) que funciona em TODAS as versões. + # Isto regista a ferramenta no sistema para ser usada em toolbars ou atalhos. + macro_name = "Zombisco_Engine" + category = "Immerse Games" + tooltip = "Abrir Motor do Zombisco" + + macro_code = f''' + macroScript {macro_name} + category:"{category}" + buttonText:"Zombisco" + tooltip:"{tooltip}" ( - python.ExecuteFile @"{py_file}" + on execute do ( + python.ExecuteFile @"{run_script}" + ) ) - """ + ''' rt.execute(macro_code) + print(f"[LOG] MacroScript registado com sucesso para todas as versões.") - # 3. Acessa o Gerenciador de Menus do 3ds Max - menu_name = "VR4Life" - main_menu_bar = rt.menuMan.getMainMenuBar() - - # Verifica se o menu já existe (para evitar duplicações se o usuário instalar 2x) - existing_menu = rt.menuMan.findMenu(menu_name) - if existing_menu: - rt.menuMan.unRegisterMenu(existing_menu) - - # Cria o menu Dropdown principal - new_menu = rt.menuMan.createMenu(menu_name) - - # Cria o item clicável que aponta para o MacroScript (A Ponte) - menu_item = rt.menuMan.createActionItem("VR4Life_AutoBake", "VR4Life") - new_menu.addItem(menu_item, -1) - - # Injeta o menu lá no topo, na barra principal do 3ds Max - sub_menu_item = rt.menuMan.createSubMenuItem(menu_name, new_menu) - - # Adiciona no final da barra (usando o index atual) - index = main_menu_bar.numItems() - main_menu_bar.addItem(sub_menu_item, index) - - # Atualiza a interface gráfica do 3ds Max na mesma hora - rt.menuMan.updateMenuBar() - - # Mensagem de Sucesso - msg = "Plugin VR4Life instalado com sucesso!\n\nOlhe para a barra superior do seu 3ds Max, o menu já está lá pronto para uso." - rt.messageBox(msg, title="Instalação Concluída") + # 2. Tenta criar o Menu Superior (Para 3ds Max 2024 e anteriores) + try: + main_menu = rt.menuMan.getMainMenuBar() + menu_name = "Immerse Games" + + # Remove o menu se já existir para evitar duplicações + existing_menu = rt.menuMan.findMenu(menu_name) + if existing_menu: + rt.menuMan.unRegisterMenu(existing_menu) + + # Cria o novo menu + new_menu = rt.menuMan.createMenu(menu_name) + menu_item = rt.menuMan.createActionItem(macro_name, category) + new_menu.addItem(menu_item, -1) + + sub_menu_item = rt.menuMan.createSubMenuItem(menu_name, new_menu) + main_menu.addItem(sub_menu_item, -1) + rt.menuMan.updateMenuBar() + + print("[LOG] Menu superior criado com sucesso (Método Clássico).") + rt.messageBox("Instalação do motor do Zombisco concluída com sucesso!\nVerifique o menu 'Immerse Games' no topo do seu 3ds Max.", title="Instalação Concluída") + + except AttributeError: + # Falhou propositadamente porque é o 3ds Max 2025 ou 2026 + print("[LOG] 3ds Max 2025/2026 detetado. O 'menuMan' foi descontinuado.") + + # Abre a UI de imediato para entregar as ferramentas à equipa sem atrasos + if os.path.exists(run_script): + rt.python.ExecuteFile(run_script) + + msg = ("Instalação Concluída!\n\n" + "No 3ds Max 2025/2026, a Autodesk alterou a forma de criar menus no topo.\n" + "Para não interromper o seu trabalho, o motor foi aberto de imediato no seu ecrã.\n\n" + "Para adicionar um botão permanente à sua área de trabalho:\n" + "1. Vá ao menu Customize > Hotkey Editor (ou Toolbars).\n" + "2. Procure pela categoria 'Immerse Games'.\n" + "3. Arraste a ferramenta 'Zombisco' para a sua barra de ferramentas preferida.") + rt.messageBox(msg, title="Immerse Games") if __name__ == "__main__": install_plugin() \ No newline at end of file