diff --git a/instalador/Instalador_Online_VR4Life.py b/instalador/Instalador_Online_VR4Life.py index 753cea8..6148b97 100644 --- a/instalador/Instalador_Online_VR4Life.py +++ b/instalador/Instalador_Online_VR4Life.py @@ -1,15 +1,15 @@ import os import urllib.request +import shutil from pymxs import runtime as rt # ========================================== # CONFIGURAÇÕES DO GITEA - IMMERSE GAMES # ========================================== -# URL apontando para a pasta 'instalador' GITEA_RAW_URL = "https://git.immersegame.com/vr4life_public/vr4life-3dmax-plugin/raw/branch/main/" GITEA_TOKEN = "3831a0da2f87e391f41f4649d48498136a1903c9" -# Descobre a pasta segura de Scripts do Usuário do próprio 3ds Max +# Caminho onde os scripts são instalados (Documentos) user_scripts_dir = rt.getDir(rt.name("userScripts")) PLUGIN_DIR = os.path.join(user_scripts_dir, "VR4Life_Plugin").replace("\\", "/") @@ -20,48 +20,69 @@ FILES_TO_DOWNLOAD = [ "run_vr4life.py", "vr4life_updater.py", "install_vr4life.py", + "vr4life.mnx", "version.txt" ] def install_from_cloud(): rt.clearListener() - print("=== INICIANDO INSTALAÇÃO ONLINE ===") + print("=== DEBUG DE CAMINHOS VR4LIFE ===") + print(f"Diretório de destino dos Pythons: {PLUGIN_DIR}") - # 1. Cria a pasta do plugin dentro do 3ds Max se ela não existir if not os.path.exists(PLUGIN_DIR): os.makedirs(PLUGIN_DIR) - print(f"Pasta de destino criada: {PLUGIN_DIR}") - # 2. Inicia o download forçando o token na URL try: for file_name in FILES_TO_DOWNLOAD: - # INJEÇÃO DIRETA: O token vai na própria URL para evitar bloqueio do Gitea nas rotas Raw remote_url = f"{GITEA_RAW_URL}{file_name}?token={GITEA_TOKEN}" local_path = os.path.join(PLUGIN_DIR, file_name).replace("\\", "/") - print(f"Baixando: {file_name}...") - 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", "token " +GITEA_TOKEN ) - # Executa o download e salva no PC + req.add_header("Authorization", "token " + GITEA_TOKEN) response = urllib.request.urlopen(req) - remote_code = response.read().decode('utf-8') - with open(local_path, "w", encoding="utf-8") as f: - f.write(remote_code) - - print("Download concluído! Configurando menu do 3ds Max...") - - # 3. Executa o instalador local (que ele acabou de baixar) para montar o menu + if file_name.endswith(".mnx"): + with open(local_path, "wb") as f: + f.write(response.read()) + print(f"MNX baixado para: {local_path}") + else: + remote_code = response.read().decode('utf-8') + with open(local_path, "w", encoding="utf-8") as f: + f.write(remote_code) + print(f"Script baixado para: {local_path}") + + # --- INSTALAÇÃO DO MENU --- + pasta_macros = rt.pathConfig.getDir(rt.name("userMacros")) + pasta_enu = os.path.dirname(pasta_macros) + pasta_ui_usuario = os.path.join(pasta_enu, "en-US", "UI") + + if not os.path.exists(pasta_ui_usuario): + os.makedirs(pasta_ui_usuario) + + # AGORA GARANTIMOS QUE O PATH DE ORIGEM É O PLUGIN_DIR + origem_mnx = os.path.join(PLUGIN_DIR, "vr4life.mnx") + destino_mnx = os.path.join(pasta_ui_usuario, "vr4life.mnx") + + print(f"Tentando copiar MNX da origem: {origem_mnx}") + print(f"Para o destino final: {destino_mnx}") + + if os.path.exists(origem_mnx): + shutil.copy2(origem_mnx, destino_mnx) + print(">>> Cópia do MNX realizada com sucesso!") + else: + print("!!! ERRO: O arquivo vr4life.mnx não foi encontrado na pasta PLUGIN_DIR após o download.") + + # Executa o instalador local install_script = os.path.join(PLUGIN_DIR, "install_vr4life.py").replace("\\", "/") - rt.python.ExecuteFile(install_script) + if os.path.exists(install_script): + print(f"Executando script de instalação: {install_script}") + rt.python.ExecuteFile(install_script) + + rt.messageBox("Instalação Online concluída. Verifique o Listener para o log de caminhos.", title="VR4Life") except Exception as e: - msg = f"Erro ao baixar os arquivos do Gitea.\nVerifique a internet, URL ou o Token de acesso.\n\nDetalhe técnico: {str(e)}" - rt.messageBox(msg, title="Erro de Instalação") - print(msg) + print(f"ERRO TÉCNICO: {str(e)}") + rt.messageBox(f"Falha na instalação: {str(e)}", title="Erro") if __name__ == "__main__": install_from_cloud() \ No newline at end of file diff --git a/instalador/mzp.run b/instalador/mzp.run index dc4930e..42c5cc8 100644 --- a/instalador/mzp.run +++ b/instalador/mzp.run @@ -1,5 +1,7 @@ -name "VR4Life Installer" -version 1 +name "Instalador VR4Life" +version 1.0 -extract to $temp\vr4life_inst -run "run_installer.ms" \ No newline at end of file +extract to "$temp\VR4Life_Install" + +run "run_installer.ms" +drop "run_installer.ms" \ No newline at end of file diff --git a/instalador/run_installer.ms b/instalador/run_installer.ms index aca6ac7..7ffa1c4 100644 --- a/instalador/run_installer.ms +++ b/instalador/run_installer.ms @@ -1,13 +1 @@ -( - -- Aponta para a pasta exata que definimos no mzp.run - local py_script = (getDir #temp) + "\\vr4life_inst\\Instalador_Online_VR4Life.py" - - -- Checa se o arquivo realmente está lá - if doesFileExist py_script then ( - -- Se estiver, executa e deixa o Python cuspir erros reais se houver - python.ExecuteFile py_script - ) else ( - -- Se não estiver, avisa onde procurou - messageBox ("O instalador não encontrou o Python!\n\nProcurou em:\n" + py_script) title:"Erro de Extração MZP" - ) -) \ No newline at end of file +python.executeFile (getDir #temp + @"\VR4Life_Install\Instalador_Online_VR4Life.py") \ No newline at end of file diff --git a/instalador/vr4life-install-3dmax.mzp b/instalador/vr4life-install-3dmax.mzp index 988446a..78e1f1b 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 14d152c..8d1536e 100644 --- a/install_vr4life.py +++ b/install_vr4life.py @@ -1,53 +1,43 @@ import os -import shutil -import pymxs +from pymxs import runtime as rt -def instalar_menu_vr4life(): +def configure_plugin(): try: - nome_arquivo_mnx = "vr4life.mnx" + print("=== CONFIGURANDO COMPONENTES INTERNOS VR4LIFE ===") - # A GRANDE MUDANÇA: Em vez de __file__, vamos direto na pasta - # temporária onde o mzp.run extraiu os arquivos! - pasta_temp_windows = os.environ.get('TEMP') - pasta_extracao_mzp = os.path.join(pasta_temp_windows, "VR4Life_Install") + # 1. Define o caminho onde os scripts foram salvos (o diretório atual deste arquivo) + plugin_dir = os.path.dirname(os.path.realpath(__file__)).replace("\\", "/") - caminho_origem_mnx = os.path.join(pasta_extracao_mzp, nome_arquivo_mnx) - - # Verifica se achou no temp - if not os.path.exists(caminho_origem_mnx): - pymxs.runtime.messageBox( - f"Erro: O arquivo '{nome_arquivo_mnx}' não foi encontrado na pasta de extração:\n{caminho_origem_mnx}\n\nVerifique se o arquivo está dentro do .mzp com o nome exato (em minúsculo).", - title="VR4Life - Erro" - ) - return False - - # Acha a pasta de interface do usuário do 3ds Max - pasta_macros = pymxs.runtime.pathConfig.getDir(pymxs.runtime.name("userMacros")) - pasta_enu = os.path.dirname(pasta_macros) - pasta_ui_usuario = os.path.join(pasta_enu, "en-US", "UI") - - if not os.path.exists(pasta_ui_usuario): - os.makedirs(pasta_ui_usuario) - - caminho_destino_mnx = os.path.join(pasta_ui_usuario, nome_arquivo_mnx) - - # Faz a cópia - shutil.copy2(caminho_origem_mnx, caminho_destino_mnx) - - pymxs.runtime.print_(f"VR4Life: Menu copiado com sucesso para {pasta_ui_usuario}\n") - - pymxs.runtime.messageBox( - "O menu do VR4Life foi instalado com sucesso!\n\nSe ele não aparecer imediatamente no topo, reinicie o 3ds Max.", - title="VR4Life - Sucesso!" - ) + # 2. Adiciona a pasta do plugin ao PATH do Python do 3ds Max + # Isso permite que você dê 'import vr4life_engine' de qualquer lugar + import sys + if plugin_dir not in sys.path: + sys.path.append(plugin_dir) + print(f"Path adicionado ao Python: {plugin_dir}") + + # 3. Se você precisar registrar algum atalho de teclado ou MacroScript, faça aqui. + # Exemplo: Registrar o comando que o botão do menu vai chamar + macro_script = f""" +macroScript VR4Life_Launcher +category:"VR4Life" +tooltip:"Abrir VR4Life" +( + python.executeFile @{plugin_dir}/run_vr4life.py@ +) +""" + rt.execute(macro_script) + print("MacroScript VR4Life_Launcher registrado com sucesso.") + + # 4. Forçar o 3ds Max a atualizar a interface para o menu aparecer + # (Opcional, às vezes o Max precisa reiniciar para ler o .mnx novo) + rt.menuMan.updateMenuBar() + + print("=== PLUGIN VR4LIFE PRONTO PARA USO ===") return True except Exception as e: - pymxs.runtime.messageBox( - f"Falha ao instalar o menu.\nErro técnico: {str(e)}", - title="VR4Life - Erro Fatal" - ) + print(f"Erro na configuração final: {str(e)}") return False -if __name__ == '__main__': - instalar_menu_vr4life() \ No newline at end of file +if __name__ == "__main__": + configure_plugin() \ No newline at end of file