From cbb9ace37896e04854bf7bba0430f1fc93b664c6 Mon Sep 17 00:00:00 2001 From: henrique Date: Sun, 22 Feb 2026 23:53:44 -0300 Subject: [PATCH] atualiza --- instalador/Instalador_Online_VR4Life.py | 4 +- instalador/vr4life-install-3dmax.mzp | Bin 2123 -> 2134 bytes install_vr4life.py | 97 ++++++++++++++---------- 3 files changed, 61 insertions(+), 40 deletions(-) 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 8f0c016915b402d6472784b517137e0ac732d901..3330e1cb00a9dbfa2af4aa485289996af749083c 100644 GIT binary patch delta 1335 zcmV-71<3l#5Y`YEP)h>@6aWAK2mtH7R$RO2!B*k~006m>7cYOy0Y?;vk_y^N5eki| z3?V^Dfde3GW3Q71d)KVjO#t=8fhXVrfCJ*diATtbG3(8LqXJeG+u8a3=9`)DG?Pk$ z%&V38W1*6S4_(FH6)e})N~~lG+52>w!(2iYLi3aX%|W3+wQ?Pr|9lzglV10sfBLN7 znth&q@dnWD!Kr_L=C$A!_)ngA{ecIkttZ~#|1Cf3cYtP6XeuHJ8C4W0-f~Uh1{Zis zXe8B*YNhlS^jj|iqtXO2);i0N>-7=WE>BaYayFtVb3>Wd&(%S~V-{q^FyZ0i^;RQF z>GW2X6eBL`icac7MMXHSrxf4G!pB+fvDY;o8i$R2dOLrjcjCi)tZ}p-AK>Ti!BKQ@ zcyM&M-?&Tnk8U@@BVr+KvpkeT#g++RKn3O#F&Ko3XF3N=@mXHXzA7%wbEam$GxOYt za(F_g)k={w735Yrh`7Qqly*lPs0^WkV*?Y3L^(zx-m+d+U6In#-2T07o9`2McvWRM?){iVFlAT&e0WO8Bry48r z+9VON7#13)Eo=l%?YLAi(1r=4s>5^51XE7U{*He&5!xY0QSiI|iQnqBd-yasYjsQq zeCk23+wr@e;X0Y?*zfDG@4|`VOBR=9E|Eqa2(7U0%W@+@fF%^f?7IXu#UQw{W_S!j z>SZa*v)oygxlF)bMku9k85Va#!V0XiiOEwN55o_75)wj;Gor`vaiw-)(pjW(#|2;T z5R-o~QBOo7X#}xUvmd5e@kcG+G68~`F1AWqy_P@ z#2Aft);fmX+|4=V=xWh3rB6FA*g4l!!7!0H0BvKPa?KD|Gw-Cv?>?PuI#Mi^8VRNn zq;*U_ZcLYpkISGh?w8J+AJ<011=+Nf$dG>~fhp8>_pNZ9w^oGPw|8fS!j_HeNKc{hG{-83bjYye$ymYzY!;>fN32B4Q6Zw) zHxY8fs`<1ND7j?|y}C4tf-$2J_84gudMp+HKs9zN*+cl}W;a0IPU~-0h-C?Zo9lm5 z{8C=tl!b-fU^IqKlXD8#5l>IHo#wcka&{R)e3cm!4!+lRQY(}Zsx2*`BE`YuM$8;I zHwqo!I=pdZ=_VW*RXSNQ4D*~|vP_^AE=EmK+95Tw+T&$2t*+ReDC`AiEvSXh%YIjr zuf4z~lp;)u*{?`mgA*xYjx{cuKV^TSSQ}+qJX}3phlaZb`f8=ywgKl|VTK?sO{AGD z43UP0=&EL$JC(vTw{^HQyBO;8)pkYS?c5kwx1iD}gX9vfjhj8hc5^m8UdokCLxzEP z=4Kda3c}V3lIEjw(s&A20G0D3F>IjfUBS=sVKKMdSK>KSJmv-(imBoX6ii?5l@m`E zh{c(qx`7H)$a9GbuSA<+cw+{7_A|txZN@~dmBVTmWFxf{HRy;vkW&X^+5^pX!kT4V z#-eWvH2Z-&iEJ+sqfzb$+)qI{fPw&UNs=Hif1!ea*o=4X+&{As1qT8R>%CT7yXe7I t;sgKyxsxRaJq6Vu1-ovOzy}|bh6f%29FwI7SOJ)m{s%_}7Y6_U004{dc|HID delta 1336 zcmV-81;_f<5X%r3P)h>@6aWAK2mq(MR$MVK?k?8^004=R7cYP2fFl)$5`Idh3Wdg0 zhBT?t77i3yTYH==*t=%EZUR+L9C!jA05~8HoOp!17_)W~CuvlHRmDF$Ki|xJGgF?V zQfZJ`y*7KyRUGqkN8yJYGhMGmN+ytgOePu3BvdXmPY_rJiUjJl+pzb~myzD@_nvzP zr-SzN%k-;z44r>I9C#;g8}5R4c<2s}T{vhTy2t--`E<|)mP(id9CGdOBtezokR|8@GHEWoH!swKm`8ZG6(($Q zH;wZl7fr>+&2z;>Flr`@-YZv4Ywqi$|I+OlPq_W${-b}L2d#)b++nR2?gaN++uM%= zj2_=>J&GQ0v-^+e^pRDjwu4z9&lN5LAs{)$6(Sr5il;gQ3iUM0r{5Hp<~dcONxhb5sQj#y_Cu}+hSJUub%!gPo&-f^TSjVT(rPs7wWIFof!Fgp-hkv~=A=xI zoOhB7d)7-*_lP>O{-zzdG2-HW6Fi!>A&uE`|S>y zep9ajUDhnMe$JirqqVj66$RPFO(#Jt^Kkiq2hv#T-}0hE^!O4xg(;;u-P0#!7TbyVU(`Xf(5LO?h}whNb)+LZ}s9?E?O zJi&hh3dW!wi&(M{BB`c7P1DjxE#IR6!Av)oN?Luapcz?+c#OWGEl>)sk!ne}^y&3p zxMhk7jeFAGh5pRV1>@vu-ZO>Ia&F)S*G$2AENKvyjdj2^QeMs6lbU`9Y`p47VInmV zOvOa&$husaGFO)i&{t0j=X;k+qv6V0wH1HMfW^Kk)Oz<-dEKh=u&Loz4VG`~<$K2X z#N>S!mf$&#bF(&W2iRL%70#f%+f^3UY}_V#3QeaORXJeiNF|R)5}r}BpaL4Tk}QY0 z2&dmgzzwTr(@v1&H3SX|Lw|%Uq!zQsCP(G=AcIb%hfwwFN7eO~ulO|Z^9H-QvEoKJs; z@)qn%5pk+j(ZmUgd}$=D@u_;c4K06XDe2YTEa?yShujP^T7EhW5vI0=w|xaMXEY6^l&1xd1D zF)>_4qnycEkOUi;`jGPrdYI22=S;jp#UpM~!zff*Wdik9F}Y+;xi~Si#iUeq``*xOipaVv;~^$821WX#-djiX!?_Oi?zNC zj7Bl%Y0vn@An|>mWoP-m`LD?Ltuo?`yYnxz90dmg4X3+STrn{2F4qJA0Ev?@2R#Ko u67@1{lgkGmlO_cc4I}^n0000003ZMW01=b02Ur1(lL-h%1`G!P0000PTyh%# 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