open.mp forum
[Tool] PawnPro 4.0.0 para SA-MP e open.mp — o que mudou e o que foi corrigido - Printable Version

+ open.mp forum (https://forum.open.mp)
-- Forum: SA-MP (https://forum.open.mp/forumdisplay.php?fid=3)
--- Forum: Releases (https://forum.open.mp/forumdisplay.php?fid=13)
--- Thread: [Tool] PawnPro 4.0.0 para SA-MP e open.mp — o que mudou e o que foi corrigido (/showthread.php?tid=6465)



PawnPro 4.0.0 para SA-MP e open.mp — o que mudou e o que foi corrigido - NullSablex - 2026-09-21

PawnPro 4.0.0
🇧🇷 Extensão de VS Code / VSCodium para Pawn — SA-MP e open.mp
🇬🇧 VS Code / VSCodium extension for Pawn — SA-MP and open.mp


Marketplace · Open VSX · GitHub · Documentação

Quote:🇧🇷 A 4.0.0 está no ar. É a maior atualização da extensão até hoje: IntelliSense cinco vezes mais rápido em projeto grande, F12 para ir à definição, depuração de filterscript, log de diagnóstico para relatar bug, e uma lista de correções que inclui a tela de configurações que não respondia a clique e a formatação que danificava código.

🇧🇷 Não há nada novo para instalar e a sua configuração continua valendo. Só um aviso importa: se você usa o depurador, atualize o plugin do servidor — detalhes no fim.

🇬🇧 4.0.0 is out — the biggest update yet: 5× faster IntelliSense on large projects, F12 go-to-definition, filterscript debugging, a diagnostic log for bug reports, and a long list of fixes including the settings page that ignored clicks and formatting that corrupted code. Nothing new to install; your settings carry over. One caveat: if you debug, update the server plugin.



🆕 Novo na 4.0.0 / New in 4.0.0

⌨️ Ir para definição — F12 ou Ctrl+clique
🇧🇷 Leva à declaração no próprio arquivo, num include ou em outro arquivo compilado junto. Em cima de um forward, vai direto ao corpo da função.
🇬🇧 Jumps to the declaration in the file, in an include, or in another file compiled with it. On a forward, it goes to the body.

📓 Log de diagnóstico / Diagnostic log
🇧🇷 Configurações → Diagnóstico → nível info. A extensão, o motor de análise e o depurador gravam em .pawnpro/logs/: um pawnpro.log com tudo na ordem em que aconteceu, mais um arquivo por componente. Desligado de fábrica — nenhum arquivo é criado até você ligar —, e os logs entram sozinhos no .gitignore. Ao abrir uma issue, anexar esse arquivo vale mais que qualquer descrição.
🇬🇧 Settings → Diagnosticsinfo. Extension, analysis engine and debugger all write to .pawnpro/logs/: one pawnpro.log with everything in the order it happened, plus one file per component. Off by default; the logs are gitignored automatically.

🧩 Depuração de filterscript / Debugging filterscripts
🇧🇷 Aponte program para o .amx do filterscript: só ele para nos breakpoints, e os outros scripts do servidor seguem rodando normalmente.
🇬🇧 Point program at the filterscript's .amx: only it stops at breakpoints, the server's other scripts keep running.

✏️ Breakpoint sobrevive a edição durante a sessão / Breakpoints survive edits mid-session
🇧🇷 O texto de quando o script foi compilado fica guardado, e cada breakpoint é levado para a linha equivalente do binário em execução. Uma linha nova, que não existe no código compilado, fica marcada como não verificada até você reiniciar — em vez de parar no lugar errado.
🇬🇧 The text as compiled is kept, and each breakpoint is mapped to the matching line of the running binary. A brand-new line shows as unverified until you restart, instead of stopping in the wrong place.

🔁 O IntelliSense volta sozinho quando cai / IntelliSense restarts itself
🇧🇷 Antes, uma falha no motor deixava o editor sem análise até recarregar a janela. Agora ele sobe de novo sozinho, e um aviso diz quantas vezes isso aconteceu. Depois de cinco quedas seguidas, desiste e avisa — "PawnPro: Limpar Cache" tenta de novo.
🇬🇧 A crash in the engine used to leave you with no analysis until you reloaded the window. It now comes back on its own, with a notice telling you how many times it happened; after five straight crashes it gives up and says so.



⚡ O que melhorou no dia a dia / Day-to-day improvements
  • Projeto grande ficou rápido — 🇧🇷 num gamemode com 84 includes, cada edição caiu de cerca de 1 s para 0,2 s / 🇬🇧 with 84 includes, from ~1 s to 0.2 s per edit
  • O IntelliSense enxerga o programa inteiro — e só ele — 🇧🇷 hover, assinatura, autocomplete, referências e o contador acima das funções passam a considerar tudo o que é compilado junto com o arquivo aberto, inclusive o [b].inc irmão que você não abriu[/b], e nunca outro programa: gamemode e filterscript deixam de se misturar, mesmo com funções de mesmo nome / 🇬🇧 the whole compilation unit, closed sibling includes included, and never another program
  • Renomear (F2) respeita escopo — 🇧🇷 um local muda só no bloco onde foi declarado; um parâmetro, só na função. Renomear uma public atualiza o nome em SetTimer("Nome", …). Renomear uma global que tem um local homônimo é recusado, dizendo onde está o conflito — antes os dois eram trocados juntos / 🇬🇧 scope-aware rename; conflicts are refused with the location
  • A análise vale para o texto não salvo — 🇧🇷 o que você escreve num include aberto já conta nos outros arquivos, antes de salvar / 🇬🇧 unsaved edits in an include already count elsewhere
  • A extensão não trava mais esperando o compilador — 🇧🇷 ele roda em segundo plano e a interface segue respondendo / 🇬🇧 the compiler runs in the background
  • Cada falha de RCON diz o que houve — 🇧🇷 servidor parado, RCON desligado no config.json, senha inválida, servidor remoto ou tempo esgotado, em vez de um código interno / 🇬🇧 real reasons instead of an internal code
  • Servidor que morre logo ao iniciar (plugin faltando, por exemplo) — 🇧🇷 é informado na hora, com o código de saída, em vez de a extensão ficar esperando a porta até o prazo acabar / 🇬🇧 reported immediately with the exit code
  • Seletor de SDK ganha "Automático", já como padrão — 🇧🇷 usa o SDK do open.mp quando o projeto o tem (qawno/include/open.mp.inc ou o caminho configurado); sem ele, as nativas vêm dos includes, como no SA-MP / 🇬🇧 new default: open.mp SDK when present, otherwise natives from your includes
  • Tipo errado no config.json — 🇧🇷 o valor é ignorado sozinho e o resto do arquivo continua valendo / 🇬🇧 the bad value is skipped, the rest still applies
  • Mudança no config.json chega à análise sem recarregar — 🇧🇷 incluindo as listas .ban/.allow / 🇬🇧 including the .ban/.allow lists



🐛 Corrigido / Fixed

Interface
  • A tela de configurações voltou a responder aos cliques. 🇧🇷 A política de segurança da página usa nonce, e nonce não vale para atributo de evento: os onclick/onchange dos controles eram bloqueados, e o sintoma era a página inteira muda, sem erro visível. A Biblioteca de Recursos tinha o mesmo problema / 🇬🇧 settings page clicks work again (nonce-based CSP was blocking inline handlers); same for the Resource Library
  • A extensão não depende mais do IntelliSense subir para ativar. 🇧🇷 Ela ficava presa numa chamada sem prazo, e o que vinha depois — configurações, biblioteca, barra de status — nunca chegava a existir / 🇬🇧 activation no longer blocks on the engine
  • 🇧🇷 A página "O que há de novo" mostrava os > do changelog no meio do texto / 🇬🇧 the What's New page rendered raw > markers
  • 🇧🇷 Os títulos das correções rápidas apareciam sempre em português; agora seguem o idioma configurado / 🇬🇧 quick-fix titles follow your language setting

Análise de código
  • A formatação danificava código — 🇧🇷 em comentário no fim da linha e de bloco, em string e caractere com espaço, e em macro com continuação \. E não era estável: formatar duas vezes mudava o arquivo. Agora não altera código nem comentário, e formatar de novo não muda nada / 🇬🇧 formatting corrupted trailing/block comments, spaced string and char literals, and \-continued macros — and wasn't idempotent
  • Letra acentuada derrubava a análise — 🇧🇷 o limite de nome do Pawn é de 31 caracteres e o corte era feito em 31 bytes; ç, ã e é ocupam dois, o corte caía no meio do caractere. Mesma coisa na assinatura, com acento antes do cursor / 🇬🇧 accented characters crashed analysis (31-character limit truncated at 31 bytes)
  • 🇧🇷 Aviso de um texto que já não existe deixa de aparecer: análise que termina depois de uma nova edição é descartada / 🇬🇧 stale diagnostics discarded
  • 🇧🇷 Nome dentro de string contava como referência; chamada em new x = Funcao(); era ignorada; a coluna saía errada com acento antes do nome / 🇬🇧 reference counting fixes
  • 🇧🇷 PP0012 (#include sem símbolo usado) não disparava, e a verificação de símbolo não usado não via edição feita em outro arquivo / 🇬🇧 PP0012 never fired
  • 🇧🇷 native e forward com corpo aberto na linha seguinte voltam a ser acusados, e diretiva recuada (    #include) passa a ser reconhecida / 🇬🇧 both back to working

Depuração
  • 🇧🇷 Breakpoint parando na linha errada quando o arquivo foi editado depois de compilar / 🇬🇧 wrong-line breakpoints after post-compile edits
  • 🇧🇷 Breakpoint do gamemode disparando dentro de filterscript — o plugin passa a reconhecer qual script está em depuração / 🇬🇧 gamemode breakpoints firing inside filterscripts
  • 🇧🇷 Breakpoint em include por caminho relativo (#include "../include/x.inc") passa a ser atingido / 🇬🇧 breakpoints in relatively-included files now hit
  • 🇧🇷 Arrays. Elemento de array de várias dimensões ou recebido por referência mostrava valor de outra posição da memória; data breakpoint e edição em grid[j] passam a funcionar / 🇬🇧 multi-dimensional and by-reference array elements read the wrong memory slot
  • 🇧🇷 Edição de variável só aparece como feita depois que o servidor confirma a escrita / 🇬🇧 variable edits confirmed by the server first
  • 🇧🇷 A pilha de chamadas mostra o arquivo de cada frame — um frame dentro de include abria o arquivo principal / 🇬🇧 call stack opens the right file per frame
  • 🇧🇷 Depurar com .amx sem informação de depuração recompila, em vez de subir um binário em que nenhum breakpoint pega. E qualquer -d da sua configuração é trocado por -d3 só naquela compilação: um -d0 ou -d1 configurado deixava o .amx sem o que breakpoint e variável precisam / 🇬🇧 a debug-less .amx is recompiled, and -d3 is forced for that build only
[*]


⚙️ Por dentro: de onde vem essa versão / Under the hood

🇧🇷 Vale explicar por que uma lista dessas aparece de uma vez. A extensão comandava, em TypeScript, coisas que não possuía: processos do servidor, portas, RCON, o compilador, a configuração e a resolução de includes. Cada tarefa tinha um caminho diferente por sistema operacional (lsof, /proc, netstat, taskkill), por sinal indireto, e a configuração era lida em dois lugares ao mesmo tempo. Daí vinha boa parte dos defeitos: IntelliSense discordando do que o compilador enxergava, include resolvido de um jeito na análise e de outro na compilação, e uma resposta diferente por sistema.

🇧🇷 A 4.0.0 move tudo isso para o PawnPro-Core, um projeto novo — primeira versão, 0.1.0 — em Rust, que acompanha a extensão e também passou a hospedar o motor de análise e o depurador, que antes eram binários separados. Agora há uma resposta só para cada pergunta, e o VSIX traz um binário só.

🇬🇧 Worth explaining why a list this long lands at once. The extension was driving, in TypeScript, things it didn't own: server processes, ports, RCON, the compiler, configuration and include resolution — one code path per OS, all indirect, with configuration read in two places at once. That's where most of the defects came from. 4.0.0 moves all of it into PawnPro-Core, a new project (0.1.0) written in Rust, which also now hosts the analysis engine and the debugger. One answer per question, one binary in the VSIX.

  • 🇧🇷 Você não baixa o núcleo: ele vem dentro da extensão, no binário da sua plataforma — Windows x64, Linux x64 e arm64, macOS x64 e arm64 / 🇬🇧 the core ships inside the extension
  • 🇧🇷 Análise, depuração e o plugin do servidor chegam por um soquete local único (named pipe no Windows), não por porta TCP / 🇬🇧 one local socket, not a TCP port
  • 🇧🇷 Encerrar processo confere de novo, na hora, se ele é o servidor deste projeto e do mesmo usuário / 🇬🇧 process kills re-check ownership
  • 🇧🇷 A ajuda mostra a versão do núcleo no lugar das versões separadas de motor e depurador / 🇬🇧 one version to report



⚠️ Antes de atualizar / Before you update

  • 🇧🇷 Se você usa o depurador: atualize o plugin do servidor. O pawnpro_debug (.so / .dll, 32 bits, como o servidor) agora sai no release do PawnPro-Core e precisa ser da mesma versão. Plugin desatualizado faz a sessão falhar — é o primeiro lugar a olhar se o F5 não responde. A ajuda da extensão aponta o release certo / 🇬🇧 update the 32-bit pawnpro_debug plugin to the matching version
  • 🇧🇷 Foram removidos do launch.json os campos server, session e stopOnEntry, que já eram ignorados. O servidor vem da seção server das configurações / 🇬🇧 server, session and stopOnEntry removed from launch.json (they were already ignored)
  • 🇧🇷 Fora isso, sua configuração e seus projetos continuam valendo, e não há nada a instalar à parte / 🇬🇧 otherwise your settings and projects carry over
  • 🇧🇷 Lembrete que ainda é o erro mais comum: abra a PASTA do projeto, não o .pwn solto — sem ela não há como achar seus includes / 🇬🇧 open the project folder, not a lone .pwn



🔎 O que ainda não está verificado
Not verified yet

🇧🇷 O depurador continua marcado como instável, e é honesto dizer onde:

  • Depuração no Windows nunca foi testada num servidor Windows real. Ela é compilada e publicada, mas lá o canal com o servidor é outro (named pipe) e o encerramento também — o mecanismo que garante que o servidor morre junto com a sessão só existe no Linux. Se você hospeda no Windows e testar, esse relato é o mais útil que existe agora
  • Pausar com jogadores conectados foi medido sem clientes de verdade. Num teste, um jogador continuou se movendo com a execução parada num breakpoint; não se sabe o efeito com servidor cheio, nem se a rajada de sincronia na retomada derruba conexão
  • A posição do breakpoint muda o cenário: parar num comando, que roda de vez em quando, não é o mesmo que parar num callback que roda a cada tick

Quote:🇧🇷 Bug encontrado vira issue pública, não vira segredo. Se você esbarrar em algo, ligue o log em info, anexe o arquivo e abra uma issue — é assim que isto melhora.
🇬🇧 Bugs become public issues, not secrets. If you hit something, set logging to info, attach the file and open an issue.




Links
  • Changelog completo da 4.0.0 — 🇧🇷 com tudo que não caberia aqui / 🇬🇧 the full list
  • pawnpro.nullsablex.com — 🇧🇷 documentação da extensão / 🇬🇧 extension docs
  • PawnPro-Core — 🇧🇷 o núcleo em Rust, para quem quiser ver por dentro / 🇬🇧 the Rust core, if you want the internals

Code:
ext install NullSablex.pawnpro


[i]🇧🇷 Dúvida, crítica e relato de bug são bem-vindos — aqui no tópico ou nas issues do GitHub.
🇬🇧 Questions, criticism and bug reports are welcome — here or on GitHub issues.


⭐ github.com/NullSablex/PawnPro[/i]