henrique 2 months ago
parent 9c88be9560
commit 9700a41aae

@ -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
response = urllib.request.urlopen(req)
remote_code = response.read().decode('utf-8')
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")
print("Download concluído! Configurando menu do 3ds Max...")
if not os.path.exists(pasta_ui_usuario):
os.makedirs(pasta_ui_usuario)
# 3. Executa o instalador local (que ele acabou de baixar) para montar o menu
# 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("\\", "/")
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()

@ -1,5 +1,7 @@
name "VR4Life Installer"
version 1
name "Instalador VR4Life"
version 1.0
extract to "$temp\VR4Life_Install"
extract to $temp\vr4life_inst
run "run_installer.ms"
drop "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"
)
)
python.executeFile (getDir #temp + @"\VR4Life_Install\Instalador_Online_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"
# 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")
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"
print("=== CONFIGURANDO COMPONENTES INTERNOS VR4LIFE ===")
# 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("\\", "/")
# 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@
)
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")
"""
rt.execute(macro_script)
print("MacroScript VR4Life_Launcher registrado com sucesso.")
if not os.path.exists(pasta_ui_usuario):
os.makedirs(pasta_ui_usuario)
# 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()
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!"
)
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()
if __name__ == "__main__":
configure_plugin()
Loading…
Cancel
Save