From 9700a41aae8bf75d76e2e998ed9c650bc3a0cab1 Mon Sep 17 00:00:00 2001 From: henrique Date: Mon, 23 Feb 2026 21:36:27 -0300 Subject: [PATCH] aaa --- instalador/Instalador_Online_VR4Life.py | 69 +++++++++++++-------- instalador/mzp.run | 10 ++-- instalador/run_installer.ms | 14 +---- instalador/vr4life-install-3dmax.mzp | Bin 2591 -> 2472 bytes install_vr4life.py | 76 ++++++++++-------------- 5 files changed, 85 insertions(+), 84 deletions(-) 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 988446ae602b0faf9376c2a7acd5b8c06d075116..78e1f1b643cafcb83ffd0a447b3e8d5c9ff9037d 100644 GIT binary patch delta 1818 zcmY*acU02}68=#_5;_6_B_tssVCa2mLSO?bMEcSM1tbL4NDW1b$wpWe0HxcjvtK&3iNN&3xa?A2X#gwbBYs_5y-3002OM z)H)9zvvkC%OCSJ97Xtuzb^`=S%k>xv9m7j@Vs^ySOco$Z0GsZvcG@7c@!V1t63-ua zZ6o@j-&WzA;RUNR5qNXJk^76ZDnd!Sx8AoeLs8h%IUs=?ME-CT6J))dERxdJ5x=rz zB#MYdQfsyQUnnSl>dL?&b!KMm*G_M6)k=0DXB)Iv(WrfCh zU2jtchV18vihscCloy)~l^{Oj#Dls>GSCb6bBj;5{u~AsXb+r8MeZ2XY5~tW5+mvo z3k5x;oP7uN<$NnhFDPD}0%)gUjTSfhO9e$wytSL>DD(AGy^BW$sSd43DGebvweH(G z7e5~noT`a5fyrC(`^#R)&Qbr^Rc1+>bY;{Ue5$a!_t(T=Ae_Ly0UdP4FJNRz;UfLW z()%ECBr-{D$4q;CH|!L;cjA=GL&2I#uT-)FFAtWwW5$p2z;b=GDxQ1U7{BLFF+i87 z$W#g#E;K;MAxgR)^xL=T;PRc2WuS!SJ!49%q#c@di(CBU@cKzpi29O6hPk5iy@sma zTkQ@W>r%)3<|YpOVw>N3Eq{5Zu^eppNCPf7&sYGQe&FEBFso6Y>DG_(TCifT`I z_uM7|E^lU$i0jt*(ARmUjy-zeX^r?2mlmCL<~VkGr7F)k=*cTJ>&Qek$DT>MOA->xZIIjeG#Gk`7yo7%JtvFWRz zU0YW7{!IloO#-%{Bud2|A9pV>Z(;bryj+8yOB*zc{^&i%S+R7h+WnA^8#=d6ou zj1sl$SGeNiDDB?P1wHNE=}9HB(!DSm`|w9imdK4cA^(sSloek;m9?*+hTC%~2&lE& z!?YPe?_lfC6a{a-F4pU{d{@Q!$apX$Jdwk$YMhDf^OYCtof{oLX`PZ})cjjoM*Em5 zXPa}SCQM>)P7}zy6j`kZ={5jKyc>@*~6Vr;0sVlsh z>X>VLxV`uzwe6oEDJ%V#0Ss5T)zjpW#C!~CO&a&PMX&OqngQFlJw|M5xv5=(9BTQOHgK@}SIV^gQcam_K^I{@^R3GZ zYPjwXzTIW)<^Gio7IgSSCi3 z7eyz-;C%ZQcT8Tvgpc_Eporz+<2?n2IyE>fRErcxx)Mz#*@jR^ zsMBN;l@Jn%!ca-q!cpodJleYm^q4;DsLE!voT(cZFj!*piFOz)_ zVlFfkCls$-mHj&eVfNkZ$Gl)b`J0wwLmeak_%r=y5yF2Z0DupW2gcHqPhh{*%d7mq q^#3Xc0LkyVAcV4Gpa`LyKStu2=B!}PJ?-6Bl zq}oO}QXL)UvL-5I$1S1DDM!EO_jJzrJkR^j=XpNw`^Wn}@25uPzbNz%hoxmu006)N zNhdk5W0psrk^z8rL@rtvBo9PCw^O?B{Hu*ZKg1bzF%L23hD7AlDrnogrb=u57}CUq zCJ7sa9>8i>s=-T0iuBaOEa%=!mXZOmT#AeuAN}}cx~Omo$8<}7T+jL#Qkr*R>+x=} zs;O|ut>H9c^mE)zK_F3;xRMVUurIZ{OWk>MBU$||GibdO{L}zW+&o`$ei`;`fmaJo z-+ig}fmA~Ok}6x>Xdr&MVP-2yND1{0GuDw)KZ-IGQ#~eO+vtbG^oDXGD&KE=f6QE} zd{Ac3Fuwn)WECmIkbJ7Bd&`Vs9SVn^4%zcV)J}I>OioU%l6BqQz9(Nt>0;)xJ?9(_ z9kRYvjhg7=_xOX0w}n=k8W(fUC)$)HObL=2&fVFy>*dS>&nqs59uvo%;2vJT8oiIN zdrCX1^+3Ku_jS3GcF<`ROZ0{8Gk96|W&fbZ_l+?Fu~nfDuq&cWDxFw8iCI2@K4dZJT@9%Nv}eCqJv)fS~o>=#MD&A$(b!hLB8fZXeq5~p>HCbe)@ zO;o}P=J9eW{*Dq^m&Xq^7xK+pG9#*nubLX<6$iLLFd6mL8Yb_?^pLmFY8q8$kusk1 z+#{CH7;<2Fogj8V#>aEu>lG{Hn6``8QpeY;=|!b;9Y+mT6>e{F5Ms@wsA+xtzi`x=PS0K(&jQU$e{;YQQhe1w; zm1ot}5*+x5hL)^8pY2-(TN9O)iI=fuJxk{*X<+c6e+9J%dSXe5Y3W6B)CrfleWZ0) zmH)D{*~A`5+D%NGTR`WDjL_5C({l0(Q4npeW1Us7LPLvNYtXlq=%h4@SEeT)NuNHeV=s z0v7EOItieocUZmG^iz#~r>!@}yf`-5TtB&Y%NS?=9f6%35o61^yA&ww4A{<*!g0tK z#yJURGWgeXBrc@VWn7Q(#kk()*L{9`=}5IIz`4P(-%Gn}bRUu`sQY+F#ju?s-}wtJ zJI%5jxrPo`O*B>Au(P6>j5>Un3EgK0iajM~$(a@{EQ6oNgTtI8H*S} zl1OdE)7&B|O`Vv`Qdd#DFQj>!gJ4bn|zeD{f-rrJT z<>!+v?rc?zlZW@1wpHucD+;#p)=078AJ8*qH5pI)fAVEEbw1S3*KyAtZE^vF(p8L3 zU9rLx*;2~%av6--y3isU79Yon=i)lh zb1Or%Llg5Nv@eG}Xqf(5`BqL5p^Fx~mk{(T%fo?@N}mozha>pIh`i}?>L4BA3$Rx7 zEF;--$9YeegDp8C->Lne&w*)}Mt1EK0_DEQQX#2jb{CfZl8W%@jm<(dITi)eLtu$( z*sjv3M~=5xf{1OWb?>6AW-|%bd}Kq$qzB^pHz|RS%FfE;KBwAbMVceay%uCeB>Vj- zX+Vr?o|XkznwBzhIblI$`*#bPbI5`9Yd;Zu0RRL7H;Ykr6H$pV7;1d9*=0*aiiHBO zPTWvRYt?$MlEzGDY8}!+jU5^EOTMojs2I(CCDqjjFDxKEG*dk$J$XYBf0-0?0suqWPQzzYHZ22vmZC~b;w3ZDp% zj*SbBjHFO8QL&UQTC;;+#kYR!%8omvf!6=Nw-wY_E>j% z%$CV6cjK>k1lDZZLtGJmF2NOfrab7DTDVLON zm~5VWAJ5L)d-;j@iYg{16)LHqVT8M9u&pxinv=CNb-AN~wC+TFlIy~9nz1wY! z9#ed>c!n?(c9v^2o!UY3s73B*BYg5U=}pIqpp8Sf